mirror of
https://github.com/moonlight-stream/moonlight-qt.git
synced 2026-10-22 16:17:20 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3b8e3b7d5c | ||
|
|
6129000dde | ||
|
|
65b274d695 | ||
|
|
a13dd0076b | ||
|
|
cc026c995c | ||
|
|
81cfacaa3d | ||
|
|
fabebc05d2 | ||
|
|
07a97bab03 | ||
|
|
69ac810c82 | ||
|
|
3f4609dc6e | ||
|
|
1ddb529d26 | ||
|
|
ab6b88073c | ||
|
|
ad3ed97472 | ||
|
|
07e902fe95 | ||
|
|
eb781ce689 | ||
|
|
555a65c8ea | ||
|
|
58429f4172 | ||
|
|
e2692a0abd | ||
|
|
d218c43edf | ||
|
|
fae9813127 | ||
|
|
adc56d4ee5 | ||
|
|
f982e33fab | ||
|
|
9ab4479fcf | ||
|
|
3e330b7929 | ||
|
|
ecddada150 | ||
|
|
0c828cbb37 | ||
|
|
84a32f8c16 | ||
|
|
4ee36fd405 | ||
|
|
0802609fd8 | ||
|
|
de88176995 | ||
|
|
aca82f400a | ||
|
|
54bb6fe527 | ||
|
|
c1f663cec1 | ||
|
|
aaf59c2d01 | ||
|
|
692942e5be | ||
|
|
f4acd629a1 | ||
|
|
0ff8a44ec3 | ||
|
|
c6d8f6e618 | ||
|
|
1baa23cc43 | ||
|
|
3be696e6bb | ||
|
|
3cfcb01603 | ||
|
|
d39a29759c | ||
|
|
bf4332b9e7 | ||
|
|
feaae7b684 | ||
|
|
be7852dfc0 | ||
|
|
b0804ce048 | ||
|
|
aa7d5fa924 | ||
|
|
b4cab12e9d | ||
|
|
133dda2de0 | ||
|
|
ef5605ae39 | ||
|
|
9b29b2702e | ||
|
|
abafa270e5 | ||
|
|
15852ccf81 | ||
|
|
a427ecd029 | ||
|
|
77228dcb2c | ||
|
|
3948cfe495 | ||
|
|
36218b54f8 | ||
|
|
be2f4433db | ||
|
|
dd5d36cf07 | ||
|
|
685136d98f | ||
|
|
852937421e | ||
|
|
a5389b7be5 | ||
|
|
1b96b18bc0 | ||
|
|
e9edad6f8c | ||
|
|
f8a6012c3a | ||
|
|
e103f6c9b6 | ||
|
|
9daf7b5a36 | ||
|
|
d6142e1af0 | ||
|
|
b0491210ff | ||
|
|
91d8550290 | ||
|
|
dfaaa7d72a | ||
|
|
5174a4f58a | ||
|
|
b9c73df488 | ||
|
|
f99f1f6441 | ||
|
|
1ec1f5d3be | ||
|
|
713db06a05 | ||
|
|
a0adcbd90b | ||
|
|
b94776421c | ||
|
|
79c1043063 | ||
|
|
cfabae17c0 | ||
|
|
71a1d25e90 | ||
|
|
c2d7b835fb | ||
|
|
f72888ce6f | ||
|
|
30f474d253 | ||
|
|
216f274a92 | ||
|
|
5ea79efe4b | ||
|
|
197c1ba21b | ||
|
|
95c4a24d99 | ||
|
|
f5f23a7c22 | ||
|
|
c469576460 | ||
|
|
0001bb0e4c | ||
|
|
56f184393f | ||
|
|
85777e85fa | ||
|
|
c750ec3cc7 | ||
|
|
c75b781d3f | ||
|
|
8aa42ff1d9 | ||
|
|
63a5bc5e12 | ||
|
|
e0b7b6dc3d | ||
|
|
3d7ecf98c2 | ||
|
|
ad5581c620 | ||
|
|
69af991772 | ||
|
|
2bb2745f91 | ||
|
|
5f682bb45f | ||
|
|
48bcb6b9a6 | ||
|
|
092c0a7392 | ||
|
|
4e8618c512 | ||
|
|
c51a69c0dc | ||
|
|
2480849f39 | ||
|
|
6bfe40607d | ||
|
|
a1c350a537 | ||
|
|
f732b1978e | ||
|
|
d3a542bac4 | ||
|
|
b12724db02 | ||
|
|
f8f5e8e869 | ||
|
|
0733f06103 | ||
|
|
6fdaa6ee8a | ||
|
|
f10b547a49 | ||
|
|
38396b2691 | ||
|
|
220f50ebe4 | ||
|
|
c989133d27 | ||
|
|
6c339551eb | ||
|
|
ef23a80b16 | ||
|
|
a521093731 | ||
|
|
747d3eedf1 | ||
|
|
fd563726f0 | ||
|
|
62136a1a96 | ||
|
|
cf16c31d38 | ||
|
|
0f5d4aa72f | ||
|
|
d8dbe77427 | ||
|
|
0e5670d50d | ||
|
|
22924a1e92 | ||
|
|
e3a7b54f90 | ||
|
|
81d5e7f014 | ||
|
|
9790c218dc | ||
|
|
6d3d51553b | ||
|
|
474591c6a5 | ||
|
|
5de0dc2713 | ||
|
|
57a34a7abb | ||
|
|
54517bda1b | ||
|
|
4291e15b60 | ||
|
|
940ae6406b | ||
|
|
6a0cf4bfd3 | ||
|
|
fee6f75223 | ||
|
|
8c93b2d54c | ||
|
|
dbbb1bd8a1 | ||
|
|
5c838b2fc5 | ||
|
|
3a094d4ba8 | ||
|
|
5d11c1ea6a | ||
|
|
a7e2e15eac | ||
|
|
585a0ca1f4 | ||
|
|
09ed82db65 | ||
|
|
a56cb0e88a | ||
|
|
9acf5ff0ef | ||
|
|
64a7790aed | ||
|
|
9a5134ffcf | ||
|
|
1d2c4d0843 | ||
|
|
efad34be62 | ||
|
|
52761ade87 | ||
|
|
e6b816e776 | ||
|
|
6d3bcba5d0 | ||
|
|
2e7ffa606b | ||
|
|
055cae90b8 | ||
|
|
23acf92803 | ||
|
|
91ee7d76eb | ||
|
|
570888e2b8 | ||
|
|
282f27f0c8 | ||
|
|
98376ade45 | ||
|
|
9682968b55 | ||
|
|
877cb5f1b0 | ||
|
|
6972573a6e | ||
|
|
742f1b1283 | ||
|
|
0b127a2f3b | ||
|
|
a6057835a8 | ||
|
|
c32794477e | ||
|
|
999ac60bda | ||
|
|
bca4b832a8 | ||
|
|
2fc1dda232 | ||
|
|
99495cff90 | ||
|
|
795962a4ba | ||
|
|
7bde9f447a | ||
|
|
b45c3e3c7f | ||
|
|
ce2a01fc59 | ||
|
|
edeea65c3e | ||
|
|
6e8ee94b91 | ||
|
|
97d8274911 | ||
|
|
73d84dc13f | ||
|
|
f32501d498 | ||
|
|
9c289c3fe9 | ||
|
|
2a610584ee | ||
|
|
8e06421567 | ||
|
|
57dc3725f5 | ||
|
|
d6ef8945f5 | ||
|
|
e078a8b7b6 | ||
|
|
a6395b9025 | ||
|
|
6c0983d77c | ||
|
|
4ae39f2bd5 | ||
|
|
71fc701809 | ||
|
|
d418921e4b | ||
|
|
4b83b022d3 | ||
|
|
8b13e5b47e | ||
|
|
0bfd565bda | ||
|
|
2224a558ee | ||
|
|
93c02fb43a | ||
|
|
93ee51cabb | ||
|
|
cd6ba554a4 | ||
|
|
89aa2be358 | ||
|
|
da261246b9 | ||
|
|
4d3e09f4a0 | ||
|
|
9add6b3696 | ||
|
|
ef037e18d0 | ||
|
|
36db791516 | ||
|
|
25d2ea5e94 | ||
|
|
34f2d18f27 | ||
|
|
4935c846aa | ||
|
|
b1f980c216 | ||
|
|
738f64c903 | ||
|
|
7235663447 | ||
|
|
9d78c416f7 | ||
|
|
9a64c026ea | ||
|
|
be2af1d17a | ||
|
|
b21131a466 | ||
|
|
41c5126472 | ||
|
|
b96cb1abaf | ||
|
|
20143606e2 | ||
|
|
1d79bcc657 | ||
|
|
e8b4494fc3 | ||
|
|
2518208c5c | ||
|
|
918fea7d4b | ||
|
|
4dc07bf63f | ||
|
|
04a0aca221 | ||
|
|
1942e72474 | ||
|
|
f256407789 | ||
|
|
67612f607e | ||
|
|
7274c42126 | ||
|
|
e288402e88 | ||
|
|
76bd4a1c7b | ||
|
|
13dbad6f35 | ||
|
|
cf089fdfe9 | ||
|
|
9755e31fa2 | ||
|
|
3fcf31d009 | ||
|
|
1cbdd0e675 | ||
|
|
e0fd84d6f5 | ||
|
|
443720c3de | ||
|
|
254526a213 | ||
|
|
ad0afb5fc9 | ||
|
|
e64b15d2a7 | ||
|
|
cdc3352318 | ||
|
|
2416618b34 | ||
|
|
c951d77a52 | ||
|
|
759ddc0b4b | ||
|
|
a0709bec51 | ||
|
|
f5bc4e7a24 | ||
|
|
b4665b6e5a | ||
|
|
b85d5b8822 | ||
|
|
12ad75a6b0 | ||
|
|
af92fe6ad1 | ||
|
|
fcf7ed4faa | ||
|
|
a58649fd10 | ||
|
|
ee5918cf4e | ||
|
|
d7de3301ed | ||
|
|
bd1988c775 | ||
|
|
474010b31d | ||
|
|
dd941154d6 | ||
|
|
cbb53745f6 | ||
|
|
3dff62e0cf | ||
|
|
719024ec01 | ||
|
|
f0659b4f3c | ||
|
|
a649f2736f | ||
|
|
046ccb1dee | ||
|
|
d340556c28 | ||
|
|
32250db126 | ||
|
|
cb8c30db2e | ||
|
|
dacd5a9e3d | ||
|
|
859d8b96a7 | ||
|
|
02981e3cee | ||
|
|
49892b3ce8 | ||
|
|
b223e7ec36 | ||
|
|
0926337c1d | ||
|
|
346e72a678 | ||
|
|
d612e47b62 | ||
|
|
c138cbf994 | ||
|
|
dfe275ab67 | ||
|
|
d6cfbdb273 | ||
|
|
8a27fa7bb5 | ||
|
|
b9a6fb1fe5 | ||
|
|
4b6194e15e | ||
|
|
e1b3f90f8b | ||
|
|
c5cc0b8c59 | ||
|
|
5c849ec666 | ||
|
|
c2a30cbe19 | ||
|
|
31eddd8da0 | ||
|
|
abf2a14ee6 | ||
|
|
e555874485 | ||
|
|
a7aef8f147 | ||
|
|
5b8c11f1a9 | ||
|
|
645040c943 | ||
|
|
fcc5ea348c | ||
|
|
3fbb45448f | ||
|
|
8a83289709 | ||
|
|
08175de069 | ||
|
|
808933cd70 | ||
|
|
384dd2adab | ||
|
|
4a37952b41 | ||
|
|
1046d264d8 | ||
|
|
bb235ab1ae | ||
|
|
ef88b83727 | ||
|
|
5612e9864e | ||
|
|
8302187dee | ||
|
|
77d07c7c4d | ||
|
|
b2265080fd | ||
|
|
0d70bd9ac0 | ||
|
|
8f63d59b81 | ||
|
|
0395c0cc95 | ||
|
|
72065412a3 | ||
|
|
7af2cdd0ef | ||
|
|
67c801c4e7 | ||
|
|
f7c8ad4c5a | ||
|
|
61092b34de | ||
|
|
1e9e96fb8c | ||
|
|
17d1ced07c | ||
|
|
a26ced04ff | ||
|
|
154b5b6ded | ||
|
|
8219dbef6f | ||
|
|
3da724e76a | ||
|
|
1616d237ae | ||
|
|
3d21facc9f | ||
|
|
fead2a08a3 | ||
|
|
d8acf24af0 | ||
|
|
97412b3c79 | ||
|
|
6145913068 | ||
|
|
e56bb6785f | ||
|
|
6d63d6c54a | ||
|
|
6e8a103e70 | ||
|
|
00d3530f64 | ||
|
|
1e6ca18193 | ||
|
|
5a32992497 | ||
|
|
79ba00a2f4 | ||
|
|
fdfaf8ec70 | ||
|
|
162c58b697 | ||
|
|
75959ca692 | ||
|
|
06fbcd19c8 | ||
|
|
36e0468a99 | ||
|
|
c4d85cf928 | ||
|
|
daf8495acb | ||
|
|
9999ded933 | ||
|
|
80128e8293 | ||
|
|
9579b2c85e | ||
|
|
eb7f184848 | ||
|
|
71b21920e2 | ||
|
|
91b787a5be | ||
|
|
11f659aadb | ||
|
|
0870dd15a8 | ||
|
|
7cd52041d8 | ||
|
|
f2bcb49478 | ||
|
|
60a4bda94f | ||
|
|
54cfc46500 | ||
|
|
c09559ade5 | ||
|
|
3e9aea1f7a | ||
|
|
f0c292f508 | ||
|
|
1444ba2c35 | ||
|
|
fac4c85133 | ||
|
|
97a09e0571 | ||
|
|
c7121516c1 | ||
|
|
56a5fbf63b | ||
|
|
80604a752b | ||
|
|
3fe6e18609 | ||
|
|
47f3f30d83 | ||
|
|
085a904970 | ||
|
|
0fa7723f51 | ||
|
|
84ea483b4c | ||
|
|
4de3aa96b6 | ||
|
|
1193943228 | ||
|
|
2959faca0c | ||
|
|
d0df4fa3a0 | ||
|
|
0a301dd2f9 | ||
|
|
43e3679297 | ||
|
|
0455063854 | ||
|
|
12d90d77c7 | ||
|
|
61d7749aaf | ||
|
|
69fb4a0c37 | ||
|
|
d2c9f058f8 | ||
|
|
acaa3afa0f | ||
|
|
3c58e21cbf | ||
|
|
9d3c5b9bc6 | ||
|
|
ce34358d46 | ||
|
|
278bcec238 | ||
|
|
128f458848 | ||
|
|
7ae2bcd6db | ||
|
|
130f252f97 | ||
|
|
d339e05a3b | ||
|
|
933f4813aa | ||
|
|
f14e71c1d6 | ||
|
|
d78dbd7b0f | ||
|
|
71a6ef6eba | ||
|
|
4873862d16 | ||
|
|
425efe3d72 | ||
|
|
666dc13c01 | ||
|
|
267f9f5759 | ||
|
|
c8d8c00f84 | ||
|
|
dcc567ebda | ||
|
|
a199a3ccc3 | ||
|
|
8159e07427 | ||
|
|
32d70758c5 | ||
|
|
3a9e284f29 | ||
|
|
c658daeac6 | ||
|
|
f605169b15 | ||
|
|
f82b495bcc | ||
|
|
33b44a87c5 | ||
|
|
a88d994fcb | ||
|
|
dd9224d9a6 | ||
|
|
48728efee0 | ||
|
|
043c55ae66 | ||
|
|
fa3f822cf1 | ||
|
|
5afab126b3 | ||
|
|
bee8378795 | ||
|
|
cbd42f4a58 | ||
|
|
3333fd7fc8 | ||
|
|
142258b4b5 | ||
|
|
01213b58ba | ||
|
|
51df7032bb | ||
|
|
c033ce5ecf | ||
|
|
bfaf57cfd0 | ||
|
|
a3167b8152 | ||
|
|
b4a6512784 | ||
|
|
17abe8f164 |
No files matched your search
@@ -12,8 +12,11 @@ contains(QT_ARCH, i386) {
|
|||||||
contains(QT_ARCH, x86_64) {
|
contains(QT_ARCH, x86_64) {
|
||||||
LIBS += -L$$PWD/../libs/windows/lib/x64
|
LIBS += -L$$PWD/../libs/windows/lib/x64
|
||||||
}
|
}
|
||||||
|
contains(QT_ARCH, arm64) {
|
||||||
|
LIBS += -L$$PWD/../libs/windows/lib/arm64
|
||||||
|
}
|
||||||
|
|
||||||
LIBS += -lNktHookLib
|
LIBS += -ldetours
|
||||||
DEFINES += ANTIHOOKING_LIBRARY
|
DEFINES += ANTIHOOKING_LIBRARY
|
||||||
SOURCES += antihookingprotection.cpp
|
SOURCES += antihookingprotection.cpp
|
||||||
HEADERS += antihookingprotection.h
|
HEADERS += antihookingprotection.h
|
||||||
@@ -1,6 +1,9 @@
|
|||||||
#include "antihookingprotection.h"
|
#include "antihookingprotection.h"
|
||||||
|
|
||||||
#include <NktHookLib.h>
|
#define WIN32_LEAN_AND_MEAN
|
||||||
|
#include <Windows.h>
|
||||||
|
|
||||||
|
#include <detours.h>
|
||||||
|
|
||||||
typedef HMODULE (WINAPI *LoadLibraryAFunc)(LPCSTR lpLibFileName);
|
typedef HMODULE (WINAPI *LoadLibraryAFunc)(LPCSTR lpLibFileName);
|
||||||
typedef HMODULE (WINAPI *LoadLibraryWFunc)(LPCWSTR lpLibFileName);
|
typedef HMODULE (WINAPI *LoadLibraryWFunc)(LPCWSTR lpLibFileName);
|
||||||
@@ -12,25 +15,35 @@ class AntiHookingProtection
|
|||||||
public:
|
public:
|
||||||
static void enable()
|
static void enable()
|
||||||
{
|
{
|
||||||
#ifdef QT_DEBUG
|
DetourTransactionBegin();
|
||||||
s_HookManager.SetEnableDebugOutput(true);
|
DetourUpdateThread(GetCurrentThread());
|
||||||
#endif
|
|
||||||
|
|
||||||
HINSTANCE kernel32Handle = NktHookLibHelpers::GetModuleBaseAddress(L"kernel32.dll");
|
s_RealLoadLibraryA = LoadLibraryA;
|
||||||
SIZE_T hookId;
|
DetourAttach(&(PVOID&)s_RealLoadLibraryA, LoadLibraryAHook);
|
||||||
|
|
||||||
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryA,
|
s_RealLoadLibraryW = LoadLibraryW;
|
||||||
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryA"),
|
DetourAttach(&(PVOID&)s_RealLoadLibraryW, LoadLibraryWHook);
|
||||||
(LPVOID)AntiHookingProtection::LoadLibraryAHook);
|
|
||||||
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryW,
|
s_RealLoadLibraryExA = LoadLibraryExA;
|
||||||
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryW"),
|
DetourAttach(&(PVOID&)s_RealLoadLibraryExA, LoadLibraryExAHook);
|
||||||
(LPVOID)AntiHookingProtection::LoadLibraryWHook);
|
|
||||||
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryExA,
|
s_RealLoadLibraryExW = LoadLibraryExW;
|
||||||
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryExA"),
|
DetourAttach(&(PVOID&)s_RealLoadLibraryExW, LoadLibraryExWHook);
|
||||||
(LPVOID)AntiHookingProtection::LoadLibraryExAHook);
|
|
||||||
s_HookManager.Hook(&hookId, (LPVOID*)&s_RealLoadLibraryExW,
|
DetourTransactionCommit();
|
||||||
NktHookLibHelpers::GetProcedureAddress(kernel32Handle, "LoadLibraryExW"),
|
}
|
||||||
(LPVOID)AntiHookingProtection::LoadLibraryExWHook);
|
|
||||||
|
static void disable()
|
||||||
|
{
|
||||||
|
DetourTransactionBegin();
|
||||||
|
DetourUpdateThread(GetCurrentThread());
|
||||||
|
|
||||||
|
DetourDetach(&(PVOID&)s_RealLoadLibraryA, LoadLibraryAHook);
|
||||||
|
DetourDetach(&(PVOID&)s_RealLoadLibraryW, LoadLibraryWHook);
|
||||||
|
DetourDetach(&(PVOID&)s_RealLoadLibraryExA, LoadLibraryExAHook);
|
||||||
|
DetourDetach(&(PVOID&)s_RealLoadLibraryExW, LoadLibraryExWHook);
|
||||||
|
|
||||||
|
DetourTransactionCommit();
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -124,7 +137,6 @@ private:
|
|||||||
return s_RealLoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
return s_RealLoadLibraryExW(lpLibFileName, hFile, dwFlags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static CNktHookLib s_HookManager;
|
|
||||||
static LoadLibraryAFunc s_RealLoadLibraryA;
|
static LoadLibraryAFunc s_RealLoadLibraryA;
|
||||||
static LoadLibraryWFunc s_RealLoadLibraryW;
|
static LoadLibraryWFunc s_RealLoadLibraryW;
|
||||||
static LoadLibraryExAFunc s_RealLoadLibraryExA;
|
static LoadLibraryExAFunc s_RealLoadLibraryExA;
|
||||||
@@ -139,7 +151,7 @@ private:
|
|||||||
L"SS2OSD.dll", // ASUS Sonic Studio 2
|
L"SS2OSD.dll", // ASUS Sonic Studio 2
|
||||||
L"Nahimic2OSD.dll",
|
L"Nahimic2OSD.dll",
|
||||||
L"NahimicMSIOSD.dll",
|
L"NahimicMSIOSD.dll",
|
||||||
L"nhAsusPhoebusOSD.dll" // ASUS Phoebus
|
L"nhAsusPhoebusOSD.dll", // ASUS Phoebus
|
||||||
|
|
||||||
// This DLL has been seen in several crash reports. Some Googling
|
// This DLL has been seen in several crash reports. Some Googling
|
||||||
// suggests it's highly unstable and causes issues in many games.
|
// suggests it's highly unstable and causes issues in many games.
|
||||||
@@ -209,7 +221,6 @@ private:
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
CNktHookLib AntiHookingProtection::s_HookManager;
|
|
||||||
LoadLibraryAFunc AntiHookingProtection::s_RealLoadLibraryA;
|
LoadLibraryAFunc AntiHookingProtection::s_RealLoadLibraryA;
|
||||||
LoadLibraryWFunc AntiHookingProtection::s_RealLoadLibraryW;
|
LoadLibraryWFunc AntiHookingProtection::s_RealLoadLibraryW;
|
||||||
LoadLibraryExAFunc AntiHookingProtection::s_RealLoadLibraryExA;
|
LoadLibraryExAFunc AntiHookingProtection::s_RealLoadLibraryExA;
|
||||||
@@ -218,14 +229,26 @@ LoadLibraryExWFunc AntiHookingProtection::s_RealLoadLibraryExW;
|
|||||||
AH_EXPORT void AntiHookingDummyImport() {}
|
AH_EXPORT void AntiHookingDummyImport() {}
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID)
|
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
||||||
{
|
{
|
||||||
|
if (DetourIsHelperProcess()) {
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
switch (fdwReason)
|
switch (fdwReason)
|
||||||
{
|
{
|
||||||
case DLL_PROCESS_ATTACH:
|
case DLL_PROCESS_ATTACH:
|
||||||
|
DetourRestoreAfterWith();
|
||||||
AntiHookingProtection::enable();
|
AntiHookingProtection::enable();
|
||||||
DisableThreadLibraryCalls(hinstDLL);
|
DisableThreadLibraryCalls(hinstDLL);
|
||||||
break;
|
break;
|
||||||
|
case DLL_PROCESS_DETACH:
|
||||||
|
// Ignore DLL_PROCESS_DETACH on process exit. No need to waste time
|
||||||
|
// unhooking everything if the whole process is being destroyed.
|
||||||
|
if (lpvReserved == NULL) {
|
||||||
|
AntiHookingProtection::disable();
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# Moonlight PC
|
# Moonlight PC
|
||||||
|
|
||||||
[Moonlight PC](https://moonlight-stream.org) is an open source implementation of NVIDIA's GameStream, as used by the NVIDIA Shield, but built to run on Windows, Mac, and Linux. This client is the successor to [Moonlight Chrome](https://github.com/moonlight-stream/moonlight-chrome) for streaming on PC.
|
[Moonlight PC](https://moonlight-stream.org) is an open source PC client for NVIDIA GameStream, as used by the NVIDIA Shield.
|
||||||
|
|
||||||
Moonlight also has mobile versions for [Android](https://github.com/moonlight-stream/moonlight-android) and [iOS](https://github.com/moonlight-stream/moonlight-ios).
|
Moonlight also has mobile versions for [Android](https://github.com/moonlight-stream/moonlight-android) and [iOS](https://github.com/moonlight-stream/moonlight-ios).
|
||||||
|
|
||||||
@@ -14,6 +14,7 @@ You can follow development on our [Discord server](https://moonlight-stream.org/
|
|||||||
- Hardware accelerated video decoding on Windows, Mac, and Linux
|
- Hardware accelerated video decoding on Windows, Mac, and Linux
|
||||||
- Supports streaming at up to 120 FPS (high refresh rate monitor recommended)
|
- Supports streaming at up to 120 FPS (high refresh rate monitor recommended)
|
||||||
- Supports streaming at 720p, 1080p, 1440p, 4K, and the client PC's native screen resolution
|
- Supports streaming at 720p, 1080p, 1440p, 4K, and the client PC's native screen resolution
|
||||||
|
- HDR streaming support
|
||||||
- 7.1 surround sound audio support
|
- 7.1 surround sound audio support
|
||||||
- Support for both pointer capture (for games) and direct mouse control (for remote desktop)
|
- Support for both pointer capture (for games) and direct mouse control (for remote desktop)
|
||||||
- Support for passing system-wide keyboard shortcuts like Alt+Tab to the host
|
- Support for passing system-wide keyboard shortcuts like Alt+Tab to the host
|
||||||
@@ -43,12 +44,12 @@ Hosting for Moonlight's Raspberry Pi and L4T package repositories is graciously
|
|||||||
* [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) (Community edition is fine)
|
* [Visual Studio 2019](https://visualstudio.microsoft.com/downloads/) (Community edition is fine)
|
||||||
* Select **MSVC 2019** option during Qt installation. MinGW is not supported.
|
* Select **MSVC 2019** option during Qt installation. MinGW is not supported.
|
||||||
* [7-Zip](https://www.7-zip.org/) (only if building installers for non-development PCs)
|
* [7-Zip](https://www.7-zip.org/) (only if building installers for non-development PCs)
|
||||||
* [WiX Toolset](https://wixtoolset.org/releases/) v3.11 or later (only if building installers for non-development PCs)
|
* [WiX Toolset](https://wixtoolset.org/releases/v3-14-0-5722/) v3.14.0.5722 or later (only if building installers for non-development PCs)
|
||||||
|
|
||||||
### macOS Build Requirements
|
### macOS Build Requirements
|
||||||
* Qt 5.15 SDK or later
|
* Qt 6.2 SDK or later
|
||||||
* macOS High Sierra (10.13) or later
|
* macOS Mojave (10.14) or later
|
||||||
* Xcode 11
|
* Xcode 13
|
||||||
* [create-dmg](https://github.com/sindresorhus/create-dmg) (only if building DMGs for use on non-development Macs)
|
* [create-dmg](https://github.com/sindresorhus/create-dmg) (only if building DMGs for use on non-development Macs)
|
||||||
|
|
||||||
### Linux/Unix Build Requirements
|
### Linux/Unix Build Requirements
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
<key>CFBundleSignature</key>
|
<key>CFBundleSignature</key>
|
||||||
<string>????</string>
|
<string>????</string>
|
||||||
<key>LSMinimumSystemVersion</key>
|
<key>LSMinimumSystemVersion</key>
|
||||||
<string>10.13</string>
|
<string>10.14</string>
|
||||||
<key>NSPrincipalClass</key>
|
<key>NSPrincipalClass</key>
|
||||||
<string>NSApplication</string>
|
<string>NSApplication</string>
|
||||||
<key>NSSupportsAutomaticGraphicsSwitching</key>
|
<key>NSSupportsAutomaticGraphicsSwitching</key>
|
||||||
|
|||||||
+1
-1
Submodule app/SDL_GameControllerDB updated: 376c576317...4896d2de6b.
+54
-16
@@ -33,18 +33,20 @@ DEFINES += QT_DEPRECATED_WARNINGS
|
|||||||
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0
|
||||||
|
|
||||||
win32 {
|
win32 {
|
||||||
INCLUDEPATH += $$PWD/../libs/windows/include
|
|
||||||
|
|
||||||
contains(QT_ARCH, i386) {
|
contains(QT_ARCH, i386) {
|
||||||
LIBS += -L$$PWD/../libs/windows/lib/x86
|
LIBS += -L$$PWD/../libs/windows/lib/x86
|
||||||
|
INCLUDEPATH += $$PWD/../libs/windows/include/x86
|
||||||
}
|
}
|
||||||
contains(QT_ARCH, x86_64) {
|
contains(QT_ARCH, x86_64) {
|
||||||
LIBS += -L$$PWD/../libs/windows/lib/x64
|
LIBS += -L$$PWD/../libs/windows/lib/x64
|
||||||
|
INCLUDEPATH += $$PWD/../libs/windows/include/x64
|
||||||
}
|
}
|
||||||
contains(QT_ARCH, arm64) {
|
contains(QT_ARCH, arm64) {
|
||||||
LIBS += -L$$PWD/../libs/windows/lib/arm64
|
LIBS += -L$$PWD/../libs/windows/lib/arm64
|
||||||
|
INCLUDEPATH += $$PWD/../libs/windows/include/arm64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
INCLUDEPATH += $$PWD/../libs/windows/include
|
||||||
LIBS += ws2_32.lib winmm.lib dxva2.lib ole32.lib gdi32.lib user32.lib d3d9.lib dwmapi.lib dbghelp.lib
|
LIBS += ws2_32.lib winmm.lib dxva2.lib ole32.lib gdi32.lib user32.lib d3d9.lib dwmapi.lib dbghelp.lib
|
||||||
}
|
}
|
||||||
macx {
|
macx {
|
||||||
@@ -52,6 +54,11 @@ macx {
|
|||||||
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2.framework/Versions/A/Headers
|
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2.framework/Versions/A/Headers
|
||||||
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2_ttf.framework/Versions/A/Headers
|
INCLUDEPATH += $$PWD/../libs/mac/Frameworks/SDL2_ttf.framework/Versions/A/Headers
|
||||||
LIBS += -L$$PWD/../libs/mac/lib -F$$PWD/../libs/mac/Frameworks
|
LIBS += -L$$PWD/../libs/mac/lib -F$$PWD/../libs/mac/Frameworks
|
||||||
|
|
||||||
|
# QMake doesn't handle framework-style includes correctly on its own
|
||||||
|
QMAKE_CFLAGS += -F$$PWD/../libs/mac/Frameworks
|
||||||
|
QMAKE_CXXFLAGS += -F$$PWD/../libs/mac/Frameworks
|
||||||
|
QMAKE_OBJECTIVE_CFLAGS += -F$$PWD/../libs/mac/Frameworks
|
||||||
}
|
}
|
||||||
|
|
||||||
unix:!macx {
|
unix:!macx {
|
||||||
@@ -88,6 +95,11 @@ unix:!macx {
|
|||||||
PKGCONFIG += libdrm
|
PKGCONFIG += libdrm
|
||||||
CONFIG += libdrm
|
CONFIG += libdrm
|
||||||
}
|
}
|
||||||
|
|
||||||
|
packagesExist(ffnvcodec) {
|
||||||
|
PKGCONFIG += ffnvcodec
|
||||||
|
CONFIG += cuda
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
packagesExist(wayland-client) {
|
packagesExist(wayland-client) {
|
||||||
@@ -101,14 +113,14 @@ unix:!macx {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
win32 {
|
win32 {
|
||||||
LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus
|
LIBS += -llibssl -llibcrypto -lSDL2 -lSDL2_ttf -lavcodec -lavutil -lopus -ldxgi -ld3d11
|
||||||
CONFIG += ffmpeg
|
CONFIG += ffmpeg
|
||||||
}
|
}
|
||||||
win32:!winrt {
|
win32:!winrt {
|
||||||
CONFIG += soundio discord-rpc
|
CONFIG += soundio discord-rpc
|
||||||
}
|
}
|
||||||
macx {
|
macx {
|
||||||
LIBS += -lssl -lcrypto -lavcodec.58 -lavutil.56 -lopus -framework SDL2 -framework SDL2_ttf
|
LIBS += -lssl -lcrypto -lavcodec.59 -lavutil.57 -lopus -framework SDL2 -framework SDL2_ttf
|
||||||
LIBS += -lobjc -framework VideoToolbox -framework AVFoundation -framework CoreVideo -framework CoreGraphics -framework CoreMedia -framework AppKit -framework Metal
|
LIBS += -lobjc -framework VideoToolbox -framework AVFoundation -framework CoreVideo -framework CoreGraphics -framework CoreMedia -framework AppKit -framework Metal
|
||||||
|
|
||||||
# For libsoundio
|
# For libsoundio
|
||||||
@@ -118,7 +130,9 @@ macx {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
|
backend/nvaddress.cpp \
|
||||||
backend/nvapp.cpp \
|
backend/nvapp.cpp \
|
||||||
|
cli/pair.cpp \
|
||||||
main.cpp \
|
main.cpp \
|
||||||
backend/computerseeker.cpp \
|
backend/computerseeker.cpp \
|
||||||
backend/identitymanager.cpp \
|
backend/identitymanager.cpp \
|
||||||
@@ -129,13 +143,13 @@ SOURCES += \
|
|||||||
backend/boxartmanager.cpp \
|
backend/boxartmanager.cpp \
|
||||||
backend/richpresencemanager.cpp \
|
backend/richpresencemanager.cpp \
|
||||||
cli/commandlineparser.cpp \
|
cli/commandlineparser.cpp \
|
||||||
|
cli/listapps.cpp \
|
||||||
cli/quitstream.cpp \
|
cli/quitstream.cpp \
|
||||||
cli/startstream.cpp \
|
cli/startstream.cpp \
|
||||||
settings/compatfetcher.cpp \
|
settings/compatfetcher.cpp \
|
||||||
settings/mappingfetcher.cpp \
|
settings/mappingfetcher.cpp \
|
||||||
settings/streamingpreferences.cpp \
|
settings/streamingpreferences.cpp \
|
||||||
streaming/input/abstouch.cpp \
|
streaming/input/abstouch.cpp \
|
||||||
streaming/input/clipboard.cpp \
|
|
||||||
streaming/input/gamepad.cpp \
|
streaming/input/gamepad.cpp \
|
||||||
streaming/input/input.cpp \
|
streaming/input/input.cpp \
|
||||||
streaming/input/keyboard.cpp \
|
streaming/input/keyboard.cpp \
|
||||||
@@ -156,7 +170,9 @@ SOURCES += \
|
|||||||
wm.cpp
|
wm.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
|
backend/nvaddress.h \
|
||||||
backend/nvapp.h \
|
backend/nvapp.h \
|
||||||
|
cli/pair.h \
|
||||||
settings/compatfetcher.h \
|
settings/compatfetcher.h \
|
||||||
settings/mappingfetcher.h \
|
settings/mappingfetcher.h \
|
||||||
utils.h \
|
utils.h \
|
||||||
@@ -169,6 +185,7 @@ HEADERS += \
|
|||||||
backend/boxartmanager.h \
|
backend/boxartmanager.h \
|
||||||
backend/richpresencemanager.h \
|
backend/richpresencemanager.h \
|
||||||
cli/commandlineparser.h \
|
cli/commandlineparser.h \
|
||||||
|
cli/listapps.h \
|
||||||
cli/quitstream.h \
|
cli/quitstream.h \
|
||||||
cli/startstream.h \
|
cli/startstream.h \
|
||||||
settings/streamingpreferences.h \
|
settings/streamingpreferences.h \
|
||||||
@@ -195,7 +212,6 @@ ffmpeg {
|
|||||||
SOURCES += \
|
SOURCES += \
|
||||||
streaming/video/ffmpeg.cpp \
|
streaming/video/ffmpeg.cpp \
|
||||||
streaming/video/ffmpeg-renderers/sdlvid.cpp \
|
streaming/video/ffmpeg-renderers/sdlvid.cpp \
|
||||||
streaming/video/ffmpeg-renderers/cuda.cpp \
|
|
||||||
streaming/video/ffmpeg-renderers/pacer/pacer.cpp \
|
streaming/video/ffmpeg-renderers/pacer/pacer.cpp \
|
||||||
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp
|
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.cpp
|
||||||
|
|
||||||
@@ -203,7 +219,6 @@ ffmpeg {
|
|||||||
streaming/video/ffmpeg.h \
|
streaming/video/ffmpeg.h \
|
||||||
streaming/video/ffmpeg-renderers/renderer.h \
|
streaming/video/ffmpeg-renderers/renderer.h \
|
||||||
streaming/video/ffmpeg-renderers/sdlvid.h \
|
streaming/video/ffmpeg-renderers/sdlvid.h \
|
||||||
streaming/video/ffmpeg-renderers/cuda.h \
|
|
||||||
streaming/video/ffmpeg-renderers/pacer/pacer.h \
|
streaming/video/ffmpeg-renderers/pacer/pacer.h \
|
||||||
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h
|
streaming/video/ffmpeg-renderers/pacer/nullthreadedvsyncsource.h
|
||||||
}
|
}
|
||||||
@@ -256,10 +271,17 @@ libdrm {
|
|||||||
|
|
||||||
linux {
|
linux {
|
||||||
message(Master hooks enabled)
|
message(Master hooks enabled)
|
||||||
SOURCES += masterhook.c
|
SOURCES += masterhook.c masterhook_internal.c
|
||||||
LIBS += -ldl
|
LIBS += -ldl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
cuda {
|
||||||
|
message(CUDA support enabled)
|
||||||
|
|
||||||
|
DEFINES += HAVE_CUDA
|
||||||
|
SOURCES += streaming/video/ffmpeg-renderers/cuda.cpp
|
||||||
|
HEADERS += streaming/video/ffmpeg-renderers/cuda.h
|
||||||
|
}
|
||||||
config_EGL {
|
config_EGL {
|
||||||
message(EGL renderer selected)
|
message(EGL renderer selected)
|
||||||
|
|
||||||
@@ -283,15 +305,20 @@ config_SL {
|
|||||||
streaming/video/slvid.h \
|
streaming/video/slvid.h \
|
||||||
streaming/audio/renderers/slaud.h
|
streaming/audio/renderers/slaud.h
|
||||||
}
|
}
|
||||||
|
win32 {
|
||||||
|
HEADERS += streaming/video/ffmpeg-renderers/dxutil.h
|
||||||
|
}
|
||||||
win32:!winrt {
|
win32:!winrt {
|
||||||
message(DXVA2 renderer selected)
|
message(DXVA2 and D3D11VA renderers selected)
|
||||||
|
|
||||||
SOURCES += \
|
SOURCES += \
|
||||||
streaming/video/ffmpeg-renderers/dxva2.cpp \
|
streaming/video/ffmpeg-renderers/dxva2.cpp \
|
||||||
|
streaming/video/ffmpeg-renderers/d3d11va.cpp \
|
||||||
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.cpp
|
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.cpp
|
||||||
|
|
||||||
HEADERS += \
|
HEADERS += \
|
||||||
streaming/video/ffmpeg-renderers/dxva2.h \
|
streaming/video/ffmpeg-renderers/dxva2.h \
|
||||||
|
streaming/video/ffmpeg-renderers/d3d11va.h \
|
||||||
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.h
|
streaming/video/ffmpeg-renderers/pacer/dxvsyncsource.h
|
||||||
}
|
}
|
||||||
macx {
|
macx {
|
||||||
@@ -336,7 +363,20 @@ TRANSLATIONS += \
|
|||||||
languages/qml_ja.ts \
|
languages/qml_ja.ts \
|
||||||
languages/qml_vi.ts \
|
languages/qml_vi.ts \
|
||||||
languages/qml_th.ts \
|
languages/qml_th.ts \
|
||||||
languages/qml_ko.ts
|
languages/qml_ko.ts \
|
||||||
|
languages/qml_hu.ts \
|
||||||
|
languages/qml_nl.ts \
|
||||||
|
languages/qml_sv.ts \
|
||||||
|
languages/qml_tr.ts \
|
||||||
|
languages/qml_uk.ts \
|
||||||
|
languages/qml_zh_Hant.ts \
|
||||||
|
languages/qml_el.ts \
|
||||||
|
languages/qml_hi.ts \
|
||||||
|
languages/qml_it.ts \
|
||||||
|
languages/qml_pt.ts \
|
||||||
|
languages/qml_pt_BR.ts \
|
||||||
|
languages/qml_pl.ts \
|
||||||
|
languages/qml_cs.ts
|
||||||
|
|
||||||
# Additional import path used to resolve QML modules in Qt Creator's code model
|
# Additional import path used to resolve QML modules in Qt Creator's code model
|
||||||
QML_IMPORT_PATH =
|
QML_IMPORT_PATH =
|
||||||
@@ -375,13 +415,11 @@ INCLUDEPATH += $$PWD/../h264bitstream/h264bitstream
|
|||||||
DEPENDPATH += $$PWD/../h264bitstream/h264bitstream
|
DEPENDPATH += $$PWD/../h264bitstream/h264bitstream
|
||||||
|
|
||||||
!winrt {
|
!winrt {
|
||||||
contains(QT_ARCH, i386)|contains(QT_ARCH, x86_64) {
|
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/release/ -lAntiHooking
|
||||||
win32:CONFIG(release, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/release/ -lAntiHooking
|
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/debug/ -lAntiHooking
|
||||||
else:win32:CONFIG(debug, debug|release): LIBS += -L$$OUT_PWD/../AntiHooking/debug/ -lAntiHooking
|
|
||||||
|
|
||||||
INCLUDEPATH += $$PWD/../AntiHooking
|
INCLUDEPATH += $$PWD/../AntiHooking
|
||||||
DEPENDPATH += $$PWD/../AntiHooking
|
DEPENDPATH += $$PWD/../AntiHooking
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unix:!macx: {
|
unix:!macx: {
|
||||||
|
|||||||
@@ -106,7 +106,7 @@ void BoxArtManager::handleBoxArtLoadComplete(NvComputer* computer, NvApp app, QU
|
|||||||
|
|
||||||
QUrl BoxArtManager::loadBoxArtFromNetwork(NvComputer* computer, int appId)
|
QUrl BoxArtManager::loadBoxArtFromNetwork(NvComputer* computer, int appId)
|
||||||
{
|
{
|
||||||
NvHTTP http(computer->activeAddress, computer->serverCert);
|
NvHTTP http(computer);
|
||||||
|
|
||||||
QString cachePath = getFilePathForBoxArt(computer, appId);
|
QString cachePath = getFilePathForBoxArt(computer, appId);
|
||||||
QImage image;
|
QImage image;
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
#include <QCoreApplication>
|
#include <QCoreApplication>
|
||||||
|
|
||||||
|
#include <random>
|
||||||
|
|
||||||
#define SER_HOSTS "hosts"
|
#define SER_HOSTS "hosts"
|
||||||
|
|
||||||
class PcMonitorThread : public QThread
|
class PcMonitorThread : public QThread
|
||||||
@@ -27,9 +29,9 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
bool tryPollComputer(QString address, bool& changed)
|
bool tryPollComputer(NvAddress address, bool& changed)
|
||||||
{
|
{
|
||||||
NvHTTP http(address, m_Computer->serverCert);
|
NvHTTP http(address, 0, m_Computer->serverCert);
|
||||||
|
|
||||||
QString serverInfo;
|
QString serverInfo;
|
||||||
try {
|
try {
|
||||||
@@ -38,7 +40,7 @@ private:
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
NvComputer newState(address, serverInfo, QSslCertificate());
|
NvComputer newState(http, serverInfo);
|
||||||
|
|
||||||
// Ensure the machine that responded is the one we intended to contact
|
// Ensure the machine that responded is the one we intended to contact
|
||||||
if (m_Computer->uuid != newState.uuid) {
|
if (m_Computer->uuid != newState.uuid) {
|
||||||
@@ -52,9 +54,7 @@ private:
|
|||||||
|
|
||||||
bool updateAppList(bool& changed)
|
bool updateAppList(bool& changed)
|
||||||
{
|
{
|
||||||
Q_ASSERT(m_Computer->activeAddress != nullptr);
|
NvHTTP http(m_Computer);
|
||||||
|
|
||||||
NvHTTP http(m_Computer->activeAddress, m_Computer->serverCert);
|
|
||||||
|
|
||||||
QVector<NvApp> appList;
|
QVector<NvApp> appList;
|
||||||
|
|
||||||
@@ -88,7 +88,7 @@ private:
|
|||||||
|
|
||||||
if (tryPollComputer(address, stateChanged)) {
|
if (tryPollComputer(address, stateChanged)) {
|
||||||
if (!wasOnline) {
|
if (!wasOnline) {
|
||||||
qInfo() << m_Computer->name << "is now online at" << m_Computer->activeAddress;
|
qInfo() << m_Computer->name << "is now online at" << m_Computer->activeAddress.toString();
|
||||||
}
|
}
|
||||||
online = true;
|
online = true;
|
||||||
break;
|
break;
|
||||||
@@ -326,7 +326,7 @@ void ComputerManager::handleMdnsServiceResolved(MdnsPendingComputer* computer,
|
|||||||
// address may not be reachable (if the user hasn't installed the IPv6 helper yet
|
// address may not be reachable (if the user hasn't installed the IPv6 helper yet
|
||||||
// or if this host lacks outbound IPv6 capability). We want to add IPv6 even if
|
// or if this host lacks outbound IPv6 capability). We want to add IPv6 even if
|
||||||
// it's not currently reachable.
|
// it's not currently reachable.
|
||||||
addNewHost(address.toString(), true, v6Global);
|
addNewHost(NvAddress(address, computer->port()), true, NvAddress(v6Global, computer->port()));
|
||||||
added = true;
|
added = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -340,7 +340,7 @@ void ComputerManager::handleMdnsServiceResolved(MdnsPendingComputer* computer,
|
|||||||
if (address.isInSubnet(QHostAddress("fe80::"), 10) ||
|
if (address.isInSubnet(QHostAddress("fe80::"), 10) ||
|
||||||
address.isInSubnet(QHostAddress("fec0::"), 10) ||
|
address.isInSubnet(QHostAddress("fec0::"), 10) ||
|
||||||
address.isInSubnet(QHostAddress("fc00::"), 7)) {
|
address.isInSubnet(QHostAddress("fc00::"), 7)) {
|
||||||
addNewHost(address.toString(), true, v6Global);
|
addNewHost(NvAddress(address, computer->port()), true, NvAddress(v6Global, computer->port()));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -457,7 +457,8 @@ class PendingPairingTask : public QObject, public QRunnable
|
|||||||
|
|
||||||
public:
|
public:
|
||||||
PendingPairingTask(ComputerManager* computerManager, NvComputer* computer, QString pin)
|
PendingPairingTask(ComputerManager* computerManager, NvComputer* computer, QString pin)
|
||||||
: m_Computer(computer),
|
: m_ComputerManager(computerManager),
|
||||||
|
m_Computer(computer),
|
||||||
m_Pin(pin)
|
m_Pin(pin)
|
||||||
{
|
{
|
||||||
connect(this, &PendingPairingTask::pairingCompleted,
|
connect(this, &PendingPairingTask::pairingCompleted,
|
||||||
@@ -470,7 +471,7 @@ signals:
|
|||||||
private:
|
private:
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
NvPairingManager pairingManager(m_Computer->activeAddress);
|
NvPairingManager pairingManager(m_Computer);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
NvPairingManager::PairState result = pairingManager.pair(m_Computer->appVersion, m_Pin, m_Computer->serverCert);
|
NvPairingManager::PairState result = pairingManager.pair(m_Computer->appVersion, m_Pin, m_Computer->serverCert);
|
||||||
@@ -486,6 +487,9 @@ private:
|
|||||||
emit pairingCompleted(m_Computer, "Another pairing attempt is already in progress.");
|
emit pairingCompleted(m_Computer, "Another pairing attempt is already in progress.");
|
||||||
break;
|
break;
|
||||||
case NvPairingManager::PairState::PAIRED:
|
case NvPairingManager::PairState::PAIRED:
|
||||||
|
// Persist the newly pinned server certificate for this host
|
||||||
|
m_ComputerManager->saveHosts();
|
||||||
|
|
||||||
emit pairingCompleted(m_Computer, nullptr);
|
emit pairingCompleted(m_Computer, nullptr);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -496,6 +500,7 @@ private:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ComputerManager* m_ComputerManager;
|
||||||
NvComputer* m_Computer;
|
NvComputer* m_Computer;
|
||||||
QString m_Pin;
|
QString m_Pin;
|
||||||
};
|
};
|
||||||
@@ -526,7 +531,7 @@ signals:
|
|||||||
private:
|
private:
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
NvHTTP http(m_Computer->activeAddress, m_Computer->serverCert);
|
NvHTTP http(m_Computer);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (m_Computer->currentGameId != 0) {
|
if (m_Computer->currentGameId != 0) {
|
||||||
@@ -592,12 +597,24 @@ void ComputerManager::stopPollingAsync()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ComputerManager::addNewHostManually(QString address)
|
||||||
|
{
|
||||||
|
QUrl url = QUrl::fromUserInput(address);
|
||||||
|
if (url.isValid() && !url.host().isEmpty()) {
|
||||||
|
// If there wasn't a port specified, use the default
|
||||||
|
addNewHost(NvAddress(url.host(), url.port(DEFAULT_HTTP_PORT)), false);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
emit computerAddCompleted(false, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class PendingAddTask : public QObject, public QRunnable
|
class PendingAddTask : public QObject, public QRunnable
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
PendingAddTask(ComputerManager* computerManager, QString address, QHostAddress mdnsIpv6Address, bool mdns)
|
PendingAddTask(ComputerManager* computerManager, NvAddress address, NvAddress mdnsIpv6Address, bool mdns)
|
||||||
: m_ComputerManager(computerManager),
|
: m_ComputerManager(computerManager),
|
||||||
m_Address(address),
|
m_Address(address),
|
||||||
m_MdnsIpv6Address(mdnsIpv6Address),
|
m_MdnsIpv6Address(mdnsIpv6Address),
|
||||||
@@ -661,15 +678,15 @@ private:
|
|||||||
|
|
||||||
void run()
|
void run()
|
||||||
{
|
{
|
||||||
NvHTTP http(m_Address, QSslCertificate());
|
NvHTTP http(m_Address, 0, QSslCertificate());
|
||||||
|
|
||||||
qInfo() << "Processing new PC at" << m_Address << "from" << (m_Mdns ? "mDNS" : "user") << m_MdnsIpv6Address;
|
qInfo() << "Processing new PC at" << m_Address.toString() << "from" << (m_Mdns ? "mDNS" : "user") << "with IPv6 address" << m_MdnsIpv6Address.toString();
|
||||||
|
|
||||||
// Perform initial serverinfo fetch over HTTP since we don't know which cert to use
|
// Perform initial serverinfo fetch over HTTP since we don't know which cert to use
|
||||||
QString serverInfo = fetchServerInfo(http);
|
QString serverInfo = fetchServerInfo(http);
|
||||||
if (serverInfo.isEmpty() && !m_MdnsIpv6Address.isNull()) {
|
if (serverInfo.isEmpty() && !m_MdnsIpv6Address.isNull()) {
|
||||||
// Retry using the global IPv6 address if the IPv4 or link-local IPv6 address fails
|
// Retry using the global IPv6 address if the IPv4 or link-local IPv6 address fails
|
||||||
http.setAddress(m_MdnsIpv6Address.toString());
|
http.setAddress(m_MdnsIpv6Address);
|
||||||
serverInfo = fetchServerInfo(http);
|
serverInfo = fetchServerInfo(http);
|
||||||
}
|
}
|
||||||
if (serverInfo.isEmpty()) {
|
if (serverInfo.isEmpty()) {
|
||||||
@@ -677,7 +694,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create initial newComputer using HTTP serverinfo with no pinned cert
|
// Create initial newComputer using HTTP serverinfo with no pinned cert
|
||||||
NvComputer* newComputer = new NvComputer(http.address(), serverInfo, QSslCertificate());
|
NvComputer* newComputer = new NvComputer(http, serverInfo);
|
||||||
|
|
||||||
// Check if we have a record of this host UUID to pull the pinned cert
|
// Check if we have a record of this host UUID to pull the pinned cert
|
||||||
NvComputer* existingComputer;
|
NvComputer* existingComputer;
|
||||||
@@ -691,13 +708,14 @@ private:
|
|||||||
|
|
||||||
// Fetch serverinfo again over HTTPS with the pinned cert
|
// Fetch serverinfo again over HTTPS with the pinned cert
|
||||||
if (existingComputer != nullptr) {
|
if (existingComputer != nullptr) {
|
||||||
|
Q_ASSERT(http.httpsPort() != 0);
|
||||||
serverInfo = fetchServerInfo(http);
|
serverInfo = fetchServerInfo(http);
|
||||||
if (serverInfo.isEmpty()) {
|
if (serverInfo.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update the polled computer with the HTTPS information
|
// Update the polled computer with the HTTPS information
|
||||||
NvComputer httpsComputer(http.address(), serverInfo, QSslCertificate());
|
NvComputer httpsComputer(http, serverInfo);
|
||||||
newComputer->update(httpsComputer);
|
newComputer->update(httpsComputer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -711,11 +729,11 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get the WAN IP address using STUN if we're on mDNS over IPv4
|
// Get the WAN IP address using STUN if we're on mDNS over IPv4
|
||||||
if (QHostAddress(newComputer->localAddress).protocol() == QAbstractSocket::IPv4Protocol) {
|
if (QHostAddress(newComputer->localAddress.address()).protocol() == QAbstractSocket::IPv4Protocol) {
|
||||||
quint32 addr;
|
quint32 addr;
|
||||||
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
|
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
newComputer->remoteAddress = QHostAddress(qFromBigEndian(addr)).toString();
|
newComputer->setRemoteAddress(QHostAddress(qFromBigEndian(addr)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
qWarning() << "STUN failed to get WAN address:" << err;
|
qWarning() << "STUN failed to get WAN address:" << err;
|
||||||
@@ -723,15 +741,15 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!m_MdnsIpv6Address.isNull()) {
|
if (!m_MdnsIpv6Address.isNull()) {
|
||||||
Q_ASSERT(m_MdnsIpv6Address.protocol() == QAbstractSocket::IPv6Protocol);
|
Q_ASSERT(QHostAddress(m_MdnsIpv6Address.address()).protocol() == QAbstractSocket::IPv6Protocol);
|
||||||
newComputer->ipv6Address = m_MdnsIpv6Address.toString();
|
newComputer->ipv6Address = m_MdnsIpv6Address;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
newComputer->manualAddress = m_Address;
|
newComputer->manualAddress = m_Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
QHostAddress hostAddress(m_Address);
|
QHostAddress hostAddress(m_Address.address());
|
||||||
bool addressIsSiteLocalV4 =
|
bool addressIsSiteLocalV4 =
|
||||||
hostAddress.isInSubnet(QHostAddress("10.0.0.0"), 8) ||
|
hostAddress.isInSubnet(QHostAddress("10.0.0.0"), 8) ||
|
||||||
hostAddress.isInSubnet(QHostAddress("172.16.0.0"), 12) ||
|
hostAddress.isInSubnet(QHostAddress("172.16.0.0"), 12) ||
|
||||||
@@ -756,7 +774,7 @@ private:
|
|||||||
|
|
||||||
// Tell our client if something changed
|
// Tell our client if something changed
|
||||||
if (changed) {
|
if (changed) {
|
||||||
qInfo() << existingComputer->name << "is now at" << existingComputer->activeAddress;
|
qInfo() << existingComputer->name << "is now at" << existingComputer->activeAddress.toString();
|
||||||
emit computerStateChanged(existingComputer);
|
emit computerStateChanged(existingComputer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -777,7 +795,7 @@ private:
|
|||||||
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
|
int err = LiFindExternalAddressIP4("stun.moonlight-stream.org", 3478, &addr);
|
||||||
if (err == 0) {
|
if (err == 0) {
|
||||||
lock.relock();
|
lock.relock();
|
||||||
newComputer->remoteAddress = QHostAddress(qFromBigEndian(addr)).toString();
|
newComputer->setRemoteAddress(QHostAddress(qFromBigEndian(addr)));
|
||||||
lock.unlock();
|
lock.unlock();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
@@ -797,12 +815,12 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
ComputerManager* m_ComputerManager;
|
ComputerManager* m_ComputerManager;
|
||||||
QString m_Address;
|
NvAddress m_Address;
|
||||||
QHostAddress m_MdnsIpv6Address;
|
NvAddress m_MdnsIpv6Address;
|
||||||
bool m_Mdns;
|
bool m_Mdns;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ComputerManager::addNewHost(QString address, bool mdns, QHostAddress mdnsIpv6Address)
|
void ComputerManager::addNewHost(NvAddress address, bool mdns, NvAddress mdnsIpv6Address)
|
||||||
{
|
{
|
||||||
// Punt to a worker thread to avoid stalling the
|
// Punt to a worker thread to avoid stalling the
|
||||||
// UI while waiting for serverinfo query to complete
|
// UI while waiting for serverinfo query to complete
|
||||||
@@ -810,4 +828,14 @@ void ComputerManager::addNewHost(QString address, bool mdns, QHostAddress mdnsIp
|
|||||||
QThreadPool::globalInstance()->start(addTask);
|
QThreadPool::globalInstance()->start(addTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: Use QRandomGenerator when we drop Qt 5.9 support
|
||||||
|
QString ComputerManager::generatePinString()
|
||||||
|
{
|
||||||
|
std::uniform_int_distribution<int> dist(0, 9999);
|
||||||
|
std::random_device rd;
|
||||||
|
std::mt19937 engine(rd());
|
||||||
|
|
||||||
|
return QString::asprintf("%04u", dist(engine));
|
||||||
|
}
|
||||||
|
|
||||||
#include "computermanager.moc"
|
#include "computermanager.moc"
|
||||||
@@ -24,6 +24,7 @@ public:
|
|||||||
explicit MdnsPendingComputer(QMdnsEngine::Server* server,
|
explicit MdnsPendingComputer(QMdnsEngine::Server* server,
|
||||||
const QMdnsEngine::Service& service)
|
const QMdnsEngine::Service& service)
|
||||||
: m_Hostname(service.hostname()),
|
: m_Hostname(service.hostname()),
|
||||||
|
m_Port(service.port()),
|
||||||
m_Server(server),
|
m_Server(server),
|
||||||
m_Resolver(nullptr)
|
m_Resolver(nullptr)
|
||||||
{
|
{
|
||||||
@@ -41,6 +42,11 @@ public:
|
|||||||
return m_Hostname;
|
return m_Hostname;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
uint16_t port()
|
||||||
|
{
|
||||||
|
return m_Port;
|
||||||
|
}
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void handleResolvedTimeout()
|
void handleResolvedTimeout()
|
||||||
{
|
{
|
||||||
@@ -75,6 +81,7 @@ private:
|
|||||||
}
|
}
|
||||||
|
|
||||||
QByteArray m_Hostname;
|
QByteArray m_Hostname;
|
||||||
|
uint16_t m_Port;
|
||||||
QMdnsEngine::Server* m_Server;
|
QMdnsEngine::Server* m_Server;
|
||||||
QMdnsEngine::Resolver* m_Resolver;
|
QMdnsEngine::Resolver* m_Resolver;
|
||||||
QVector<QHostAddress> m_Addresses;
|
QVector<QHostAddress> m_Addresses;
|
||||||
@@ -159,6 +166,7 @@ class ComputerManager : public QObject
|
|||||||
|
|
||||||
friend class DeferredHostDeletionTask;
|
friend class DeferredHostDeletionTask;
|
||||||
friend class PendingAddTask;
|
friend class PendingAddTask;
|
||||||
|
friend class PendingPairingTask;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ComputerManager(QObject *parent = nullptr);
|
explicit ComputerManager(QObject *parent = nullptr);
|
||||||
@@ -169,7 +177,11 @@ public:
|
|||||||
|
|
||||||
Q_INVOKABLE void stopPollingAsync();
|
Q_INVOKABLE void stopPollingAsync();
|
||||||
|
|
||||||
Q_INVOKABLE void addNewHost(QString address, bool mdns, QHostAddress mdnsIpv6Address = QHostAddress());
|
Q_INVOKABLE void addNewHostManually(QString address);
|
||||||
|
|
||||||
|
void addNewHost(NvAddress address, bool mdns, NvAddress mdnsIpv6Address = NvAddress());
|
||||||
|
|
||||||
|
QString generatePinString();
|
||||||
|
|
||||||
void pairHost(NvComputer* computer, QString pin);
|
void pairHost(NvComputer* computer, QString pin);
|
||||||
|
|
||||||
|
|||||||
@@ -20,7 +20,7 @@ void ComputerSeeker::start(int timeout)
|
|||||||
// if m_ComputerName is UUID, or the name that doesn't resolve to an IP
|
// if m_ComputerName is UUID, or the name that doesn't resolve to an IP
|
||||||
// address) and by polling it using mDNS, hopefully one of these methods
|
// address) and by polling it using mDNS, hopefully one of these methods
|
||||||
// would find the host
|
// would find the host
|
||||||
m_ComputerManager->addNewHost(m_ComputerName, false);
|
m_ComputerManager->addNewHostManually(m_ComputerName);
|
||||||
m_ComputerManager->startPolling();
|
m_ComputerManager->startPolling();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -44,8 +44,8 @@ bool ComputerSeeker::matchComputer(NvComputer *computer) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const QString& addr : computer->uniqueAddresses()) {
|
for (const NvAddress& addr : computer->uniqueAddresses()) {
|
||||||
if (addr.toLower() == value) {
|
if (addr.address().toLower() == value || addr.toString().toLower() == value) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,65 @@
|
|||||||
|
#include "nvaddress.h"
|
||||||
|
|
||||||
|
#include <QHostAddress>
|
||||||
|
|
||||||
|
NvAddress::NvAddress()
|
||||||
|
{
|
||||||
|
setAddress(nullptr);
|
||||||
|
setPort(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
NvAddress::NvAddress(QString addr, uint16_t port)
|
||||||
|
{
|
||||||
|
setAddress(addr);
|
||||||
|
setPort(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
NvAddress::NvAddress(QHostAddress addr, uint16_t port)
|
||||||
|
{
|
||||||
|
setAddress(addr);
|
||||||
|
setPort(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t NvAddress::port() const
|
||||||
|
{
|
||||||
|
return m_Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString NvAddress::address() const
|
||||||
|
{
|
||||||
|
return m_Address;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NvAddress::setPort(uint16_t port)
|
||||||
|
{
|
||||||
|
m_Port = port;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NvAddress::setAddress(QString addr)
|
||||||
|
{
|
||||||
|
m_Address = addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NvAddress::setAddress(QHostAddress addr)
|
||||||
|
{
|
||||||
|
m_Address = addr.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool NvAddress::isNull() const
|
||||||
|
{
|
||||||
|
return m_Address.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString NvAddress::toString() const
|
||||||
|
{
|
||||||
|
if (m_Address.isEmpty()) {
|
||||||
|
return "<NULL>";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (QHostAddress(m_Address).protocol() == QAbstractSocket::IPv6Protocol) {
|
||||||
|
return QString("[%1]:%2").arg(m_Address).arg(m_Port);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return QString("%1:%2").arg(m_Address).arg(m_Port);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QHostAddress>
|
||||||
|
|
||||||
|
#define DEFAULT_HTTP_PORT 47989
|
||||||
|
#define DEFAULT_HTTPS_PORT 47984
|
||||||
|
|
||||||
|
class NvAddress
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
NvAddress();
|
||||||
|
explicit NvAddress(QString addr, uint16_t port);
|
||||||
|
explicit NvAddress(QHostAddress addr, uint16_t port);
|
||||||
|
|
||||||
|
uint16_t port() const;
|
||||||
|
void setPort(uint16_t port);
|
||||||
|
|
||||||
|
QString address() const;
|
||||||
|
void setAddress(QString addr);
|
||||||
|
void setAddress(QHostAddress addr);
|
||||||
|
|
||||||
|
bool isNull() const;
|
||||||
|
QString toString() const;
|
||||||
|
|
||||||
|
bool operator==(const NvAddress& other) const
|
||||||
|
{
|
||||||
|
return m_Address == other.m_Address &&
|
||||||
|
m_Port == other.m_Port;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool operator!=(const NvAddress& other) const
|
||||||
|
{
|
||||||
|
return !operator==(other);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_Address;
|
||||||
|
uint16_t m_Port;
|
||||||
|
};
|
||||||
+70
-26
@@ -11,9 +11,13 @@
|
|||||||
#define SER_UUID "uuid"
|
#define SER_UUID "uuid"
|
||||||
#define SER_MAC "mac"
|
#define SER_MAC "mac"
|
||||||
#define SER_LOCALADDR "localaddress"
|
#define SER_LOCALADDR "localaddress"
|
||||||
|
#define SER_LOCALPORT "localport"
|
||||||
#define SER_REMOTEADDR "remoteaddress"
|
#define SER_REMOTEADDR "remoteaddress"
|
||||||
|
#define SER_REMOTEPORT "remoteport"
|
||||||
#define SER_MANUALADDR "manualaddress"
|
#define SER_MANUALADDR "manualaddress"
|
||||||
|
#define SER_MANUALPORT "manualport"
|
||||||
#define SER_IPV6ADDR "ipv6address"
|
#define SER_IPV6ADDR "ipv6address"
|
||||||
|
#define SER_IPV6PORT "ipv6port"
|
||||||
#define SER_APPLIST "apps"
|
#define SER_APPLIST "apps"
|
||||||
#define SER_SRVCERT "srvcert"
|
#define SER_SRVCERT "srvcert"
|
||||||
#define SER_CUSTOMNAME "customname"
|
#define SER_CUSTOMNAME "customname"
|
||||||
@@ -24,10 +28,14 @@ NvComputer::NvComputer(QSettings& settings)
|
|||||||
this->uuid = settings.value(SER_UUID).toString();
|
this->uuid = settings.value(SER_UUID).toString();
|
||||||
this->hasCustomName = settings.value(SER_CUSTOMNAME).toBool();
|
this->hasCustomName = settings.value(SER_CUSTOMNAME).toBool();
|
||||||
this->macAddress = settings.value(SER_MAC).toByteArray();
|
this->macAddress = settings.value(SER_MAC).toByteArray();
|
||||||
this->localAddress = settings.value(SER_LOCALADDR).toString();
|
this->localAddress = NvAddress(settings.value(SER_LOCALADDR).toString(),
|
||||||
this->remoteAddress = settings.value(SER_REMOTEADDR).toString();
|
settings.value(SER_LOCALPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
|
||||||
this->ipv6Address = settings.value(SER_IPV6ADDR).toString();
|
this->remoteAddress = NvAddress(settings.value(SER_REMOTEADDR).toString(),
|
||||||
this->manualAddress = settings.value(SER_MANUALADDR).toString();
|
settings.value(SER_REMOTEPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
|
||||||
|
this->ipv6Address = NvAddress(settings.value(SER_IPV6ADDR).toString(),
|
||||||
|
settings.value(SER_IPV6PORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
|
||||||
|
this->manualAddress = NvAddress(settings.value(SER_MANUALADDR).toString(),
|
||||||
|
settings.value(SER_MANUALPORT, QVariant(DEFAULT_HTTP_PORT)).toUInt());
|
||||||
this->serverCert = QSslCertificate(settings.value(SER_SRVCERT).toByteArray());
|
this->serverCert = QSslCertificate(settings.value(SER_SRVCERT).toByteArray());
|
||||||
|
|
||||||
int appCount = settings.beginReadArray(SER_APPLIST);
|
int appCount = settings.beginReadArray(SER_APPLIST);
|
||||||
@@ -41,7 +49,6 @@ NvComputer::NvComputer(QSettings& settings)
|
|||||||
settings.endArray();
|
settings.endArray();
|
||||||
sortAppList();
|
sortAppList();
|
||||||
|
|
||||||
this->activeAddress = nullptr;
|
|
||||||
this->currentGameId = 0;
|
this->currentGameId = 0;
|
||||||
this->pairState = PS_UNKNOWN;
|
this->pairState = PS_UNKNOWN;
|
||||||
this->state = CS_UNKNOWN;
|
this->state = CS_UNKNOWN;
|
||||||
@@ -52,6 +59,15 @@ NvComputer::NvComputer(QSettings& settings)
|
|||||||
this->pendingQuit = false;
|
this->pendingQuit = false;
|
||||||
this->gpuModel = nullptr;
|
this->gpuModel = nullptr;
|
||||||
this->isSupportedServerVersion = true;
|
this->isSupportedServerVersion = true;
|
||||||
|
this->externalPort = this->remoteAddress.port();
|
||||||
|
this->activeHttpsPort = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void NvComputer::setRemoteAddress(QHostAddress address)
|
||||||
|
{
|
||||||
|
Q_ASSERT(this->externalPort != 0);
|
||||||
|
|
||||||
|
this->remoteAddress = NvAddress(address, this->externalPort);
|
||||||
}
|
}
|
||||||
|
|
||||||
void NvComputer::serialize(QSettings& settings) const
|
void NvComputer::serialize(QSettings& settings) const
|
||||||
@@ -62,10 +78,14 @@ void NvComputer::serialize(QSettings& settings) const
|
|||||||
settings.setValue(SER_CUSTOMNAME, hasCustomName);
|
settings.setValue(SER_CUSTOMNAME, hasCustomName);
|
||||||
settings.setValue(SER_UUID, uuid);
|
settings.setValue(SER_UUID, uuid);
|
||||||
settings.setValue(SER_MAC, macAddress);
|
settings.setValue(SER_MAC, macAddress);
|
||||||
settings.setValue(SER_LOCALADDR, localAddress);
|
settings.setValue(SER_LOCALADDR, localAddress.address());
|
||||||
settings.setValue(SER_REMOTEADDR, remoteAddress);
|
settings.setValue(SER_LOCALPORT, localAddress.port());
|
||||||
settings.setValue(SER_IPV6ADDR, ipv6Address);
|
settings.setValue(SER_REMOTEADDR, remoteAddress.address());
|
||||||
settings.setValue(SER_MANUALADDR, manualAddress);
|
settings.setValue(SER_REMOTEPORT, remoteAddress.port());
|
||||||
|
settings.setValue(SER_IPV6ADDR, ipv6Address.address());
|
||||||
|
settings.setValue(SER_IPV6PORT, ipv6Address.port());
|
||||||
|
settings.setValue(SER_MANUALADDR, manualAddress.address());
|
||||||
|
settings.setValue(SER_MANUALPORT, manualAddress.port());
|
||||||
settings.setValue(SER_SRVCERT, serverCert.toPem());
|
settings.setValue(SER_SRVCERT, serverCert.toPem());
|
||||||
|
|
||||||
// Avoid deleting an existing applist if we couldn't get one
|
// Avoid deleting an existing applist if we couldn't get one
|
||||||
@@ -87,9 +107,9 @@ void NvComputer::sortAppList()
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serverCert)
|
NvComputer::NvComputer(NvHTTP& http, QString serverInfo)
|
||||||
{
|
{
|
||||||
this->serverCert = serverCert;
|
this->serverCert = http.serverCert();
|
||||||
|
|
||||||
this->hasCustomName = false;
|
this->hasCustomName = false;
|
||||||
this->name = NvHTTP::getXmlString(serverInfo, "hostname");
|
this->name = NvHTTP::getXmlString(serverInfo, "hostname");
|
||||||
@@ -130,19 +150,38 @@ NvComputer::NvComputer(QString address, QString serverInfo, QSslCertificate serv
|
|||||||
});
|
});
|
||||||
|
|
||||||
// We can get an IPv4 loopback address if we're using the GS IPv6 Forwarder
|
// We can get an IPv4 loopback address if we're using the GS IPv6 Forwarder
|
||||||
this->localAddress = NvHTTP::getXmlString(serverInfo, "LocalIP");
|
this->localAddress = NvAddress(NvHTTP::getXmlString(serverInfo, "LocalIP"), http.httpPort());
|
||||||
if (this->localAddress.startsWith("127.")) {
|
if (this->localAddress.address().startsWith("127.")) {
|
||||||
this->localAddress = QString();
|
this->localAddress = NvAddress();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString httpsPort = NvHTTP::getXmlString(serverInfo, "HttpsPort");
|
||||||
|
if (httpsPort.isEmpty() || (this->activeHttpsPort = httpsPort.toUShort()) == 0) {
|
||||||
|
this->activeHttpsPort = DEFAULT_HTTPS_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is an extension which is not present in GFE. It is present for Sunshine to be able
|
||||||
|
// to support dynamic HTTP WAN ports without requiring the user to manually enter the port.
|
||||||
|
QString remotePortStr = NvHTTP::getXmlString(serverInfo, "ExternalPort");
|
||||||
|
if (remotePortStr.isEmpty() || (this->externalPort = remotePortStr.toUShort()) == 0) {
|
||||||
|
this->externalPort = DEFAULT_HTTP_PORT;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString remoteAddress = NvHTTP::getXmlString(serverInfo, "ExternalIP");
|
||||||
|
if (!remoteAddress.isEmpty()) {
|
||||||
|
this->remoteAddress = NvAddress(remoteAddress, this->externalPort);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
this->remoteAddress = NvAddress();
|
||||||
}
|
}
|
||||||
|
|
||||||
this->remoteAddress = NvHTTP::getXmlString(serverInfo, "ExternalIP");
|
|
||||||
this->pairState = NvHTTP::getXmlString(serverInfo, "PairStatus") == "1" ?
|
this->pairState = NvHTTP::getXmlString(serverInfo, "PairStatus") == "1" ?
|
||||||
PS_PAIRED : PS_NOT_PAIRED;
|
PS_PAIRED : PS_NOT_PAIRED;
|
||||||
this->currentGameId = NvHTTP::getCurrentGame(serverInfo);
|
this->currentGameId = NvHTTP::getCurrentGame(serverInfo);
|
||||||
this->appVersion = NvHTTP::getXmlString(serverInfo, "appversion");
|
this->appVersion = NvHTTP::getXmlString(serverInfo, "appversion");
|
||||||
this->gfeVersion = NvHTTP::getXmlString(serverInfo, "GfeVersion");
|
this->gfeVersion = NvHTTP::getXmlString(serverInfo, "GfeVersion");
|
||||||
this->gpuModel = NvHTTP::getXmlString(serverInfo, "gputype");
|
this->gpuModel = NvHTTP::getXmlString(serverInfo, "gputype");
|
||||||
this->activeAddress = address;
|
this->activeAddress = http.address();
|
||||||
this->state = NvComputer::CS_ONLINE;
|
this->state = NvComputer::CS_ONLINE;
|
||||||
this->pendingQuit = false;
|
this->pendingQuit = false;
|
||||||
this->isSupportedServerVersion = CompatFetcher::isGfeVersionSupported(this->gfeVersion);
|
this->isSupportedServerVersion = CompatFetcher::isGfeVersionSupported(this->gfeVersion);
|
||||||
@@ -177,7 +216,10 @@ bool NvComputer::wake()
|
|||||||
// Add the addresses that we know this host to be
|
// Add the addresses that we know this host to be
|
||||||
// and broadcast addresses for this link just in
|
// and broadcast addresses for this link just in
|
||||||
// case the host has timed out in ARP entries.
|
// case the host has timed out in ARP entries.
|
||||||
QVector<QString> addressList = uniqueAddresses();
|
QVector<QString> addressList;
|
||||||
|
for (const NvAddress& addr : uniqueAddresses()) {
|
||||||
|
addressList.append(addr.address());
|
||||||
|
}
|
||||||
addressList.append("255.255.255.255");
|
addressList.append("255.255.255.255");
|
||||||
|
|
||||||
// Try to broadcast on all available NICs
|
// Try to broadcast on all available NICs
|
||||||
@@ -238,14 +280,14 @@ bool NvComputer::wake()
|
|||||||
|
|
||||||
bool NvComputer::isReachableOverVpn()
|
bool NvComputer::isReachableOverVpn()
|
||||||
{
|
{
|
||||||
if (activeAddress.isEmpty()) {
|
if (activeAddress.isNull()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
QTcpSocket s;
|
QTcpSocket s;
|
||||||
|
|
||||||
s.setProxy(QNetworkProxy::NoProxy);
|
s.setProxy(QNetworkProxy::NoProxy);
|
||||||
s.connectToHost(activeAddress, 47984);
|
s.connectToHost(activeAddress.address(), activeAddress.port());
|
||||||
if (s.waitForConnected(3000)) {
|
if (s.waitForConnected(3000)) {
|
||||||
Q_ASSERT(!s.localAddress().isNull());
|
Q_ASSERT(!s.localAddress().isNull());
|
||||||
|
|
||||||
@@ -331,9 +373,9 @@ bool NvComputer::updateAppList(QVector<NvApp> newAppList) {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
QVector<QString> NvComputer::uniqueAddresses() const
|
QVector<NvAddress> NvComputer::uniqueAddresses() const
|
||||||
{
|
{
|
||||||
QVector<QString> uniqueAddressList;
|
QVector<NvAddress> uniqueAddressList;
|
||||||
|
|
||||||
// Start with addresses correctly ordered
|
// Start with addresses correctly ordered
|
||||||
uniqueAddressList.append(activeAddress);
|
uniqueAddressList.append(activeAddress);
|
||||||
@@ -344,7 +386,7 @@ QVector<QString> NvComputer::uniqueAddresses() const
|
|||||||
|
|
||||||
// Prune duplicates (always giving precedence to the first)
|
// Prune duplicates (always giving precedence to the first)
|
||||||
for (int i = 0; i < uniqueAddressList.count(); i++) {
|
for (int i = 0; i < uniqueAddressList.count(); i++) {
|
||||||
if (uniqueAddressList[i].isEmpty()) {
|
if (uniqueAddressList[i].isNull()) {
|
||||||
uniqueAddressList.remove(i);
|
uniqueAddressList.remove(i);
|
||||||
i--;
|
i--;
|
||||||
continue;
|
continue;
|
||||||
@@ -400,10 +442,12 @@ bool NvComputer::update(NvComputer& that)
|
|||||||
ASSIGN_IF_CHANGED(name);
|
ASSIGN_IF_CHANGED(name);
|
||||||
}
|
}
|
||||||
ASSIGN_IF_CHANGED_AND_NONEMPTY(macAddress);
|
ASSIGN_IF_CHANGED_AND_NONEMPTY(macAddress);
|
||||||
ASSIGN_IF_CHANGED_AND_NONEMPTY(localAddress);
|
ASSIGN_IF_CHANGED_AND_NONNULL(localAddress);
|
||||||
ASSIGN_IF_CHANGED_AND_NONEMPTY(remoteAddress);
|
ASSIGN_IF_CHANGED_AND_NONNULL(remoteAddress);
|
||||||
ASSIGN_IF_CHANGED_AND_NONEMPTY(ipv6Address);
|
ASSIGN_IF_CHANGED_AND_NONNULL(ipv6Address);
|
||||||
ASSIGN_IF_CHANGED_AND_NONEMPTY(manualAddress);
|
ASSIGN_IF_CHANGED_AND_NONNULL(manualAddress);
|
||||||
|
ASSIGN_IF_CHANGED(activeHttpsPort);
|
||||||
|
ASSIGN_IF_CHANGED(externalPort);
|
||||||
ASSIGN_IF_CHANGED(pairState);
|
ASSIGN_IF_CHANGED(pairState);
|
||||||
ASSIGN_IF_CHANGED(serverCodecModeSupport);
|
ASSIGN_IF_CHANGED(serverCodecModeSupport);
|
||||||
ASSIGN_IF_CHANGED(currentGameId);
|
ASSIGN_IF_CHANGED(currentGameId);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "nvhttp.h"
|
#include "nvhttp.h"
|
||||||
|
#include "nvaddress.h"
|
||||||
|
|
||||||
#include <QThread>
|
#include <QThread>
|
||||||
#include <QReadWriteLock>
|
#include <QReadWriteLock>
|
||||||
@@ -21,10 +22,13 @@ private:
|
|||||||
bool pendingQuit;
|
bool pendingQuit;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit NvComputer(QString address, QString serverInfo, QSslCertificate serverCert);
|
explicit NvComputer(NvHTTP& http, QString serverInfo);
|
||||||
|
|
||||||
explicit NvComputer(QSettings& settings);
|
explicit NvComputer(QSettings& settings);
|
||||||
|
|
||||||
|
void
|
||||||
|
setRemoteAddress(QHostAddress);
|
||||||
|
|
||||||
bool
|
bool
|
||||||
update(NvComputer& that);
|
update(NvComputer& that);
|
||||||
|
|
||||||
@@ -34,7 +38,7 @@ public:
|
|||||||
bool
|
bool
|
||||||
isReachableOverVpn();
|
isReachableOverVpn();
|
||||||
|
|
||||||
QVector<QString>
|
QVector<NvAddress>
|
||||||
uniqueAddresses() const;
|
uniqueAddresses() const;
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -57,7 +61,8 @@ public:
|
|||||||
// Ephemeral traits
|
// Ephemeral traits
|
||||||
ComputerState state;
|
ComputerState state;
|
||||||
PairState pairState;
|
PairState pairState;
|
||||||
QString activeAddress;
|
NvAddress activeAddress;
|
||||||
|
uint16_t activeHttpsPort;
|
||||||
int currentGameId;
|
int currentGameId;
|
||||||
QString gfeVersion;
|
QString gfeVersion;
|
||||||
QString appVersion;
|
QString appVersion;
|
||||||
@@ -68,10 +73,10 @@ public:
|
|||||||
bool isSupportedServerVersion;
|
bool isSupportedServerVersion;
|
||||||
|
|
||||||
// Persisted traits
|
// Persisted traits
|
||||||
QString localAddress;
|
NvAddress localAddress;
|
||||||
QString remoteAddress;
|
NvAddress remoteAddress;
|
||||||
QString ipv6Address;
|
NvAddress ipv6Address;
|
||||||
QString manualAddress;
|
NvAddress manualAddress;
|
||||||
QByteArray macAddress;
|
QByteArray macAddress;
|
||||||
QString name;
|
QString name;
|
||||||
bool hasCustomName;
|
bool hasCustomName;
|
||||||
@@ -81,4 +86,7 @@ public:
|
|||||||
|
|
||||||
// Synchronization
|
// Synchronization
|
||||||
mutable QReadWriteLock lock;
|
mutable QReadWriteLock lock;
|
||||||
|
|
||||||
|
private:
|
||||||
|
uint16_t externalPort;
|
||||||
};
|
};
|
||||||
+70
-14
@@ -1,4 +1,4 @@
|
|||||||
#include "nvhttp.h"
|
#include "nvcomputer.h"
|
||||||
#include <Limelight.h>
|
#include <Limelight.h>
|
||||||
|
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
@@ -18,15 +18,14 @@
|
|||||||
#define RESUME_TIMEOUT_MS 30000
|
#define RESUME_TIMEOUT_MS 30000
|
||||||
#define QUIT_TIMEOUT_MS 30000
|
#define QUIT_TIMEOUT_MS 30000
|
||||||
|
|
||||||
NvHTTP::NvHTTP(QString address, QSslCertificate serverCert) :
|
NvHTTP::NvHTTP(NvAddress address, uint16_t httpsPort, QSslCertificate serverCert) :
|
||||||
m_ServerCert(serverCert)
|
m_ServerCert(serverCert)
|
||||||
{
|
{
|
||||||
m_BaseUrlHttp.setScheme("http");
|
m_BaseUrlHttp.setScheme("http");
|
||||||
m_BaseUrlHttps.setScheme("https");
|
m_BaseUrlHttps.setScheme("https");
|
||||||
m_BaseUrlHttp.setPort(47989);
|
|
||||||
m_BaseUrlHttps.setPort(47984);
|
|
||||||
|
|
||||||
setAddress(address);
|
setAddress(address);
|
||||||
|
setHttpsPort(httpsPort);
|
||||||
|
|
||||||
// Never use a proxy server
|
// Never use a proxy server
|
||||||
QNetworkProxy noProxy(QNetworkProxy::NoProxy);
|
QNetworkProxy noProxy(QNetworkProxy::NoProxy);
|
||||||
@@ -35,26 +34,54 @@ NvHTTP::NvHTTP(QString address, QSslCertificate serverCert) :
|
|||||||
connect(&m_Nam, &QNetworkAccessManager::sslErrors, this, &NvHTTP::handleSslErrors);
|
connect(&m_Nam, &QNetworkAccessManager::sslErrors, this, &NvHTTP::handleSslErrors);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NvHTTP::NvHTTP(NvComputer* computer) :
|
||||||
|
NvHTTP(computer->activeAddress, computer->activeHttpsPort, computer->serverCert)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
void NvHTTP::setServerCert(QSslCertificate serverCert)
|
void NvHTTP::setServerCert(QSslCertificate serverCert)
|
||||||
{
|
{
|
||||||
m_ServerCert = serverCert;
|
m_ServerCert = serverCert;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NvHTTP::setAddress(QString address)
|
void NvHTTP::setAddress(NvAddress address)
|
||||||
{
|
{
|
||||||
Q_ASSERT(!address.isEmpty());
|
Q_ASSERT(!address.isNull());
|
||||||
|
|
||||||
m_Address = address;
|
m_Address = address;
|
||||||
|
|
||||||
m_BaseUrlHttp.setHost(address);
|
m_BaseUrlHttp.setHost(address.address());
|
||||||
m_BaseUrlHttps.setHost(address);
|
m_BaseUrlHttps.setHost(address.address());
|
||||||
|
|
||||||
|
m_BaseUrlHttp.setPort(address.port());
|
||||||
}
|
}
|
||||||
|
|
||||||
QString NvHTTP::address()
|
void NvHTTP::setHttpsPort(uint16_t port)
|
||||||
|
{
|
||||||
|
m_BaseUrlHttps.setPort(port);
|
||||||
|
}
|
||||||
|
|
||||||
|
NvAddress NvHTTP::address()
|
||||||
{
|
{
|
||||||
return m_Address;
|
return m_Address;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QSslCertificate NvHTTP::serverCert()
|
||||||
|
{
|
||||||
|
return m_ServerCert;
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t NvHTTP::httpPort()
|
||||||
|
{
|
||||||
|
return m_BaseUrlHttp.port();
|
||||||
|
}
|
||||||
|
|
||||||
|
uint16_t NvHTTP::httpsPort()
|
||||||
|
{
|
||||||
|
return m_BaseUrlHttps.port();
|
||||||
|
}
|
||||||
|
|
||||||
QVector<int>
|
QVector<int>
|
||||||
NvHTTP::parseQuad(QString quad)
|
NvHTTP::parseQuad(QString quad)
|
||||||
{
|
{
|
||||||
@@ -98,8 +125,8 @@ NvHTTP::getServerInfo(NvLogLevel logLevel, bool fastFail)
|
|||||||
{
|
{
|
||||||
QString serverInfo;
|
QString serverInfo;
|
||||||
|
|
||||||
// Check if we have a pinned cert for this host yet
|
// Check if we have a pinned cert and HTTPS port for this host yet
|
||||||
if (!m_ServerCert.isNull())
|
if (!m_ServerCert.isNull() && httpsPort() != 0)
|
||||||
{
|
{
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
@@ -134,13 +161,26 @@ NvHTTP::getServerInfo(NvLogLevel logLevel, bool fastFail)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// Only use HTTP prior to pairing
|
// Only use HTTP prior to pairing or fetching HTTPS port
|
||||||
serverInfo = openConnectionToString(m_BaseUrlHttp,
|
serverInfo = openConnectionToString(m_BaseUrlHttp,
|
||||||
"serverinfo",
|
"serverinfo",
|
||||||
nullptr,
|
nullptr,
|
||||||
fastFail ? FAST_FAIL_TIMEOUT_MS : REQUEST_TIMEOUT_MS,
|
fastFail ? FAST_FAIL_TIMEOUT_MS : REQUEST_TIMEOUT_MS,
|
||||||
logLevel);
|
logLevel);
|
||||||
verifyResponseStatus(serverInfo);
|
verifyResponseStatus(serverInfo);
|
||||||
|
|
||||||
|
// Populate the HTTPS port
|
||||||
|
uint16_t httpsPort = getXmlString(serverInfo, "HttpsPort").toUShort();
|
||||||
|
if (httpsPort == 0) {
|
||||||
|
httpsPort = DEFAULT_HTTPS_PORT;
|
||||||
|
}
|
||||||
|
setHttpsPort(httpsPort);
|
||||||
|
|
||||||
|
// If we just needed to determine the HTTPS port, we'll try again over
|
||||||
|
// HTTPS now that we have the port number
|
||||||
|
if (!m_ServerCert.isNull()) {
|
||||||
|
return getServerInfo(logLevel, fastFail);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return serverInfo;
|
return serverInfo;
|
||||||
@@ -151,7 +191,8 @@ NvHTTP::launchApp(int appId,
|
|||||||
PSTREAM_CONFIGURATION streamConfig,
|
PSTREAM_CONFIGURATION streamConfig,
|
||||||
bool sops,
|
bool sops,
|
||||||
bool localAudio,
|
bool localAudio,
|
||||||
int gamepadMask)
|
int gamepadMask,
|
||||||
|
QString& rtspSessionUrl)
|
||||||
{
|
{
|
||||||
int riKeyId;
|
int riKeyId;
|
||||||
|
|
||||||
@@ -181,12 +222,16 @@ NvHTTP::launchApp(int appId,
|
|||||||
"&gcmap="+QString::number(gamepadMask),
|
"&gcmap="+QString::number(gamepadMask),
|
||||||
LAUNCH_TIMEOUT_MS);
|
LAUNCH_TIMEOUT_MS);
|
||||||
|
|
||||||
|
qInfo() << "Launch response:" << response;
|
||||||
|
|
||||||
// Throws if the request failed
|
// Throws if the request failed
|
||||||
verifyResponseStatus(response);
|
verifyResponseStatus(response);
|
||||||
|
|
||||||
|
rtspSessionUrl = getXmlString(response, "sessionUrl0");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig)
|
NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig, QString& rtspSessionUrl)
|
||||||
{
|
{
|
||||||
int riKeyId;
|
int riKeyId;
|
||||||
|
|
||||||
@@ -201,8 +246,12 @@ NvHTTP::resumeApp(PSTREAM_CONFIGURATION streamConfig)
|
|||||||
"&surroundAudioInfo="+QString::number(SURROUNDAUDIOINFO_FROM_AUDIO_CONFIGURATION(streamConfig->audioConfiguration)),
|
"&surroundAudioInfo="+QString::number(SURROUNDAUDIOINFO_FROM_AUDIO_CONFIGURATION(streamConfig->audioConfiguration)),
|
||||||
RESUME_TIMEOUT_MS);
|
RESUME_TIMEOUT_MS);
|
||||||
|
|
||||||
|
qInfo() << "Resume response:" << response;
|
||||||
|
|
||||||
// Throws if the request failed
|
// Throws if the request failed
|
||||||
verifyResponseStatus(response);
|
verifyResponseStatus(response);
|
||||||
|
|
||||||
|
rtspSessionUrl = getXmlString(response, "sessionUrl0");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -214,6 +263,8 @@ NvHTTP::quitApp()
|
|||||||
nullptr,
|
nullptr,
|
||||||
QUIT_TIMEOUT_MS);
|
QUIT_TIMEOUT_MS);
|
||||||
|
|
||||||
|
qInfo() << "Quit response:" << response;
|
||||||
|
|
||||||
// Throws if the request failed
|
// Throws if the request failed
|
||||||
verifyResponseStatus(response);
|
verifyResponseStatus(response);
|
||||||
|
|
||||||
@@ -330,6 +381,8 @@ NvHTTP::verifyResponseStatus(QString xml)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
throw GfeHttpResponseException(-1, "Malformed GFE XML (missing root element)");
|
||||||
}
|
}
|
||||||
|
|
||||||
QImage
|
QImage
|
||||||
@@ -435,6 +488,9 @@ NvHTTP::openConnection(QUrl baseUrl,
|
|||||||
int timeoutMs,
|
int timeoutMs,
|
||||||
NvLogLevel logLevel)
|
NvLogLevel logLevel)
|
||||||
{
|
{
|
||||||
|
// Port must be set
|
||||||
|
Q_ASSERT(baseUrl.port(0) != 0);
|
||||||
|
|
||||||
// Build a URL for the request
|
// Build a URL for the request
|
||||||
QUrl url(baseUrl);
|
QUrl url(baseUrl);
|
||||||
url.setPath("/" + command);
|
url.setPath("/" + command);
|
||||||
|
|||||||
+20
-6
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "identitymanager.h"
|
#include "identitymanager.h"
|
||||||
#include "nvapp.h"
|
#include "nvapp.h"
|
||||||
|
#include "nvaddress.h"
|
||||||
|
|
||||||
#include <Limelight.h>
|
#include <Limelight.h>
|
||||||
|
|
||||||
@@ -9,6 +10,8 @@
|
|||||||
#include <QNetworkAccessManager>
|
#include <QNetworkAccessManager>
|
||||||
#include <QNetworkReply>
|
#include <QNetworkReply>
|
||||||
|
|
||||||
|
class NvComputer;
|
||||||
|
|
||||||
class NvDisplayMode
|
class NvDisplayMode
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -106,7 +109,9 @@ public:
|
|||||||
NVLL_VERBOSE
|
NVLL_VERBOSE
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit NvHTTP(QString address, QSslCertificate serverCert);
|
explicit NvHTTP(NvAddress address, uint16_t httpsPort, QSslCertificate serverCert);
|
||||||
|
|
||||||
|
explicit NvHTTP(NvComputer* computer);
|
||||||
|
|
||||||
static
|
static
|
||||||
int
|
int
|
||||||
@@ -138,9 +143,16 @@ public:
|
|||||||
|
|
||||||
void setServerCert(QSslCertificate serverCert);
|
void setServerCert(QSslCertificate serverCert);
|
||||||
|
|
||||||
void setAddress(QString address);
|
void setAddress(NvAddress address);
|
||||||
|
void setHttpsPort(uint16_t port);
|
||||||
|
|
||||||
QString address();
|
NvAddress address();
|
||||||
|
|
||||||
|
QSslCertificate serverCert();
|
||||||
|
|
||||||
|
uint16_t httpPort();
|
||||||
|
|
||||||
|
uint16_t httpsPort();
|
||||||
|
|
||||||
static
|
static
|
||||||
QVector<int>
|
QVector<int>
|
||||||
@@ -150,14 +162,16 @@ public:
|
|||||||
quitApp();
|
quitApp();
|
||||||
|
|
||||||
void
|
void
|
||||||
resumeApp(PSTREAM_CONFIGURATION streamConfig);
|
resumeApp(PSTREAM_CONFIGURATION streamConfig,
|
||||||
|
QString& rtspSessionUrl);
|
||||||
|
|
||||||
void
|
void
|
||||||
launchApp(int appId,
|
launchApp(int appId,
|
||||||
PSTREAM_CONFIGURATION streamConfig,
|
PSTREAM_CONFIGURATION streamConfig,
|
||||||
bool sops,
|
bool sops,
|
||||||
bool localAudio,
|
bool localAudio,
|
||||||
int gamepadMask);
|
int gamepadMask,
|
||||||
|
QString& rtspSessionUrl);
|
||||||
|
|
||||||
QVector<NvApp>
|
QVector<NvApp>
|
||||||
getAppList();
|
getAppList();
|
||||||
@@ -182,7 +196,7 @@ private:
|
|||||||
int timeoutMs,
|
int timeoutMs,
|
||||||
NvLogLevel logLevel);
|
NvLogLevel logLevel);
|
||||||
|
|
||||||
QString m_Address;
|
NvAddress m_Address;
|
||||||
QNetworkAccessManager m_Nam;
|
QNetworkAccessManager m_Nam;
|
||||||
QSslCertificate m_ServerCert;
|
QSslCertificate m_ServerCert;
|
||||||
};
|
};
|
||||||
@@ -11,8 +11,8 @@
|
|||||||
|
|
||||||
#define REQUEST_TIMEOUT_MS 5000
|
#define REQUEST_TIMEOUT_MS 5000
|
||||||
|
|
||||||
NvPairingManager::NvPairingManager(QString address) :
|
NvPairingManager::NvPairingManager(NvComputer* computer) :
|
||||||
m_Http(address, QSslCertificate())
|
m_Http(computer)
|
||||||
{
|
{
|
||||||
QByteArray cert = IdentityManager::get()->getCertificate();
|
QByteArray cert = IdentityManager::get()->getCertificate();
|
||||||
BIO *bio = BIO_new_mem_buf(cert.data(), -1);
|
BIO *bio = BIO_new_mem_buf(cert.data(), -1);
|
||||||
@@ -167,11 +167,7 @@ NvPairingManager::signMessage(const QByteArray& message)
|
|||||||
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
|
EVP_MD_CTX *ctx = EVP_MD_CTX_create();
|
||||||
THROW_BAD_ALLOC_IF_NULL(ctx);
|
THROW_BAD_ALLOC_IF_NULL(ctx);
|
||||||
|
|
||||||
const EVP_MD *md = EVP_get_digestbyname("SHA256");
|
EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, m_PrivateKey);
|
||||||
THROW_BAD_ALLOC_IF_NULL(md);
|
|
||||||
|
|
||||||
EVP_DigestInit_ex(ctx, md, NULL);
|
|
||||||
EVP_DigestSignInit(ctx, NULL, md, NULL, m_PrivateKey);
|
|
||||||
EVP_DigestSignUpdate(ctx, reinterpret_cast<unsigned char*>(const_cast<char*>(message.data())), message.length());
|
EVP_DigestSignUpdate(ctx, reinterpret_cast<unsigned char*>(const_cast<char*>(message.data())), message.length());
|
||||||
|
|
||||||
size_t signatureLength = 0;
|
size_t signatureLength = 0;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public:
|
|||||||
ALREADY_IN_PROGRESS
|
ALREADY_IN_PROGRESS
|
||||||
};
|
};
|
||||||
|
|
||||||
explicit NvPairingManager(QString address);
|
explicit NvPairingManager(NvComputer* computer);
|
||||||
|
|
||||||
~NvPairingManager();
|
~NvPairingManager();
|
||||||
|
|
||||||
|
|||||||
@@ -71,16 +71,9 @@ SystemProperties::SystemProperties()
|
|||||||
querySdlVideoInfo();
|
querySdlVideoInfo();
|
||||||
|
|
||||||
Q_ASSERT(maximumStreamingFrameRate >= 60);
|
Q_ASSERT(maximumStreamingFrameRate >= 60);
|
||||||
Q_ASSERT(!monitorDesktopResolutions.isEmpty());
|
|
||||||
Q_ASSERT(!monitorNativeResolutions.isEmpty());
|
Q_ASSERT(!monitorNativeResolutions.isEmpty());
|
||||||
}
|
}
|
||||||
|
|
||||||
QRect SystemProperties::getDesktopResolution(int displayIndex)
|
|
||||||
{
|
|
||||||
// Returns default constructed QRect if out of bounds
|
|
||||||
return monitorDesktopResolutions.value(displayIndex);
|
|
||||||
}
|
|
||||||
|
|
||||||
QRect SystemProperties::getNativeResolution(int displayIndex)
|
QRect SystemProperties::getNativeResolution(int displayIndex)
|
||||||
{
|
{
|
||||||
// Returns default constructed QRect if out of bounds
|
// Returns default constructed QRect if out of bounds
|
||||||
@@ -148,7 +141,7 @@ void SystemProperties::querySdlVideoInfoInternal()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Session::getDecoderInfo(testWindow, hasHardwareAcceleration, rendererAlwaysFullScreen, maximumResolution);
|
Session::getDecoderInfo(testWindow, hasHardwareAcceleration, rendererAlwaysFullScreen, supportsHdr, maximumResolution);
|
||||||
|
|
||||||
SDL_DestroyWindow(testWindow);
|
SDL_DestroyWindow(testWindow);
|
||||||
|
|
||||||
@@ -193,7 +186,6 @@ void SystemProperties::refreshDisplaysInternal()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
monitorDesktopResolutions.clear();
|
|
||||||
monitorNativeResolutions.clear();
|
monitorNativeResolutions.clear();
|
||||||
|
|
||||||
// Never let the maximum drop below 60 FPS
|
// Never let the maximum drop below 60 FPS
|
||||||
@@ -202,26 +194,8 @@ void SystemProperties::refreshDisplaysInternal()
|
|||||||
SDL_DisplayMode bestMode;
|
SDL_DisplayMode bestMode;
|
||||||
for (int displayIndex = 0; displayIndex < SDL_GetNumVideoDisplays(); displayIndex++) {
|
for (int displayIndex = 0; displayIndex < SDL_GetNumVideoDisplays(); displayIndex++) {
|
||||||
SDL_DisplayMode desktopMode;
|
SDL_DisplayMode desktopMode;
|
||||||
int err;
|
|
||||||
|
|
||||||
err = SDL_GetDesktopDisplayMode(displayIndex, &desktopMode);
|
if (StreamUtils::getNativeDesktopMode(displayIndex, &desktopMode)) {
|
||||||
if (err == 0) {
|
|
||||||
if (desktopMode.w <= 8192 && desktopMode.h <= 8192) {
|
|
||||||
monitorDesktopResolutions.insert(displayIndex, QRect(0, 0, desktopMode.w, desktopMode.h));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Skipping resolution over 8K: %dx%d",
|
|
||||||
desktopMode.w, desktopMode.h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"SDL_GetDesktopDisplayMode() failed: %s",
|
|
||||||
SDL_GetError());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (StreamUtils::getRealDesktopMode(displayIndex, &desktopMode)) {
|
|
||||||
if (desktopMode.w <= 8192 && desktopMode.h <= 8192) {
|
if (desktopMode.w <= 8192 && desktopMode.h <= 8192) {
|
||||||
monitorNativeResolutions.insert(displayIndex, QRect(0, 0, desktopMode.w, desktopMode.h));
|
monitorNativeResolutions.insert(displayIndex, QRect(0, 0, desktopMode.w, desktopMode.h));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,9 +26,9 @@ public:
|
|||||||
Q_PROPERTY(int maximumStreamingFrameRate MEMBER maximumStreamingFrameRate CONSTANT)
|
Q_PROPERTY(int maximumStreamingFrameRate MEMBER maximumStreamingFrameRate CONSTANT)
|
||||||
Q_PROPERTY(QSize maximumResolution MEMBER maximumResolution CONSTANT)
|
Q_PROPERTY(QSize maximumResolution MEMBER maximumResolution CONSTANT)
|
||||||
Q_PROPERTY(QString versionString MEMBER versionString CONSTANT)
|
Q_PROPERTY(QString versionString MEMBER versionString CONSTANT)
|
||||||
|
Q_PROPERTY(bool supportsHdr MEMBER supportsHdr CONSTANT)
|
||||||
|
|
||||||
Q_INVOKABLE void refreshDisplays();
|
Q_INVOKABLE void refreshDisplays();
|
||||||
Q_INVOKABLE QRect getDesktopResolution(int displayIndex);
|
|
||||||
Q_INVOKABLE QRect getNativeResolution(int displayIndex);
|
Q_INVOKABLE QRect getNativeResolution(int displayIndex);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
@@ -51,8 +51,8 @@ private:
|
|||||||
QString unmappedGamepads;
|
QString unmappedGamepads;
|
||||||
int maximumStreamingFrameRate;
|
int maximumStreamingFrameRate;
|
||||||
QSize maximumResolution;
|
QSize maximumResolution;
|
||||||
QList<QRect> monitorDesktopResolutions;
|
|
||||||
QList<QRect> monitorNativeResolutions;
|
QList<QRect> monitorNativeResolutions;
|
||||||
QString versionString;
|
QString versionString;
|
||||||
|
bool supportsHdr;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -164,8 +164,10 @@ GlobalCommandLineParser::ParseResult GlobalCommandLineParser::parse(const QStrin
|
|||||||
"Starts Moonlight normally if no arguments are given.\n"
|
"Starts Moonlight normally if no arguments are given.\n"
|
||||||
"\n"
|
"\n"
|
||||||
"Available actions:\n"
|
"Available actions:\n"
|
||||||
|
" list List the available apps on a host\n"
|
||||||
" quit Quit the currently running app\n"
|
" quit Quit the currently running app\n"
|
||||||
" stream Start streaming an app\n"
|
" stream Start streaming an app\n"
|
||||||
|
" pair Pair a new host\n"
|
||||||
"\n"
|
"\n"
|
||||||
"See 'moonlight <action> --help' for help of specific action."
|
"See 'moonlight <action> --help' for help of specific action."
|
||||||
);
|
);
|
||||||
@@ -193,6 +195,10 @@ GlobalCommandLineParser::ParseResult GlobalCommandLineParser::parse(const QStrin
|
|||||||
return QuitRequested;
|
return QuitRequested;
|
||||||
} else if (action == "stream") {
|
} else if (action == "stream") {
|
||||||
return StreamRequested;
|
return StreamRequested;
|
||||||
|
} else if (action == "pair") {
|
||||||
|
return PairRequested;
|
||||||
|
} else if (action == "list") {
|
||||||
|
return ListRequested;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -242,6 +248,58 @@ QString QuitCommandLineParser::getHost() const
|
|||||||
return m_Host;
|
return m_Host;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PairCommandLineParser::PairCommandLineParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
PairCommandLineParser::~PairCommandLineParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void PairCommandLineParser::parse(const QStringList &args)
|
||||||
|
{
|
||||||
|
CommandLineParser parser;
|
||||||
|
parser.setupCommonOptions();
|
||||||
|
parser.setApplicationDescription(
|
||||||
|
"\n"
|
||||||
|
"Pair with the specified host."
|
||||||
|
);
|
||||||
|
parser.addPositionalArgument("pair", "pair host");
|
||||||
|
parser.addPositionalArgument("host", "Host computer name, UUID, or IP address", "<host>");
|
||||||
|
parser.addValueOption("pin", "4 digit pairing PIN");
|
||||||
|
|
||||||
|
if (!parser.parse(args)) {
|
||||||
|
parser.showError(parser.errorText());
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.handleUnknownOptions();
|
||||||
|
|
||||||
|
// This method will not return and terminates the process if --version or
|
||||||
|
// --help is specified
|
||||||
|
parser.handleHelpAndVersionOptions();
|
||||||
|
|
||||||
|
// Verify that host has been provided
|
||||||
|
auto posArgs = parser.positionalArguments();
|
||||||
|
if (posArgs.length() < 2) {
|
||||||
|
parser.showError("Host not provided");
|
||||||
|
}
|
||||||
|
m_Host = parser.positionalArguments().at(1);
|
||||||
|
m_PredefinedPin = parser.value("pin");
|
||||||
|
if (!m_PredefinedPin.isEmpty() && m_PredefinedPin.length() != 4) {
|
||||||
|
parser.showError("PIN must be 4 digits");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PairCommandLineParser::getHost() const
|
||||||
|
{
|
||||||
|
return m_Host;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString PairCommandLineParser::getPredefinedPin() const
|
||||||
|
{
|
||||||
|
return m_PredefinedPin;
|
||||||
|
}
|
||||||
|
|
||||||
StreamCommandLineParser::StreamCommandLineParser()
|
StreamCommandLineParser::StreamCommandLineParser()
|
||||||
{
|
{
|
||||||
m_WindowModeMap = {
|
m_WindowModeMap = {
|
||||||
@@ -312,6 +370,7 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
|
|||||||
parser.addToggleOption("background-gamepad", "background gamepad input");
|
parser.addToggleOption("background-gamepad", "background gamepad input");
|
||||||
parser.addToggleOption("reverse-scroll-direction", "inverted scroll direction");
|
parser.addToggleOption("reverse-scroll-direction", "inverted scroll direction");
|
||||||
parser.addToggleOption("swap-gamepad-buttons", "swap A/B and X/Y gamepad buttons (Nintendo-style)");
|
parser.addToggleOption("swap-gamepad-buttons", "swap A/B and X/Y gamepad buttons (Nintendo-style)");
|
||||||
|
parser.addToggleOption("keep-awake", "prevent display sleep while streaming");
|
||||||
parser.addChoiceOption("capture-system-keys", "capture system key combos", m_CaptureSysKeysModeMap.keys());
|
parser.addChoiceOption("capture-system-keys", "capture system key combos", m_CaptureSysKeysModeMap.keys());
|
||||||
parser.addChoiceOption("video-codec", "video codec", m_VideoCodecMap.keys());
|
parser.addChoiceOption("video-codec", "video codec", m_VideoCodecMap.keys());
|
||||||
parser.addChoiceOption("video-decoder", "video decoder", m_VideoDecoderMap.keys());
|
parser.addChoiceOption("video-decoder", "video decoder", m_VideoDecoderMap.keys());
|
||||||
@@ -423,6 +482,9 @@ void StreamCommandLineParser::parse(const QStringList &args, StreamingPreference
|
|||||||
// Resolve --swap-gamepad-buttons and --no-swap-gamepad-buttons options
|
// Resolve --swap-gamepad-buttons and --no-swap-gamepad-buttons options
|
||||||
preferences->swapFaceButtons = parser.getToggleOptionValue("swap-gamepad-buttons", preferences->swapFaceButtons);
|
preferences->swapFaceButtons = parser.getToggleOptionValue("swap-gamepad-buttons", preferences->swapFaceButtons);
|
||||||
|
|
||||||
|
// Resolve --keep-awake and --no-keep-awake options
|
||||||
|
preferences->keepAwake = parser.getToggleOptionValue("keep-awake", preferences->keepAwake);
|
||||||
|
|
||||||
// Resolve --capture-system-keys option
|
// Resolve --capture-system-keys option
|
||||||
if (parser.isSet("capture-system-keys")) {
|
if (parser.isSet("capture-system-keys")) {
|
||||||
preferences->captureSysKeysMode = mapValue(m_CaptureSysKeysModeMap, parser.getChoiceOptionValue("capture-system-keys"));
|
preferences->captureSysKeysMode = mapValue(m_CaptureSysKeysModeMap, parser.getChoiceOptionValue("capture-system-keys"));
|
||||||
@@ -464,3 +526,62 @@ QString StreamCommandLineParser::getAppName() const
|
|||||||
{
|
{
|
||||||
return m_AppName;
|
return m_AppName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ListCommandLineParser::ListCommandLineParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ListCommandLineParser::~ListCommandLineParser()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ListCommandLineParser::parse(const QStringList &args)
|
||||||
|
{
|
||||||
|
CommandLineParser parser;
|
||||||
|
parser.setupCommonOptions();
|
||||||
|
parser.setApplicationDescription(
|
||||||
|
"\n"
|
||||||
|
"List the available apps on the given host."
|
||||||
|
);
|
||||||
|
parser.addPositionalArgument("list", "list available apps");
|
||||||
|
parser.addPositionalArgument("host", "Host computer name, UUID, or IP address", "<host>");
|
||||||
|
|
||||||
|
parser.addFlagOption("csv", "Print as CSV with additional information");
|
||||||
|
parser.addFlagOption("verbose", "Displays additional information");
|
||||||
|
|
||||||
|
if (!parser.parse(args)) {
|
||||||
|
parser.showError(parser.errorText());
|
||||||
|
}
|
||||||
|
|
||||||
|
parser.handleUnknownOptions();
|
||||||
|
|
||||||
|
|
||||||
|
m_PrintCSV = parser.isSet("csv");
|
||||||
|
m_Verbose = parser.isSet("verbose");
|
||||||
|
|
||||||
|
// This method will not return and terminates the process if --version or
|
||||||
|
// --help is specified
|
||||||
|
parser.handleHelpAndVersionOptions();
|
||||||
|
|
||||||
|
// Verify that host has been provided
|
||||||
|
auto posArgs = parser.positionalArguments();
|
||||||
|
if (posArgs.length() < 2) {
|
||||||
|
parser.showError("Host not provided");
|
||||||
|
}
|
||||||
|
m_Host = parser.positionalArguments().at(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ListCommandLineParser::getHost() const
|
||||||
|
{
|
||||||
|
return m_Host;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ListCommandLineParser::isPrintCSV() const
|
||||||
|
{
|
||||||
|
return m_PrintCSV;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ListCommandLineParser::isVerbose() const
|
||||||
|
{
|
||||||
|
return m_Verbose;
|
||||||
|
}
|
||||||
@@ -12,6 +12,8 @@ public:
|
|||||||
NormalStartRequested,
|
NormalStartRequested,
|
||||||
StreamRequested,
|
StreamRequested,
|
||||||
QuitRequested,
|
QuitRequested,
|
||||||
|
PairRequested,
|
||||||
|
ListRequested,
|
||||||
};
|
};
|
||||||
|
|
||||||
GlobalCommandLineParser();
|
GlobalCommandLineParser();
|
||||||
@@ -35,6 +37,22 @@ private:
|
|||||||
QString m_Host;
|
QString m_Host;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class PairCommandLineParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
PairCommandLineParser();
|
||||||
|
virtual ~PairCommandLineParser();
|
||||||
|
|
||||||
|
void parse(const QStringList &args);
|
||||||
|
|
||||||
|
QString getHost() const;
|
||||||
|
QString getPredefinedPin() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_Host;
|
||||||
|
QString m_PredefinedPin;
|
||||||
|
};
|
||||||
|
|
||||||
class StreamCommandLineParser
|
class StreamCommandLineParser
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
@@ -55,3 +73,21 @@ private:
|
|||||||
QMap<QString, StreamingPreferences::VideoDecoderSelection> m_VideoDecoderMap;
|
QMap<QString, StreamingPreferences::VideoDecoderSelection> m_VideoDecoderMap;
|
||||||
QMap<QString, StreamingPreferences::CaptureSysKeysMode> m_CaptureSysKeysModeMap;
|
QMap<QString, StreamingPreferences::CaptureSysKeysMode> m_CaptureSysKeysModeMap;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
class ListCommandLineParser
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ListCommandLineParser();
|
||||||
|
virtual ~ListCommandLineParser();
|
||||||
|
|
||||||
|
void parse(const QStringList &args);
|
||||||
|
|
||||||
|
QString getHost() const;
|
||||||
|
bool isPrintCSV() const;
|
||||||
|
bool isVerbose() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
QString m_Host;
|
||||||
|
bool m_PrintCSV;
|
||||||
|
bool m_Verbose;
|
||||||
|
};
|
||||||
@@ -0,0 +1,208 @@
|
|||||||
|
#include "listapps.h"
|
||||||
|
|
||||||
|
#include "backend/boxartmanager.h"
|
||||||
|
#include "backend/computermanager.h"
|
||||||
|
#include "backend/computerseeker.h"
|
||||||
|
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#define COMPUTER_SEEK_TIMEOUT 10000
|
||||||
|
#define APP_SEEK_TIMEOUT 10000
|
||||||
|
|
||||||
|
namespace CliListApps
|
||||||
|
{
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
StateInit,
|
||||||
|
StateSeekComputer,
|
||||||
|
StateListApp,
|
||||||
|
StateSeekApp,
|
||||||
|
StateFailure,
|
||||||
|
};
|
||||||
|
|
||||||
|
class Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
ComputerFound,
|
||||||
|
ComputerUpdated,
|
||||||
|
ComputerSeekTimedout,
|
||||||
|
Executed,
|
||||||
|
};
|
||||||
|
|
||||||
|
Event(Type type)
|
||||||
|
: type(type), computerManager(nullptr), computer(nullptr) {}
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
ComputerManager *computerManager;
|
||||||
|
NvComputer *computer;
|
||||||
|
QString errorMessage;
|
||||||
|
};
|
||||||
|
|
||||||
|
class LauncherPrivate
|
||||||
|
{
|
||||||
|
Q_DECLARE_PUBLIC(Launcher)
|
||||||
|
|
||||||
|
public:
|
||||||
|
LauncherPrivate(Launcher *q) : q_ptr(q) {}
|
||||||
|
|
||||||
|
void handleEvent(Event event)
|
||||||
|
{
|
||||||
|
Q_Q(Launcher);
|
||||||
|
NvApp app;
|
||||||
|
|
||||||
|
switch (event.type) {
|
||||||
|
// Occurs when CLI main calls execute
|
||||||
|
case Event::Executed:
|
||||||
|
if (m_State == StateInit) {
|
||||||
|
m_State = StateSeekComputer;
|
||||||
|
m_ComputerManager = event.computerManager;
|
||||||
|
|
||||||
|
m_ComputerSeeker = new ComputerSeeker(m_ComputerManager, m_ComputerName, q);
|
||||||
|
q->connect(m_ComputerSeeker, &ComputerSeeker::computerFound,
|
||||||
|
q, &Launcher::onComputerFound);
|
||||||
|
q->connect(m_ComputerSeeker, &ComputerSeeker::errorTimeout,
|
||||||
|
q, &Launcher::onComputerSeekTimeout);
|
||||||
|
m_ComputerSeeker->start(COMPUTER_SEEK_TIMEOUT);
|
||||||
|
|
||||||
|
q->connect(m_ComputerManager, &ComputerManager::computerStateChanged,
|
||||||
|
q, &Launcher::onComputerUpdated);
|
||||||
|
|
||||||
|
m_BoxArtManager = new BoxArtManager(q);
|
||||||
|
|
||||||
|
if (m_Arguments.isVerbose()) {
|
||||||
|
fprintf(stdout, "Establishing connection to PC...\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when computer search timed out
|
||||||
|
case Event::ComputerSeekTimedout:
|
||||||
|
if (m_State == StateSeekComputer) {
|
||||||
|
fprintf(stderr, "%s\n", qPrintable(QString("Failed to connect to %1").arg(m_ComputerName)));
|
||||||
|
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when searched computer is found
|
||||||
|
case Event::ComputerFound:
|
||||||
|
if (m_State == StateSeekComputer) {
|
||||||
|
if (event.computer->pairState == NvComputer::PS_PAIRED) {
|
||||||
|
m_State = StateSeekApp;
|
||||||
|
m_Computer = event.computer;
|
||||||
|
m_TimeoutTimer->start(APP_SEEK_TIMEOUT);
|
||||||
|
if (m_Arguments.isVerbose()) {
|
||||||
|
fprintf(stdout, "Loading app list...\n");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m_State = StateFailure;
|
||||||
|
fprintf(stderr, "%s\n", qPrintable(QObject::tr("Computer %1 has not been paired. "
|
||||||
|
"Please open Moonlight to pair before retrieving games list.")
|
||||||
|
.arg(event.computer->name)));
|
||||||
|
|
||||||
|
QCoreApplication::exit(-1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when a computer is updated
|
||||||
|
case Event::ComputerUpdated:
|
||||||
|
if (m_State == StateSeekApp) {
|
||||||
|
m_Arguments.isPrintCSV() ? printAppsCSV(m_Computer->appList) : printApps(m_Computer->appList);
|
||||||
|
|
||||||
|
QCoreApplication::exit(0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printApps(QVector<NvApp> apps) {
|
||||||
|
for (int i = 0; i < apps.length(); i++) {
|
||||||
|
fprintf(stdout, "%s\n", qPrintable(apps[i].name));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printAppsCSV(QVector<NvApp> apps) {
|
||||||
|
fprintf(stdout, "Name, ID, HDR Support, App Collection Game, Hidden, Direct Launch, Boxart URL\n");
|
||||||
|
for (int i = 0; i < apps.length(); i++) {
|
||||||
|
printAppCSV(apps[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void printAppCSV(NvApp app) const
|
||||||
|
{
|
||||||
|
fprintf(stdout, "\"%s\",%d,%s,%s,%s,%s,\"%s\"\n", qPrintable(app.name),
|
||||||
|
app.id,
|
||||||
|
app.hdrSupported ? "true" : "false",
|
||||||
|
app.isAppCollectorGame ? "true" : "false",
|
||||||
|
app.hidden ? "true" : "false",
|
||||||
|
app.directLaunch ? "true" : "false",
|
||||||
|
qPrintable(m_BoxArtManager->loadBoxArt(m_Computer, app).toDisplayString()));
|
||||||
|
}
|
||||||
|
|
||||||
|
Launcher *q_ptr;
|
||||||
|
ComputerManager *m_ComputerManager;
|
||||||
|
QString m_ComputerName;
|
||||||
|
ComputerSeeker *m_ComputerSeeker;
|
||||||
|
BoxArtManager *m_BoxArtManager;
|
||||||
|
NvComputer *m_Computer;
|
||||||
|
State m_State;
|
||||||
|
QTimer *m_TimeoutTimer;
|
||||||
|
ListCommandLineParser m_Arguments;
|
||||||
|
};
|
||||||
|
|
||||||
|
Launcher::Launcher(QString computer, ListCommandLineParser arguments, QObject *parent)
|
||||||
|
: QObject(parent),
|
||||||
|
m_DPtr(new LauncherPrivate(this))
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
d->m_ComputerName = computer;
|
||||||
|
d->m_State = StateInit;
|
||||||
|
d->m_TimeoutTimer = new QTimer(this);
|
||||||
|
d->m_TimeoutTimer->setSingleShot(true);
|
||||||
|
d->m_Arguments = arguments;
|
||||||
|
connect(d->m_TimeoutTimer, &QTimer::timeout,
|
||||||
|
this, &Launcher::onComputerSeekTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Launcher::~Launcher()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::execute(ComputerManager *manager)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::Executed);
|
||||||
|
event.computerManager = manager;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Launcher::isExecuted() const
|
||||||
|
{
|
||||||
|
Q_D(const Launcher);
|
||||||
|
return d->m_State != StateInit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onComputerFound(NvComputer *computer)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::ComputerFound);
|
||||||
|
event.computer = computer;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onComputerSeekTimeout()
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::ComputerSeekTimedout);
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onComputerUpdated(NvComputer *computer)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::ComputerUpdated);
|
||||||
|
event.computer = computer;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "commandlineparser.h"
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
class ComputerManager;
|
||||||
|
class NvComputer;
|
||||||
|
|
||||||
|
namespace CliListApps
|
||||||
|
{
|
||||||
|
|
||||||
|
class LauncherPrivate;
|
||||||
|
|
||||||
|
class Launcher : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DECLARE_PRIVATE_D(m_DPtr, Launcher)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Launcher(QString computer, ListCommandLineParser arguments, QObject *parent = nullptr);
|
||||||
|
~Launcher();
|
||||||
|
|
||||||
|
Q_INVOKABLE void execute(ComputerManager *manager);
|
||||||
|
Q_INVOKABLE bool isExecuted() const;
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onComputerFound(NvComputer *computer);
|
||||||
|
void onComputerUpdated(NvComputer *computer);
|
||||||
|
void onComputerSeekTimeout();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QScopedPointer<LauncherPrivate> m_DPtr;
|
||||||
|
ListCommandLineParser m_Arguments;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
#include "pair.h"
|
||||||
|
|
||||||
|
#include "backend/computermanager.h"
|
||||||
|
#include "backend/computerseeker.h"
|
||||||
|
#include <QCoreApplication>
|
||||||
|
#include <QTimer>
|
||||||
|
|
||||||
|
#define COMPUTER_SEEK_TIMEOUT 10000
|
||||||
|
|
||||||
|
namespace CliPair
|
||||||
|
{
|
||||||
|
|
||||||
|
enum State {
|
||||||
|
StateInit,
|
||||||
|
StateSeekComputer,
|
||||||
|
StatePairing,
|
||||||
|
StateFailure,
|
||||||
|
StateComplete,
|
||||||
|
};
|
||||||
|
|
||||||
|
class Event
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
enum Type {
|
||||||
|
ComputerFound,
|
||||||
|
Executed,
|
||||||
|
PairingCompleted,
|
||||||
|
Timedout,
|
||||||
|
};
|
||||||
|
|
||||||
|
Event(Type type)
|
||||||
|
: type(type), computerManager(nullptr), computer(nullptr) {}
|
||||||
|
|
||||||
|
Type type;
|
||||||
|
ComputerManager *computerManager;
|
||||||
|
NvComputer *computer;
|
||||||
|
QString errorMessage;
|
||||||
|
};
|
||||||
|
|
||||||
|
class LauncherPrivate
|
||||||
|
{
|
||||||
|
Q_DECLARE_PUBLIC(Launcher)
|
||||||
|
|
||||||
|
public:
|
||||||
|
LauncherPrivate(Launcher *q) : q_ptr(q) {}
|
||||||
|
|
||||||
|
void handleEvent(Event event)
|
||||||
|
{
|
||||||
|
Q_Q(Launcher);
|
||||||
|
|
||||||
|
switch (event.type) {
|
||||||
|
// Occurs when CliPair becomes visible and the UI calls launcher's execute()
|
||||||
|
case Event::Executed:
|
||||||
|
if (m_State == StateInit) {
|
||||||
|
m_State = StateSeekComputer;
|
||||||
|
m_ComputerManager = event.computerManager;
|
||||||
|
q->connect(m_ComputerManager, &ComputerManager::pairingCompleted,
|
||||||
|
q, &Launcher::onPairingCompleted);
|
||||||
|
|
||||||
|
// If we weren't provided a predefined PIN, generate one now
|
||||||
|
if (m_PredefinedPin.isEmpty()) {
|
||||||
|
m_PredefinedPin = m_ComputerManager->generatePinString();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_ComputerSeeker = new ComputerSeeker(m_ComputerManager, m_ComputerName, q);
|
||||||
|
q->connect(m_ComputerSeeker, &ComputerSeeker::computerFound,
|
||||||
|
q, &Launcher::onComputerFound);
|
||||||
|
q->connect(m_ComputerSeeker, &ComputerSeeker::errorTimeout,
|
||||||
|
q, &Launcher::onTimeout);
|
||||||
|
m_ComputerSeeker->start(COMPUTER_SEEK_TIMEOUT);
|
||||||
|
|
||||||
|
emit q->searchingComputer();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when searched computer is found
|
||||||
|
case Event::ComputerFound:
|
||||||
|
if (m_State == StateSeekComputer) {
|
||||||
|
if (event.computer->pairState == NvComputer::PS_PAIRED) {
|
||||||
|
m_State = StateFailure;
|
||||||
|
QString msg = QObject::tr("%1 is already paired").arg(event.computer->name);
|
||||||
|
emit q->failed(msg);
|
||||||
|
}
|
||||||
|
else if (event.computer->currentGameId != 0) {
|
||||||
|
m_State = StateFailure;
|
||||||
|
QString msg = QObject::tr("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.");
|
||||||
|
emit q->failed(msg);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
Q_ASSERT(!m_PredefinedPin.isEmpty());
|
||||||
|
|
||||||
|
m_State = StatePairing;
|
||||||
|
m_ComputerManager->pairHost(event.computer, m_PredefinedPin);
|
||||||
|
emit q->pairing(event.computer->name, m_PredefinedPin);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when pairing operation completes
|
||||||
|
case Event::PairingCompleted:
|
||||||
|
if (m_State == StatePairing) {
|
||||||
|
if (event.errorMessage.isEmpty()) {
|
||||||
|
m_State = StateComplete;
|
||||||
|
emit q->success();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
m_State = StateFailure;
|
||||||
|
emit q->failed(event.errorMessage);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
// Occurs when computer search timed out
|
||||||
|
case Event::Timedout:
|
||||||
|
if (m_State == StateSeekComputer) {
|
||||||
|
m_State = StateFailure;
|
||||||
|
emit q->failed(QObject::tr("Failed to connect to %1").arg(m_ComputerName));
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Launcher *q_ptr;
|
||||||
|
QString m_ComputerName;
|
||||||
|
QString m_PredefinedPin;
|
||||||
|
ComputerManager *m_ComputerManager;
|
||||||
|
ComputerSeeker *m_ComputerSeeker;
|
||||||
|
NvComputer *m_Computer;
|
||||||
|
State m_State;
|
||||||
|
QTimer *m_TimeoutTimer;
|
||||||
|
};
|
||||||
|
|
||||||
|
Launcher::Launcher(QString computer, QString predefinedPin, QObject *parent)
|
||||||
|
: QObject(parent),
|
||||||
|
m_DPtr(new LauncherPrivate(this))
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
d->m_ComputerName = computer;
|
||||||
|
d->m_PredefinedPin = predefinedPin;
|
||||||
|
d->m_State = StateInit;
|
||||||
|
d->m_TimeoutTimer = new QTimer(this);
|
||||||
|
d->m_TimeoutTimer->setSingleShot(true);
|
||||||
|
connect(d->m_TimeoutTimer, &QTimer::timeout,
|
||||||
|
this, &Launcher::onTimeout);
|
||||||
|
}
|
||||||
|
|
||||||
|
Launcher::~Launcher()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::execute(ComputerManager *manager)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::Executed);
|
||||||
|
event.computerManager = manager;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool Launcher::isExecuted() const
|
||||||
|
{
|
||||||
|
Q_D(const Launcher);
|
||||||
|
return d->m_State != StateInit;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onComputerFound(NvComputer *computer)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::ComputerFound);
|
||||||
|
event.computer = computer;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onTimeout()
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::Timedout);
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Launcher::onPairingCompleted(NvComputer* computer, QString error)
|
||||||
|
{
|
||||||
|
Q_D(Launcher);
|
||||||
|
Event event(Event::PairingCompleted);
|
||||||
|
event.computer = computer;
|
||||||
|
event.errorMessage = error;
|
||||||
|
d->handleEvent(event);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QVariant>
|
||||||
|
|
||||||
|
class ComputerManager;
|
||||||
|
class NvComputer;
|
||||||
|
class Session;
|
||||||
|
class StreamingPreferences;
|
||||||
|
|
||||||
|
namespace CliPair
|
||||||
|
{
|
||||||
|
|
||||||
|
class Event;
|
||||||
|
class LauncherPrivate;
|
||||||
|
|
||||||
|
class Launcher : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
Q_DECLARE_PRIVATE_D(m_DPtr, Launcher)
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit Launcher(QString computer, QString predefinedPin,
|
||||||
|
QObject *parent = nullptr);
|
||||||
|
~Launcher();
|
||||||
|
Q_INVOKABLE void execute(ComputerManager *manager);
|
||||||
|
Q_INVOKABLE bool isExecuted() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void searchingComputer();
|
||||||
|
void pairing(QString pcName, QString pin);
|
||||||
|
void failed(QString text);
|
||||||
|
void success();
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void onComputerFound(NvComputer *computer);
|
||||||
|
void onPairingCompleted(NvComputer *computer, QString error);
|
||||||
|
void onTimeout();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QScopedPointer<LauncherPrivate> m_DPtr;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -36,6 +36,101 @@
|
|||||||
</screenshots>
|
</screenshots>
|
||||||
|
|
||||||
<releases>
|
<releases>
|
||||||
|
<release version="4.2.1" date="2022-09-12">
|
||||||
|
<description>
|
||||||
|
<p>Bugfixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed streaming from hosts running Sunshine</li>
|
||||||
|
<li>Updated community-contributed translations from Weblate</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="4.2.0" date="2022-09-10">
|
||||||
|
<description>
|
||||||
|
<p>New features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added support for pairing via the terminal</li>
|
||||||
|
<li>Added support for listing installed apps on a host via the terminal</li>
|
||||||
|
<li>Improved handling of V-Sync on Wayland systems to reduce latency</li>
|
||||||
|
<li>Improved performance using the legacy non-EGL VAAPI rendering code</li>
|
||||||
|
</ul>
|
||||||
|
<p>Bugfixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed native resolution detection on high DPI Wayland systems</li>
|
||||||
|
<li>Fixed audio crackling with SDL 2.24.0 on systems using PulseAudio</li>
|
||||||
|
<li>Updated included gamepad mappings</li>
|
||||||
|
<li>Updated community-contributed translations from Weblate</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="4.1.0" date="2022-05-23">
|
||||||
|
<description>
|
||||||
|
<p>New features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Overlays are now supported on the non-EGL X11 VAAPI renderer (requires RGBA subpicture support in the VAAPI driver)</li>
|
||||||
|
<li>Cursor lock can now be disabled when in full-screen mode</li>
|
||||||
|
</ul>
|
||||||
|
<p>Behavior Changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Moonlight can now reduce the client display resolution in full-screen mode if the current display mode doesn't have a high enough refresh rate for the selected stream frame rate</li>
|
||||||
|
<li>When choosing a new client display resolution in full-screen mode, Moonlight will pick a display mode with the closest aspect ratio to the selected stream resolution</li>
|
||||||
|
<li>Moonlight now defaults to borderless windowed mode on Wayland systems</li>
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
<p>Bugfixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed missing toolbar buttons in certain languages</li>
|
||||||
|
<li>Fixed some text on the settings page not updating when the language is changed</li>
|
||||||
|
<li>Fixed a frame pacing bug that could cause excessive frame drops</li>
|
||||||
|
<li>Fixed the "keep display awake" setting not being saved when Moonlight restarts</li>
|
||||||
|
<li>Fixed black screen after unmaximizing the Moonlight window on some Linux systems</li>
|
||||||
|
<li>Updated included gamepad mappings</li>
|
||||||
|
<li>Updated community-contributed translations from Weblate</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="4.0.0" date="2022-04-02">
|
||||||
|
<description>
|
||||||
|
<p>New features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Added a new key combo for locking the mouse cursor to the window (Ctrl+Alt+Shift+L)</li>
|
||||||
|
<li>Added an option to avoid keeping the client display awake while streaming</li>
|
||||||
|
</ul>
|
||||||
|
<p>Behavior Changes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>HDR streaming is now a separate option rather than being part of the Video Codec override dropdown</li>
|
||||||
|
<li>HDR streaming is no longer restricted to apps that are certified by NVIDIA as compatible with GameStream HDR. Some newer games may require an HDR display or EDID emulator dongle connected to your host PC for HDR options to be available.</li>
|
||||||
|
</ul>
|
||||||
|
<p>Bugfixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed loss of all audio if the active audio device is unplugged while streaming</li>
|
||||||
|
<li>Fixed the GUI being unresponsive after manually quitting when connection to the host is lost</li>
|
||||||
|
<li>Fixed a rare crash if a controller disconnects right as rumble is starting</li>
|
||||||
|
<li>Fixed text rendering on the overlay UI when using SDL_ttf 2.0.18 on Linux</li>
|
||||||
|
<li>Updated included gamepad mappings</li>
|
||||||
|
<li>Updated community-contributed translations from Weblate</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
|
<release version="3.2.0" date="2022-01-18">
|
||||||
|
<description>
|
||||||
|
<p>New features:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Reduced CPU usage while streaming</li>
|
||||||
|
<li>Non-ASCII characters are now supported when pasting clipboard data to the host</li>
|
||||||
|
<li>Added support for zero-copy NVDEC rendering for Nvidia Wayland systems</li>
|
||||||
|
<li>Significantly improved performance with asynchronous decoders like V4L2M2M on Linux</li>
|
||||||
|
<li>Added support for color compression planes on newer Intel systems when using VAAPI decoding</li>
|
||||||
|
<li>Added support for copy-back rendering in non-default pixel formats (like the Raspberry Pi SAND format)</li>
|
||||||
|
</ul>
|
||||||
|
<p>Bugfixes:</p>
|
||||||
|
<ul>
|
||||||
|
<li>Fixed unexpected GUI input after using the gamepad quit combo</li>
|
||||||
|
<li>Updated included gamepad mappings</li>
|
||||||
|
<li>Updated community-contributed translations from Weblate</li>
|
||||||
|
</ul>
|
||||||
|
</description>
|
||||||
|
</release>
|
||||||
<release version="3.1.4" date="2021-06-25">
|
<release version="3.1.4" date="2021-06-25">
|
||||||
<description>
|
<description>
|
||||||
<p>Changes:</p>
|
<p>Changes:</p>
|
||||||
|
|||||||
@@ -0,0 +1,91 @@
|
|||||||
|
import QtQuick 2.0
|
||||||
|
import QtQuick.Controls 2.2
|
||||||
|
|
||||||
|
import ComputerManager 1.0
|
||||||
|
import SdlGamepadKeyNavigation 1.0
|
||||||
|
|
||||||
|
Item {
|
||||||
|
function onSearchingComputer() {
|
||||||
|
stageLabel.text = qsTr("Establishing connection to PC...")
|
||||||
|
}
|
||||||
|
|
||||||
|
function onPairing(pcName, pin) {
|
||||||
|
stageLabel.text = qsTr("Pairing... Please enter '%1' on %2.").arg(pin).arg(pcName)
|
||||||
|
}
|
||||||
|
|
||||||
|
function onFailed(message) {
|
||||||
|
stageIndicator.visible = false
|
||||||
|
errorDialog.text = message
|
||||||
|
errorDialog.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
function onSuccess(appName) {
|
||||||
|
stageIndicator.visible = false
|
||||||
|
pairCompleteDialog.open()
|
||||||
|
}
|
||||||
|
|
||||||
|
// Allow user to back out of pairing
|
||||||
|
Keys.onEscapePressed: {
|
||||||
|
Qt.quit()
|
||||||
|
}
|
||||||
|
Keys.onBackPressed: {
|
||||||
|
Qt.quit()
|
||||||
|
}
|
||||||
|
Keys.onCancelPressed: {
|
||||||
|
Qt.quit()
|
||||||
|
}
|
||||||
|
|
||||||
|
StackView.onActivated: {
|
||||||
|
if (!launcher.isExecuted()) {
|
||||||
|
toolBar.visible = false
|
||||||
|
|
||||||
|
// Normally this is enabled by PcView, but we will won't
|
||||||
|
// load PcView when streaming from the command-line.
|
||||||
|
SdlGamepadKeyNavigation.enable()
|
||||||
|
|
||||||
|
launcher.searchingComputer.connect(onSearchingComputer)
|
||||||
|
launcher.pairing.connect(onPairing)
|
||||||
|
launcher.failed.connect(onFailed)
|
||||||
|
launcher.success.connect(onSuccess)
|
||||||
|
launcher.execute(ComputerManager)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Row {
|
||||||
|
anchors.centerIn: parent
|
||||||
|
spacing: 5
|
||||||
|
id: stageIndicator
|
||||||
|
|
||||||
|
BusyIndicator {
|
||||||
|
id: stageSpinner
|
||||||
|
}
|
||||||
|
|
||||||
|
Label {
|
||||||
|
id: stageLabel
|
||||||
|
height: stageSpinner.height
|
||||||
|
font.pointSize: 20
|
||||||
|
verticalAlignment: Text.AlignVCenter
|
||||||
|
|
||||||
|
wrapMode: Text.Wrap
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ErrorMessageDialog {
|
||||||
|
id: errorDialog
|
||||||
|
|
||||||
|
onClosed: {
|
||||||
|
Qt.quit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
NavigableMessageDialog {
|
||||||
|
id: pairCompleteDialog
|
||||||
|
closePolicy: Popup.CloseOnEscape
|
||||||
|
|
||||||
|
text:qsTr("Pairing completed successfully")
|
||||||
|
standardButtons: Dialog.Ok
|
||||||
|
onClosed: {
|
||||||
|
Qt.quit()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
import QtQuick 2.0
|
import QtQuick 2.0
|
||||||
import QtQuick.Controls 2.2
|
import QtQuick.Controls 2.2
|
||||||
|
import QtQuick.Layouts 1.3
|
||||||
|
|
||||||
ToolButton {
|
ToolButton {
|
||||||
property string iconSource
|
property string iconSource
|
||||||
@@ -20,8 +21,7 @@ ToolButton {
|
|||||||
|
|
||||||
// This determines the size of the Material highlight. We increase it
|
// This determines the size of the Material highlight. We increase it
|
||||||
// from the default because we use larger than normal icons for TV readability.
|
// from the default because we use larger than normal icons for TV readability.
|
||||||
background.width: (parent.height - parent.anchors.bottomMargin - parent.anchors.topMargin) * 0.60
|
Layout.preferredHeight: parent.height
|
||||||
background.height: (parent.height - parent.anchors.bottomMargin - parent.anchors.topMargin) * 0.60
|
|
||||||
|
|
||||||
Keys.onReturnPressed: {
|
Keys.onReturnPressed: {
|
||||||
clicked()
|
clicked()
|
||||||
|
|||||||
+216
-83
@@ -11,6 +11,8 @@ Flickable {
|
|||||||
id: settingsPage
|
id: settingsPage
|
||||||
objectName: qsTr("Settings")
|
objectName: qsTr("Settings")
|
||||||
|
|
||||||
|
signal languageChanged()
|
||||||
|
|
||||||
boundsBehavior: Flickable.OvershootBounds
|
boundsBehavior: Flickable.OvershootBounds
|
||||||
|
|
||||||
contentWidth: settingsColumn1.width > settingsColumn2.width ? settingsColumn1.width : settingsColumn2.width
|
contentWidth: settingsColumn1.width > settingsColumn2.width ? settingsColumn1.width : settingsColumn2.width
|
||||||
@@ -95,50 +97,39 @@ Flickable {
|
|||||||
// Add native resolutions for all attached displays
|
// Add native resolutions for all attached displays
|
||||||
var done = false
|
var done = false
|
||||||
for (var displayIndex = 0; !done; displayIndex++) {
|
for (var displayIndex = 0; !done; displayIndex++) {
|
||||||
for (var displayResIndex = 0; displayResIndex < 2; displayResIndex++) {
|
var screenRect = SystemProperties.getNativeResolution(displayIndex);
|
||||||
var screenRect;
|
|
||||||
|
|
||||||
// Some platforms have different desktop resolutions
|
if (screenRect.width === 0) {
|
||||||
// and native resolutions (like macOS with Retina displays)
|
// Exceeded max count of displays
|
||||||
if (displayResIndex === 0) {
|
done = true
|
||||||
screenRect = SystemProperties.getDesktopResolution(displayIndex)
|
break
|
||||||
}
|
}
|
||||||
else {
|
|
||||||
screenRect = SystemProperties.getNativeResolution(displayIndex)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (screenRect.width === 0) {
|
var indexToAdd = 0
|
||||||
// Exceeded max count of displays
|
for (var j = 0; j < resolutionComboBox.count; j++) {
|
||||||
done = true
|
var existing_width = parseInt(resolutionListModel.get(j).video_width);
|
||||||
|
var existing_height = parseInt(resolutionListModel.get(j).video_height);
|
||||||
|
|
||||||
|
if (screenRect.width === existing_width && screenRect.height === existing_height) {
|
||||||
|
// Duplicate entry, skip
|
||||||
|
indexToAdd = -1
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
else if (screenRect.width * screenRect.height > existing_width * existing_height) {
|
||||||
var indexToAdd = 0
|
// Candidate entrypoint after this entry
|
||||||
for (var j = 0; j < resolutionComboBox.count; j++) {
|
indexToAdd = j + 1
|
||||||
var existing_width = parseInt(resolutionListModel.get(j).video_width);
|
|
||||||
var existing_height = parseInt(resolutionListModel.get(j).video_height);
|
|
||||||
|
|
||||||
if (screenRect.width === existing_width && screenRect.height === existing_height) {
|
|
||||||
// Duplicate entry, skip
|
|
||||||
indexToAdd = -1
|
|
||||||
break
|
|
||||||
}
|
|
||||||
else if (screenRect.width * screenRect.height > existing_width * existing_height) {
|
|
||||||
// Candidate entrypoint after this entry
|
|
||||||
indexToAdd = j + 1
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Insert this display's resolution if it's not a duplicate
|
// Insert this display's resolution if it's not a duplicate
|
||||||
if (indexToAdd >= 0) {
|
if (indexToAdd >= 0) {
|
||||||
resolutionListModel.insert(indexToAdd,
|
resolutionListModel.insert(indexToAdd,
|
||||||
{
|
{
|
||||||
"text": "Native ("+screenRect.width+"x"+screenRect.height+")",
|
"text": "Native ("+screenRect.width+"x"+screenRect.height+")",
|
||||||
"video_width": ""+screenRect.width,
|
"video_width": ""+screenRect.width,
|
||||||
"video_height": ""+screenRect.height,
|
"video_height": ""+screenRect.height,
|
||||||
"is_custom": false
|
"is_custom": false
|
||||||
})
|
})
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -345,7 +336,7 @@ Flickable {
|
|||||||
maximumLength: 5
|
maximumLength: 5
|
||||||
inputMethodHints: Qt.ImhDigitsOnly
|
inputMethodHints: Qt.ImhDigitsOnly
|
||||||
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_width
|
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_width
|
||||||
validator: IntValidator{bottom:128; top:8192}
|
validator: IntValidator{bottom:256; top:8192}
|
||||||
focus: true
|
focus: true
|
||||||
|
|
||||||
onTextChanged: {
|
onTextChanged: {
|
||||||
@@ -374,7 +365,7 @@ Flickable {
|
|||||||
maximumLength: 5
|
maximumLength: 5
|
||||||
inputMethodHints: Qt.ImhDigitsOnly
|
inputMethodHints: Qt.ImhDigitsOnly
|
||||||
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_height
|
placeholderText: resolutionListModel.get(resolutionComboBox.currentIndex).video_height
|
||||||
validator: IntValidator{bottom:128; top:8192}
|
validator: IntValidator{bottom:256; top:8192}
|
||||||
|
|
||||||
onTextChanged: {
|
onTextChanged: {
|
||||||
// standardButton() was added in Qt 5.10, so we must check for it first
|
// standardButton() was added in Qt 5.10, so we must check for it first
|
||||||
@@ -465,6 +456,7 @@ Flickable {
|
|||||||
// ignore setting the index at first, and actually set it when the component is loaded
|
// ignore setting the index at first, and actually set it when the component is loaded
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
reinitialize()
|
reinitialize()
|
||||||
|
languageChanged.connect(reinitialize)
|
||||||
}
|
}
|
||||||
|
|
||||||
id: fpsComboBox
|
id: fpsComboBox
|
||||||
@@ -531,28 +523,53 @@ Flickable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
AutoResizingComboBox {
|
AutoResizingComboBox {
|
||||||
// ignore setting the index at first, and actually set it when the component is loaded
|
function createModel() {
|
||||||
Component.onCompleted: {
|
var model = Qt.createQmlObject('import QtQuick 2.0; ListModel {}', parent, '')
|
||||||
|
|
||||||
|
model.append({
|
||||||
|
text: qsTr("Fullscreen"),
|
||||||
|
val: StreamingPreferences.WM_FULLSCREEN
|
||||||
|
})
|
||||||
|
|
||||||
|
model.append({
|
||||||
|
text: qsTr("Borderless windowed"),
|
||||||
|
val: StreamingPreferences.WM_FULLSCREEN_DESKTOP
|
||||||
|
})
|
||||||
|
|
||||||
|
model.append({
|
||||||
|
text: qsTr("Windowed"),
|
||||||
|
val: StreamingPreferences.WM_WINDOWED
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
|
// Set the recommended option based on the OS
|
||||||
|
for (var i = 0; i < model.count; i++) {
|
||||||
|
var thisWm = model.get(i).val;
|
||||||
|
if (thisWm === StreamingPreferences.recommendedFullScreenMode) {
|
||||||
|
model.get(i).text += qsTr(" (Recommended)")
|
||||||
|
model.move(i, 0, 1)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return model
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// This is used on initialization and upon retranslation
|
||||||
|
function reinitialize() {
|
||||||
if (!visible) {
|
if (!visible) {
|
||||||
// Do nothing if the control won't even be visible
|
// Do nothing if the control won't even be visible
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// Set the recommended option based on the OS
|
model = createModel()
|
||||||
for (var i = 0; i < windowModeListModel.count; i++) {
|
|
||||||
var thisWm = windowModeListModel.get(i).val;
|
|
||||||
if (thisWm === StreamingPreferences.recommendedFullScreenMode) {
|
|
||||||
windowModeListModel.get(i).text += qsTr(" (Recommended)")
|
|
||||||
windowModeListModel.move(i, 0, 1);
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
currentIndex = 0
|
currentIndex = 0
|
||||||
|
|
||||||
|
// Set the current value based on the saved preferences
|
||||||
var savedWm = StreamingPreferences.windowMode
|
var savedWm = StreamingPreferences.windowMode
|
||||||
for (var i = 0; i < windowModeListModel.count; i++) {
|
for (var i = 0; i < model.count; i++) {
|
||||||
var thisWm = windowModeListModel.get(i).val;
|
var thisWm = model.get(i).val;
|
||||||
if (savedWm === thisWm) {
|
if (savedWm === thisWm) {
|
||||||
currentIndex = i
|
currentIndex = i
|
||||||
break
|
break
|
||||||
@@ -562,28 +579,18 @@ Flickable {
|
|||||||
activated(currentIndex)
|
activated(currentIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Component.onCompleted: {
|
||||||
|
reinitialize()
|
||||||
|
languageChanged.connect(reinitialize)
|
||||||
|
}
|
||||||
|
|
||||||
id: windowModeComboBox
|
id: windowModeComboBox
|
||||||
visible: SystemProperties.hasDesktopEnvironment
|
visible: SystemProperties.hasDesktopEnvironment
|
||||||
enabled: !SystemProperties.rendererAlwaysFullScreen
|
enabled: !SystemProperties.rendererAlwaysFullScreen
|
||||||
hoverEnabled: true
|
hoverEnabled: true
|
||||||
textRole: "text"
|
textRole: "text"
|
||||||
model: ListModel {
|
|
||||||
id: windowModeListModel
|
|
||||||
ListElement {
|
|
||||||
text: qsTr("Fullscreen")
|
|
||||||
val: StreamingPreferences.WM_FULLSCREEN
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
text: qsTr("Borderless windowed")
|
|
||||||
val: StreamingPreferences.WM_FULLSCREEN_DESKTOP
|
|
||||||
}
|
|
||||||
ListElement {
|
|
||||||
text: qsTr("Windowed")
|
|
||||||
val: StreamingPreferences.WM_WINDOWED
|
|
||||||
}
|
|
||||||
}
|
|
||||||
onActivated: {
|
onActivated: {
|
||||||
StreamingPreferences.windowMode = windowModeListModel.get(currentIndex).val
|
StreamingPreferences.windowMode = model.get(currentIndex).val
|
||||||
}
|
}
|
||||||
|
|
||||||
ToolTip.delay: 1000
|
ToolTip.delay: 1000
|
||||||
@@ -766,7 +773,7 @@ Flickable {
|
|||||||
val: StreamingPreferences.LANG_AUTO
|
val: StreamingPreferences.LANG_AUTO
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
text: "Deutsch" //German
|
text: "Deutsch" // German
|
||||||
val: StreamingPreferences.LANG_DE
|
val: StreamingPreferences.LANG_DE
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
@@ -774,11 +781,11 @@ Flickable {
|
|||||||
val: StreamingPreferences.LANG_EN
|
val: StreamingPreferences.LANG_EN
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
text: "Français" //French
|
text: "Français" // French
|
||||||
val: StreamingPreferences.LANG_FR
|
val: StreamingPreferences.LANG_FR
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
text: "简体中文" //Simplified Chinese
|
text: "简体中文" // Simplified Chinese
|
||||||
val: StreamingPreferences.LANG_ZH_CN
|
val: StreamingPreferences.LANG_ZH_CN
|
||||||
}
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
@@ -789,11 +796,10 @@ Flickable {
|
|||||||
text: "русский" // Russian
|
text: "русский" // Russian
|
||||||
val: StreamingPreferences.LANG_RU
|
val: StreamingPreferences.LANG_RU
|
||||||
}
|
}
|
||||||
// Don't list Spanish until it is more complete
|
ListElement {
|
||||||
/*ListElement {
|
|
||||||
text: "Español" // Spanish
|
text: "Español" // Spanish
|
||||||
val: StreamingPreferences.LANG_ES
|
val: StreamingPreferences.LANG_ES
|
||||||
}*/
|
}
|
||||||
ListElement {
|
ListElement {
|
||||||
text: "日本語" // Japanese
|
text: "日本語" // Japanese
|
||||||
val: StreamingPreferences.LANG_JA
|
val: StreamingPreferences.LANG_JA
|
||||||
@@ -810,6 +816,58 @@ Flickable {
|
|||||||
text: "한국어" // Korean
|
text: "한국어" // Korean
|
||||||
val: StreamingPreferences.LANG_KO
|
val: StreamingPreferences.LANG_KO
|
||||||
}
|
}
|
||||||
|
/* ListElement {
|
||||||
|
text: "Magyar" // Hungarian
|
||||||
|
val: StreamingPreferences.LANG_HU
|
||||||
|
} */
|
||||||
|
ListElement {
|
||||||
|
text: "Nederlands" // Dutch
|
||||||
|
val: StreamingPreferences.LANG_NL
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: "Svenska" // Swedish
|
||||||
|
val: StreamingPreferences.LANG_SV
|
||||||
|
}
|
||||||
|
/* ListElement {
|
||||||
|
text: "Türkçe" // Turkish
|
||||||
|
val: StreamingPreferences.LANG_TR
|
||||||
|
} */
|
||||||
|
/* ListElement {
|
||||||
|
text: "Українська" // Ukrainian
|
||||||
|
val: StreamingPreferences.LANG_UK
|
||||||
|
} */
|
||||||
|
ListElement {
|
||||||
|
text: "繁体字" // Traditional Chinese
|
||||||
|
val: StreamingPreferences.LANG_ZH_HANT
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: "Português" // Portuguese
|
||||||
|
val: StreamingPreferences.LANG_PT
|
||||||
|
}
|
||||||
|
/* ListElement {
|
||||||
|
text: "Português do Brasil" // Brazilian Portuguese
|
||||||
|
val: StreamingPreferences.LANG_PT_BR
|
||||||
|
} */
|
||||||
|
ListElement {
|
||||||
|
text: "Ελληνικά" // Greek
|
||||||
|
val: StreamingPreferences.LANG_EL
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: "Italiano" // Italian
|
||||||
|
val: StreamingPreferences.LANG_IT
|
||||||
|
}
|
||||||
|
/* ListElement {
|
||||||
|
text: "हिन्दी, हिंदी" // Hindi
|
||||||
|
val: StreamingPreferences.LANG_HI
|
||||||
|
} */
|
||||||
|
ListElement {
|
||||||
|
text: "Język polski" // Polish
|
||||||
|
val: StreamingPreferences.LANG_PL
|
||||||
|
}
|
||||||
|
ListElement {
|
||||||
|
text: "Čeština" // Czech
|
||||||
|
val: StreamingPreferences.LANG_CS
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
||||||
onActivated : {
|
onActivated : {
|
||||||
@@ -824,6 +882,9 @@ Flickable {
|
|||||||
// Force the back operation to pop any AppView pages that exist.
|
// Force the back operation to pop any AppView pages that exist.
|
||||||
// The AppView stops working after retranslate() for some reason.
|
// The AppView stops working after retranslate() for some reason.
|
||||||
window.clearOnBack = true
|
window.clearOnBack = true
|
||||||
|
|
||||||
|
// Signal other controls to adjust their text
|
||||||
|
languageChanged()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -910,6 +971,22 @@ Flickable {
|
|||||||
ToolTip.visible: hovered
|
ToolTip.visible: hovered
|
||||||
ToolTip.text: qsTr("Updates your Discord status to display the name of the game you're streaming.")
|
ToolTip.text: qsTr("Updates your Discord status to display the name of the game you're streaming.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: keepAwakeCheck
|
||||||
|
width: parent.width
|
||||||
|
text: qsTr("Keep the display awake while streaming")
|
||||||
|
font.pointSize: 12
|
||||||
|
checked: StreamingPreferences.keepAwake
|
||||||
|
onCheckedChanged: {
|
||||||
|
StreamingPreferences.keepAwake = checked
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip.delay: 1000
|
||||||
|
ToolTip.timeout: 5000
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.text: qsTr("Prevents the screensaver from starting or the display from going to sleep while streaming.")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1229,6 +1306,7 @@ Flickable {
|
|||||||
|
|
||||||
id: decoderComboBox
|
id: decoderComboBox
|
||||||
textRole: "text"
|
textRole: "text"
|
||||||
|
enabled: !enableHdr.checked
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
id: decoderListModel
|
id: decoderListModel
|
||||||
ListElement {
|
ListElement {
|
||||||
@@ -1245,9 +1323,26 @@ Flickable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
||||||
onActivated : {
|
onActivated: {
|
||||||
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
|
if (enabled) {
|
||||||
|
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This handles the state of the enableHdr checkbox changing
|
||||||
|
onEnabledChanged: {
|
||||||
|
if (enabled) {
|
||||||
|
StreamingPreferences.videoDecoderSelection = decoderListModel.get(currentIndex).val
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
StreamingPreferences.videoDecoderSelection = StreamingPreferences.VDS_AUTO
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip.delay: 1000
|
||||||
|
ToolTip.timeout: 5000
|
||||||
|
ToolTip.visible: hovered && !enabled
|
||||||
|
ToolTip.text: qsTr("Enabling HDR overrides manual decoder selections.")
|
||||||
}
|
}
|
||||||
|
|
||||||
Label {
|
Label {
|
||||||
@@ -1262,7 +1357,11 @@ Flickable {
|
|||||||
// ignore setting the index at first, and actually set it when the component is loaded
|
// ignore setting the index at first, and actually set it when the component is loaded
|
||||||
Component.onCompleted: {
|
Component.onCompleted: {
|
||||||
var saved_vcc = StreamingPreferences.videoCodecConfig
|
var saved_vcc = StreamingPreferences.videoCodecConfig
|
||||||
|
|
||||||
|
// Default to Automatic (relevant if HDR is enabled,
|
||||||
|
// where we will match none of the codecs in the list)
|
||||||
currentIndex = 0
|
currentIndex = 0
|
||||||
|
|
||||||
for(var i = 0; i < codecListModel.count; i++) {
|
for(var i = 0; i < codecListModel.count; i++) {
|
||||||
var el_vcc = codecListModel.get(i).val;
|
var el_vcc = codecListModel.get(i).val;
|
||||||
if (saved_vcc === el_vcc) {
|
if (saved_vcc === el_vcc) {
|
||||||
@@ -1270,11 +1369,13 @@ Flickable {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
activated(currentIndex)
|
activated(currentIndex)
|
||||||
}
|
}
|
||||||
|
|
||||||
id: codecComboBox
|
id: codecComboBox
|
||||||
textRole: "text"
|
textRole: "text"
|
||||||
|
enabled: !enableHdr.checked
|
||||||
model: ListModel {
|
model: ListModel {
|
||||||
id: codecListModel
|
id: codecListModel
|
||||||
ListElement {
|
ListElement {
|
||||||
@@ -1289,15 +1390,47 @@ Flickable {
|
|||||||
text: qsTr("HEVC (H.265)")
|
text: qsTr("HEVC (H.265)")
|
||||||
val: StreamingPreferences.VCC_FORCE_HEVC
|
val: StreamingPreferences.VCC_FORCE_HEVC
|
||||||
}
|
}
|
||||||
/*ListElement {
|
|
||||||
text: qsTr("HEVC HDR (Experimental)")
|
|
||||||
val: StreamingPreferences.VCC_FORCE_HEVC_HDR
|
|
||||||
}*/
|
|
||||||
}
|
}
|
||||||
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
// ::onActivated must be used, as it only listens for when the index is changed by a human
|
||||||
onActivated : {
|
onActivated : {
|
||||||
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
|
if (enabled) {
|
||||||
|
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This handles the state of the enableHdr checkbox changing
|
||||||
|
onEnabledChanged: {
|
||||||
|
if (enabled) {
|
||||||
|
StreamingPreferences.videoCodecConfig = codecListModel.get(currentIndex).val
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
StreamingPreferences.videoCodecConfig = StreamingPreferences.VCC_FORCE_HEVC_HDR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ToolTip.delay: 1000
|
||||||
|
ToolTip.timeout: 5000
|
||||||
|
ToolTip.visible: hovered && !enabled
|
||||||
|
ToolTip.text: qsTr("Enabling HDR overrides manual codec selections.")
|
||||||
|
}
|
||||||
|
|
||||||
|
CheckBox {
|
||||||
|
id: enableHdr
|
||||||
|
width: parent.width
|
||||||
|
text: qsTr("Enable HDR (Experimental)")
|
||||||
|
font.pointSize: 12
|
||||||
|
enabled: SystemProperties.supportsHdr
|
||||||
|
checked: enabled && StreamingPreferences.videoCodecConfig == StreamingPreferences.VCC_FORCE_HEVC_HDR
|
||||||
|
|
||||||
|
// Updating StreamingPreferences.videoCodecConfig is handled above
|
||||||
|
|
||||||
|
ToolTip.delay: 1000
|
||||||
|
ToolTip.timeout: 5000
|
||||||
|
ToolTip.visible: hovered
|
||||||
|
ToolTip.text: enabled ?
|
||||||
|
qsTr("The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.")
|
||||||
|
:
|
||||||
|
qsTr("HDR streaming is not supported on this PC.")
|
||||||
}
|
}
|
||||||
|
|
||||||
CheckBox {
|
CheckBox {
|
||||||
|
|||||||
@@ -103,7 +103,10 @@ Item {
|
|||||||
streamSegueErrorDialog.open()
|
streamSegueErrorDialog.open()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function sessionReadyForDeletion()
|
||||||
|
{
|
||||||
// Garbage collect the Session object since it's pretty heavyweight
|
// Garbage collect the Session object since it's pretty heavyweight
|
||||||
// and keeps other libraries (like SDL_TTF) around until it is deleted.
|
// and keeps other libraries (like SDL_TTF) around until it is deleted.
|
||||||
session = null
|
session = null
|
||||||
@@ -130,6 +133,7 @@ Item {
|
|||||||
session.displayLaunchWarning.connect(displayLaunchWarning)
|
session.displayLaunchWarning.connect(displayLaunchWarning)
|
||||||
session.quitStarting.connect(quitStarting)
|
session.quitStarting.connect(quitStarting)
|
||||||
session.sessionFinished.connect(sessionFinished)
|
session.sessionFinished.connect(sessionFinished)
|
||||||
|
session.readyForDeletion.connect(sessionReadyForDeletion)
|
||||||
|
|
||||||
// Kick off the stream
|
// Kick off the stream
|
||||||
spinnerTimer.start()
|
spinnerTimer.start()
|
||||||
|
|||||||
@@ -2,8 +2,6 @@
|
|||||||
|
|
||||||
#include <QThreadPool>
|
#include <QThreadPool>
|
||||||
|
|
||||||
#include <random>
|
|
||||||
|
|
||||||
ComputerModel::ComputerModel(QObject* object)
|
ComputerModel::ComputerModel(QObject* object)
|
||||||
: QAbstractListModel(object) {}
|
: QAbstractListModel(object) {}
|
||||||
|
|
||||||
@@ -140,14 +138,9 @@ void ComputerModel::renameComputer(int computerIndex, QString name)
|
|||||||
m_ComputerManager->renameHost(m_Computers[computerIndex], name);
|
m_ComputerManager->renameHost(m_Computers[computerIndex], name);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Use QRandomGenerator when we drop Qt 5.9 support
|
|
||||||
QString ComputerModel::generatePinString()
|
QString ComputerModel::generatePinString()
|
||||||
{
|
{
|
||||||
std::uniform_int_distribution<int> dist(0, 9999);
|
return m_ComputerManager->generatePinString();
|
||||||
std::random_device rd;
|
|
||||||
std::mt19937 engine(rd());
|
|
||||||
|
|
||||||
return QString::asprintf("%04u", dist(engine));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
class DeferredTestConnectionTask : public QObject, public QRunnable
|
class DeferredTestConnectionTask : public QObject, public QRunnable
|
||||||
|
|||||||
+20
-10
@@ -181,10 +181,20 @@ ApplicationWindow {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function navigateTo(url, objectName)
|
// Workaround for lack of instanceof in Qt 5.9.
|
||||||
|
//
|
||||||
|
// Based on https://stackoverflow.com/questions/13923794/how-to-do-a-is-a-typeof-or-instanceof-in-qml
|
||||||
|
function qmltypeof(obj, className) { // QtObject, string -> bool
|
||||||
|
// className plus "(" is the class instance without modification
|
||||||
|
// className plus "_QML" is the class instance with user-defined properties
|
||||||
|
var str = obj.toString();
|
||||||
|
return str.startsWith(className + "(") || str.startsWith(className + "_QML");
|
||||||
|
}
|
||||||
|
|
||||||
|
function navigateTo(url, objectType)
|
||||||
{
|
{
|
||||||
var existingItem = stackView.find(function(item, index) {
|
var existingItem = stackView.find(function(item, index) {
|
||||||
return item.objectName === objectName
|
return qmltypeof(item, objectType)
|
||||||
})
|
})
|
||||||
|
|
||||||
if (existingItem !== null) {
|
if (existingItem !== null) {
|
||||||
@@ -215,7 +225,7 @@ ApplicationWindow {
|
|||||||
}
|
}
|
||||||
|
|
||||||
RowLayout {
|
RowLayout {
|
||||||
spacing: 20
|
spacing: 10
|
||||||
anchors.leftMargin: 10
|
anchors.leftMargin: 10
|
||||||
anchors.rightMargin: 10
|
anchors.rightMargin: 10
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
@@ -251,7 +261,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
Label {
|
Label {
|
||||||
id: versionLabel
|
id: versionLabel
|
||||||
visible: stackView.currentItem.objectName === qsTr("Settings")
|
visible: qmltypeof(stackView.currentItem, "SettingsView")
|
||||||
text: qsTr("Version %1").arg(SystemProperties.versionString)
|
text: qsTr("Version %1").arg(SystemProperties.versionString)
|
||||||
font.pointSize: 12
|
font.pointSize: 12
|
||||||
horizontalAlignment: Qt.AlignRight
|
horizontalAlignment: Qt.AlignRight
|
||||||
@@ -261,7 +271,7 @@ ApplicationWindow {
|
|||||||
NavigableToolButton {
|
NavigableToolButton {
|
||||||
id: discordButton
|
id: discordButton
|
||||||
visible: SystemProperties.hasBrowser &&
|
visible: SystemProperties.hasBrowser &&
|
||||||
stackView.currentItem.objectName === qsTr("Settings")
|
qmltypeof(stackView.currentItem, "SettingsView")
|
||||||
|
|
||||||
iconSource: "qrc:/res/Discord-Logo-White.svg"
|
iconSource: "qrc:/res/Discord-Logo-White.svg"
|
||||||
|
|
||||||
@@ -280,7 +290,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
NavigableToolButton {
|
NavigableToolButton {
|
||||||
id: addPcButton
|
id: addPcButton
|
||||||
visible: stackView.currentItem.objectName === qsTr("Computers")
|
visible: qmltypeof(stackView.currentItem, "PcView")
|
||||||
|
|
||||||
iconSource: "qrc:/res/ic_add_to_queue_white_48px.svg"
|
iconSource: "qrc:/res/ic_add_to_queue_white_48px.svg"
|
||||||
|
|
||||||
@@ -378,7 +388,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
iconSource: "qrc:/res/ic_videogame_asset_white_48px.svg"
|
iconSource: "qrc:/res/ic_videogame_asset_white_48px.svg"
|
||||||
|
|
||||||
onClicked: navigateTo("qrc:/gui/GamepadMapper.qml", qsTr("Gamepad Mapping"))
|
onClicked: navigateTo("qrc:/gui/GamepadMapper.qml", "GamepadMapper")
|
||||||
|
|
||||||
Keys.onDownPressed: {
|
Keys.onDownPressed: {
|
||||||
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
|
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
|
||||||
@@ -390,7 +400,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
iconSource: "qrc:/res/settings.svg"
|
iconSource: "qrc:/res/settings.svg"
|
||||||
|
|
||||||
onClicked: navigateTo("qrc:/gui/SettingsView.qml", qsTr("Settings"))
|
onClicked: navigateTo("qrc:/gui/SettingsView.qml", "SettingsView")
|
||||||
|
|
||||||
Keys.onDownPressed: {
|
Keys.onDownPressed: {
|
||||||
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
|
stackView.currentItem.forceActiveFocus(Qt.TabFocus)
|
||||||
@@ -412,7 +422,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
ErrorMessageDialog {
|
ErrorMessageDialog {
|
||||||
id: noHwDecoderDialog
|
id: noHwDecoderDialog
|
||||||
text: qsTr("No functioning hardware accelerated H.264 video decoder was detected by Moonlight. " +
|
text: qsTr("No functioning hardware accelerated video decoder was detected by Moonlight. " +
|
||||||
"Your streaming performance may be severely degraded in this configuration.")
|
"Your streaming performance may be severely degraded in this configuration.")
|
||||||
helpText: qsTr("Click the Help button for more information on solving this problem.")
|
helpText: qsTr("Click the Help button for more information on solving this problem.")
|
||||||
helpUrl: "https://github.com/moonlight-stream/moonlight-docs/wiki/Fixing-Hardware-Decoding-Problems"
|
helpUrl: "https://github.com/moonlight-stream/moonlight-docs/wiki/Fixing-Hardware-Decoding-Problems"
|
||||||
@@ -493,7 +503,7 @@ ApplicationWindow {
|
|||||||
|
|
||||||
onAccepted: {
|
onAccepted: {
|
||||||
if (editText.text) {
|
if (editText.text) {
|
||||||
ComputerManager.addNewHost(editText.text.trim(), false)
|
ComputerManager.addNewHostManually(editText.text.trim())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,7 @@
|
|||||||
SdlGamepadKeyNavigation::SdlGamepadKeyNavigation()
|
SdlGamepadKeyNavigation::SdlGamepadKeyNavigation()
|
||||||
: m_Enabled(false),
|
: m_Enabled(false),
|
||||||
m_UiNavMode(false),
|
m_UiNavMode(false),
|
||||||
|
m_FirstPoll(false),
|
||||||
m_LastAxisNavigationEventTime(0)
|
m_LastAxisNavigationEventTime(0)
|
||||||
{
|
{
|
||||||
m_PollingTimer = new QTimer(this);
|
m_PollingTimer = new QTimer(this);
|
||||||
@@ -62,6 +63,9 @@ void SdlGamepadKeyNavigation::enable()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Flush events on the first poll
|
||||||
|
m_FirstPoll = true;
|
||||||
|
|
||||||
// Poll every 50 ms for a new joystick event
|
// Poll every 50 ms for a new joystick event
|
||||||
m_PollingTimer->start(50);
|
m_PollingTimer->start(50);
|
||||||
|
|
||||||
@@ -91,6 +95,16 @@ void SdlGamepadKeyNavigation::onPollingTimerFired()
|
|||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
StreamingPreferences prefs;
|
StreamingPreferences prefs;
|
||||||
|
|
||||||
|
// Discard any pending button events on the first poll to avoid picking up
|
||||||
|
// stale input data from the stream session (like the quit combo).
|
||||||
|
if (m_FirstPoll) {
|
||||||
|
SDL_PumpEvents();
|
||||||
|
SDL_FlushEvent(SDL_CONTROLLERBUTTONDOWN);
|
||||||
|
SDL_FlushEvent(SDL_CONTROLLERBUTTONUP);
|
||||||
|
|
||||||
|
m_FirstPoll = false;
|
||||||
|
}
|
||||||
|
|
||||||
while (SDL_PollEvent(&event)) {
|
while (SDL_PollEvent(&event)) {
|
||||||
switch (event.type) {
|
switch (event.type) {
|
||||||
case SDL_QUIT:
|
case SDL_QUIT:
|
||||||
|
|||||||
@@ -34,5 +34,6 @@ private:
|
|||||||
QList<SDL_GameController*> m_Gamepads;
|
QList<SDL_GameController*> m_Gamepads;
|
||||||
bool m_Enabled;
|
bool m_Enabled;
|
||||||
bool m_UiNavMode;
|
bool m_UiNavMode;
|
||||||
|
bool m_FirstPoll;
|
||||||
Uint32 m_LastAxisNavigationEventTime;
|
Uint32 m_LastAxisNavigationEventTime;
|
||||||
};
|
};
|
||||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
+266
-185
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.
+502
-417
File diff suppressed because it is too large.
Load diff
Binary file not shown.
+260
-175
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.
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.
+233
-152
@@ -51,6 +51,24 @@
|
|||||||
<translation>本当に%1を終了しますか?未セーブの進行状況はすべて失われます。</translation>
|
<translation>本当に%1を終了しますか?未セーブの進行状況はすべて失われます。</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation type="unfinished">PCとの接続を確立しています...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>オーディオキャプチャーデバイスがありません。GeForce Experienceを再インストールすることでこのエラーが解決されます。</translation>
|
<translation>オーディオキャプチャーデバイスがありません。GeForce Experienceを再インストールすることでこのエラーが解決されます。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -246,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>実行中のゲームはこのPCで開始されたものではありません。ホストPCでゲームを手動で終了するか、最初にゲームを開始したデバイスを使用する必要があります。</translation>
|
<translation>実行中のゲームはこのPCで開始されたものではありません。ホストPCでゲームを手動で終了するか、最初にゲームを開始したデバイスを使用する必要があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -254,6 +272,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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 type="unfinished">ホストPCで前回のセッションが実行している間はペアリングできません。実行中のゲームを終了するかホストPCを再起動した後に、再度ペアリングしてください。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -276,6 +305,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>アプリケーション%1の検出に失敗</translation>
|
<translation>アプリケーション%1の検出に失敗</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -292,147 +326,160 @@
|
|||||||
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>ホストから映像を受信していません。</translation>
|
<translation>ホストから映像を受信していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>ファイアウォールと次のポートのポートフォワーディングルールを確認してください: %1</translation>
|
<translation>ファイアウォールと次のポートのポートフォワーディングルールを確認してください: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>ネットワーク接続がうまくいっていません。ビデオビットレートの設定を下げるか、より高速な回線を使用してください。</translation>
|
<translation>ネットワーク接続がうまくいっていません。ビデオビットレートの設定を下げるか、より高速な回線を使用してください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>ストリーミングを開始する際に、ホストPCで何か問題が発生しました。</translation>
|
<translation>ストリーミングを開始する際に、ホストPCで何か問題が発生しました。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>ホストPCでDRM保護コンテンツを開いていないことを確認してください。また、ホストPCの再起動もお試しください。</translation>
|
<translation>ホストPCでDRM保護コンテンツを開いていないことを確認してください。また、ホストPCの再起動もお試しください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>問題が解決しない場合は、GPUドライバーとGeForce Experienceを再インストールしてみてください。</translation>
|
<translation>問題が解決しない場合は、GPUドライバーとGeForce Experienceを再インストールしてみてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>接続が終了しました</translation>
|
<translation>接続が終了しました</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>%1のGeForce Experienceのバージョンは、このビルドのMoonlightではサポートされていません。%1からストリーミングするには、Moonlightをアップデートする必要があります。</translation>
|
<translation>%1のGeForce Experienceのバージョンは、このビルドのMoonlightではサポートされていません。%1からストリーミングするには、Moonlightをアップデートする必要があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>リモートデスクトップマウスモードを有効にすると、ゲームで問題が発生する場合があります。</translation>
|
<translation>リモートデスクトップマウスモードを有効にすると、ゲームで問題が発生する場合があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>ソフトウェアデコードではHDRに対応していません。</translation>
|
<translation>ソフトウェアデコードではHDRに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>ソフトウェアデコードを強制する設定になっていると、ストリーミングのパフォーマンスが低下する場合があります。</translation>
|
<translation>ソフトウェアデコードを強制する設定になっていると、ストリーミングのパフォーマンスが低下する場合があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>サポートされていないFPSオプションを使用すると、スタッタリングやラグの原因となることがあります。</translation>
|
<translation>サポートされていないFPSオプションを使用すると、スタッタリングやラグの原因となることがあります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>ディスプレイよりも高いフレームレートでストリーミングする場合、垂直同期は無効になります。</translation>
|
<translation>ディスプレイよりも高いフレームレートでストリーミングする場合、垂直同期は無効になります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>GPUをサポートしていないHEVCを強制する設定を選択したため、ソフトウェアデコーディングを使用しています。これによってストリーミングパフォーマンスが低下する可能性があります。</translation>
|
<translation>GPUをサポートしていないHEVCを強制する設定を選択したため、ソフトウェアデコーディングを使用しています。これによってストリーミングパフォーマンスが低下する可能性があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>このPCのGPUはHEVCデコーディングに対応していません。</translation>
|
<translation type="vanished">このPCのGPUはHEVCデコーディングに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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>ホストPCのGPUはHEVCに対応していません。HEVCストリーミングにはGeForce GTX 900シリーズ(Maxwell)以降のGPUが必要です。</translation>
|
<translation>ホストPCのGPUはHEVCに対応していません。HEVCストリーミングにはGeForce GTX 900シリーズ(Maxwell)以降のGPUが必要です。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1はHDR10に対応していません。</translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1はHDR10に対応していません。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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>ホストPCのGPUはHDRストリーミングに対応していません。HDRストリーミングにはGeForce GTX 1000シリーズ(Pascal)以降のGPUが必要です。</translation>
|
<translation>ホストPCのGPUはHDRストリーミングに対応していません。HDRストリーミングにはGeForce GTX 1000シリーズ(Pascal)以降のGPUが必要です。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>このPCのGPUはHDRストリーミングのHEVC Main10デコーディングに対応していません。</translation>
|
<translation>このPCのGPUはHDRストリーミングのHEVC Main10デコーディングに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>4KストリーミングにはGeForce Experience 3.0以降が必要です。</translation>
|
<translation>4KストリーミングにはGeForce Experience 3.0以降が必要です。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>選択したサラウンド音声設定は現在のオーディオデバイスに対応していません。</translation>
|
<translation>選択したサラウンド音声設定は現在のオーディオデバイスに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>オーディオデバイスのオープンに失敗しました。このセッションでは音声は利用できません。</translation>
|
<translation>オーディオデバイスのオープンに失敗しました。このセッションでは音声は利用できません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation>接続されたゲームパッドはマッピングされていないため、使用できません。この問題を解決するには、Moonlightのヘルプをご覧ください。</translation>
|
<translation>接続されたゲームパッドはマッピングされていないため、使用できません。この問題を解決するには、Moonlightのヘルプをご覧ください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation>ホストPCのGPUは4Kを超えるビデオ解像度でのストリーミングに対応していません。</translation>
|
<translation>ホストPCのGPUは4Kを超えるビデオ解像度でのストリーミングに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation>4Kを超えるビデオ解像度はHEVCコーデックでのみ対応しています。</translation>
|
<translation>4Kを超えるビデオ解像度はHEVCコーデックでのみ対応しています。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation>このPCのGPUはハードウェアデコードに対応していないため、ハードウェアデコードを強制するという選択を満たすことができません。</translation>
|
<translation>このPCのGPUはハードウェアデコードに対応していないため、ハードウェアデコードを強制するという選択を満たすことができません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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>選択したコーデックとハードウェアデコードを強制する設定には互換性がありません。このPCのGPUは、選択したコーデックのデコードに対応していません。</translation>
|
<translation>選択したコーデックとハードウェアデコードを強制する設定には互換性がありません。このPCのGPUは、選択したコーデックのデコードに対応していません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation>GeForce Experienceがエラーを返しました: %1</translation>
|
<translation>GeForce Experienceがエラーを返しました: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation>ビデオデコーダを初期化できませんでした。ストリーミングの設定を確認して再度お試しください。</translation>
|
<translation>ビデオデコーダを初期化できませんでした。ストリーミングの設定を確認して再度お試しください。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -445,60 +492,60 @@
|
|||||||
<translation>設定</translation>
|
<translation>設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>解像度とFPS</translation>
|
<translation>解像度とFPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>PCやネットワーク接続に対して大きすぎる値を設定すると、ラグやスタッタリング、エラーの原因となる場合があります。</translation>
|
<translation>PCやネットワーク接続に対して大きすぎる値を設定すると、ラグやスタッタリング、エラーの原因となる場合があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>基本設定</translation>
|
<translation>基本設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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>カスタム解像度はGeForce Experienceで公式にサポートされていないため、ホストディスプレイの解像度は設定されません。ゲーム内で手動で設定する必要があります。</translation>
|
<translation>カスタム解像度はGeForce Experienceで公式にサポートされていないため、ホストディスプレイの解像度は設定されません。ゲーム内で手動で設定する必要があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation>クライアントやホストPCが対応していない解像度では、ストリーミングエラーが発生する可能性があります。</translation>
|
<translation>クライアントやホストPCが対応していない解像度では、ストリーミングエラーが発生する可能性があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation>カスタム解像度を入力:</translation>
|
<translation>カスタム解像度を入力:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation>%1 FPS</translation>
|
<translation>%1 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -507,167 +554,192 @@
|
|||||||
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation>映像ビットレート:</translation>
|
<translation>映像ビットレート:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation>低速回線ではビットレートを下げてください。画質を上げるにはビットレートを上げてください。</translation>
|
<translation>低速回線ではビットレートを下げてください。画質を上げるにはビットレートを上げてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation>映像ビットレート: %1 Mbps</translation>
|
<translation>映像ビットレート: %1 Mbps</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation>表示モード</translation>
|
<translation>表示モード</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
||||||
<translation> (推奨)</translation>
|
<translation> (推奨)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation>全画面表示</translation>
|
<translation>全画面表示</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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>一般的には全画面表示が最も優れたパフォーマンスを発揮しますが、macOSの操作スペース、Alt+Tab、スクリーンショットツール、オンスクリーンオーバーレイなどの機能を使用する場合は、ボーダレスウィンドウがより効果的です。</translation>
|
<translation>一般的には全画面表示が最も優れたパフォーマンスを発揮しますが、macOSの操作スペース、Alt+Tab、スクリーンショットツール、オンスクリーンオーバーレイなどの機能を使用する場合は、ボーダレスウィンドウがより効果的です。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation>ボーダレスウィンドウ</translation>
|
<translation>ボーダレスウィンドウ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation>%1 FPS (サポートされていません)</translation>
|
<translation>%1 FPS (サポートされていません)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation>ウィンドウ</translation>
|
<translation>ウィンドウ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation>垂直同期</translation>
|
<translation>垂直同期</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation>垂直同期を無効にすると、サブフレームのレンダリング遅延が発生しますが、目に見えるティアリングが表示されることがあります</translation>
|
<translation>垂直同期を無効にすると、サブフレームのレンダリング遅延が発生しますが、目に見えるティアリングが表示されることがあります</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation>フレームペーシング</translation>
|
<translation>フレームペーシング</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation>フレーム・ペーシングは、早すぎるフレームを遅らせることで、マイクロスタッターを軽減します</translation>
|
<translation>フレーム・ペーシングは、早すぎるフレームを遅らせることで、マイクロスタッターを軽減します</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation>音声設定</translation>
|
<translation>音声設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation>ステレオ</translation>
|
<translation>ステレオ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation>5.1サラウンドサウンド</translation>
|
<translation>5.1サラウンドサウンド</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation>7.1サラウンドサウンド</translation>
|
<translation>7.1サラウンドサウンド</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation>ストリーミング中にホストPCのスピーカーをミュートする</translation>
|
<translation>ストリーミング中にホストPCのスピーカーをミュートする</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation>この設定を有効にするには、現在進行中のゲームを再起動する必要があります</translation>
|
<translation>この設定を有効にするには、現在進行中のゲームを再起動する必要があります</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation>Moonlightがアクティブなウィンドウでないときに音声ストリームをミュートする</translation>
|
<translation>Moonlightがアクティブなウィンドウでないときに音声ストリームをミュートする</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||||
<translation>ストリーミングからAlt+Tabで抜けたり、別のウィンドウをクリックしたりすると、Moonlightの音声をミュートします。</translation>
|
<translation>ストリーミングからAlt+Tabで抜けたり、別のウィンドウをクリックしたりすると、Moonlightの音声をミュートします。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation>UI設定</translation>
|
<translation>UI設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation>言語</translation>
|
<translation>言語</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation>自動</translation>
|
<translation>自動</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation>この変更を有効にするには、Moonlightを再起動する必要があります</translation>
|
<translation>この変更を有効にするには、Moonlightを再起動する必要があります</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation>GUI表示モード</translation>
|
<translation>GUI表示モード</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation>最大化</translation>
|
<translation>最大化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation>入力設定</translation>
|
<translation>入力設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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>
|
<translation>これにより、クライアントのマウスカーソルをキャプチャすることなく、シームレスなマウスコントロールが可能になります。リモートデスクトップでの使用に最適ですが、ほとんどのゲームでは動作しません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<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のバグにより、ホストPCにマルチモニターがある場合、このオプションは正しく動作しない可能性があります。</translation>
|
<translation>注: GeForce Experienceのバグにより、ホストPCにマルチモニターがある場合、このオプションは正しく動作しない可能性があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
||||||
@@ -677,198 +749,208 @@
|
|||||||
<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>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<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>
|
<translation>注: WindowsのCtrl+Alt+Delのような特定のキーボードショートカットは、Moonlightを含むいかなるアプリケーションでも傍受することができません。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation>タッチスクリーンを仮想トラックパッドとして使用する</translation>
|
<translation>タッチスクリーンを仮想トラックパッドとして使用する</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation>マウスの左右のボタンを入れ替える</translation>
|
<translation>マウスの左右のボタンを入れ替える</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation>マウスのスクロール方向を逆にする</translation>
|
<translation>マウスのスクロール方向を逆にする</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation>ゲームパッドの設定</translation>
|
<translation>ゲームパッドの設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation>ゲームパッドのA/BとX/Yボタンを入れ替える</translation>
|
<translation>ゲームパッドのA/BとX/Yボタンを入れ替える</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation>ゲームパッドを任天堂スタイルのボタン配置に変更します</translation>
|
<translation>ゲームパッドを任天堂スタイルのボタン配置に変更します</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation>ゲームパッド#1を常時接続するよう強制</translation>
|
<translation>ゲームパッド#1を常時接続するよう強制</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||||
<translation>実際にはゲームパッドがPCに接続されていなくても、1台のゲームパッドが常にホストに接続されているように強制します。</translation>
|
<translation>実際にはゲームパッドがPCに接続されていなくても、1台のゲームパッドが常にホストに接続されているように強制します。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation>ストリーミング中でもCtrl+Alt+Shift+Mで切り替えることができます。</translation>
|
<translation>ストリーミング中でもCtrl+Alt+Shift+Mで切り替えることができます。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation>ゲームパッドで「スタート」ボタンを押しながらマウス操作ができるようにする</translation>
|
<translation>ゲームパッドで「スタート」ボタンを押しながらマウス操作ができるようにする</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation>Moonlightがバックグラウンドで動作しているときにゲームパッドの入力を処理する</translation>
|
<translation>Moonlightがバックグラウンドで動作しているときにゲームパッドの入力を処理する</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation>現在のウィンドウがフォーカスされていない場合でも、Moonlightがゲームパッドの入力をキャプチャできるようにします</translation>
|
<translation>現在のウィンドウがフォーカスされていない場合でも、Moonlightがゲームパッドの入力をキャプチャできるようにします</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation>ホスト設定</translation>
|
<translation>ホスト設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation>高度な設定</translation>
|
<translation>高度な設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation>オーディオ構成</translation>
|
<translation>オーディオ構成</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation>接続品質に関する警告の表示</translation>
|
<translation>接続品質に関する警告の表示</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation>Discord Rich Presenceの統合</translation>
|
<translation>Discord Rich Presenceの統合</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation>Discordのステータスを更新して、ストリーミングしているゲームの名前を表示します。</translation>
|
<translation>Discordのステータスを更新して、ストリーミングしているゲームの名前を表示します。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation>起動後のゲームパッドの接続をサポートしていないゲームをストリーミングする場合のみ、このオプションを有効にしてください。</translation>
|
<translation>起動後のゲームパッドの接続をサポートしていないゲームをストリーミングする場合のみ、このオプションを有効にしてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation>ゲームではなくリモートデスクトップにマウスを最適化</translation>
|
<translation>ゲームではなくリモートデスクトップにマウスを最適化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation>システムのキーボードショートカットをキャプチャ</translation>
|
<translation>システムのキーボードショートカットをキャプチャ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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>これにより、通常はストリーミング中にクライアントOSが処理するAlt+Tabなどのシステム全体のキーボードショートカットをキャプチャすることができます。</translation>
|
<translation>これにより、通常はストリーミング中にクライアントOSが処理するAlt+Tabなどのシステム全体のキーボードショートカットをキャプチャすることができます。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation>フルスクリーン時</translation>
|
<translation>フルスクリーン時</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation>常時</translation>
|
<translation>常時</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation>チェックすると、タッチスクリーンはトラックパッドのように動作します。チェックを外すと、タッチスクリーンが直接マウスポインターを操作するようになります。</translation>
|
<translation>チェックすると、タッチスクリーンはトラックパッドのように動作します。チェックを外すと、タッチスクリーンが直接マウスポインターを操作するようになります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation>ストリーミング用にゲーム設定を最適化</translation>
|
<translation>ストリーミング用にゲーム設定を最適化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation>ストリーミング終了後にホストPCのアプリを終了させる</translation>
|
<translation>ストリーミング終了後にホストPCのアプリを終了させる</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<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>
|
<translation>ストリーミングを終了すると、ストリーミング中のアプリやゲームが終了します。保存されていない進行状況は失われます!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation>映像デコーダ</translation>
|
<translation>映像デコーダ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation>自動 (推奨)</translation>
|
<translation>自動 (推奨)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation>ソフトウェアデコードを強制</translation>
|
<translation>ソフトウェアデコードを強制</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation>ハードウェアデコードを強制</translation>
|
<translation>ハードウェアデコードを強制</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation>ビデオコーデック</translation>
|
<translation>ビデオコーデック</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation>H.264</translation>
|
<translation>H.264</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation>HEVC (H.265)</translation>
|
<translation>HEVC (H.265)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation>サポートされていないFPSオプションをアンロック</translation>
|
<translation>サポートされていないFPSオプションをアンロック</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation>ローカルネットワーク上のPCを自動的に検出 (推奨)</translation>
|
<translation>ローカルネットワーク上のPCを自動的に検出 (推奨)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation>ブロックされた接続を自動的に検出 (推奨)</translation>
|
<translation>ブロックされた接続を自動的に検出 (推奨)</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,22 +984,22 @@
|
|||||||
<translation>このPCのインターネット接続がMoonlightをブロックしています。このネットワークに接続している間はインターネットでのストリーミングができない場合があります。</translation>
|
<translation>このPCのインターネット接続がMoonlightをブロックしています。このネットワークに接続している間はインターネットでのストリーミングができない場合があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation>ヒント:</translation>
|
<translation>ヒント:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation>%1を押してセッションを切断します</translation>
|
<translation>%1を押してセッションを切断します</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation>Start+Select+L1+R1</translation>
|
<translation>Start+Select+L1+R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -925,95 +1007,94 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>設定</translation>
|
<translation>設定</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation>バージョン %1</translation>
|
<translation>バージョン %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation>Discordコミュニティに参加する</translation>
|
<translation>Discordコミュニティに参加する</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation>コンピュータ</translation>
|
<translation type="vanished">コンピュータ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation>手動でPCを追加</translation>
|
<translation>手動でPCを追加</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation>Moonlightで利用可能なアップデート: バージョン %1</translation>
|
<translation>Moonlightで利用可能なアップデート: バージョン %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation>ゲームパッドマッパー</translation>
|
<translation>ゲームパッドマッパー</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation>ゲームパッドのマッピング</translation>
|
<translation type="vanished">ゲームパッドのマッピング</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>ハードウェアアクセラレーションによるH.264ビデオデコーダーがMoonlightによって検出されませんでした。この構成では、ストリーミングのパフォーマンスが大幅に低下する可能性があります。</translation>
|
<translation type="vanished">ハードウェアアクセラレーションによるH.264ビデオデコーダーがMoonlightによって検出されませんでした。この構成では、ストリーミングのパフォーマンスが大幅に低下する可能性があります。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation>XWaylandではハードウェアアクセラレーションが動作しません。XWaylandで続行すると、ストリーミングのパフォーマンスが低下する可能性があります。QT_QPA_PLATFORM=waylandで実行するか、X11に切り替えてみてください。</translation>
|
<translation>XWaylandではハードウェアアクセラレーションが動作しません。XWaylandで続行すると、ストリーミングのパフォーマンスが低下する可能性があります。QT_QPA_PLATFORM=waylandで実行するか、X11に切り替えてみてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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>このバージョンのMoonlightは、お使いのPCに最適化されていません。最高のストリーミングパフォーマンスを実現するには、Moonlightの'%1'バージョンをダウンロードしてください。</translation>
|
<translation>このバージョンのMoonlightは、お使いのPCに最適化されていません。最高のストリーミングパフォーマンスを実現するには、Moonlightの'%1'バージョンをダウンロードしてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation>Moonlightはマッピングのないゲームパッドを検出しました:</translation>
|
<translation>Moonlightはマッピングのないゲームパッドを検出しました:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>ヘルプ</translation>
|
<translation>ヘルプ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation>この問題を解決するための詳細情報については、ヘルプボタンをクリックしてください。</translation>
|
<translation>この問題を解決するための詳細情報については、ヘルプボタンをクリックしてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation>詳細については、ヘルプボタンをクリックしてください。</translation>
|
<translation>詳細については、ヘルプボタンをクリックしてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation>ゲームパッドをマップする方法については、ヘルプボタンをクリックしてください。</translation>
|
<translation>ゲームパッドをマップする方法については、ヘルプボタンをクリックしてください。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation>本当に終了しますか?</translation>
|
<translation>本当に終了しますか?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation>GameStream PCのIPアドレスを入力してください:</translation>
|
<translation>GameStream PCのIPアドレスを入力してください:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Binary file not shown.
+233
-152
@@ -51,6 +51,24 @@
|
|||||||
<translation>%1을(를) 종료하시겠습니까? 저장하지 않은 모든 진행 상황은 손실됩니다.</translation>
|
<translation>%1을(를) 종료하시겠습니까? 저장하지 않은 모든 진행 상황은 손실됩니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation>PC에 연결하는 중...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation>페어링 중... %2에 '%1'을(를) 입력하십시오.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation>페어링이 성공적으로 완료되었습니다</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>오디오 캡처 장치가 없습니다. GeForce Experience를 다시 설치하면 이 오류가 해결됩니다.</translation>
|
<translation>오디오 캡처 장치가 없습니다. GeForce Experience를 다시 설치하면 이 오류가 해결됩니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -246,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>실행 중인 게임이 이 PC에서 시작되지 않았습니다. 호스트 PC에서 게임을 수동으로 종료하거나 원래 게임을 시작한 장치를 사용해야 합니다.</translation>
|
<translation>실행 중인 게임이 이 PC에서 시작되지 않았습니다. 호스트 PC에서 게임을 수동으로 종료하거나 원래 게임을 시작한 장치를 사용해야 합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -254,6 +272,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation>%1은(는) 이미 페어링되었습니다</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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>이전 세션이 호스트 PC에서 실행 중인 동안에는 페어링 할 수 없습니다. 실행 중인 게임을 종료하거나 호스트 PC를 재부팅 한 다음 다시 페어링을 시도하십시오.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -276,6 +305,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>응용 프로그램 %1을(를) 찾지 못했습니다</translation>
|
<translation>응용 프로그램 %1을(를) 찾지 못했습니다</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation>컴퓨터 %1이(가) 페어링되지 않았습니다. 게임 목록을 검색하기 전에 Moonlight를 열어 페어링하십시오.</translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -292,147 +326,160 @@
|
|||||||
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>호스트로부터 받은 영상이 없습니다.</translation>
|
<translation>호스트로부터 받은 영상이 없습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>방화벽 및 다음 포트의 포트 포워딩 규칙을 확인하여 주십시오: %1</translation>
|
<translation>방화벽 및 다음 포트의 포트 포워딩 규칙을 확인하여 주십시오: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>네트워크 연결이 제대로 작동하지 않습니다. 영상 비트레이트 설정을 줄이거나 더 빠른 연결을 시도하십시오.</translation>
|
<translation>네트워크 연결이 제대로 작동하지 않습니다. 영상 비트레이트 설정을 줄이거나 더 빠른 연결을 시도하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>스트리밍을 시작할 때 호스트 PC에서 문제가 발생했습니다.</translation>
|
<translation>스트리밍을 시작할 때 호스트 PC에서 문제가 발생했습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>호스트 PC에 DRM으로 보호된 콘텐츠가 열려 있지 않은지 확인하십시오. 또한 호스트 PC를 다시 시작하는 것을 시도해 볼 수 있습니다.</translation>
|
<translation>호스트 PC에 DRM으로 보호된 콘텐츠가 열려 있지 않은지 확인하십시오. 또한 호스트 PC를 다시 시작하는 것을 시도해 볼 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>문제가 지속되면 GPU 드라이버와 GeForce Experience를 다시 설치해보십시오.</translation>
|
<translation>문제가 지속되면 GPU 드라이버와 GeForce Experience를 다시 설치해보십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>연결이 종료되었습니다</translation>
|
<translation>연결이 종료되었습니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>%1의 GeForce Experience 버전은 이 빌드의 Moonlight에서 지원되지 않습니다. %1에서 스트리밍하려면 Moonlight를 업데이트 해야 합니다.</translation>
|
<translation>%1의 GeForce Experience 버전은 이 빌드의 Moonlight에서 지원되지 않습니다. %1에서 스트리밍하려면 Moonlight를 업데이트 해야 합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>원격 데스크톱 마우스 모드를 활성화하도록 선택하면 게임에서 문제가 발생할 수 있습니다.</translation>
|
<translation>원격 데스크톱 마우스 모드를 활성화하도록 선택하면 게임에서 문제가 발생할 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>HDR는 소프트웨어 디코딩에서 지원되지 않습니다.</translation>
|
<translation>HDR는 소프트웨어 디코딩에서 지원되지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>소프트웨어 디코딩을 강제하도록 선택하면 스트리밍 성능이 저하 될 수 있습니다.</translation>
|
<translation>소프트웨어 디코딩을 강제하도록 선택하면 스트리밍 성능이 저하 될 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>지원되지 않는 FPS 옵션을 사용하면 끊김 또는 지연이 발생할 수 있습니다.</translation>
|
<translation>지원되지 않는 FPS 옵션을 사용하면 끊김 또는 지연이 발생할 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>수직동기화는 디스플레이보다 높은 프레임 레이트로 스트리밍 할 때 비활성화됩니다.</translation>
|
<translation>수직동기화는 디스플레이보다 높은 프레임 레이트로 스트리밍 할 때 비활성화됩니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>GPU 지원 없이 HEVC를 강제하도록 선택하여 소프트웨어 디코딩을 사용합니다. 이로 인해 스트리밍 성능이 저하 될 수 있습니다.</translation>
|
<translation>GPU 지원 없이 HEVC를 강제하도록 선택하여 소프트웨어 디코딩을 사용합니다. 이로 인해 스트리밍 성능이 저하 될 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>이 PC의 GPU는 HEVC 디코딩을 지원하지 않습니다.</translation>
|
<translation type="vanished">이 PC의 GPU는 HEVC 디코딩을 지원하지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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>호스트 PC의 GPU가 HEVC를 지원하지 않습니다. HEVC 스트리밍에는 GeForce GTX 900 시리즈 (Maxwell) 이상의 GPU가 필요합니다.</translation>
|
<translation>호스트 PC의 GPU가 HEVC를 지원하지 않습니다. HEVC 스트리밍에는 GeForce GTX 900 시리즈 (Maxwell) 이상의 GPU가 필요합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1은(는) HDR10을 지원하지 않습니다.</translation>
|
<translation>H.264 사용을 강제하도록 선택하였으나 GPU 미지원으로 인해 소프트웨어 디코딩을 사용 중입니다. 이로 인해 스트리밍 성능이 저하될 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation>호스트 PC와 클라이언트 PC가 동일한 비디오 코덱을 지원하지 않습니다. 이로 인해 스트리밍 성능이 저하될 수 있습니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation>클라이언트 GPU가 H.264 디코딩을 지원하지 않습니다. 이로 인해 스트리밍 성능이 저하될 수 있습니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1은(는) HDR10을 지원하지 않습니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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>호스트 PC의 GPU가 HDR 스트리밍을 지원하지 않습니다. HDR 스트리밍에는 GeForce GTX 1000 시리즈 (Pascal) 이상의 GPU가 필요합니다.</translation>
|
<translation>호스트 PC의 GPU가 HDR 스트리밍을 지원하지 않습니다. HDR 스트리밍에는 GeForce GTX 1000 시리즈 (Pascal) 이상의 GPU가 필요합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>이 PC의 GPU는 HDR 스트리밍을 위한 HEVC Main10 디코딩을 지원하지 않습니다.</translation>
|
<translation>이 PC의 GPU는 HDR 스트리밍을 위한 HEVC Main10 디코딩을 지원하지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>4K 스트리밍에는 GeForce Experience 3.0 이상이 필요합니다.</translation>
|
<translation>4K 스트리밍에는 GeForce Experience 3.0 이상이 필요합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>선택한 서라운드 사운드 설정은 현재 오디오 장치에서 지원되지 않습니다.</translation>
|
<translation>선택한 서라운드 사운드 설정은 현재 오디오 장치에서 지원되지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>오디오 장치를 열지 못했습니다. 이 세션에서는 오디오를 사용할 수 없습니다.</translation>
|
<translation>오디오 장치를 열지 못했습니다. 이 세션에서는 오디오를 사용할 수 없습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation>연결된 게임 패드에 매핑이 없으며 사용할 수 없습니다. 이 문제를 해결하려면 Moonlight 도움말을 방문하십시오.</translation>
|
<translation>연결된 게임 패드에 매핑이 없으며 사용할 수 없습니다. 이 문제를 해결하려면 Moonlight 도움말을 방문하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation>호스트 PC의 GPU가 4K 이상의 비디오 해상도의 스트리밍을 지원하지 않습니다.</translation>
|
<translation>호스트 PC의 GPU가 4K 이상의 비디오 해상도의 스트리밍을 지원하지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation>4K 이상의 비디오 해상도는 HEVC 코덱에서만 지원됩니다.</translation>
|
<translation>4K 이상의 비디오 해상도는 HEVC 코덱에서만 지원됩니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation>이 PC의 GPU가 하드웨어 디코딩을 지원하지 않아 하드웨어 디코딩을 강제하도록 선택하였으나 지원되지 않습니다.</translation>
|
<translation>이 PC의 GPU가 하드웨어 디코딩을 지원하지 않아 하드웨어 디코딩을 강제하도록 선택하였으나 지원되지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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>선택한 코덱과 하드웨어 디코딩을 강제하도록 선택한 설정이 호환되지 않습니다. 이 PC의 GPU는 선택한 코덱의 디코딩을 지원하지 않습니다.</translation>
|
<translation>선택한 코덱과 하드웨어 디코딩을 강제하도록 선택한 설정이 호환되지 않습니다. 이 PC의 GPU는 선택한 코덱의 디코딩을 지원하지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation>GeForce Experience에서 오류를 반환했습니다: %1</translation>
|
<translation>GeForce Experience에서 오류를 반환했습니다: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation>비디오 디코더를 초기화 할 수 없습니다. 스트리밍 설정을 확인하고 다시 시도하십시오.</translation>
|
<translation>비디오 디코더를 초기화 할 수 없습니다. 스트리밍 설정을 확인하고 다시 시도하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -445,60 +492,60 @@
|
|||||||
<translation>설정</translation>
|
<translation>설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>해상도 및 FPS</translation>
|
<translation>해상도 및 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>PC 또는 네트워크 연결보다 너무 높은 값을 설정하면 지연, 끊김 또는 오류가 발생할 수 있습니다.</translation>
|
<translation>PC 또는 네트워크 연결보다 너무 높은 값을 설정하면 지연, 끊김 또는 오류가 발생할 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>기본 설정</translation>
|
<translation>기본 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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>사용자 지정 해상도는 GeForce Experience에서 공식적으로 지원되지 않으므로 해당 설정은 호스트 디스플레이의 해상도를 설정하지 않습니다. 게임 중에 수동으로 설정해야합니다.</translation>
|
<translation>사용자 지정 해상도는 GeForce Experience에서 공식적으로 지원되지 않으므로 해당 설정은 호스트 디스플레이의 해상도를 설정하지 않습니다. 게임 중에 수동으로 설정해야합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation>클라이언트 또는 호스트 PC에서 지원하지 않는 해상도로 인해 스트리밍 오류가 발생할 수 있습니다.</translation>
|
<translation>클라이언트 또는 호스트 PC에서 지원하지 않는 해상도로 인해 스트리밍 오류가 발생할 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation>사용자 정의 해상도 입력:</translation>
|
<translation>사용자 정의 해상도 입력:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation>%1 FPS</translation>
|
<translation>%1 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -507,167 +554,192 @@
|
|||||||
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation>영상 비트레이트:</translation>
|
<translation>영상 비트레이트:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation>느린 연결에서는 비트레이트를 낮추십시오. 이미지 품질을 높이려면 비트레이트를 높이십시오.</translation>
|
<translation>느린 연결에서는 비트레이트를 낮추십시오. 이미지 품질을 높이려면 비트레이트를 높이십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation>영상 비트레이트: %1 Mbps</translation>
|
<translation>영상 비트레이트: %1 Mbps</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation>디스플레이 모드</translation>
|
<translation>디스플레이 모드</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
||||||
<translation> (권장)</translation>
|
<translation> (권장)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation>전체 화면</translation>
|
<translation>전체 화면</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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>전체 화면은 일반적으로 최상의 성능을 제공하지만 테두리 없는 창은 macOS Spaces, Alt+Tab, 스크린샷 도구, 화면 오버레이 등과 같은 기능에서 더 잘 작동합니다.</translation>
|
<translation>전체 화면은 일반적으로 최상의 성능을 제공하지만 테두리 없는 창은 macOS Spaces, Alt+Tab, 스크린샷 도구, 화면 오버레이 등과 같은 기능에서 더 잘 작동합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation>테두리 없는 창</translation>
|
<translation>테두리 없는 창</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation>%1 FPS (지원되지 않음)</translation>
|
<translation>%1 FPS (지원되지 않음)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation>창</translation>
|
<translation>창</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation>수직동기화</translation>
|
<translation>수직동기화</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation>수직동기화를 비활성화하면 서브프레임 렌더링 지연이 허용되지만 화면 찢김이 발생할 수 있습니다</translation>
|
<translation>수직동기화를 비활성화하면 서브프레임 렌더링 지연이 허용되지만 화면 찢김이 발생할 수 있습니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation>프레임 조율</translation>
|
<translation>프레임 조율</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation>프레임 조율은 너무 일찍 들어오는 프레임을 지연시켜 미세한 끊김 현상을 줄입니다</translation>
|
<translation>프레임 조율은 너무 일찍 들어오는 프레임을 지연시켜 미세한 끊김 현상을 줄입니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation>오디오 설정</translation>
|
<translation>오디오 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation>스테레오</translation>
|
<translation>스테레오</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation>5.1 서라운드 사운드</translation>
|
<translation>5.1 서라운드 사운드</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation>7.1 서라운드 사운드</translation>
|
<translation>7.1 서라운드 사운드</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation>스트리밍하는 동안 호스트 PC 스피커를 음소거</translation>
|
<translation>스트리밍하는 동안 호스트 PC 스피커를 음소거</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation>이 설정을 적용하려면 현재 진행중인 게임을 다시 시작해야합니다</translation>
|
<translation>이 설정을 적용하려면 현재 진행중인 게임을 다시 시작해야합니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation>Moonlight가 활성 창이 아닌 경우 오디오 스트림을 음소거</translation>
|
<translation>Moonlight가 활성 창이 아닌 경우 오디오 스트림을 음소거</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||||
<translation>스트림에서 Alt+Tab을 누르거나 다른 창을 클릭하면 Moonlight의 오디오를 음소거합니다.</translation>
|
<translation>스트림에서 Alt+Tab을 누르거나 다른 창을 클릭하면 Moonlight의 오디오를 음소거합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation>UI 설정</translation>
|
<translation>UI 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation>언어</translation>
|
<translation>언어</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation>자동</translation>
|
<translation>자동</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation>이 변경 사항을 적용하려면 Moonlight를 다시 시작해야합니다</translation>
|
<translation>이 변경 사항을 적용하려면 Moonlight를 다시 시작해야합니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation>GUI 디스플레이 모드</translation>
|
<translation>GUI 디스플레이 모드</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation>최대화</translation>
|
<translation>최대화</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation>입력 설정</translation>
|
<translation>입력 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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>
|
<translation>클라이언트의 마우스 커서 캡처없이 원활한 마우스 제어가 가능합니다. 원격 데스크톱 사용에 이상적이지만 대부분의 게임에서는 작동하지 않습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<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의 버그로 인해 호스트 PC에 다중 모니터가 있는 경우 이 옵션이 제대로 작동하지 않을 수 있습니다.</translation>
|
<translation>참고: GeForce Experience의 버그로 인해 호스트 PC에 다중 모니터가 있는 경우 이 옵션이 제대로 작동하지 않을 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation>HDR을 활성화하면 지정된 디코더 선택이 무시됩니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation>HDR을 활성화하면 지정된 코덱 선택이 무시됩니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation>HDR 활성화 (실험적 기능)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation>이 스트림은 HDR을 지원하지만 일부 게임에서는 HDR 모드를 활성화하기 위해 호스트 PC에 HDR 모니터가 필요할 수 있습니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation>이 PC에서는 HDR 스트리밍이 지원되지 않습니다.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
||||||
@@ -677,198 +749,208 @@
|
|||||||
<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>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<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>
|
<translation>참고: Windows의 Ctrl+Alt+Del과 같은 특정 키보드 단축키는 Moonlight를 포함한 모든 응용 프로그램에서 가로챌 수 없습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation>터치스크린을 가상 트랙패드로 사용</translation>
|
<translation>터치스크린을 가상 트랙패드로 사용</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation>왼쪽과 오른쪽 마우스 버튼 전환</translation>
|
<translation>왼쪽과 오른쪽 마우스 버튼 전환</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation>마우스 스크롤 방향 반전</translation>
|
<translation>마우스 스크롤 방향 반전</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation>게임패드 설정</translation>
|
<translation>게임패드 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation>게임패드 버튼 A/B와 X/Y 전환</translation>
|
<translation>게임패드 버튼 A/B와 X/Y 전환</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation>게임패드를 Nintendo 스타일의 레이아웃으로 전환합니다</translation>
|
<translation>게임패드를 Nintendo 스타일의 레이아웃으로 전환합니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation>게임패드 #1을 항상 연결</translation>
|
<translation>게임패드 #1을 항상 연결</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||||
<translation>이 PC에 실제로 연결된 게임패드가 없는 경우에도 단일 게임패드가 항상 호스트에 연결되도록 합니다.</translation>
|
<translation>이 PC에 실제로 연결된 게임패드가 없는 경우에도 단일 게임패드가 항상 호스트에 연결되도록 합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation>스트리밍 중에 Ctrl+Alt+Shift+M을 사용하여 전환 할 수 있습니다.</translation>
|
<translation>스트리밍 중에 Ctrl+Alt+Shift+M을 사용하여 전환 할 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation>'Start' 버튼을 누르는 동안 게임패드로 마우스 제어를 활성화</translation>
|
<translation>'Start' 버튼을 누르는 동안 게임패드로 마우스 제어를 활성화</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation>Moonlight가 백그라운드에 있을 때 게임패드 입력 처리</translation>
|
<translation>Moonlight가 백그라운드에 있을 때 게임패드 입력 처리</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation>Moonlight가 현재 초점이 맞춰진 창이 아닌 경우에도 게임패드 입력을 캡처할 수 있습니다</translation>
|
<translation>Moonlight가 현재 초점이 맞춰진 창이 아닌 경우에도 게임패드 입력을 캡처할 수 있습니다</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation>호스트 설정</translation>
|
<translation>호스트 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation>고급 설정</translation>
|
<translation>고급 설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation>오디오 구성</translation>
|
<translation>오디오 구성</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation>연결 품질 경고 표시</translation>
|
<translation>연결 품질 경고 표시</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation>Discord Rich Presence 통합</translation>
|
<translation>Discord Rich Presence 통합</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation>스트리밍중인 게임의 이름을 표시하도록 Discord 상태를 업데이트합니다.</translation>
|
<translation>스트리밍중인 게임의 이름을 표시하도록 Discord 상태를 업데이트합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation>시작 후 연결되는 게임패드를 지원하지 않는 게임을 스트리밍할 때만 이 옵션을 활성화하십시오.</translation>
|
<translation>시작 후 연결되는 게임패드를 지원하지 않는 게임을 스트리밍할 때만 이 옵션을 활성화하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation>게임 대신 원격 데스크톱에 맞게 마우스 최적화</translation>
|
<translation>게임 대신 원격 데스크톱에 맞게 마우스 최적화</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation>스트리밍 중 화면 켜짐 유지</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation>스트리밍 도중 화면 보호기의 시작 또는 디스플레이 잠자기를 방지합니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation>시스템 키보드 단축키 캡처</translation>
|
<translation>시스템 키보드 단축키 캡처</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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>일반적으로 클라이언트 OS에서 처리하는 Alt+Tab과 같은 시스템 전체 키보드 단축키를 캡처합니다.</translation>
|
<translation>일반적으로 클라이언트 OS에서 처리하는 Alt+Tab과 같은 시스템 전체 키보드 단축키를 캡처합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation>전체 화면에서</translation>
|
<translation>전체 화면에서</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation>항상</translation>
|
<translation>항상</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation>선택하면 터치스크린이 트랙패드처럼 작동합니다. 선택하지 않으면 터치스크린이 마우스 포인터를 직접 제어합니다.</translation>
|
<translation>선택하면 터치스크린이 트랙패드처럼 작동합니다. 선택하지 않으면 터치스크린이 마우스 포인터를 직접 제어합니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation>게임 설정을 스트리밍을 위해 최적화</translation>
|
<translation>게임 설정을 스트리밍을 위해 최적화</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation>스트리밍 종료 후 호스트 PC에서 앱 종료</translation>
|
<translation>스트리밍 종료 후 호스트 PC에서 앱 종료</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<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>
|
<translation>스트리밍을 종료하면 스트리밍 중인 앱이나 게임이 종료됩니다. 저장하지 않은 진행 상황을 잃게됩니다!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation>비디오 디코더</translation>
|
<translation>비디오 디코더</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation>자동 (권장)</translation>
|
<translation>자동 (권장)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation>소프트웨어 디코딩 강제</translation>
|
<translation>소프트웨어 디코딩 강제</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation>하드웨어 디코딩 강제</translation>
|
<translation>하드웨어 디코딩 강제</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation>비디오 코덱</translation>
|
<translation>비디오 코덱</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation>H.264</translation>
|
<translation>H.264</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation>HEVC (H.265)</translation>
|
<translation>HEVC (H.265)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation>지원되지 않는 FPS 옵션 잠금 해제</translation>
|
<translation>지원되지 않는 FPS 옵션 잠금 해제</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation>로컬 네트워크에서 자동으로 PC 찾기 (권장)</translation>
|
<translation>로컬 네트워크에서 자동으로 PC 찾기 (권장)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation>차단된 연결 자동 감지 (권장)</translation>
|
<translation>차단된 연결 자동 감지 (권장)</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,22 +984,22 @@
|
|||||||
<translation>이 PC의 인터넷 연결이 Moonlight를 차단하고 있습니다. 이 네트워크에 연결되어 있으면 인터넷을 통한 스트리밍이 작동하지 않을 수 있습니다.</translation>
|
<translation>이 PC의 인터넷 연결이 Moonlight를 차단하고 있습니다. 이 네트워크에 연결되어 있으면 인터넷을 통한 스트리밍이 작동하지 않을 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation>팁:</translation>
|
<translation>팁:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation>세션 연결을 끊으려면 %1을(를) 누르십시오</translation>
|
<translation>세션 연결을 끊으려면 %1을(를) 누르십시오</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation>Start+Select+L1+R1</translation>
|
<translation>Start+Select+L1+R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -925,95 +1007,94 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>설정</translation>
|
<translation>설정</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation>버전 %1</translation>
|
<translation>버전 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation>Discord에서 커뮤니티에 가입하세요</translation>
|
<translation>Discord에서 커뮤니티에 가입하세요</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation>컴퓨터</translation>
|
<translation type="vanished">컴퓨터</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation>수동으로 PC 추가</translation>
|
<translation>수동으로 PC 추가</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation>Moonlight 업데이트 가능: 버전 %1</translation>
|
<translation>Moonlight 업데이트 가능: 버전 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation>게임패드 매퍼</translation>
|
<translation>게임패드 매퍼</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation>게임패드 매핑</translation>
|
<translation type="vanished">게임패드 매핑</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>사용 가능한 하드웨어 가속 H.264 비디오 디코더가 감지되지 않았습니다. 이 구성에서는 스트리밍 성능이 심각하게 저하될 수 있습니다.</translation>
|
<translation type="vanished">사용 가능한 하드웨어 가속 H.264 비디오 디코더가 감지되지 않았습니다. 이 구성에서는 스트리밍 성능이 심각하게 저하될 수 있습니다.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation>하드웨어 가속은 XWayland에서 작동하지 않습니다. XWayland에서 계속 진행 시 스트리밍 성능이 저하 될 수 있습니다. QT_QPA_PLATFORM=wayland로 실행하거나 X11로 전환하십시오.</translation>
|
<translation>하드웨어 가속은 XWayland에서 작동하지 않습니다. XWayland에서 계속 진행 시 스트리밍 성능이 저하 될 수 있습니다. QT_QPA_PLATFORM=wayland로 실행하거나 X11로 전환하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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>이 버전의 Moonlight는 해당 PC에 최적화되어 있지 않습니다. 최상의 스트리밍 성능을 위해 Moonlight '%1'버전을 다운로드하십시오.</translation>
|
<translation>이 버전의 Moonlight는 해당 PC에 최적화되어 있지 않습니다. 최상의 스트리밍 성능을 위해 Moonlight '%1'버전을 다운로드하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation>Moonlight가 매핑없는 게임패드를 감지했습니다:</translation>
|
<translation>Moonlight가 매핑없는 게임패드를 감지했습니다:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>도움말</translation>
|
<translation>도움말</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation>Moonlight에서 작동하는 하드웨어 가속 비디오 디코더가 감지되지 않았습니다. 이 구성에서는 스트리밍 성능이 심각하게 저하될 수 있습니다.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation>이 문제의 해결에 대한 자세한 내용을 보려면 도움말 단추를 클릭하십시오.</translation>
|
<translation>이 문제의 해결에 대한 자세한 내용을 보려면 도움말 단추를 클릭하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation>자세한 내용은 도움말 버튼을 클릭하십시오.</translation>
|
<translation>자세한 내용은 도움말 버튼을 클릭하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation>게임패드 매핑 방법에 대한 정보를 보려면 도움말 버튼을 클릭하십시오.</translation>
|
<translation>게임패드 매핑 방법에 대한 정보를 보려면 도움말 버튼을 클릭하십시오.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation>종료 하시겠습니까?</translation>
|
<translation>종료 하시겠습니까?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation>GameStream PC의 IP 주소를 입력하십시오:</translation>
|
<translation>GameStream PC의 IP 주소를 입력하십시오:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Binary file not shown.
+263
-178
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.
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.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
+243
-158
@@ -28,7 +28,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../gui/AppView.qml" line="315"/>
|
<location filename="../gui/AppView.qml" line="315"/>
|
||||||
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
|
<source>Launch this app immediately when the host is selected, bypassing the app selection grid.</source>
|
||||||
<translation>Запустить эту игру при выборе хоста (пропустить страницу выбора игры)</translation>
|
<translation>Запустить это приложение сразу после выбора хоста, пропуская страницу выбора приложений.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/AppView.qml" line="324"/>
|
<location filename="../gui/AppView.qml" line="324"/>
|
||||||
@@ -51,6 +51,24 @@
|
|||||||
<translation>Вы уверены, что хотите завершить %1? Несохранённый прогресс может быть утерян.</translation>
|
<translation>Вы уверены, что хотите завершить %1? Несохранённый прогресс может быть утерян.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation type="unfinished">Подключение к ПК...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>Потеряно виртуальное аудиоустройство. Попробуйте переустановить GeForce Experience.</translation>
|
<translation>Потеряно виртуальное аудиоустройство. Попробуйте переустановить GeForce Experience.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -160,7 +178,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../gui/PcView.qml" line="224"/>
|
<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>
|
<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>
|
<translation>Версия GeForce Experience на %1 не поддерживается данной сборкой Moonlight. Вы должны обновить Moonlight для потоковой передачи с %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/PcView.qml" line="247"/>
|
<location filename="../gui/PcView.qml" line="247"/>
|
||||||
@@ -246,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>
|
<translation>Выбранная игра уже запущена. Вручную закройте игру на хост-ПК, или используйте устройство, с которого она была запущена.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -254,6 +272,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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 type="unfinished">Нельзя создать новую пару, пока на ПК ещё активно соединение. Завершите запущенную на хосте игру или перезапустите ПК-хост, затем попробуйте ещё раз.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -276,6 +305,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>Не удалось найти игру "%1"</translation>
|
<translation>Не удалось найти игру "%1"</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -292,147 +326,160 @@
|
|||||||
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>Не удалось загрузить видео с хост-ПК. (No video received from host.)</translation>
|
<translation>Видео не получена с раздающего компьютера.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>Проверьте настройки брандмауэра и проброса портов для следующих портов: %1</translation>
|
<translation>Проверьте настройки брандмауэра и проброса портов для следующих портов: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>Ваше сетевое подключение не справляется с заданными настройками. Попробуйте изменить битрейт или использовать более быстрое подключение.</translation>
|
<translation>Ваше сетевое подключение не справляется с заданными настройками. Попробуйте изменить битрейт или использовать более быстрое подключение.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>Что-то пошло не так на хост-ПК при попытке начать стрим.</translation>
|
<translation>Что-то пошло не так на хост-ПК при попытке начать стрим.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>Убедитесь, что на нём не открыто защищённых DRM материалов. Также попытайтесь перезагрузить ПК.</translation>
|
<translation>Убедитесь, что на нём не открыто защищённых DRM материалов. Также попытайтесь перезагрузить ПК.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>Если проблема не уходит, попробуйте переустановить драйвер видеокарты и/или GeForce Experience.</translation>
|
<translation>Если проблема не уходит, попробуйте переустановить драйвер видеокарты и/или GeForce Experience.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>Подключение разорвано</translation>
|
<translation>Подключение разорвано</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>
|
<translation>Версия GeForce Experience на %1 не поддерживается данной сборкой Moonlight. Вы должны обновить Moonlight для потоковой передачи с %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>Вы выбрали режим удалённого рабочего стола. Это может вызвать проблемы с мышью в некоторых играх.</translation>
|
<translation>Вы выбрали режим удалённого рабочего стола. Это может вызвать проблемы с мышью в некоторых играх.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>HDR не поддерживается с программным декодированием.</translation>
|
<translation>HDR не поддерживается с программным декодированием.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>Вы выбрали программное декодирование, что может ухудшить производительность.</translation>
|
<translation>Вы выбрали программное декодирование, что может ухудшить производительность.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>Неподдерживаемые значения FPS могут вызвать подтормаживания или повысить задержку.</translation>
|
<translation>Неподдерживаемые значения FPS могут вызвать подтормаживания или повысить задержку.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>V-sync будет отключён, если частота кадров стрима превышает частоту развёртки экрана.</translation>
|
<translation>V-sync будет отключён, если частота кадров стрима превышает частоту развёртки экрана.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>Ваша видеокарта не поддерживает аппаратное декодирование HEVC, используется программное декодирование. Это может ухудшить производительность.</translation>
|
<translation>Ваша видеокарта не поддерживает аппаратное декодирование HEVC, используется программное декодирование. Это может ухудшить производительность.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>Видеокарта этого ПК не поддерживает декодирование HEVC.</translation>
|
<translation type="vanished">Видеокарта этого ПК не поддерживает декодирование HEVC.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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. Требуется видеокарты GTX 900 серии или новее. Используйте H264.</translation>
|
<translation>Видеокарта хост-ПК не поддеживает HEVC. Требуется видеокарты GTX 900 серии или новее. Используйте H264.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1 не поддеживает HDR10.</translation>
|
<translation>Использования программного обеспечения с декодированием в следствие выбора H.264 без поддержки ГП. Это может вызвать низкий уровень производительности при трансляции.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation>Ваш компьютер, осуществляющий раздачу, или компьютер-клиент не поддерживают одинаковые видео кодеки. Это может вызвать низкую производительность потока.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation>Клиентская графическая карта не поддерживает H.264 кодировку. Это может вызвать низкую производительность потока.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1 не поддеживает HDR10.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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. Нужна видеокарта GTX серии 1000 или новее.</translation>
|
<translation>Видеокарты ПК-хоста не поддеживает стрим в HDR. Нужна видеокарта GTX серии 1000 или новее.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>Видеокарта этого ПК не поддерживает декодирование HEVC профиля Main10, HDR недоступен.</translation>
|
<translation>Видеокарта этого ПК не поддерживает декодирование HEVC профиля Main10, HDR недоступен.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>Разрешение 4K требует GeForce Experience 3.0 или новее.</translation>
|
<translation>Разрешение 4K требует GeForce Experience 3.0 или новее.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>Ваша настройка объёмного звука не поддерживается текущим аудиоустройством.</translation>
|
<translation>Ваша настройка объёмного звука не поддерживается текущим аудиоустройством.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>Не удалось открыть аудиоустройство на этом ПК. Звук будет отключён на этот раз.</translation>
|
<translation>Не удалось открыть аудиоустройство на этом ПК. Звук будет отключён на этот раз.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation>Подключённый геймпад не настроен и не может быть использован. Посетите раздел помощи Moonlight, чтобы исправить это.</translation>
|
<translation>Подключённый геймпад не настроен и не может быть использован. Посетите раздел помощи Moonlight, чтобы исправить это.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation>Видеокарта хост-ПК не поддерживает разрешения выше 4K.</translation>
|
<translation>Видеокарта хост-ПК не поддерживает разрешения выше 4K.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation>Разрешения выше 4K работают только с HEVC.</translation>
|
<translation>Разрешения выше 4K работают только с HEVC.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation>Вы выбрали аппаратное декодирование, но видеокарта этого ПК не поддерживает аппаратное декодирование для выбранного кодека.</translation>
|
<translation>Вы выбрали аппаратное декодирование, но видеокарта этого ПК не поддерживает аппаратное декодирование для выбранного кодека.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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>
|
<translation>Вы выбрали аппаратное декодирование, но видеокарта этого ПК не поддерживает аппаратное декодирование для выбранного кодека.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation>Ошибка GeForce Experience: %1</translation>
|
<translation>Ошибка GeForce Experience: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation>Не удалось запустить декодирование видео. Проверьте настройки стрима и попробуйте ещё раз.</translation>
|
<translation>Не удалось запустить декодирование видео. Проверьте настройки стрима и попробуйте ещё раз.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -445,60 +492,60 @@
|
|||||||
<translation>Настройки</translation>
|
<translation>Настройки</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>Разрешение и FPS</translation>
|
<translation>Разрешение и FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>Слишком высокие настройки могут вызвать проблемы с производительностью, подтормаживания, или ошибки.</translation>
|
<translation>Слишком высокие настройки могут вызвать проблемы с производительностью, подтормаживания, или ошибки.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>Основные настройки</translation>
|
<translation>Основные настройки</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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>Кастомные разрешения не поддерживаются официально в GeForce Experience, так что разрешения дисплея хост-ПК не будет изменено. Вам нужно будет задать его вручную в игре.</translation>
|
<translation>Кастомные разрешения не поддерживаются официально в GeForce Experience, так что разрешения дисплея хост-ПК не будет изменено. Вам нужно будет задать его вручную в игре.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation>Если выбранное разрешение не поддерживается хостом или клиентом, могут возникнуть ошибки.</translation>
|
<translation>Если выбранное разрешение не поддерживается хостом или клиентом, могут возникнуть ошибки.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation>Введите желаемое разрешение:</translation>
|
<translation>Введите желаемое разрешение:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation>%1 FPS</translation>
|
<translation>%1 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -507,167 +554,192 @@
|
|||||||
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation>Битрейт видео:</translation>
|
<translation>Битрейт видео:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation>Используйте низкий битрейт при медленном соединении. Высокий битрейт улучшит качество видео.</translation>
|
<translation>Используйте низкий битрейт при медленном соединении. Высокий битрейт улучшит качество видео.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation>Битрейт видео: %1 Мб/с</translation>
|
<translation>Битрейт видео: %1 Мб/с</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation>Режим дисплея</translation>
|
<translation>Режим дисплея</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
||||||
<translation> (Рекомендуется)</translation>
|
<translation> (Рекомендуется)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation>На весь экран</translation>
|
<translation>На весь экран</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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>Полноэкранный режим уменьшает задержку и улучшает производительность, но режим в окне без рамки может лучше работать с Alt+Tab, инструментами для создания скриншотов, оверлеями и Spaces в MacOS.</translation>
|
<translation>Полноэкранный режим уменьшает задержку и улучшает производительность, но режим в окне без рамки может лучше работать с Alt+Tab, инструментами для создания скриншотов, оверлеями и Spaces в MacOS.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation>В окне без рамки</translation>
|
<translation>В окне без рамки</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation>%1 FPS (не поддерживается)</translation>
|
<translation>%1 FPS (не поддерживается)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation>В окне</translation>
|
<translation>В окне</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation>V-Sync</translation>
|
<translation>Вертикальная синхронизация</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation>Отключение V-Sync позволяет уменьшить задержку до менее 1 кадра, но допускает эффект разрывов экрана</translation>
|
<translation>Отключение V-Sync позволяет уменьшить задержку до менее 1 кадра, но допускает эффект разрывов экрана</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation>Frame pacing (см. описание)</translation>
|
<translation>Frame pacing (см. описание)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation>Frame pacing улучшает плавность при стриме через интернет, Wi-Fi, и другие каналы с нестабильной задержкой (пингом), но увеличивает задержку. При стриме через проводной LAN желательно отключить.</translation>
|
<translation>Frame pacing улучшает плавность при стриме через интернет, Wi-Fi, и другие каналы с нестабильной задержкой (пингом), но увеличивает задержку. При стриме через проводной LAN желательно отключить.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation>Настройки звука</translation>
|
<translation>Настройки звука</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation>Стерео</translation>
|
<translation>Стерео</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation>5.1 объёмный звук</translation>
|
<translation>5.1 объёмный звук</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation>7.1 объёмный звук</translation>
|
<translation>7.1 объёмный звук</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation>Не воспроизводить звук на хост-ПК</translation>
|
<translation>Не воспроизводить звук на хост-ПК</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation>Для применения настроек необходим перезапуск игры</translation>
|
<translation>Для применения настроек необходим перезапуск игры</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation>Отключить звук, когда окно Moonlight становится неактивно</translation>
|
<translation>Отключить звук, когда окно Moonlight становится неактивно</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||||
<translation>Когда Вы переключаетесь на другое окно на клиенте, Moonlight будет заглушен, пока Вы не переключитесь обратно.</translation>
|
<translation>Когда Вы переключаетесь на другое окно на клиенте, Moonlight будет заглушен, пока Вы не переключитесь обратно.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation>Настройки интерфейса</translation>
|
<translation>Настройки интерфейса</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation>Язык</translation>
|
<translation>Язык</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation>Автоматически</translation>
|
<translation>Автоматически</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation>Для применения изменений необходим перезапуск Moonlight</translation>
|
<translation>Для применения изменений необходим перезапуск Moonlight</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation>Режим показа интерфейса</translation>
|
<translation>Режим показа интерфейса</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation>Развёрнуто</translation>
|
<translation>Развёрнуто</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation>Настройки ввода</translation>
|
<translation>Настройки ввода</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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>Удобно для удалённого рабочего стола, т.к. курсор мыши не будет "захвачен" и может уходить за пределы окна Moonlight. Не будет работать в большинстве игр.</translation>
|
<translation>Удобно для удалённого рабочего стола, т.к. курсор мыши не будет "захвачен" и может уходить за пределы окна Moonlight. Не будет работать в большинстве игр.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<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 эта настройка может не работать, если к хост-ПК подключено несколько мониторов.</translation>
|
<translation>Предупреждение: Из-за бага GeForce Experience эта настройка может не работать, если к хост-ПК подключено несколько мониторов.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation>Включение HDR перезаписывает ручные настройки декодера.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation>Включение HDR перезаписывает ручные настроки кодеков.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation>Включить HDR (Эксперементальна опция)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation>Поток будет поддерживать HDR, но часть игр может потребовать HDR монитор на раздающем компьютере, чтобы переключиться на режим HDR.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation>Поток с HDR не поддерживается на данном персональном компьютере.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
||||||
@@ -677,198 +749,212 @@
|
|||||||
<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>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
||||||
<translation>Предупреждение: некоторые комбинации клавиш, вроде Ctrl-Alt-Del, не могут быть перехвачены.</translation>
|
<translation>Предупреждение: некоторые комбинации клавиш, вроде Ctrl-Alt-Del, не могут быть перехвачены.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation>Использовать сенсорный экран как виртуальный тачпад</translation>
|
<translation>Использовать сенсорный экран как виртуальный тачпад</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation>Поменять местами левую и правую кнопки мыши</translation>
|
<translation>Поменять местами левую и правую кнопки мыши</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation>Колесо мыши крутит в обратном направлении</translation>
|
<translation>Колесо мыши крутит в обратном направлении</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation>Настройки геймпада</translation>
|
<translation>Настройки геймпада</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation>Поменять местами кнопки A/B и X/Y</translation>
|
<translation>Поменять местами кнопки A/B и X/Y</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation>Меняет назначения кнопок в стиль Nintendo</translation>
|
<translation>Меняет назначения кнопок в стиль Nintendo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation>Принудительно оставить геймпад №1 подключённым</translation>
|
<translation>Принудительно оставить геймпад №1 подключённым</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<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>
|
<translation>Хотя бы один виртуальный геймпад всегда будет "подключён" к хост-ПК, даже если физически к ПК-хосту не подключено ни одного.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation>Вы можете переключить эту настройку во время стрима нажатием Ctrl+Alt+Shift+M.</translation>
|
<translation>Вы можете переключить эту настройку во время стрима нажатием Ctrl+Alt+Shift+M.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation>Переходить в режим управления курсором мыши удержанием кнопки "Start"</translation>
|
<translation>Переходить в режим управления курсором мыши удержанием кнопки "Start"</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation>Геймпад работает, когда окно Moonlight в фоне</translation>
|
<translation>Геймпад работает, когда окно Moonlight в фоне</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation>Позволяет захватывать ввод с геймпада, даже когда окно Moonlight неактивно</translation>
|
<translation>Позволяет захватывать ввод с геймпада, даже когда окно Moonlight неактивно</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation>Настройки ПК-хоста</translation>
|
<translation>Настройки ПК-хоста</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation>Расширенные настройки</translation>
|
<translation>Расширенные настройки</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation>Настройки звука</translation>
|
<translation>Настройки звука</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation>Показывать предупреждения о качестве соединения</translation>
|
<translation>Показывать предупреждения о качестве соединения</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation>Интеграция в Discord Rich Presence</translation>
|
<translation>Интеграция в Discord Rich Presence</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation>Пишет статус в Discord с названием запущенноый игры.</translation>
|
<translation>Пишет статус в Discord с названием запущенноый игры.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation>Необходимо для игр, не поддерживающих "горячее" подключение геймпадов.</translation>
|
<translation>Необходимо для игр, не поддерживающих "горячее" подключение геймпадов.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation>Оптимизировать мышь для удалённого рабочего стола вместо игр</translation>
|
<translation>Оптимизировать мышь для удалённого рабочего стола вместо игр</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation>Оставляйте экран включеным, пока осуществляется передача</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation>Предотвращает запуск записи экрана или выключения монитора в процессе передачи.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation>Захватывать нажатия горячих клавиш</translation>
|
<translation>Захватывать нажатия горячих клавиш</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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>Это включает захват комбинаций вроде Alt+Tab, которые иначе бы обычно обрабатывались операционной системой.</translation>
|
<translation>Это включает захват комбинаций вроде Alt+Tab, которые иначе бы обычно обрабатывались операционной системой.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation>только в режиме на весь экран</translation>
|
<translation>только в режиме на весь экран</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation>всегда</translation>
|
<translation>всегда</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation>Если включено, сенсорный экран будет использоваться как тачпад. Если отключено, сенсорный экран будет прямо управлять курсором мыши.</translation>
|
<translation>Если включено, сенсорный экран будет использоваться как тачпад. Если отключено, сенсорный экран будет прямо управлять курсором мыши.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation>Позволить GeForce Experience оптимизировать настройки игры</translation>
|
<translation>Позволить GeForce Experience оптимизировать настройки игры</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation>Завершить игру на ПК-хосте при выходе</translation>
|
<translation>Завершить игру на ПК-хосте при выходе</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||||
<translation>Это выйдет из игры или приложения при закрытии окна Moonlight или нажатии Ctrl+Alt+Shift+Q. Несохранённый прогресс может быть утерян!</translation>
|
<translation>Это выйдет из игры или приложения при закрытии окна Moonlight или нажатии Ctrl+Alt+Shift+Q. Несохранённый прогресс может быть утерян!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation>Декодер видео</translation>
|
<translation>Декодер видео</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation>Автоматически (рекомендуется)</translation>
|
<translation>Автоматически (рекомендуется)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation>Программный</translation>
|
<translation>Программный</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation>Аппаратный</translation>
|
<translation>Аппаратный</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation>Видеокодек</translation>
|
<translation>Видеокодек</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation>H.264</translation>
|
<translation>H.264</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation>HEVC (H.265)</translation>
|
<translation>HEVC (H.265)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<source>HEVC HDR (Experimental)</source>
|
||||||
|
<translation type="vanished">HEVC HDR (Экспериментальный)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation>Включить неподдерживаемые настройки FPS</translation>
|
<translation>Включить неподдерживаемые настройки FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation>Автоматически найти ПК-хосты в локальной сети (рекомендуется)</translation>
|
<translation>Автоматически найти ПК-хосты в локальной сети (рекомендуется)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation>Автоматически определять проблемы с подключением (рекомендуется)</translation>
|
<translation>Автоматически определять проблемы с подключением (рекомендуется)</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,22 +988,22 @@
|
|||||||
<translation>Интернет-соединение этого ПК блокирует Moonlight. Стриминг через интернет может не работать.</translation>
|
<translation>Интернет-соединение этого ПК блокирует Moonlight. Стриминг через интернет может не работать.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation>Совет:</translation>
|
<translation>Совет:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation>Нажмите %1, чтобы отсоединиться</translation>
|
<translation>Нажмите %1, чтобы отсоединиться</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation>Start+Select+L1+R1</translation>
|
<translation type="unfinished">Start+Select+L1+R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -925,95 +1011,94 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>Настройки</translation>
|
<translation>Настройки</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation>Версия %1</translation>
|
<translation>Версия %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation>Присоединитесь к нашему Discord (на английском)</translation>
|
<translation>Присоединитесь к нашему Discord (на английском)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation>Компьютеры</translation>
|
<translation type="vanished">Компьютеры</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation>Добавить ПК вручную</translation>
|
<translation>Добавить ПК вручную</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation>Обновление Moonlight доступно: версия %1</translation>
|
<translation>Обновление Moonlight доступно: версия %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation>Назначения кнопок геймпада</translation>
|
<translation>Назначения кнопок геймпада</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation>Назначение кнопок геймпада</translation>
|
<translation type="vanished">Назначение кнопок геймпада</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>Moonlight не может найти декодер для H.264. Программное декодирование может быть намного медленнее.</translation>
|
<translation type="vanished">Moonlight не может найти декодер для H.264. Программное декодирование может быть намного медленнее.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation>Аппаратное ускорение не работает с XWayland. Попробуйте переключиться на X11 или добавьте параметр "QT_QPA_PLATFORM=wayland".</translation>
|
<translation>Аппаратное ускорение не работает с XWayland. Попробуйте переключиться на X11 или добавьте параметр "QT_QPA_PLATFORM=wayland".</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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>Эта версия Moonlight не оптимизирована для Вашего ПК. Пожалуйста, установите "%1" для лучшей производительности.</translation>
|
<translation>Эта версия Moonlight не оптимизирована для Вашего ПК. Пожалуйста, установите "%1" для лучшей производительности.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation>Moonilght обнаружил геймпады без настроек:</translation>
|
<translation>Moonilght обнаружил геймпады без настроек:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Помощь</translation>
|
<translation>Помощь</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation>Нажмите кнопку Помощь, чтобы увидеть способы решения проблемы.</translation>
|
<translation>Нажмите кнопку Помощь, чтобы увидеть способы решения проблемы.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation>Нажмите кнопку Помощь, чтобы увидеть больше информации.</translation>
|
<translation>Нажмите кнопку Помощь, чтобы увидеть больше информации.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation>Нажмите кнопку Помощь, чтобы узнать, как настроить геймпад.</translation>
|
<translation>Нажмите кнопку Помощь, чтобы узнать, как настроить геймпад.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation>Вы уверены, что хотите выйти?</translation>
|
<translation>Вы уверены, что хотите выйти?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation>Введите IP-адрес компьютера с включённым NVIDIA GameStream:</translation>
|
<translation>Введите IP-адрес компьютера с включённым NVIDIA GameStream:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
+232
-155
@@ -51,6 +51,24 @@
|
|||||||
<translation>คุณแน่ใจว่าคุณต้องการออกจาก %1? ความคืบหน้าใด ๆ ที่ไม่ได้ถูกบันทึกไว้จะสูญหายไป</translation>
|
<translation>คุณแน่ใจว่าคุณต้องการออกจาก %1? ความคืบหน้าใด ๆ ที่ไม่ได้ถูกบันทึกไว้จะสูญหายไป</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation type="unfinished">กำลังสร้างการเชื่อมต่อกับคอมพิวเตอร์...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>ไม่พบอุปกรณ์จับเสียง ติดตั้ง GeForce Experience ใหม่ควรจะแก้ไขข้อผิดพลาดนี้ได้</translation>
|
<translation>ไม่พบอุปกรณ์จับเสียง ติดตั้ง GeForce Experience ใหม่ควรจะแก้ไขข้อผิดพลาดนี้ได้</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -246,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>
|
<translation>เกมที่ทำงานอยู่ไม่ได้ถูกเปิดโดยคอมพิวเตอร์นี้ คุณต้องออกจากเกมด้วยคอมพิวเตอร์หลักเองหรือใช้อุปกรณ์ที่เปิดเกม</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -254,6 +272,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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 type="unfinished">คุณไม่สามารถจับคู่ในขณะที่เซสชันก่อนหน้ายังทำงานอยู่บนคอมพิวเตอร์ตัวหลัก ออกจากเกมที่กำลังทำงานอยู่หรือรีบูตคอมพิวเตอร์ตัวหลัก จากนั้นลองจับคู่อีกครั้ง</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -276,6 +305,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>ไม่สามารถค้นหาแอป %1</translation>
|
<translation>ไม่สามารถค้นหาแอป %1</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -292,147 +326,160 @@
|
|||||||
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>ไม่ได้รับวิดีโอจากเครื่องหลัก</translation>
|
<translation>ไม่ได้รับวิดีโอจากเครื่องหลัก</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>ตรวจสอบ Firewall และ Port forwarding rules สำหรับ port(s): %1</translation>
|
<translation>ตรวจสอบ Firewall และ Port forwarding rules สำหรับ port(s): %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>การเชื่อมต่อเครื่อข่ายทำงานได้ไม่ค่อยดี ลด Bitrate ของวิดีโอหรือลองใช้การเชื่อมต่อที่เร็วกว่านี้</translation>
|
<translation>การเชื่อมต่อเครื่อข่ายทำงานได้ไม่ค่อยดี ลด Bitrate ของวิดีโอหรือลองใช้การเชื่อมต่อที่เร็วกว่านี้</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>เกิดข้อผิดพลาดบางอย่างบนคอมพิวเตอร์หลักขณะที่กำลังเริ่มสตรีม</translation>
|
<translation>เกิดข้อผิดพลาดบางอย่างบนคอมพิวเตอร์หลักขณะที่กำลังเริ่มสตรีม</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>ทำให้แน่ใจว่าคุณไม่ได้เปิดเนื้อหาที่ถูกป้องกันด้วย DRM บนคอมพิวเตอร์หลัก คุณก็สามารถลองรีสตาร์ทคอมพิวเตอร์หลักได้ด้วย</translation>
|
<translation>ทำให้แน่ใจว่าคุณไม่ได้เปิดเนื้อหาที่ถูกป้องกันด้วย DRM บนคอมพิวเตอร์หลัก คุณก็สามารถลองรีสตาร์ทคอมพิวเตอร์หลักได้ด้วย</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>หากยังคงมีปัญหาอยู่ ลองติดตั้งไดร์เวอร์ของการ์ดจอและ GeForce Experience ใหม่</translation>
|
<translation>หากยังคงมีปัญหาอยู่ ลองติดตั้งไดร์เวอร์ของการ์ดจอและ GeForce Experience ใหม่</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>ยุติการเชื่อมต่อแล้ว</translation>
|
<translation>ยุติการเชื่อมต่อแล้ว</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>รุ่นของ GeForce Experience บน %1 ไม่รองรับ Moonlight รุ่นนี้ คุณต้องอัปเดต Moonlight เพื่อสตรีมจาก % 1</translation>
|
<translation>รุ่นของ GeForce Experience บน %1 ไม่รองรับ Moonlight รุ่นนี้ คุณต้องอัปเดต Moonlight เพื่อสตรีมจาก % 1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>การเลือกการตั้งค่าของคุณที่จะเปิดโหมดเมาส์ Remote Desktop อาจจะทำให้เกิดปัญหาในเกม</translation>
|
<translation>การเลือกการตั้งค่าของคุณที่จะเปิดโหมดเมาส์ Remote Desktop อาจจะทำให้เกิดปัญหาในเกม</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>ไม่รองรับ HDR ด้วยการถอดรหัสแบบซอฟต์แวร์</translation>
|
<translation>ไม่รองรับ HDR ด้วยการถอดรหัสแบบซอฟต์แวร์</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>การเลือกการตั้งค่าของคุณเพื่อบังคับให้ถอดรหัสแบบซอฟต์แวร์อาจทำให้ประสิทธิภาพการสตรีมไม่ดี</translation>
|
<translation>การเลือกการตั้งค่าของคุณเพื่อบังคับให้ถอดรหัสแบบซอฟต์แวร์อาจทำให้ประสิทธิภาพการสตรีมไม่ดี</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>การใช้ FPS ที่ไม่รองรับอาจจะทำให้เกิดการกระตุกหรือความล่าช้าได้</translation>
|
<translation>การใช้ FPS ที่ไม่รองรับอาจจะทำให้เกิดการกระตุกหรือความล่าช้าได้</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>V-sync จะถูกปิดเมื่อสตรีมที่เฟรมเรทที่สูงกว่าจอ</translation>
|
<translation>V-sync จะถูกปิดเมื่อสตรีมที่เฟรมเรทที่สูงกว่าจอ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>การใช้การถอดรหัสแบบซอฟต์แวร์เนื่องจากการบังคับ HEVC โดยที่การ์จอไม่รองรับ ให้ประสิทธิภาพการสตรีมไม่ดี</translation>
|
<translation>การใช้การถอดรหัสแบบซอฟต์แวร์เนื่องจากการบังคับ HEVC โดยที่การ์จอไม่รองรับ ให้ประสิทธิภาพการสตรีมไม่ดี</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>การ์ดจอของคอมพิวเตอร์เครื่องนี้ไม่รองรับการถอดรหัส HEVC</translation>
|
<translation type="vanished">การ์ดจอของคอมพิวเตอร์เครื่องนี้ไม่รองรับการถอดรหัส HEVC</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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 ต้องใช้ GeForce GTX รุ่น 900 (Maxwell) หรือใหม่กว่าสำหรับการสตรีม HEVC</translation>
|
<translation>การ์ดจอของคอมพิวเตอร์หลักไม่รองรับ HEVC ต้องใช้ GeForce GTX รุ่น 900 (Maxwell) หรือใหม่กว่าสำหรับการสตรีม HEVC</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1 ไม่รองรับ HDR10</translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1 ไม่รองรับ HDR10</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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 ต้องใช้ GeForce GTX รุ่น 1000 (Pascal) หรือใหม่กว่าสำหรับการสตรีม HDR</translation>
|
<translation>คอมพิวเตอร์หลักไม่รองรับการสตรีม HDR ต้องใช้ GeForce GTX รุ่น 1000 (Pascal) หรือใหม่กว่าสำหรับการสตรีม HDR</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>คอมพิวเตอร์นี้ไม่รองรับการถอดรหัส HEVC Main10 สำหรับการสตรีม HDR</translation>
|
<translation>คอมพิวเตอร์นี้ไม่รองรับการถอดรหัส HEVC Main10 สำหรับการสตรีม HDR</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>ต้องใช้ GeForce Experience 3.0 หรือใหม่กว่าสำหรับการสตรีมแบบ 4K</translation>
|
<translation>ต้องใช้ GeForce Experience 3.0 หรือใหม่กว่าสำหรับการสตรีมแบบ 4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>อุปกรณ์เสียงปัจจุบัน ไม่รองรับการตั้งค่าเสียงรอบทิศทางที่คุณเลือก</translation>
|
<translation>อุปกรณ์เสียงปัจจุบัน ไม่รองรับการตั้งค่าเสียงรอบทิศทางที่คุณเลือก</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>ไม่สามารถเปิดอุปกรณ์เสียงได้ จะไม่สามารถใช้งานเสียงได้ในเซสชันนี้</translation>
|
<translation>ไม่สามารถเปิดอุปกรณ์เสียงได้ จะไม่สามารถใช้งานเสียงได้ในเซสชันนี้</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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 type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -445,60 +492,60 @@
|
|||||||
<translation>การตั้งค่า</translation>
|
<translation>การตั้งค่า</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>ความละเอียดและ FPS</translation>
|
<translation>ความละเอียดและ FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>ค่า การตั้งค่าสูงเกินไปสำหรับคอมพิวเตอร์ของคุณหรือการเชื่อต่อเครือข่าย อาจจะทำให้ล่าช้ากระตุกหรือข้อผิดพลาด</translation>
|
<translation>ค่า การตั้งค่าสูงเกินไปสำหรับคอมพิวเตอร์ของคุณหรือการเชื่อต่อเครือข่าย อาจจะทำให้ล่าช้ากระตุกหรือข้อผิดพลาด</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>การตั้งค่าพื้นฐาน</translation>
|
<translation>การตั้งค่าพื้นฐาน</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -507,167 +554,192 @@
|
|||||||
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
||||||
@@ -677,198 +749,208 @@
|
|||||||
<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>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,22 +984,22 @@
|
|||||||
<translation type="unfinished">การเชื่อมต่ออินเทอร์เน็ตของคอมพิวเตอร์บล็อก Moonlight ไว้ การสตรีมผ่านอินเทอร์เน็ตอาจไม่ทำงานในขณะที่เชื่อมต่อกับเครือข่ายนี้</translation>
|
<translation type="unfinished">การเชื่อมต่ออินเทอร์เน็ตของคอมพิวเตอร์บล็อก Moonlight ไว้ การสตรีมผ่านอินเทอร์เน็ตอาจไม่ทำงานในขณะที่เชื่อมต่อกับเครือข่ายนี้</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -925,95 +1007,90 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation type="unfinished">การตั้งค่า</translation>
|
<translation type="unfinished">การตั้งค่า</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation type="unfinished">คอมพิวเตอร์</translation>
|
<translation type="obsolete">คอมพิวเตอร์</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation type="unfinished">การตั้งค่าปุ่ม Gamepad</translation>
|
<translation type="obsolete">การตั้งค่าปุ่ม Gamepad</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="415"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<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 type="unfinished"></translation>
|
|
||||||
</message>
|
|
||||||
<message>
|
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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 type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
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.
+237
-152
@@ -51,6 +51,24 @@
|
|||||||
<translation>Bạn có chắc bạn muốn thoát %1 không? Bất kỳ việc gì đang làm chưa được lưu sẽ bị mất.</translation>
|
<translation>Bạn có chắc bạn muốn thoát %1 không? Bất kỳ việc gì đang làm chưa được lưu sẽ bị mất.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation type="unfinished">Đang lập kết nối đến PC...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>Thiếu thiết bị ghi âm. Việc cài đặt lại GeForce Experience có thể sẽ giải quyết lỗi này.</translation>
|
<translation>Thiếu thiết bị ghi âm. Việc cài đặt lại GeForce Experience có thể sẽ giải quyết lỗi này.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -246,7 +264,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>Trò chơi đang chạy đã không được PC này khởi động. Bạn phải thoát trò chơi trên PC chủ theo cách thủ công hoặc sử dụng thiết bị đã khởi động trò chơi lúc đầu.</translation>
|
<translation>Trò chơi đang chạy đã không được PC này khởi động. Bạn phải thoát trò chơi trên PC chủ theo cách thủ công hoặc sử dụng thiết bị đã khởi động trò chơi lúc đầu.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -254,6 +272,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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 type="unfinished">Bạn không thể ghép đôi trong khi một phiên làm việc trước vẫn đang chạy trên PC chủ. Hãy thoát các trò chơi hoặc khởi động lại PC chủ, sau đó thử ghép đôi lại.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -276,6 +305,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>Tìm ứng dụng %1 thất bại</translation>
|
<translation>Tìm ứng dụng %1 thất bại</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -292,147 +326,160 @@
|
|||||||
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
<translation type="vanished">Kein Videosignal vom Host empfangen. Prüfe die Host Firewall und Portweiterleitungsregeln.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>Không nhận được video từ máy chủ.</translation>
|
<translation>Không nhận được video từ máy chủ.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>Hãy kiểm tra tường lửa và các quy tắc chuyển tiếp cổng cho (các) cổng: %1</translation>
|
<translation>Hãy kiểm tra tường lửa và các quy tắc chuyển tiếp cổng cho (các) cổng: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>Kết nối mạng của bạn đang không hoạt động tốt. Hãy giảm cài đặt tốc độ bit video hoặc thử một kết nối nhanh hơn.</translation>
|
<translation>Kết nối mạng của bạn đang không hoạt động tốt. Hãy giảm cài đặt tốc độ bit video hoặc thử một kết nối nhanh hơn.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>Có gì đó sai đã xảy ra trên PC chủ của bạn khi bắt đầu stream.</translation>
|
<translation>Có gì đó sai đã xảy ra trên PC chủ của bạn khi bắt đầu stream.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>Hãy chắc chắn là bạn không mở bất kỳ nội dung được DRM bảo vệ nào trên PC chủ. Bạn cũng có thể thử khởi động lại PC chủ.</translation>
|
<translation>Hãy chắc chắn là bạn không mở bất kỳ nội dung được DRM bảo vệ nào trên PC chủ. Bạn cũng có thể thử khởi động lại PC chủ.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>Nếu vấn đề vẫn tiếp diễn, hãy thử cài đặt lại driver GPU và GeForce Experience.</translation>
|
<translation>Nếu vấn đề vẫn tiếp diễn, hãy thử cài đặt lại driver GPU và GeForce Experience.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>Kết nối bị chấm dứt</translation>
|
<translation>Kết nối bị chấm dứt</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>Phiên bản của GeForce Experience trên %1 không được bản dựng Moonlight này hỗ trợ. Bạn phải cập nhật Moonlight để stream từ %1.</translation>
|
<translation>Phiên bản của GeForce Experience trên %1 không được bản dựng Moonlight này hỗ trợ. Bạn phải cập nhật Moonlight để stream từ %1.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>Lựa chọn bật chế độ chuột máy tính từ xa của bạn có thể sẽ gây ra vấn đề trong các trò chơi.</translation>
|
<translation>Lựa chọn bật chế độ chuột máy tính từ xa của bạn có thể sẽ gây ra vấn đề trong các trò chơi.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>HDR không được hỗ trợ với giải mã phần mềm.</translation>
|
<translation>HDR không được hỗ trợ với giải mã phần mềm.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>Lựa chọn cài đặt buộc giải mã phần mềm của bạn có thể sẽ gây ra hiệu năng stream kém.</translation>
|
<translation>Lựa chọn cài đặt buộc giải mã phần mềm của bạn có thể sẽ gây ra hiệu năng stream kém.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>Việc sử dụng các tuỳ chọn FPS không được hỗ trợ có thể sẽ gây ra khựng hoặc lag.</translation>
|
<translation>Việc sử dụng các tuỳ chọn FPS không được hỗ trợ có thể sẽ gây ra khựng hoặc lag.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>V-sync sẽ bị tắt khi stream tại tốc độ khung hình cao hơn màn hình.</translation>
|
<translation>V-sync sẽ bị tắt khi stream tại tốc độ khung hình cao hơn màn hình.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>Đang sử dụng giải mã phần mềm do lựa chọn buộc HEVC của bạn mà không có sự hỗ trợ của GPU. Việc này có thể sẽ gây ra hiệu năng stream kém.</translation>
|
<translation>Đang sử dụng giải mã phần mềm do lựa chọn buộc HEVC của bạn mà không có sự hỗ trợ của GPU. Việc này có thể sẽ gây ra hiệu năng stream kém.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>GPU của PC này không hỗ trợ giải mã HEVC.</translation>
|
<translation type="vanished">GPU của PC này không hỗ trợ giải mã HEVC.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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>GPU của PC chủ không hỗ trợ HEVC. Một GPU GeForce GTX 900-series (Maxwell) hoặc mới hơn được yêu cầu để stream HEVC.</translation>
|
<translation>GPU của PC chủ không hỗ trợ HEVC. Một GPU GeForce GTX 900-series (Maxwell) hoặc mới hơn được yêu cầu để stream HEVC.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1 không hỗ trợ HDR10.</translation>
|
<translation>Đang sử dụng giải mã phần mềm do lựa chọn buộc dùng H.264 mà GPU không hỗ trợ. Việc này có thể gây ra hiệu năng stream thấp.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation>PC chủ và PC khách không hỗ trợ cùng codec video. Việc này có thể gây ra hiệu năng stream thấp.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation>GPU khách không hỗ trợ giải mã H.264. Việc này có thể gây ra hiệu năng stream thấp.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1 không hỗ trợ HDR10.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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>GPU của PC chủ không hỗ trợ stream HDR. Một GPU GTX 1000-series (Pascal) hoặc mới hơn được yêu cầu để stream HDR.</translation>
|
<translation>GPU của PC chủ không hỗ trợ stream HDR. Một GPU GTX 1000-series (Pascal) hoặc mới hơn được yêu cầu để stream HDR.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>GPU của PC chủ không hỗ trợ giải mã HEVC Main10 để stream HDR.</translation>
|
<translation>GPU của PC chủ không hỗ trợ giải mã HEVC Main10 để stream HDR.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>GeForce Experience 3.0 hoặc cao hơn được yêu cầu để stream 4K.</translation>
|
<translation>GeForce Experience 3.0 hoặc cao hơn được yêu cầu để stream 4K.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>Cài đặt âm thanh bao quanh đã chọn của bạn không được thiết bị âm thanh hiện tại hỗ trợ.</translation>
|
<translation>Cài đặt âm thanh bao quanh đã chọn của bạn không được thiết bị âm thanh hiện tại hỗ trợ.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>Mở thiết bị âm thanh thất bại. Âm thanh sẽ không có sẵn trong phiên làm việc này.</translation>
|
<translation>Mở thiết bị âm thanh thất bại. Âm thanh sẽ không có sẵn trong phiên làm việc này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation>Một tay cầm điều khiển không được chỉ định nút và sẽ không thể sử dụng được. Hãy đi đến trợ giúp của Moonlight để giải quyết điều này.</translation>
|
<translation>Một tay cầm điều khiển không được chỉ định nút và sẽ không thể sử dụng được. Hãy đi đến trợ giúp của Moonlight để giải quyết điều này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation>GPU của PC chủ không hỗ trợ stream độ phân giải video trên 4K.</translation>
|
<translation>GPU của PC chủ không hỗ trợ stream độ phân giải video trên 4K.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation>Các độ phân giải video trên 4K chỉ được codec HEVC hỗ trợ.</translation>
|
<translation>Các độ phân giải video trên 4K chỉ được codec HEVC hỗ trợ.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation>Lựa chọn buộc giải mã phần cứng của bạn không thể được thoả mãn do thiếu sự hỗ trợ giải mã phần cứng trên GPU của PC này.</translation>
|
<translation>Lựa chọn buộc giải mã phần cứng của bạn không thể được thoả mãn do thiếu sự hỗ trợ giải mã phần cứng trên GPU của PC này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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>Lựa chọn codec và cài đặt buộc giải mã phần cứng của bạn không tương thích. GPU của PC này thiếu sự hỗ trợ cho việc giải mã codec đã chọn.</translation>
|
<translation>Lựa chọn codec và cài đặt buộc giải mã phần cứng của bạn không tương thích. GPU của PC này thiếu sự hỗ trợ cho việc giải mã codec đã chọn.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation>GeForce Experience đã trả lời bằng lỗi: %1</translation>
|
<translation>GeForce Experience đã trả lời bằng lỗi: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation>Không thể khởi tạo trình giải mã video. Vui lòng kiểm tra cài đặt stream của bạn và thử lại.</translation>
|
<translation>Không thể khởi tạo trình giải mã video. Vui lòng kiểm tra cài đặt stream của bạn và thử lại.</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -445,60 +492,60 @@
|
|||||||
<translation>Cài đặt</translation>
|
<translation>Cài đặt</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>Độ phân giải và FPS</translation>
|
<translation>Độ phân giải và FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>Việc đặt các giá trị quá cao cho PC hoặc kết nối mạng của bạn có thể sẽ gây ra lag, khựng, hoặc lỗi.</translation>
|
<translation>Việc đặt các giá trị quá cao cho PC hoặc kết nối mạng của bạn có thể sẽ gây ra lag, khựng, hoặc lỗi.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>Cài đặt cơ bản</translation>
|
<translation>Cài đặt cơ bản</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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>Các độ phân giải tuỳ chỉnh không được GeForce Experience hỗ trợ chính thức, vậy nên nó sẽ không đặt độ phân giải hiển thị của máy chủ. Bạn sẽ cần phải đặt nó theo cách thủ công khi đang trong trò chơi.</translation>
|
<translation>Các độ phân giải tuỳ chỉnh không được GeForce Experience hỗ trợ chính thức, vậy nên nó sẽ không đặt độ phân giải hiển thị của máy chủ. Bạn sẽ cần phải đặt nó theo cách thủ công khi đang trong trò chơi.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation>Các độ phân giải không được máy khách hoặc PC chủ của bạn hỗ trợ có thể sẽ gây ra lỗi stream.</translation>
|
<translation>Các độ phân giải không được máy khách hoặc PC chủ của bạn hỗ trợ có thể sẽ gây ra lỗi stream.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation>Nhập độ phân giải tuỳ chỉnh:</translation>
|
<translation>Nhập độ phân giải tuỳ chỉnh:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation>%1 FPS</translation>
|
<translation>%1 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -507,167 +554,192 @@
|
|||||||
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
<translation type="vanished">%1 FPS (nicht unterstützt)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation>Tốc độ bit video:</translation>
|
<translation>Tốc độ bit video:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation>Hạ thấp tốc độ bit trên các kết nối chậm hơn. Tăng tốc độ bit để tăng chất lượng hình ảnh.</translation>
|
<translation>Hạ thấp tốc độ bit trên các kết nối chậm hơn. Tăng tốc độ bit để tăng chất lượng hình ảnh.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation>Tốc độ bit video: %1 Mbps</translation>
|
<translation>Tốc độ bit video: %1 Mbps</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation>Chế độ hiển thị</translation>
|
<translation>Chế độ hiển thị</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
<translatorcomment>Dont put the space in ransaltions</translatorcomment>
|
||||||
<translation> (Được khuyến nghị)</translation>
|
<translation> (Được khuyến nghị)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation>Toàn màn hình</translation>
|
<translation>Toàn màn hình</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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>Toàn màn hình nói chung là cung cấp hiệu năng tốt nhất, nhưng cửa sổ không viền có thể sẽ hoạt động tốt hơn với các tính năng như macOS Spaces, Alt+Tab, các công cụ chụp màn hình, các lớp phủ trên màn hình, v.v.</translation>
|
<translation>Toàn màn hình nói chung là cung cấp hiệu năng tốt nhất, nhưng cửa sổ không viền có thể sẽ hoạt động tốt hơn với các tính năng như macOS Spaces, Alt+Tab, các công cụ chụp màn hình, các lớp phủ trên màn hình, v.v.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation>Cửa sổ không viền</translation>
|
<translation>Cửa sổ không viền</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation>%1 FPS (Không được hỗ trợ)</translation>
|
<translation>%1 FPS (Không được hỗ trợ)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation>Cửa sổ</translation>
|
<translation>Cửa sổ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation>V-Sync</translation>
|
<translation>V-Sync</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation>Việc tắt V-Sync cho phép độ trễ kết xuất khung hình con, nhưng nó có thể hiển thị sự biến dạng hình ảnh có thể nhìn thấy được</translation>
|
<translation>Việc tắt V-Sync cho phép độ trễ kết xuất khung hình con, nhưng nó có thể hiển thị sự biến dạng hình ảnh có thể nhìn thấy được</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation>Nhịp độ khung hình</translation>
|
<translation>Nhịp độ khung hình</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation>Nhịp độ khung hình làm giảm sự khựng nhỏ bằng cách trì hoãn các khung hình đi đến quá sớm</translation>
|
<translation>Nhịp độ khung hình làm giảm sự khựng nhỏ bằng cách trì hoãn các khung hình đi đến quá sớm</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation>Cài đặt âm thanh</translation>
|
<translation>Cài đặt âm thanh</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation>Stereo</translation>
|
<translation>Stereo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation>Âm thanh bao quanh 5.1</translation>
|
<translation>Âm thanh bao quanh 5.1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation>Âm thanh bao quanh 7.1</translation>
|
<translation>Âm thanh bao quanh 7.1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation>Làm im lặng loa của PC chủ trong khi stream</translation>
|
<translation>Làm im lặng loa của PC chủ trong khi stream</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation>Bạn phải khởi động lại bất kỳ trò chơi hiện đang chơi nào để thay đổi này có hiệu lực</translation>
|
<translation>Bạn phải khởi động lại bất kỳ trò chơi hiện đang chơi nào để thay đổi này có hiệu lực</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation>Làm im lặng stream âm thanh khi Moonlight không phải là cửa sổ đang hoạt động</translation>
|
<translation>Làm im lặng stream âm thanh khi Moonlight không phải là cửa sổ đang hoạt động</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||||
<translation>Làm im lặng âm thanh của Moonlight khi bạn Alt+Tab ra khỏi stream hoặc click vào một cửa sổ khác.</translation>
|
<translation>Làm im lặng âm thanh của Moonlight khi bạn Alt+Tab ra khỏi stream hoặc click vào một cửa sổ khác.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation>Cài đặt giao diện</translation>
|
<translation>Cài đặt giao diện</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation>Ngôn ngữ</translation>
|
<translation>Ngôn ngữ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation>Tự động</translation>
|
<translation>Tự động</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation>Bạn phải khởi động lại Moonlight để thay đổi này có hiệu lực</translation>
|
<translation>Bạn phải khởi động lại Moonlight để thay đổi này có hiệu lực</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation>Chế độ hiển thị giao diện đồ hoạ</translation>
|
<translation>Chế độ hiển thị giao diện đồ hoạ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation>Phóng to</translation>
|
<translation>Phóng to</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation>Cài đặt đầu vào</translation>
|
<translation>Cài đặt đầu vào</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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>Việc này bật điều khiển chuột liền mạch mà không bắt con trỏ chuột của máy khách. Nó là lý tưởng cho việc sử dụng máy tính từ xa nhưng sẽ không hoạt động trong đa số trò chơi.</translation>
|
<translation>Việc này bật điều khiển chuột liền mạch mà không bắt con trỏ chuột của máy khách. Nó là lý tưởng cho việc sử dụng máy tính từ xa nhưng sẽ không hoạt động trong đa số trò chơi.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
||||||
<translation>LƯU Ý: Vì một lỗi trong GeForce Experience, tuỳ chọn này có thể sẽ không hoạt động đúng nếu PC chủ của bạn có nhiều màn hình.</translation>
|
<translation>LƯU Ý: Vì một lỗi trong GeForce Experience, tuỳ chọn này có thể sẽ không hoạt động đúng nếu PC chủ của bạn có nhiều màn hình.</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation>Việc bật HDR sẽ được ưu tiên trước lựa chọn codec thủ công.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation>Bật HDR (Thử nghiệm)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation>Stream sẽ có khả năng là HDR, nhưng một số trò chơi có thể yêu cầu màn hình HDR trên PC chủ để bật chế độ HDR.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation>Việc stream HDR không được hỗ trợ trên PC này.</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
<translation type="vanished">Erfassen von System-Tastaturkürzeln beim Streaming im Vollbildmodus</translation>
|
||||||
@@ -677,198 +749,212 @@
|
|||||||
<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>
|
<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>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
||||||
<translation>LƯU Ý: Một số lối tắt bàn phím cụ thể như Ctrl+Alt+Del trên Windows không thể được bất kỳ ứng dụng nào can thiệp, bao gồm cả Moonlight.</translation>
|
<translation>LƯU Ý: Một số lối tắt bàn phím cụ thể như Ctrl+Alt+Del trên Windows không thể được bất kỳ ứng dụng nào can thiệp, bao gồm cả Moonlight.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation>Sử dụng màn hình cảm ứng như một trackpad ảo</translation>
|
<translation>Sử dụng màn hình cảm ứng như một trackpad ảo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation>Đảo các nút chuột trái và phải</translation>
|
<translation>Đảo các nút chuột trái và phải</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation>Đảo ngược hướng cuộn chuột</translation>
|
<translation>Đảo ngược hướng cuộn chuột</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation>Cài đặt tay cầm điều khiển</translation>
|
<translation>Cài đặt tay cầm điều khiển</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation>Đảo các nút A/B và X/Y của tay cầm điều khiển</translation>
|
<translation>Đảo các nút A/B và X/Y của tay cầm điều khiển</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation>Việc này chuyển các tay cầm điều khiển sang một bố cục nút giống Nintendo</translation>
|
<translation>Việc này chuyển các tay cầm điều khiển sang một bố cục nút giống Nintendo</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation>Buộc tay cầm điều khiển #1 luôn được kết nối</translation>
|
<translation>Buộc tay cầm điều khiển #1 luôn được kết nối</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
||||||
<translation>Buộc một tay cầm điều khiển luôn giữ trạng thái đã kết nối đến máy chủ, kể cả nếu không có tay cầm điều khiển nào thực sự được kết nối đến PC.</translation>
|
<translation>Buộc một tay cầm điều khiển luôn giữ trạng thái đã kết nối đến máy chủ, kể cả nếu không có tay cầm điều khiển nào thực sự được kết nối đến PC.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation>Bạn có thể bật/tắt việc này trong khi stream bằng Ctrl+Alt+Shift+M.</translation>
|
<translation>Bạn có thể bật/tắt việc này trong khi stream bằng Ctrl+Alt+Shift+M.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation>Bật điều khiển chuột bằng tay cầm điều khiển bằng cách giữ nút 'Start'</translation>
|
<translation>Bật điều khiển chuột bằng tay cầm điều khiển bằng cách giữ nút 'Start'</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation>Xử lý đầu vào của tay cầm điều khiển khi Moonlight ở trong nền</translation>
|
<translation>Xử lý đầu vào của tay cầm điều khiển khi Moonlight ở trong nền</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation>Cho phép Moonlight nắm bắt đầu vào của tay cầm điều khiển kể cả nếu nó không phải là cửa sổ hiện được tập trung</translation>
|
<translation>Cho phép Moonlight nắm bắt đầu vào của tay cầm điều khiển kể cả nếu nó không phải là cửa sổ hiện được tập trung</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation>Cài đặt máy chủ</translation>
|
<translation>Cài đặt máy chủ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation>Cài đặt nâng cao</translation>
|
<translation>Cài đặt nâng cao</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation>Thiết lập âm thanh</translation>
|
<translation>Thiết lập âm thanh</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation>Hiện cảnh báo chất lượng kết nối</translation>
|
<translation>Hiện cảnh báo chất lượng kết nối</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation>Tích hợp với Discord Rich Presence</translation>
|
<translation>Tích hợp với Discord Rich Presence</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation>Cập nhật trạng thái Discord của bạn để hiển thị tên trò chơi bạn đang stream.</translation>
|
<translation>Cập nhật trạng thái Discord của bạn để hiển thị tên trò chơi bạn đang stream.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation>Chỉ bật tuỳ chọn này khi stream một trò chơi không hỗ trợ tay cầm điều khiển được kết nối sau khi khởi động.</translation>
|
<translation>Chỉ bật tuỳ chọn này khi stream một trò chơi không hỗ trợ tay cầm điều khiển được kết nối sau khi khởi động.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation>Tối ưu hoá chuột cho máy tính từ xa thay vì trò chơi</translation>
|
<translation>Tối ưu hoá chuột cho máy tính từ xa thay vì trò chơi</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation>Giữ màn hình bật trong khi stream</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation>Ngăn screensaver hoạt động hoặc màn hình tắt trong khi stream.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation>Nắm bắt các lối tắt bàn phím hệ thống</translation>
|
<translation>Nắm bắt các lối tắt bàn phím hệ thống</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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>Việc này bật việc nắm bắt các lối tắt bàn phím toàn hệ thống như Alt+Tab (bình thường sẽ được HĐH máy khách xử lý) trong khi stream.</translation>
|
<translation>Việc này bật việc nắm bắt các lối tắt bàn phím toàn hệ thống như Alt+Tab (bình thường sẽ được HĐH máy khách xử lý) trong khi stream.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation>trong toàn màn hình</translation>
|
<translation>trong toàn màn hình</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation>luôn luôn</translation>
|
<translation>luôn luôn</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation>Khi được đánh dấu, màn hình cảm ứng hoạt động như một trackpad. Khi không được đánh dấu, màn hình cảm ứng sẽ trực tiếp điều khiển con trỏ chuột.</translation>
|
<translation>Khi được đánh dấu, màn hình cảm ứng hoạt động như một trackpad. Khi không được đánh dấu, màn hình cảm ứng sẽ trực tiếp điều khiển con trỏ chuột.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation>Tối ưu hoá cài đặt trò chơi cho việc stream</translation>
|
<translation>Tối ưu hoá cài đặt trò chơi cho việc stream</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation>Thoát ứng dụng trên PC chủ sau khi kết thúc stream</translation>
|
<translation>Thoát ứng dụng trên PC chủ sau khi kết thúc stream</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
||||||
<translation>Việc này sẽ đóng ứng dụng hoặc trò chơi bạn đang stream khi bạn kết thúc stream. Bạn sẽ mất công việc đang làm chưa được lưu!</translation>
|
<translation>Việc này sẽ đóng ứng dụng hoặc trò chơi bạn đang stream khi bạn kết thúc stream. Bạn sẽ mất công việc đang làm chưa được lưu!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation>Trình giải mã video</translation>
|
<translation>Trình giải mã video</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation>Tự động (Được khuyến nghị)</translation>
|
<translation>Tự động (Được khuyến nghị)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation>Buộc giải mã phần mềm</translation>
|
<translation>Buộc giải mã phần mềm</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation>Buộc giải mã phần cứng</translation>
|
<translation>Buộc giải mã phần cứng</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation>Codec video</translation>
|
<translation>Codec video</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation>H.264</translation>
|
<translation>H.264</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation>HEVC (H.265)</translation>
|
<translation>HEVC (H.265)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<source>HEVC HDR (Experimental)</source>
|
||||||
|
<translation type="vanished">HEVC HDR (Thử nghiệm)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation>Mở khoá các tuỳ chọn FPS không được hỗ trợ</translation>
|
<translation>Mở khoá các tuỳ chọn FPS không được hỗ trợ</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation>Tự động tìm các PC trên mạng cục bộ (Được khuyến nghị)</translation>
|
<translation>Tự động tìm các PC trên mạng cục bộ (Được khuyến nghị)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation>Tự động phát hiện các kết nối bị chặn (Được khuyến nghị)</translation>
|
<translation>Tự động phát hiện các kết nối bị chặn (Được khuyến nghị)</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -902,22 +988,22 @@
|
|||||||
<translation>Kết nối Internet của PC này đang chặn Moonlight. Việc stream qua Internet có thể sẽ không được khi kết nối đến mạng này.</translation>
|
<translation>Kết nối Internet của PC này đang chặn Moonlight. Việc stream qua Internet có thể sẽ không được khi kết nối đến mạng này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation>Mẹo:</translation>
|
<translation>Mẹo:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation>Nhấn %1 để ngắt kết nối phiên làm việc của bạn</translation>
|
<translation>Nhấn %1 để ngắt kết nối phiên làm việc của bạn</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation>Start+Select+L1+R1</translation>
|
<translation>Start+Select+L1+R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -925,95 +1011,94 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>Cài đặt</translation>
|
<translation>Cài đặt</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation>Phiên bản %1</translation>
|
<translation>Phiên bản %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation>Tham gia cộng đồng của chúng tôi trên Discord</translation>
|
<translation>Tham gia cộng đồng của chúng tôi trên Discord</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation>Máy tính</translation>
|
<translation type="vanished">Máy tính</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation>Thêm PC thủ công</translation>
|
<translation>Thêm PC thủ công</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation>Có bản cập nhật cho Moonlight: Phiên bản %1</translation>
|
<translation>Có bản cập nhật cho Moonlight: Phiên bản %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation>Trình chỉ định nút tay cầm điều khiển</translation>
|
<translation>Trình chỉ định nút tay cầm điều khiển</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation>Chỉ định nút tay cầm điều khiển</translation>
|
<translation type="vanished">Chỉ định nút tay cầm điều khiển</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>Không có trình giải mã video H.264 được tăng tốc phần cứng nào được Moonlight phát hiện. Hiệu năng stream của bạn có thể sẽ bị giảm nghiêm trọng trong thiết lập này.</translation>
|
<translation type="vanished">Không có trình giải mã video H.264 được tăng tốc phần cứng nào được Moonlight phát hiện. Hiệu năng stream của bạn có thể sẽ bị giảm nghiêm trọng trong thiết lập này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation>Tăng tốc phần cứng không hoạt động trên Wayland. Việc tiếp tục trên XWayland có thể sẽ dẫn đến hiệu năng stream kém. Hãy thử chạy với QT_QPA_PLATFORM=wayland hoặc chuyển sang X11.</translation>
|
<translation>Tăng tốc phần cứng không hoạt động trên Wayland. Việc tiếp tục trên XWayland có thể sẽ dẫn đến hiệu năng stream kém. Hãy thử chạy với QT_QPA_PLATFORM=wayland hoặc chuyển sang X11.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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>Phiên bản Moonlight này không được tối ưu hoá cho PC của bạn. Vui lòng tải xuống phiên bản Moonlight '%1' để có hiệu năng stream tốt nhất.</translation>
|
<translation>Phiên bản Moonlight này không được tối ưu hoá cho PC của bạn. Vui lòng tải xuống phiên bản Moonlight '%1' để có hiệu năng stream tốt nhất.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation>Moonlight đã phát hiện tay cầm điều khiển không được chỉ định nút:</translation>
|
<translation>Moonlight đã phát hiện tay cầm điều khiển không được chỉ định nút:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>Trợ giúp</translation>
|
<translation>Trợ giúp</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation>Moonlight không phát hiện được trình giải mã video tăng tốc phần cứng nào. Hiệu năng stream của bạn có thể bị giảm nghiêm trọng khi dùng thiết lập này.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation>Click nút Trợ giúp để biết thêm thông tin về việc giải quyết vấn đề này.</translation>
|
<translation>Click nút Trợ giúp để biết thêm thông tin về việc giải quyết vấn đề này.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation>Click nút Trợ giúp để biết thêm thông tin.</translation>
|
<translation>Click nút Trợ giúp để biết thêm thông tin.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation>Click nút Trợ giúp để biết thêm thông tin về cách chỉ định nút tay cầm điều khiển.</translation>
|
<translation>Click nút Trợ giúp để biết thêm thông tin về cách chỉ định nút tay cầm điều khiển.</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation>Bạn có chắc bạn muốn thoát không?</translation>
|
<translation>Bạn có chắc bạn muốn thoát không?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation>Nhập địa chỉ IP của PC GameStream của bạn:</translation>
|
<translation>Nhập địa chỉ IP của PC GameStream của bạn:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
Binary file not shown.
File diff suppressed because it is too large.
Load diff
Binary file not shown.
+239
-154
@@ -51,6 +51,24 @@
|
|||||||
<translation>你确定要退出 %1 吗?所有未保存的游戏进度都将丢失。</translation>
|
<translation>你确定要退出 %1 吗?所有未保存的游戏进度都将丢失。</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>CliPair</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="9"/>
|
||||||
|
<source>Establishing connection to PC...</source>
|
||||||
|
<translation type="unfinished">正在建立与目标计算机的连接...</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="13"/>
|
||||||
|
<source>Pairing... Please enter '%1' on %2.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/CliPair.qml" line="85"/>
|
||||||
|
<source>Pairing completed successfully</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>CliQuitStreamSegue</name>
|
<name>CliQuitStreamSegue</name>
|
||||||
<message>
|
<message>
|
||||||
@@ -93,7 +111,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>NvHTTP</name>
|
<name>NvHTTP</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/nvhttp.cpp" line="327"/>
|
<location filename="../backend/nvhttp.cpp" line="378"/>
|
||||||
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
<source>Missing audio capture device. Reinstalling GeForce Experience should resolve this error.</source>
|
||||||
<translation>缺少音频捕获设备。重新安装 GeForce Experience 可以解决此错误。</translation>
|
<translation>缺少音频捕获设备。重新安装 GeForce Experience 可以解决此错误。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -173,7 +191,7 @@
|
|||||||
<message>
|
<message>
|
||||||
<location filename="../gui/PcView.qml" line="224"/>
|
<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>
|
<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>
|
<translation>在 %1 上已安装的GeForce Experience版本不支持当前版本的Moonlight。你必须升级Moonlight才能从 %1 串流。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/PcView.qml" line="247"/>
|
<location filename="../gui/PcView.qml" line="247"/>
|
||||||
@@ -234,7 +252,7 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>PendingQuitTask</name>
|
<name>PendingQuitTask</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../backend/computermanager.cpp" line="542"/>
|
<location filename="../backend/computermanager.cpp" line="547"/>
|
||||||
<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>
|
<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>
|
<translation>正在运行的游戏不是由这台计算机启动的。你必须在目标计算机上手动退出游戏或使用最初启动游戏的设备。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -242,6 +260,17 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>QObject</name>
|
<name>QObject</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="80"/>
|
||||||
|
<source>%1 is already paired</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="85"/>
|
||||||
|
<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 type="unfinished">当上一个会话仍在运行时,无法进行配对。请退出所有正在运行的游戏或重新启动目标计算机,然后重试配对。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/pair.cpp" line="114"/>
|
||||||
<location filename="../cli/quitstream.cpp" line="76"/>
|
<location filename="../cli/quitstream.cpp" line="76"/>
|
||||||
<location filename="../cli/startstream.cpp" line="133"/>
|
<location filename="../cli/startstream.cpp" line="133"/>
|
||||||
<source>Failed to connect to %1</source>
|
<source>Failed to connect to %1</source>
|
||||||
@@ -264,6 +293,11 @@
|
|||||||
<source>Failed to find application %1</source>
|
<source>Failed to find application %1</source>
|
||||||
<translation>找不到应用程序 %1</translation>
|
<translation>找不到应用程序 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../cli/listapps.cpp" line="99"/>
|
||||||
|
<source>Computer %1 has not been paired. Please open Moonlight to pair before retrieving games list.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
</context>
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>QuitSegue</name>
|
<name>QuitSegue</name>
|
||||||
@@ -276,147 +310,160 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>Session</name>
|
<name>Session</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="89"/>
|
<location filename="../streaming/session.cpp" line="91"/>
|
||||||
<source>No video received from host.</source>
|
<source>No video received from host.</source>
|
||||||
<translation>没有从目标计算机接收到视频画面。</translation>
|
<translation>没有从目标计算机接收到视频画面。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="90"/>
|
<location filename="../streaming/session.cpp" line="92"/>
|
||||||
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
<source>Check your firewall and port forwarding rules for port(s): %1</source>
|
||||||
<translation>检查防火墙和端口转发规则: %1</translation>
|
<translation>检查防火墙和端口转发规则: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="95"/>
|
<location filename="../streaming/session.cpp" line="97"/>
|
||||||
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
<source>Your network connection isn't performing well. Reduce your video bitrate setting or try a faster connection.</source>
|
||||||
<translation>网络连接性能不佳。请降低视频比特率或尝试更快的网络连接。</translation>
|
<translation>网络连接性能不佳。请降低视频比特率或尝试更快的网络连接。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="100"/>
|
<location filename="../streaming/session.cpp" line="102"/>
|
||||||
<source>Something went wrong on your host PC when starting the stream.</source>
|
<source>Something went wrong on your host PC when starting the stream.</source>
|
||||||
<translation>目标计算机启动流式传输时出现问题。</translation>
|
<translation>目标计算机启动流式传输时出现问题。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="101"/>
|
<location filename="../streaming/session.cpp" line="103"/>
|
||||||
<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>
|
<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>确保目标计算机上没有打开任何受 DRM 保护的内容。你也可以尝试重新启动目标计算机。</translation>
|
<translation>确保目标计算机上没有打开任何受 DRM 保护的内容。你也可以尝试重新启动目标计算机。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="102"/>
|
<location filename="../streaming/session.cpp" line="104"/>
|
||||||
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
<source>If the issue persists, try reinstalling your GPU drivers and GeForce Experience.</source>
|
||||||
<translation>如果问题仍然存在,请尝试重新安装显卡驱动程序和 GeForce Experience。</translation>
|
<translation>如果问题仍然存在,请尝试重新安装显卡驱动程序和 GeForce Experience。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="107"/>
|
<location filename="../streaming/session.cpp" line="109"/>
|
||||||
<source>Connection terminated</source>
|
<source>Connection terminated</source>
|
||||||
<translation>会话已终止</translation>
|
<translation>会话已终止</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="592"/>
|
<location filename="../streaming/session.cpp" line="662"/>
|
||||||
<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>
|
<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>
|
<translation>%1 上的 GeForce Experience 版本不受当前版本的 Moonlight 支持。你必须更新 Moonlight才能从 %1 串流。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="597"/>
|
<location filename="../streaming/session.cpp" line="667"/>
|
||||||
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
<source>Your selection to enable remote desktop mouse mode may cause problems in games.</source>
|
||||||
<translation>启用远程桌面鼠标模式可能会导致游戏出现问题。</translation>
|
<translation>启用远程桌面鼠标模式可能会导致游戏出现问题。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="602"/>
|
<location filename="../streaming/session.cpp" line="672"/>
|
||||||
<source>HDR is not supported with software decoding.</source>
|
<source>HDR is not supported with software decoding.</source>
|
||||||
<translation>软件解码不支持 HDR。</translation>
|
<translation>软件解码不支持 HDR。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="606"/>
|
<location filename="../streaming/session.cpp" line="676"/>
|
||||||
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
<source>Your settings selection to force software decoding may cause poor streaming performance.</source>
|
||||||
<translation>你选择的用于强制软件解码的设置可能会导致流式传输性能不佳。</translation>
|
<translation>你选择的用于强制软件解码的设置可能会导致流式传输性能不佳。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="611"/>
|
<location filename="../streaming/session.cpp" line="681"/>
|
||||||
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
<source>Using unsupported FPS options may cause stuttering or lag.</source>
|
||||||
<translation>使用不受支持的 FPS 选项可能会导致卡顿或延迟。</translation>
|
<translation>使用不受支持的 FPS 选项可能会导致卡顿或延迟。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="614"/>
|
<location filename="../streaming/session.cpp" line="684"/>
|
||||||
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
<source>V-sync will be disabled when streaming at a higher frame rate than the display.</source>
|
||||||
<translation>当流式传输的帧率高于显示时,垂直同步将被禁用。</translation>
|
<translation>当流式传输的帧率高于显示时,垂直同步将被禁用。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="631"/>
|
<location filename="../streaming/session.cpp" line="711"/>
|
||||||
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
<source>Using software decoding due to your selection to force HEVC without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>根据你的选择使用软件解码,以在没有显卡支持的情况下强制 HEVC。这可能会导致流式传输性能不佳。</translation>
|
<translation>根据你的选择使用软件解码,以在没有显卡支持的情况下强制 HEVC。这可能会导致流式传输性能不佳。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="634"/>
|
|
||||||
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
<source>This PC's GPU doesn't support HEVC decoding.</source>
|
||||||
<translation>此计算机的显卡不支持 HEVC 解码。</translation>
|
<translation type="vanished">此计算机的显卡不支持 HEVC 解码。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="641"/>
|
<location filename="../streaming/session.cpp" line="694"/>
|
||||||
<source>Your host PC GPU doesn't support HEVC. A GeForce GTX 900-series (Maxwell) or later GPU is required for HEVC streaming.</source>
|
<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>
|
<translation>目标计算机的显卡不支持 HEVC。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="658"/>
|
<location filename="../streaming/session.cpp" line="725"/>
|
||||||
<source>%1 doesn't support HDR10.</source>
|
<source>Using software decoding due to your selection to force H.264 without GPU support. This may cause poor streaming performance.</source>
|
||||||
<translation>%1 不支持 HDR10。</translation>
|
<translation>使用软件解码,因为你选择强制使用没有 GPU 支持的H.264。这可能会导致较差的流性能。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="662"/>
|
<location filename="../streaming/session.cpp" line="735"/>
|
||||||
|
<source>Your host PC and client PC don't support the same video codecs. This may cause poor streaming performance.</source>
|
||||||
|
<translation>你的主机和客户端 PC 不支持相同的视频编解码器。这可能会导致较差的流性能。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="738"/>
|
||||||
|
<source>Your client GPU doesn't support H.264 decoding. This may cause poor streaming performance.</source>
|
||||||
|
<translation>你的客户端 GPU 不支持 H.264 解码。这可能会导致较差的流性能。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>%1 doesn't support HDR10.</source>
|
||||||
|
<translation type="vanished">%1 不支持 HDR10。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../streaming/session.cpp" line="749"/>
|
||||||
<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>
|
<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>
|
<translation>目标计算机的显卡不支持 HDR 流。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="671"/>
|
<location filename="../streaming/session.cpp" line="758"/>
|
||||||
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
<source>This PC's GPU doesn't support HEVC Main10 decoding for HDR streaming.</source>
|
||||||
<translation>此计算机的显卡不支持 HEVC Main10 解码 HDR 流。</translation>
|
<translation>此计算机的显卡不支持 HEVC Main10 解码 HDR 流。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="684"/>
|
<location filename="../streaming/session.cpp" line="771"/>
|
||||||
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
<source>GeForce Experience 3.0 or higher is required for 4K streaming.</source>
|
||||||
<translation>4K 流式传输需要 GeForce Experience 3.0 或更高版本。</translation>
|
<translation>4K 流式传输需要 GeForce Experience 3.0 或更高版本。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="699"/>
|
<location filename="../streaming/session.cpp" line="786"/>
|
||||||
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
<source>Your selected surround sound setting is not supported by the current audio device.</source>
|
||||||
<translation>当前音频设备不支持你选择的环绕声设置。</translation>
|
<translation>当前音频设备不支持你选择的环绕声设置。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="706"/>
|
<location filename="../streaming/session.cpp" line="793"/>
|
||||||
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
<source>Failed to open audio device. Audio will be unavailable during this session.</source>
|
||||||
<translation>无法打开音频设备。音频在此会话期间将不可用。</translation>
|
<translation>无法打开音频设备。音频在此会话期间将不可用。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="711"/>
|
<location filename="../streaming/session.cpp" line="798"/>
|
||||||
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
<source>An attached gamepad has no mapping and won't be usable. Visit the Moonlight help to resolve this.</source>
|
||||||
<translation>附加的手柄没有映射,因此无法使用。请访问 Moonlight 帮助解决此问题。</translation>
|
<translation>附加的手柄没有映射,因此无法使用。请访问 Moonlight 帮助解决此问题。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="719"/>
|
<location filename="../streaming/session.cpp" line="806"/>
|
||||||
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
<source>Your host PC's GPU doesn't support streaming video resolutions over 4K.</source>
|
||||||
<translation>目标计算机的显卡不支持 4K 以上的流式传输视频分辨率。</translation>
|
<translation>目标计算机的显卡不支持 4K 以上的流式传输视频分辨率。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="723"/>
|
<location filename="../streaming/session.cpp" line="810"/>
|
||||||
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
<source>Video resolutions over 4K are only supported by the HEVC codec.</source>
|
||||||
<translation>只有 HEVC 编解码器才支持 4K 以上的视频分辨率。</translation>
|
<translation>只有 HEVC 编解码器才支持 4K 以上的视频分辨率。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="737"/>
|
<location filename="../streaming/session.cpp" line="824"/>
|
||||||
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
<source>Your selection to force hardware decoding cannot be satisfied due to missing hardware decoding support on this PC's GPU.</source>
|
||||||
<translation>由于此计算机的显卡上缺少硬件解码支持,无法满足强制硬件解码的选择。</translation>
|
<translation>由于此计算机的显卡上缺少硬件解码支持,无法满足强制硬件解码的选择。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="740"/>
|
<location filename="../streaming/session.cpp" line="827"/>
|
||||||
<source>Your codec selection and force hardware decoding setting are not compatible. This PC's GPU lacks support for decoding your chosen codec.</source>
|
<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>
|
<translation>你选择的编解码器和强制硬件解码设置不兼容。此计算机的显卡不支持解码你选择的编解码器。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1041"/>
|
<location filename="../streaming/session.cpp" line="1177"/>
|
||||||
<source>GeForce Experience returned error: %1</source>
|
<source>GeForce Experience returned error: %1</source>
|
||||||
<translation>GeForce Experience 返回错误: %1</translation>
|
<translation>GeForce Experience 返回错误: %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../streaming/session.cpp" line="1519"/>
|
<location filename="../streaming/session.cpp" line="1728"/>
|
||||||
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
<source>Unable to initialize video decoder. Please check your streaming settings and try again.</source>
|
||||||
<translation>无法初始化视频解码器。请检查你的流式传输设置,然后重试。</translation>
|
<translation>无法初始化视频解码器。请检查你的流式传输设置,然后重试。</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -429,264 +476,299 @@
|
|||||||
<translation>设置</translation>
|
<translation>设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="60"/>
|
<location filename="../gui/SettingsView.qml" line="62"/>
|
||||||
<source>Basic Settings</source>
|
<source>Basic Settings</source>
|
||||||
<translation>基本设置</translation>
|
<translation>基本设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="70"/>
|
<location filename="../gui/SettingsView.qml" line="72"/>
|
||||||
<source>Resolution and FPS</source>
|
<source>Resolution and FPS</source>
|
||||||
<translation>分辨率和 FPS</translation>
|
<translation>分辨率和 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="78"/>
|
<location filename="../gui/SettingsView.qml" line="80"/>
|
||||||
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
<source>Setting values too high for your PC or network connection may cause lag, stuttering, or errors.</source>
|
||||||
<translation>如果你的计算机或网络连接设置的值过高,可能会导致延迟,卡顿或错误。</translation>
|
<translation>如果你的计算机或网络连接设置的值过高,可能会导致延迟,卡顿或错误。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="209"/>
|
<location filename="../gui/SettingsView.qml" line="200"/>
|
||||||
<source>720p</source>
|
<source>720p</source>
|
||||||
<translation>720p</translation>
|
<translation>720p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="215"/>
|
<location filename="../gui/SettingsView.qml" line="206"/>
|
||||||
<source>1080p</source>
|
<source>1080p</source>
|
||||||
<translation>1080p</translation>
|
<translation>1080p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="221"/>
|
<location filename="../gui/SettingsView.qml" line="212"/>
|
||||||
<source>1440p</source>
|
<source>1440p</source>
|
||||||
<translation>1440p</translation>
|
<translation>1440p</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="227"/>
|
<location filename="../gui/SettingsView.qml" line="218"/>
|
||||||
<source>4K</source>
|
<source>4K</source>
|
||||||
<translation>4K</translation>
|
<translation>4K</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="331"/>
|
<location filename="../gui/SettingsView.qml" line="322"/>
|
||||||
<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>
|
<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>自定义分辨率不受 GeForce Experience 的正式支持,因此不会设置目标计算机的分辨率。你需要在游戏中手动设置。</translation>
|
<translation>自定义分辨率不受 GeForce Experience 的正式支持,因此不会设置目标计算机的分辨率。你需要在游戏中手动设置。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="332"/>
|
<location filename="../gui/SettingsView.qml" line="323"/>
|
||||||
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
<source>Resolutions that are not supported by your client or host PC may cause streaming errors.</source>
|
||||||
<translation>使用当前计算机或目标计算机不支持的分辨率可能会导致流式传输错误。</translation>
|
<translation>使用当前计算机或目标计算机不支持的分辨率可能会导致流式传输错误。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="338"/>
|
<location filename="../gui/SettingsView.qml" line="329"/>
|
||||||
<source>Enter a custom resolution:</source>
|
<source>Enter a custom resolution:</source>
|
||||||
<translation>输入自定义分辨率:</translation>
|
<translation>输入自定义分辨率:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="406"/>
|
<location filename="../gui/SettingsView.qml" line="397"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="407"/>
|
<location filename="../gui/SettingsView.qml" line="398"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="427"/>
|
<location filename="../gui/SettingsView.qml" line="418"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="430"/>
|
<location filename="../gui/SettingsView.qml" line="421"/>
|
||||||
<source>%1 FPS</source>
|
<source>%1 FPS</source>
|
||||||
<translation>%1 FPS</translation>
|
<translation>%1 FPS</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="412"/>
|
<location filename="../gui/SettingsView.qml" line="403"/>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="406"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="415"/>
|
<location filename="../gui/SettingsView.qml" line="415"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="424"/>
|
<location filename="../gui/SettingsView.qml" line="428"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="437"/>
|
<location filename="../gui/SettingsView.qml" line="431"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="440"/>
|
|
||||||
<source>%1 FPS (Unsupported)</source>
|
<source>%1 FPS (Unsupported)</source>
|
||||||
<translation>%1 FPS (不支持)</translation>
|
<translation>%1 FPS (不支持)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="493"/>
|
<location filename="../gui/SettingsView.qml" line="485"/>
|
||||||
<source>Video bitrate:</source>
|
<source>Video bitrate:</source>
|
||||||
<translation>视频比特率:</translation>
|
<translation>视频比特率:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="501"/>
|
<location filename="../gui/SettingsView.qml" line="493"/>
|
||||||
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
<source>Lower the bitrate on slower connections. Raise the bitrate to increase image quality.</source>
|
||||||
<translation>在较慢的连接上降低比特率。提高比特率以提高图像质量。</translation>
|
<translation>在较慢的连接上降低比特率。提高比特率以提高图像质量。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="519"/>
|
<location filename="../gui/SettingsView.qml" line="511"/>
|
||||||
<source>Video bitrate: %1 Mbps</source>
|
<source>Video bitrate: %1 Mbps</source>
|
||||||
<translation>视频比特率: %1 Mbps</translation>
|
<translation>视频比特率: %1 Mbps</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="527"/>
|
<location filename="../gui/SettingsView.qml" line="519"/>
|
||||||
<source>Display mode</source>
|
<source>Display mode</source>
|
||||||
<translation>显示模式</translation>
|
<translation>显示模式</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="545"/>
|
<location filename="../gui/SettingsView.qml" line="549"/>
|
||||||
<source> (Recommended)</source>
|
<source> (Recommended)</source>
|
||||||
<translation> (推荐)</translation>
|
<translation> (推荐)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="573"/>
|
<location filename="../gui/SettingsView.qml" line="530"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="868"/>
|
<location filename="../gui/SettingsView.qml" line="937"/>
|
||||||
<source>Fullscreen</source>
|
<source>Fullscreen</source>
|
||||||
<translation>全屏</translation>
|
<translation>全屏</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="577"/>
|
<location filename="../gui/SettingsView.qml" line="535"/>
|
||||||
<source>Borderless windowed</source>
|
<source>Borderless windowed</source>
|
||||||
<translation>无边框窗口</translation>
|
<translation>无边框窗口</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="581"/>
|
<location filename="../gui/SettingsView.qml" line="540"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="860"/>
|
<location filename="../gui/SettingsView.qml" line="929"/>
|
||||||
<source>Windowed</source>
|
<source>Windowed</source>
|
||||||
<translation>窗口化</translation>
|
<translation>窗口化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="592"/>
|
<location filename="../gui/SettingsView.qml" line="599"/>
|
||||||
<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>
|
<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>全屏通常提供最好的性能,但是无边框窗口可以更好地与 macOS Spaces、Alt+Tab、屏幕截图工具、屏幕覆盖等功能配合使用。</translation>
|
<translation>全屏通常提供最好的性能,但是无边框窗口可以更好地与 macOS Spaces、Alt+Tab、屏幕截图工具、屏幕覆盖等功能配合使用。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="599"/>
|
<location filename="../gui/SettingsView.qml" line="606"/>
|
||||||
<source>V-Sync</source>
|
<source>V-Sync</source>
|
||||||
<translation>垂直同步</translation>
|
<translation>垂直同步</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="609"/>
|
<location filename="../gui/SettingsView.qml" line="616"/>
|
||||||
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
<source>Disabling V-Sync allows sub-frame rendering latency, but it can display visible tearing</source>
|
||||||
<translation>禁用垂直同步可允许子帧渲染延迟,但会显示可见的撕裂</translation>
|
<translation>禁用垂直同步可允许子帧渲染延迟,但会显示可见的撕裂</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="616"/>
|
<location filename="../gui/SettingsView.qml" line="623"/>
|
||||||
<source>Frame pacing</source>
|
<source>Frame pacing</source>
|
||||||
<translation>帧速调节</translation>
|
<translation>帧速调节</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="626"/>
|
<location filename="../gui/SettingsView.qml" line="633"/>
|
||||||
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
<source>Frame pacing reduces micro-stutter by delaying frames that come in too early</source>
|
||||||
<translation>通过延迟过早进入的帧来减少卡顿</translation>
|
<translation>通过延迟过早进入的帧来减少卡顿</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="636"/>
|
<location filename="../gui/SettingsView.qml" line="643"/>
|
||||||
<source>Audio Settings</source>
|
<source>Audio Settings</source>
|
||||||
<translation>音频设置</translation>
|
<translation>音频设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="646"/>
|
<location filename="../gui/SettingsView.qml" line="653"/>
|
||||||
<source>Audio configuration</source>
|
<source>Audio configuration</source>
|
||||||
<translation>音频配置</translation>
|
<translation>音频配置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="671"/>
|
<location filename="../gui/SettingsView.qml" line="678"/>
|
||||||
<source>Stereo</source>
|
<source>Stereo</source>
|
||||||
<translation>立体声</translation>
|
<translation>立体声</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="675"/>
|
<location filename="../gui/SettingsView.qml" line="682"/>
|
||||||
<source>5.1 surround sound</source>
|
<source>5.1 surround sound</source>
|
||||||
<translation>5.1 环绕声</translation>
|
<translation>5.1 环绕声</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="679"/>
|
<location filename="../gui/SettingsView.qml" line="686"/>
|
||||||
<source>7.1 surround sound</source>
|
<source>7.1 surround sound</source>
|
||||||
<translation>7.1 环绕声</translation>
|
<translation>7.1 环绕声</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="693"/>
|
<location filename="../gui/SettingsView.qml" line="700"/>
|
||||||
<source>Mute host PC speakers while streaming</source>
|
<source>Mute host PC speakers while streaming</source>
|
||||||
<translation>流式传输启动时将目标计算机的扬声器静音</translation>
|
<translation>流式传输启动时将目标计算机的扬声器静音</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="703"/>
|
<location filename="../gui/SettingsView.qml" line="710"/>
|
||||||
<source>You must restart any game currently in progress for this setting to take effect</source>
|
<source>You must restart any game currently in progress for this setting to take effect</source>
|
||||||
<translation>要使此设置生效,必须重新启动当前正在进行的所有游戏</translation>
|
<translation>要使此设置生效,必须重新启动当前正在进行的所有游戏</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="709"/>
|
<location filename="../gui/SettingsView.qml" line="716"/>
|
||||||
<source>Mute audio stream when Moonlight is not the active window</source>
|
<source>Mute audio stream when Moonlight is not the active window</source>
|
||||||
<translation>当 Moonlight 失去焦点时静音</translation>
|
<translation>当 Moonlight 失去焦点时静音</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="720"/>
|
<location filename="../gui/SettingsView.qml" line="727"/>
|
||||||
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
<source>Mutes Moonlight's audio when you Alt+Tab out of the stream or click on a different window.</source>
|
||||||
<translation>当你用 Alt+Tab 键离开流式传输或者点击其他窗口时,Moonlight 将静音。</translation>
|
<translation>当你用 Alt+Tab 键离开流式传输或者点击其他窗口时,Moonlight 将静音。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="729"/>
|
<location filename="../gui/SettingsView.qml" line="736"/>
|
||||||
<source>UI Settings</source>
|
<source>UI Settings</source>
|
||||||
<translation>界面设置</translation>
|
<translation>界面设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="739"/>
|
<location filename="../gui/SettingsView.qml" line="746"/>
|
||||||
<source>Language</source>
|
<source>Language</source>
|
||||||
<translation>语言</translation>
|
<translation>语言</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="765"/>
|
<location filename="../gui/SettingsView.qml" line="772"/>
|
||||||
<source>Automatic</source>
|
<source>Automatic</source>
|
||||||
<translation>自动化</translation>
|
<translation>自动化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="813"/>
|
<location filename="../gui/SettingsView.qml" line="879"/>
|
||||||
<source>You must restart Moonlight for this change to take effect</source>
|
<source>You must restart Moonlight for this change to take effect</source>
|
||||||
<translation>你必须重新启动 Moonlight 才能使更改生效</translation>
|
<translation>你必须重新启动 Moonlight 才能使更改生效</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="827"/>
|
<location filename="../gui/SettingsView.qml" line="896"/>
|
||||||
<source>GUI display mode</source>
|
<source>GUI display mode</source>
|
||||||
<translation>窗口显示模式</translation>
|
<translation>窗口显示模式</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="864"/>
|
<location filename="../gui/SettingsView.qml" line="933"/>
|
||||||
<source>Maximized</source>
|
<source>Maximized</source>
|
||||||
<translation>最大化</translation>
|
<translation>最大化</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="881"/>
|
<location filename="../gui/SettingsView.qml" line="950"/>
|
||||||
<source>Show connection quality warnings</source>
|
<source>Show connection quality warnings</source>
|
||||||
<translation>显示连接质量警告</translation>
|
<translation>显示连接质量警告</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="893"/>
|
<location filename="../gui/SettingsView.qml" line="962"/>
|
||||||
<source>Discord Rich Presence integration</source>
|
<source>Discord Rich Presence integration</source>
|
||||||
<translation>Discord Rich Presence 集成</translation>
|
<translation>Discord Rich Presence 集成</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="903"/>
|
<location filename="../gui/SettingsView.qml" line="972"/>
|
||||||
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
<source>Updates your Discord status to display the name of the game you're streaming.</source>
|
||||||
<translation>更新你的 Discord 状态,以显示正在运行的游戏名称。</translation>
|
<translation>更新你的 Discord 状态,以显示正在运行的游戏名称。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="921"/>
|
<location filename="../gui/SettingsView.qml" line="978"/>
|
||||||
|
<source>Keep the display awake while streaming</source>
|
||||||
|
<translation>在串流时保持屏幕开启</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="988"/>
|
||||||
|
<source>Prevents the screensaver from starting or the display from going to sleep while streaming.</source>
|
||||||
|
<translation>防止串流时进入屏保或屏幕休眠。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1006"/>
|
||||||
<source>Input Settings</source>
|
<source>Input Settings</source>
|
||||||
<translation>输入设置</translation>
|
<translation>输入设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="932"/>
|
<location filename="../gui/SettingsView.qml" line="1017"/>
|
||||||
<source>Optimize mouse for remote desktop instead of games</source>
|
<source>Optimize mouse for remote desktop instead of games</source>
|
||||||
<translation>为远程桌面而不是游戏优化鼠标</translation>
|
<translation>为远程桌面而不是游戏优化鼠标</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="942"/>
|
<location filename="../gui/SettingsView.qml" line="1027"/>
|
||||||
<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>
|
<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>
|
<translation>这可以实现无缝鼠标控制,而无需捕获客户端的鼠标光标。这是理想的远程桌面使用方案,但不会在大多数游戏中工作。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="943"/>
|
<location filename="../gui/SettingsView.qml" line="1028"/>
|
||||||
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
<source>You can toggle this while streaming using Ctrl+Alt+Shift+M.</source>
|
||||||
<translation>你可以使用 Ctrl+Alt+Shift+M 切换鼠标控制模式。</translation>
|
<translation>你可以使用 Ctrl+Alt+Shift+M 切换鼠标控制模式。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="944"/>
|
<location filename="../gui/SettingsView.qml" line="1029"/>
|
||||||
<source>NOTE: Due to a bug in GeForce Experience, this option may not work properly if your host PC has multiple monitors.</source>
|
<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>
|
<translation>注意:由于 GeForce Experience 的 Bug,如果你的目标计算机有多个显示器,则此选项可能无法正常工作。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="954"/>
|
<location filename="../gui/SettingsView.qml" line="1039"/>
|
||||||
<source>Capture system keyboard shortcuts</source>
|
<source>Capture system keyboard shortcuts</source>
|
||||||
<translation>捕获系统快捷键</translation>
|
<translation>捕获系统快捷键</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="962"/>
|
<location filename="../gui/SettingsView.qml" line="1047"/>
|
||||||
<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>
|
<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>这样可以捕获系统范围的键盘快捷键,例如 Alt + Tab,这些快捷键通常在流式传输时由客户端系统处理。</translation>
|
<translation>这样可以捕获系统范围的键盘快捷键,例如 Alt + Tab,这些快捷键通常在流式传输时由客户端系统处理。</translation>
|
||||||
</message>
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1345"/>
|
||||||
|
<source>Enabling HDR overrides manual decoder selections.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1414"/>
|
||||||
|
<source>Enabling HDR overrides manual codec selections.</source>
|
||||||
|
<translation>启用HDR将覆盖编码器选择设置。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1420"/>
|
||||||
|
<source>Enable HDR (Experimental)</source>
|
||||||
|
<translation>启用HDR(实验性)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1431"/>
|
||||||
|
<source>The stream will be HDR-capable, but some games may require an HDR monitor on your host PC to enable HDR mode.</source>
|
||||||
|
<translation>HDR功能将在串流中可用,但一些游戏可能需要PC端接入HDR显示器以启用HDR模式。</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1433"/>
|
||||||
|
<source>HDR streaming is not supported on this PC.</source>
|
||||||
|
<translation>此PC不支持HDR。</translation>
|
||||||
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
<source>Capture system keyboard shortcuts while streaming in fullscreen</source>
|
||||||
<translation type="vanished">在全屏流式传输时捕获系统键盘快捷键</translation>
|
<translation type="vanished">在全屏流式传输时捕获系统键盘快捷键</translation>
|
||||||
@@ -696,158 +778,162 @@
|
|||||||
<translation type="vanished">这允许捕获系统范围内的键盘快捷键(如Alt+Tab),这些快捷键通常在全屏流式传输时由客户端操作系统处理。</translation>
|
<translation type="vanished">这允许捕获系统范围内的键盘快捷键(如Alt+Tab),这些快捷键通常在全屏流式传输时由客户端操作系统处理。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="963"/>
|
<location filename="../gui/SettingsView.qml" line="1048"/>
|
||||||
<source>NOTE: Certain keyboard shortcuts like Ctrl+Alt+Del on Windows cannot be intercepted by any application, including Moonlight.</source>
|
<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>
|
<translation>注意:Windows 上的某些键盘快捷键(如 Ctrl+Alt+Del)不能被任何应用程序截获,包括 Moonlight。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="992"/>
|
<location filename="../gui/SettingsView.qml" line="1077"/>
|
||||||
<source>in fullscreen</source>
|
<source>in fullscreen</source>
|
||||||
<translation>全屏</translation>
|
<translation>全屏</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="996"/>
|
<location filename="../gui/SettingsView.qml" line="1081"/>
|
||||||
<source>always</source>
|
<source>always</source>
|
||||||
<translation>总是</translation>
|
<translation>总是</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1026"/>
|
<location filename="../gui/SettingsView.qml" line="1111"/>
|
||||||
<source>Use touchscreen as a virtual trackpad</source>
|
<source>Use touchscreen as a virtual trackpad</source>
|
||||||
<translation>将触摸屏用作虚拟触控板</translation>
|
<translation>将触摸屏用作虚拟触控板</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1036"/>
|
<location filename="../gui/SettingsView.qml" line="1121"/>
|
||||||
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
<source>When checked, the touchscreen acts like a trackpad. When unchecked, the touchscreen will directly control the mouse pointer.</source>
|
||||||
<translation>选中时,触摸屏就像一个触控板。取消选中时,触摸屏将直接控制鼠标指针。</translation>
|
<translation>选中时,触摸屏就像一个触控板。取消选中时,触摸屏将直接控制鼠标指针。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1043"/>
|
<location filename="../gui/SettingsView.qml" line="1128"/>
|
||||||
<source>Swap left and right mouse buttons</source>
|
<source>Swap left and right mouse buttons</source>
|
||||||
<translation>交换鼠标左键和右键</translation>
|
<translation>交换鼠标左键和右键</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1055"/>
|
<location filename="../gui/SettingsView.qml" line="1140"/>
|
||||||
<source>Reverse mouse scrolling direction</source>
|
<source>Reverse mouse scrolling direction</source>
|
||||||
<translation>反转鼠标滚动方向</translation>
|
<translation>反转鼠标滚动方向</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1069"/>
|
<location filename="../gui/SettingsView.qml" line="1154"/>
|
||||||
<source>Gamepad Settings</source>
|
<source>Gamepad Settings</source>
|
||||||
<translation>手柄设置</translation>
|
<translation>手柄设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1079"/>
|
<location filename="../gui/SettingsView.qml" line="1164"/>
|
||||||
<source>Swap A/B and X/Y gamepad buttons</source>
|
<source>Swap A/B and X/Y gamepad buttons</source>
|
||||||
<translation>交换手柄的 A/B 和 X/Y 按钮</translation>
|
<translation>交换手柄的 A/B 和 X/Y 按钮</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1097"/>
|
<location filename="../gui/SettingsView.qml" line="1182"/>
|
||||||
<source>This switches gamepads into a Nintendo-style button layout</source>
|
<source>This switches gamepads into a Nintendo-style button layout</source>
|
||||||
<translation>这会将手柄切换为任天堂风格的按钮布局</translation>
|
<translation>这会将手柄切换为任天堂风格的按钮布局</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1103"/>
|
<location filename="../gui/SettingsView.qml" line="1188"/>
|
||||||
<source>Force gamepad #1 always connected</source>
|
<source>Force gamepad #1 always connected</source>
|
||||||
<translation>强制手柄 #1 始终连接</translation>
|
<translation>强制手柄 #1 始终连接</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1113"/>
|
<location filename="../gui/SettingsView.qml" line="1198"/>
|
||||||
<source>Forces a single gamepad to always stay connected to the host, even if no gamepads are actually connected to this PC.</source>
|
<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>
|
<translation>强制单个手柄始终与目标计算机保持连接,即使没有任何手柄实际连接到此计算机。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1114"/>
|
<location filename="../gui/SettingsView.qml" line="1199"/>
|
||||||
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
<source>Only enable this option when streaming a game that doesn't support gamepads being connected after startup.</source>
|
||||||
<translation>仅在游戏启动后不支持手柄连接时才启用此选项。</translation>
|
<translation>仅在游戏启动后不支持手柄连接时才启用此选项。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1121"/>
|
<location filename="../gui/SettingsView.qml" line="1206"/>
|
||||||
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
<source>Enable mouse control with gamepads by holding the 'Start' button</source>
|
||||||
<translation>按住手柄的“Start”按钮启用鼠标控制</translation>
|
<translation>按住手柄的“Start”按钮启用鼠标控制</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1132"/>
|
<location filename="../gui/SettingsView.qml" line="1217"/>
|
||||||
<source>Process gamepad input when Moonlight is in the background</source>
|
<source>Process gamepad input when Moonlight is in the background</source>
|
||||||
<translation>当 Moonlight 在后台时处理手柄输入</translation>
|
<translation>当 Moonlight 在后台时处理手柄输入</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1143"/>
|
<location filename="../gui/SettingsView.qml" line="1228"/>
|
||||||
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
<source>Allows Moonlight to capture gamepad inputs even if it's not the current window in focus</source>
|
||||||
<translation>即使不是焦点窗口,也允许 Moonlight 捕获手柄的输入</translation>
|
<translation>即使不是焦点窗口,也允许 Moonlight 捕获手柄的输入</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1152"/>
|
<location filename="../gui/SettingsView.qml" line="1237"/>
|
||||||
<source>Host Settings</source>
|
<source>Host Settings</source>
|
||||||
<translation>目标计算机设置</translation>
|
<translation>目标计算机设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1162"/>
|
<location filename="../gui/SettingsView.qml" line="1247"/>
|
||||||
<source>Optimize game settings for streaming</source>
|
<source>Optimize game settings for streaming</source>
|
||||||
<translation>优化游戏设置以进行流式传输</translation>
|
<translation>优化游戏设置以进行流式传输</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1173"/>
|
<location filename="../gui/SettingsView.qml" line="1258"/>
|
||||||
<source>Quit app on host PC after ending stream</source>
|
<source>Quit app on host PC after ending stream</source>
|
||||||
<translation>流式传输结束后退出目标计算机上的应用程序</translation>
|
<translation>流式传输结束后退出目标计算机上的应用程序</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1183"/>
|
<location filename="../gui/SettingsView.qml" line="1268"/>
|
||||||
<source>This will close the app or game you are streaming when you end your stream. You will lose any unsaved progress!</source>
|
<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>
|
<translation>当你结束流式传输时,这将关闭正在运行的应用程序或游戏。这会导致你失去所有未保存的游戏进度!</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1192"/>
|
<location filename="../gui/SettingsView.qml" line="1277"/>
|
||||||
<source>Advanced Settings</source>
|
<source>Advanced Settings</source>
|
||||||
<translation>高级设置</translation>
|
<translation>高级设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1202"/>
|
<location filename="../gui/SettingsView.qml" line="1287"/>
|
||||||
<source>Video decoder</source>
|
<source>Video decoder</source>
|
||||||
<translation>视频解码器</translation>
|
<translation>视频解码器</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1227"/>
|
<location filename="../gui/SettingsView.qml" line="1313"/>
|
||||||
<location filename="../gui/SettingsView.qml" line="1273"/>
|
<location filename="../gui/SettingsView.qml" line="1382"/>
|
||||||
<source>Automatic (Recommended)</source>
|
<source>Automatic (Recommended)</source>
|
||||||
<translation>自动 (推荐)</translation>
|
<translation>自动 (推荐)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1231"/>
|
<location filename="../gui/SettingsView.qml" line="1317"/>
|
||||||
<source>Force software decoding</source>
|
<source>Force software decoding</source>
|
||||||
<translation>强制软件解码</translation>
|
<translation>强制软件解码</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1235"/>
|
<location filename="../gui/SettingsView.qml" line="1321"/>
|
||||||
<source>Force hardware decoding</source>
|
<source>Force hardware decoding</source>
|
||||||
<translation>强制硬件解码</translation>
|
<translation>强制硬件解码</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1248"/>
|
<location filename="../gui/SettingsView.qml" line="1351"/>
|
||||||
<source>Video codec</source>
|
<source>Video codec</source>
|
||||||
<translation>视频编解码器</translation>
|
<translation>视频编解码器</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1277"/>
|
<location filename="../gui/SettingsView.qml" line="1386"/>
|
||||||
<source>H.264</source>
|
<source>H.264</source>
|
||||||
<translation>H.264</translation>
|
<translation>H.264</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1281"/>
|
<location filename="../gui/SettingsView.qml" line="1390"/>
|
||||||
<source>HEVC (H.265)</source>
|
<source>HEVC (H.265)</source>
|
||||||
<translation>HEVC (H.265)</translation>
|
<translation>HEVC (H.265)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1298"/>
|
<source>HEVC HDR (Experimental)</source>
|
||||||
|
<translation type="vanished">HEVC HDR (实验性)</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/SettingsView.qml" line="1439"/>
|
||||||
<source>Unlock unsupported FPS options</source>
|
<source>Unlock unsupported FPS options</source>
|
||||||
<translation>解锁不受支持的 FPS 选项</translation>
|
<translation>解锁不受支持的 FPS 选项</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1317"/>
|
<location filename="../gui/SettingsView.qml" line="1458"/>
|
||||||
<source>Automatically find PCs on the local network (Recommended)</source>
|
<source>Automatically find PCs on the local network (Recommended)</source>
|
||||||
<translation>自动在本地网络上查找计算机 (推荐)</translation>
|
<translation>自动在本地网络上查找计算机 (推荐)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/SettingsView.qml" line="1342"/>
|
<location filename="../gui/SettingsView.qml" line="1483"/>
|
||||||
<source>Automatically detect blocked connections (Recommended)</source>
|
<source>Automatically detect blocked connections (Recommended)</source>
|
||||||
<translation>自动检测被阻止的连接 (推荐)</translation>
|
<translation>自动检测被阻止的连接 (推荐)</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -881,22 +967,22 @@
|
|||||||
<translation>此计算机的互联网连接被阻塞。当连接到此网络时,互联网上的流式传输可能无法工作。</translation>
|
<translation>此计算机的互联网连接被阻塞。当连接到此网络时,互联网上的流式传输可能无法工作。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Tip:</source>
|
<source>Tip:</source>
|
||||||
<translation>提示:</translation>
|
<translation>提示:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="161"/>
|
<location filename="../gui/StreamSegue.qml" line="165"/>
|
||||||
<source>Press %1 to disconnect your session</source>
|
<source>Press %1 to disconnect your session</source>
|
||||||
<translation>按 %1 来断开会话</translation>
|
<translation>按 %1 来断开会话</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Start+Select+L1+R1</source>
|
<source>Start+Select+L1+R1</source>
|
||||||
<translation>Start+Select+L1+R1</translation>
|
<translation>Start+Select+L1+R1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/StreamSegue.qml" line="162"/>
|
<location filename="../gui/StreamSegue.qml" line="166"/>
|
||||||
<source>Ctrl+Alt+Shift+Q</source>
|
<source>Ctrl+Alt+Shift+Q</source>
|
||||||
<translation>Ctrl+Alt+Shift+Q</translation>
|
<translation>Ctrl+Alt+Shift+Q</translation>
|
||||||
</message>
|
</message>
|
||||||
@@ -904,95 +990,94 @@
|
|||||||
<context>
|
<context>
|
||||||
<name>main</name>
|
<name>main</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="254"/>
|
<location filename="../gui/main.qml" line="418"/>
|
||||||
<location filename="../gui/main.qml" line="264"/>
|
|
||||||
<location filename="../gui/main.qml" line="393"/>
|
|
||||||
<location filename="../gui/main.qml" line="408"/>
|
|
||||||
<source>Settings</source>
|
<source>Settings</source>
|
||||||
<translation>设置</translation>
|
<translation>设置</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="255"/>
|
<location filename="../gui/main.qml" line="265"/>
|
||||||
<source>Version %1</source>
|
<source>Version %1</source>
|
||||||
<translation>版本 %1</translation>
|
<translation>版本 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="271"/>
|
<location filename="../gui/main.qml" line="281"/>
|
||||||
<source>Join our community on Discord</source>
|
<source>Join our community on Discord</source>
|
||||||
<translation>加入我们的社区</translation>
|
<translation>加入我们的社区</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="283"/>
|
|
||||||
<source>Computers</source>
|
<source>Computers</source>
|
||||||
<translation>计算机列表</translation>
|
<translation type="vanished">计算机列表</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="290"/>
|
<location filename="../gui/main.qml" line="300"/>
|
||||||
<source>Add PC manually</source>
|
<source>Add PC manually</source>
|
||||||
<translation>手动添加计算机</translation>
|
<translation>手动添加计算机</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="330"/>
|
<location filename="../gui/main.qml" line="340"/>
|
||||||
<source>Update available for Moonlight: Version %1</source>
|
<source>Update available for Moonlight: Version %1</source>
|
||||||
<translation>Moonlight 可用更新:版本 %1</translation>
|
<translation>Moonlight 可用更新:版本 %1</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="354"/>
|
<location filename="../gui/main.qml" line="364"/>
|
||||||
<source>Help</source>
|
<source>Help</source>
|
||||||
<translation>帮助</translation>
|
<translation>帮助</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="377"/>
|
<location filename="../gui/main.qml" line="387"/>
|
||||||
<source>Gamepad Mapper</source>
|
<source>Gamepad Mapper</source>
|
||||||
<translation>手柄按键映射</translation>
|
<translation>手柄按键映射</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="381"/>
|
|
||||||
<source>Gamepad Mapping</source>
|
<source>Gamepad Mapping</source>
|
||||||
<translation>手柄按键映射</translation>
|
<translation type="vanished">手柄按键映射</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../gui/main.qml" line="425"/>
|
||||||
|
<source>No functioning hardware accelerated video decoder was detected by Moonlight. Your streaming performance may be severely degraded in this configuration.</source>
|
||||||
|
<translation>Moonlight 未检测到有效的硬件加速视频解码器。在此配置中,你的流性能可能会严重下降。</translation>
|
||||||
</message>
|
</message>
|
||||||
<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>
|
<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>Moonlight 未检测到功能正常的硬件加速 H.264 视频解码器。</translation>
|
<translation type="vanished">Moonlight 未检测到功能正常的硬件加速 H.264 视频解码器。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="417"/>
|
<location filename="../gui/main.qml" line="427"/>
|
||||||
<source>Click the Help button for more information on solving this problem.</source>
|
<source>Click the Help button for more information on solving this problem.</source>
|
||||||
<translation>单击帮助按钮以获取有关解决此问题的更多信息。</translation>
|
<translation>单击帮助按钮以获取有关解决此问题的更多信息。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="423"/>
|
<location filename="../gui/main.qml" line="433"/>
|
||||||
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
<source>Hardware acceleration doesn't work on XWayland. Continuing on XWayland may result in poor streaming performance. Try running with QT_QPA_PLATFORM=wayland or switch to X11.</source>
|
||||||
<translation>硬件加速在 XWayland 上不起作用。在 XWayland 上继续操作可能会导致流式传输性能下降。</translation>
|
<translation>硬件加速在 XWayland 上不起作用。在 XWayland 上继续操作可能会导致流式传输性能下降。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="425"/>
|
<location filename="../gui/main.qml" line="435"/>
|
||||||
<source>Click the Help button for more information.</source>
|
<source>Click the Help button for more information.</source>
|
||||||
<translation>单击帮助按钮以获取更多信息。</translation>
|
<translation>单击帮助按钮以获取更多信息。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="432"/>
|
<location filename="../gui/main.qml" line="442"/>
|
||||||
<source>This version of Moonlight isn't optimized for your PC. Please download the '%1' version of Moonlight for the best streaming performance.</source>
|
<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>此版本的 Moonlight 尚未针对你的计算机优化。请下载“%1”版本的 Moonlight,以获得最佳的流式传输性能。</translation>
|
<translation>此版本的 Moonlight 尚未针对你的计算机优化。请下载“%1”版本的 Moonlight,以获得最佳的流式传输性能。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="441"/>
|
<location filename="../gui/main.qml" line="451"/>
|
||||||
<source>Moonlight detected gamepads without a mapping:</source>
|
<source>Moonlight detected gamepads without a mapping:</source>
|
||||||
<translation>Moonlight 检测到没有映射的手柄:</translation>
|
<translation>Moonlight 检测到没有映射的手柄:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="443"/>
|
<location filename="../gui/main.qml" line="453"/>
|
||||||
<source>Click the Help button for information on how to map your gamepads.</source>
|
<source>Click the Help button for information on how to map your gamepads.</source>
|
||||||
<translation>单击帮助按钮以获取有关如何映射手柄的信息。</translation>
|
<translation>单击帮助按钮以获取有关如何映射手柄的信息。</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="451"/>
|
<location filename="../gui/main.qml" line="461"/>
|
||||||
<source>Are you sure you want to quit?</source>
|
<source>Are you sure you want to quit?</source>
|
||||||
<translation>确定要退出吗?</translation>
|
<translation>确定要退出吗?</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../gui/main.qml" line="481"/>
|
<location filename="../gui/main.qml" line="491"/>
|
||||||
<source>Enter the IP address of your GameStream PC:</source>
|
<source>Enter the IP address of your GameStream PC:</source>
|
||||||
<translation>输入目标计算机的 IP 地址:</translation>
|
<translation>输入目标计算机的 IP 地址:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|||||||
+124
-31
@@ -22,20 +22,23 @@
|
|||||||
#include "streaming/video/ffmpeg.h"
|
#include "streaming/video/ffmpeg.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_WIN32) && defined(Q_PROCESSOR_X86)
|
#if defined(Q_OS_WIN32)
|
||||||
#include "antihookingprotection.h"
|
#include "antihookingprotection.h"
|
||||||
#elif defined(Q_OS_LINUX)
|
#elif defined(Q_OS_LINUX)
|
||||||
#include <openssl/ssl.h>
|
#include <openssl/ssl.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "cli/listapps.h"
|
||||||
#include "cli/quitstream.h"
|
#include "cli/quitstream.h"
|
||||||
#include "cli/startstream.h"
|
#include "cli/startstream.h"
|
||||||
|
#include "cli/pair.h"
|
||||||
#include "cli/commandlineparser.h"
|
#include "cli/commandlineparser.h"
|
||||||
#include "path.h"
|
#include "path.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
#include "gui/computermodel.h"
|
#include "gui/computermodel.h"
|
||||||
#include "gui/appmodel.h"
|
#include "gui/appmodel.h"
|
||||||
#include "backend/autoupdatechecker.h"
|
#include "backend/autoupdatechecker.h"
|
||||||
|
#include "backend/computermanager.h"
|
||||||
#include "backend/systemproperties.h"
|
#include "backend/systemproperties.h"
|
||||||
#include "streaming/session.h"
|
#include "streaming/session.h"
|
||||||
#include "settings/streamingpreferences.h"
|
#include "settings/streamingpreferences.h"
|
||||||
@@ -60,6 +63,7 @@
|
|||||||
static QElapsedTimer s_LoggerTime;
|
static QElapsedTimer s_LoggerTime;
|
||||||
static QTextStream s_LoggerStream(stdout);
|
static QTextStream s_LoggerStream(stdout);
|
||||||
static QMutex s_LoggerLock;
|
static QMutex s_LoggerLock;
|
||||||
|
static bool s_SuppressVerboseOutput;
|
||||||
#ifdef LOG_TO_FILE
|
#ifdef LOG_TO_FILE
|
||||||
#define MAX_LOG_LINES 10000
|
#define MAX_LOG_LINES 10000
|
||||||
static int s_LogLinesWritten = 0;
|
static int s_LogLinesWritten = 0;
|
||||||
@@ -100,15 +104,27 @@ void sdlLogToDiskHandler(void*, int category, SDL_LogPriority priority, const ch
|
|||||||
|
|
||||||
switch (priority) {
|
switch (priority) {
|
||||||
case SDL_LOG_PRIORITY_VERBOSE:
|
case SDL_LOG_PRIORITY_VERBOSE:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
priorityTxt = "Verbose";
|
priorityTxt = "Verbose";
|
||||||
break;
|
break;
|
||||||
case SDL_LOG_PRIORITY_DEBUG:
|
case SDL_LOG_PRIORITY_DEBUG:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
priorityTxt = "Debug";
|
priorityTxt = "Debug";
|
||||||
break;
|
break;
|
||||||
case SDL_LOG_PRIORITY_INFO:
|
case SDL_LOG_PRIORITY_INFO:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
priorityTxt = "Info";
|
priorityTxt = "Info";
|
||||||
break;
|
break;
|
||||||
case SDL_LOG_PRIORITY_WARN:
|
case SDL_LOG_PRIORITY_WARN:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
priorityTxt = "Warn";
|
priorityTxt = "Warn";
|
||||||
break;
|
break;
|
||||||
case SDL_LOG_PRIORITY_ERROR:
|
case SDL_LOG_PRIORITY_ERROR:
|
||||||
@@ -134,12 +150,21 @@ void qtLogToDiskHandler(QtMsgType type, const QMessageLogContext&, const QString
|
|||||||
|
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case QtDebugMsg:
|
case QtDebugMsg:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
typeTxt = "Debug";
|
typeTxt = "Debug";
|
||||||
break;
|
break;
|
||||||
case QtInfoMsg:
|
case QtInfoMsg:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
typeTxt = "Info";
|
typeTxt = "Info";
|
||||||
break;
|
break;
|
||||||
case QtWarningMsg:
|
case QtWarningMsg:
|
||||||
|
if (s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
typeTxt = "Warning";
|
typeTxt = "Warning";
|
||||||
break;
|
break;
|
||||||
case QtCriticalMsg:
|
case QtCriticalMsg:
|
||||||
@@ -166,13 +191,26 @@ void ffmpegLogToDiskHandler(void* ptr, int level, const char* fmt, va_list vl)
|
|||||||
if ((level & 0xFF) > av_log_get_level()) {
|
if ((level & 0xFF) > av_log_get_level()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
else if ((level & 0xFF) > AV_LOG_WARNING && s_SuppressVerboseOutput) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We need to use the *previous* printPrefix value to determine whether to
|
||||||
|
// print the prefix this time. av_log_format_line() will set the printPrefix
|
||||||
|
// value to indicate whether the prefix should be printed *next time*.
|
||||||
|
bool shouldPrefixThisMessage = printPrefix != 0;
|
||||||
|
|
||||||
av_log_format_line(ptr, level, fmt, vl, lineBuffer, sizeof(lineBuffer), &printPrefix);
|
av_log_format_line(ptr, level, fmt, vl, lineBuffer, sizeof(lineBuffer), &printPrefix);
|
||||||
|
|
||||||
QTime logTime = QTime::fromMSecsSinceStartOfDay(s_LoggerTime.elapsed());
|
if (shouldPrefixThisMessage) {
|
||||||
QString txt = QString("%1 - FFmpeg: %2").arg(logTime.toString()).arg(lineBuffer);
|
QTime logTime = QTime::fromMSecsSinceStartOfDay(s_LoggerTime.elapsed());
|
||||||
|
QString txt = QString("%1 - FFmpeg: %2").arg(logTime.toString()).arg(lineBuffer);
|
||||||
logToLoggerStream(txt);
|
logToLoggerStream(txt);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
QString txt = QString(lineBuffer);
|
||||||
|
logToLoggerStream(txt);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
@@ -250,7 +288,6 @@ int main(int argc, char *argv[])
|
|||||||
QCoreApplication::setApplicationName("Moonlight");
|
QCoreApplication::setApplicationName("Moonlight");
|
||||||
|
|
||||||
if (QFile(QDir::currentPath() + "/portable.dat").exists()) {
|
if (QFile(QDir::currentPath() + "/portable.dat").exists()) {
|
||||||
qInfo() << "Running in portable mode from:" << QDir::currentPath();
|
|
||||||
QSettings::setDefaultFormat(QSettings::IniFormat);
|
QSettings::setDefaultFormat(QSettings::IniFormat);
|
||||||
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, QDir::currentPath());
|
QSettings::setPath(QSettings::IniFormat, QSettings::UserScope, QDir::currentPath());
|
||||||
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, QDir::currentPath());
|
QSettings::setPath(QSettings::IniFormat, QSettings::SystemScope, QDir::currentPath());
|
||||||
@@ -268,7 +305,7 @@ int main(int argc, char *argv[])
|
|||||||
QDir tempDir(Path::getLogDir());
|
QDir tempDir(Path::getLogDir());
|
||||||
s_LoggerFile = new QFile(tempDir.filePath(QString("Moonlight-%1.log").arg(QDateTime::currentSecsSinceEpoch())));
|
s_LoggerFile = new QFile(tempDir.filePath(QString("Moonlight-%1.log").arg(QDateTime::currentSecsSinceEpoch())));
|
||||||
if (s_LoggerFile->open(QIODevice::WriteOnly)) {
|
if (s_LoggerFile->open(QIODevice::WriteOnly)) {
|
||||||
qInfo() << "Redirecting log output to " << s_LoggerFile->fileName();
|
QTextStream(stderr) << "Redirecting log output to " << s_LoggerFile->fileName() << Qt::endl;
|
||||||
s_LoggerStream.setDevice(s_LoggerFile);
|
s_LoggerStream.setDevice(s_LoggerFile);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@@ -288,10 +325,9 @@ int main(int argc, char *argv[])
|
|||||||
SetUnhandledExceptionFilter(UnhandledExceptionHandler);
|
SetUnhandledExceptionFilter(UnhandledExceptionHandler);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(Q_OS_WIN32) && defined(Q_PROCESSOR_X86)
|
#if defined(Q_OS_WIN32)
|
||||||
// Force AntiHooking.dll to be statically imported and loaded
|
// Force AntiHooking.dll to be statically imported and loaded
|
||||||
// by ntdll on x86/x64 platforms by calling a dummy function.
|
// by ntdll on Win32 platforms by calling a dummy function.
|
||||||
// AntiHooking.dll is not currently built for ARM64.
|
|
||||||
AntiHookingDummyImport();
|
AntiHookingDummyImport();
|
||||||
#elif defined(Q_OS_LINUX)
|
#elif defined(Q_OS_LINUX)
|
||||||
// Force libssl.so to be directly linked to our binary, so
|
// Force libssl.so to be directly linked to our binary, so
|
||||||
@@ -372,18 +408,6 @@ int main(int argc, char *argv[])
|
|||||||
// Register custom metatypes for use in signals
|
// Register custom metatypes for use in signals
|
||||||
qRegisterMetaType<NvApp>("NvApp");
|
qRegisterMetaType<NvApp>("NvApp");
|
||||||
|
|
||||||
SDL_version compileVersion;
|
|
||||||
SDL_VERSION(&compileVersion);
|
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Compiled with SDL %d.%d.%d",
|
|
||||||
compileVersion.major, compileVersion.minor, compileVersion.patch);
|
|
||||||
|
|
||||||
SDL_version runtimeVersion;
|
|
||||||
SDL_GetVersion(&runtimeVersion);
|
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Running with SDL %d.%d.%d",
|
|
||||||
runtimeVersion.major, runtimeVersion.minor, runtimeVersion.patch);
|
|
||||||
|
|
||||||
// Allow the display to sleep by default. We will manually use SDL_DisableScreenSaver()
|
// Allow the display to sleep by default. We will manually use SDL_DisableScreenSaver()
|
||||||
// and SDL_EnableScreenSaver() when appropriate. This hint must be set before
|
// and SDL_EnableScreenSaver() when appropriate. This hint must be set before
|
||||||
// initializing the SDL video subsystem to have any effect.
|
// initializing the SDL video subsystem to have any effect.
|
||||||
@@ -442,9 +466,15 @@ int main(int argc, char *argv[])
|
|||||||
// the mouse motion exactly how it was given to us.
|
// the mouse motion exactly how it was given to us.
|
||||||
SDL_SetHint("SDL_MOUSE_RELATIVE_SCALING", "0");
|
SDL_SetHint("SDL_MOUSE_RELATIVE_SCALING", "0");
|
||||||
|
|
||||||
// Set our app name for SDL to use with PulseAudio. This matches what we provide
|
// Set our app name for SDL to use with PulseAudio and PipeWire. This matches what we
|
||||||
// as our app name to libsoundio too.
|
// provide as our app name to libsoundio too. On SDL 2.0.18+, SDL_APP_NAME is also used
|
||||||
|
// for screensaver inhibitor reporting.
|
||||||
SDL_SetHint("SDL_AUDIO_DEVICE_APP_NAME", "Moonlight");
|
SDL_SetHint("SDL_AUDIO_DEVICE_APP_NAME", "Moonlight");
|
||||||
|
SDL_SetHint("SDL_APP_NAME", "Moonlight");
|
||||||
|
|
||||||
|
// We handle capturing the mouse ourselves when it leaves the window, so we don't need
|
||||||
|
// SDL doing it for us behind our backs.
|
||||||
|
SDL_SetHint("SDL_MOUSE_AUTO_CAPTURE", "0");
|
||||||
|
|
||||||
#ifdef QT_DEBUG
|
#ifdef QT_DEBUG
|
||||||
// Allow thread naming using exceptions on debug builds. SDL doesn't use SEH
|
// Allow thread naming using exceptions on debug builds. SDL doesn't use SEH
|
||||||
@@ -455,6 +485,47 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QGuiApplication app(argc, argv);
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
GlobalCommandLineParser parser;
|
||||||
|
GlobalCommandLineParser::ParseResult commandLineParserResult = parser.parse(app.arguments());
|
||||||
|
switch (commandLineParserResult) {
|
||||||
|
case GlobalCommandLineParser::ListRequested:
|
||||||
|
#ifdef USE_CUSTOM_LOGGER
|
||||||
|
// Don't log to the console since it will jumble the command output
|
||||||
|
s_SuppressVerboseOutput = true;
|
||||||
|
#endif
|
||||||
|
#ifdef Q_OS_WIN32
|
||||||
|
// Attach to the console to be able to print output.
|
||||||
|
// Since we're a /SUBSYSTEM:WINDOWS app, we won't be attached by default.
|
||||||
|
if (AttachConsole(ATTACH_PARENT_PROCESS)) {
|
||||||
|
HANDLE conOut = GetStdHandle(STD_OUTPUT_HANDLE);
|
||||||
|
if (conOut != INVALID_HANDLE_VALUE && conOut != NULL) {
|
||||||
|
freopen("CONOUT$", "w", stdout);
|
||||||
|
setvbuf(stdout, NULL, _IONBF, 0);
|
||||||
|
}
|
||||||
|
HANDLE conErr = GetStdHandle(STD_ERROR_HANDLE);
|
||||||
|
if (conErr != INVALID_HANDLE_VALUE && conErr != NULL) {
|
||||||
|
freopen("CONOUT$", "w", stderr);
|
||||||
|
setvbuf(stderr, NULL, _IONBF, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SDL_version compileVersion;
|
||||||
|
SDL_VERSION(&compileVersion);
|
||||||
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Compiled with SDL %d.%d.%d",
|
||||||
|
compileVersion.major, compileVersion.minor, compileVersion.patch);
|
||||||
|
|
||||||
|
SDL_version runtimeVersion;
|
||||||
|
SDL_GetVersion(&runtimeVersion);
|
||||||
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Running with SDL %d.%d.%d",
|
||||||
|
runtimeVersion.major, runtimeVersion.minor, runtimeVersion.patch);
|
||||||
|
|
||||||
// Apply the initial translation based on user preference
|
// Apply the initial translation based on user preference
|
||||||
StreamingPreferences prefs;
|
StreamingPreferences prefs;
|
||||||
prefs.retranslate();
|
prefs.retranslate();
|
||||||
@@ -464,6 +535,7 @@ int main(int argc, char *argv[])
|
|||||||
if (WMUtils::isRunningWayland() && QGuiApplication::platformName() == "xcb") {
|
if (WMUtils::isRunningWayland() && QGuiApplication::platformName() == "xcb") {
|
||||||
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
SDL_LogWarn(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
"Detected XWayland. This will probably break hardware decoding! Try running with QT_QPA_PLATFORM=wayland or switch to X11.");
|
"Detected XWayland. This will probably break hardware decoding! Try running with QT_QPA_PLATFORM=wayland or switch to X11.");
|
||||||
|
qputenv("SDL_VIDEODRIVER", "x11");
|
||||||
}
|
}
|
||||||
else if (QGuiApplication::platformName().startsWith("wayland")) {
|
else if (QGuiApplication::platformName().startsWith("wayland")) {
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Detected Wayland");
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "Detected Wayland");
|
||||||
@@ -567,9 +639,9 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QQmlApplicationEngine engine;
|
QQmlApplicationEngine engine;
|
||||||
QString initialView;
|
QString initialView;
|
||||||
|
bool hasGUI = true;
|
||||||
|
|
||||||
GlobalCommandLineParser parser;
|
switch (commandLineParserResult) {
|
||||||
switch (parser.parse(app.arguments())) {
|
|
||||||
case GlobalCommandLineParser::NormalStartRequested:
|
case GlobalCommandLineParser::NormalStartRequested:
|
||||||
initialView = "qrc:/gui/PcView.qml";
|
initialView = "qrc:/gui/PcView.qml";
|
||||||
break;
|
break;
|
||||||
@@ -594,14 +666,35 @@ int main(int argc, char *argv[])
|
|||||||
engine.rootContext()->setContextProperty("launcher", launcher);
|
engine.rootContext()->setContextProperty("launcher", launcher);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case GlobalCommandLineParser::PairRequested:
|
||||||
|
{
|
||||||
|
initialView = "qrc:/gui/CliPair.qml";
|
||||||
|
PairCommandLineParser pairParser;
|
||||||
|
pairParser.parse(app.arguments());
|
||||||
|
auto launcher = new CliPair::Launcher(pairParser.getHost(), pairParser.getPredefinedPin(), &app);
|
||||||
|
engine.rootContext()->setContextProperty("launcher", launcher);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case GlobalCommandLineParser::ListRequested:
|
||||||
|
{
|
||||||
|
ListCommandLineParser listParser;
|
||||||
|
listParser.parse(app.arguments());
|
||||||
|
auto launcher = new CliListApps::Launcher(listParser.getHost(), listParser, &app);
|
||||||
|
launcher->execute(new ComputerManager(&app));
|
||||||
|
hasGUI = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
engine.rootContext()->setContextProperty("initialView", initialView);
|
if (hasGUI) {
|
||||||
|
engine.rootContext()->setContextProperty("initialView", initialView);
|
||||||
|
|
||||||
|
// Load the main.qml file
|
||||||
|
engine.load(QUrl(QStringLiteral("qrc:/gui/main.qml")));
|
||||||
|
if (engine.rootObjects().isEmpty())
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
// Load the main.qml file
|
|
||||||
engine.load(QUrl(QStringLiteral("qrc:/gui/main.qml")));
|
|
||||||
if (engine.rootObjects().isEmpty())
|
|
||||||
return -1;
|
|
||||||
int err = app.exec();
|
int err = app.exec();
|
||||||
|
|
||||||
// Give worker tasks time to properly exit. Fixes PendingQuitTask
|
// Give worker tasks time to properly exit. Fixes PendingQuitTask
|
||||||
|
|||||||
+35
-47
@@ -11,6 +11,10 @@
|
|||||||
|
|
||||||
#define _GNU_SOURCE
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
|
// NOTE: This file MUST NOT include fcntl.h due to open() -> open64()
|
||||||
|
// redirection that happens when _FILE_OFFSET_BITS=64!
|
||||||
|
// See masterhook_internal.c for details.
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
@@ -35,14 +39,21 @@ struct stat64 g_DrmMasterStat;
|
|||||||
// The DRM master FD created for SDL
|
// The DRM master FD created for SDL
|
||||||
int g_SdlDrmMasterFd = -1;
|
int g_SdlDrmMasterFd = -1;
|
||||||
|
|
||||||
|
int drmIsMaster(int fd)
|
||||||
|
{
|
||||||
|
// Detect master by attempting something that requires master.
|
||||||
|
// This method is available in Mesa DRM since Feb 2019.
|
||||||
|
return drmAuthMagic(fd, 0) != -EACCES;
|
||||||
|
}
|
||||||
|
|
||||||
// This hook will handle legacy DRM rendering
|
// This hook will handle legacy DRM rendering
|
||||||
int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId,
|
int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId,
|
||||||
uint32_t x, uint32_t y, uint32_t *connectors, int count,
|
uint32_t x, uint32_t y, uint32_t *connectors, int count,
|
||||||
drmModeModeInfoPtr mode)
|
drmModeModeInfoPtr mode)
|
||||||
{
|
{
|
||||||
// Grab the first DRM FD that makes it in here. This will be the Qt
|
// Grab the first DRM Master FD that makes it in here. This will be the Qt
|
||||||
// EGLFS backend's DRM FD, which we will need later.
|
// EGLFS backend's DRM FD, on which we will call drmDropMaster() later.
|
||||||
if (g_QtDrmMasterFd == -1) {
|
if (g_QtDrmMasterFd == -1 && drmIsMaster(fd)) {
|
||||||
g_QtDrmMasterFd = fd;
|
g_QtDrmMasterFd = fd;
|
||||||
fstat64(g_QtDrmMasterFd, &g_DrmMasterStat);
|
fstat64(g_QtDrmMasterFd, &g_DrmMasterStat);
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
@@ -51,16 +62,16 @@ int drmModeSetCrtc(int fd, uint32_t crtcId, uint32_t bufferId,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Call into the real thing
|
// Call into the real thing
|
||||||
return ((typeof(drmModeSetCrtc)*)dlsym(RTLD_NEXT, "drmModeSetCrtc"))(fd, crtcId, bufferId, x, y, connectors, count, mode);
|
return ((typeof(drmModeSetCrtc)*)dlsym(RTLD_NEXT, __FUNCTION__))(fd, crtcId, bufferId, x, y, connectors, count, mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This hook will handle atomic DRM rendering
|
// This hook will handle atomic DRM rendering
|
||||||
int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req,
|
int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req,
|
||||||
uint32_t flags, void *user_data)
|
uint32_t flags, void *user_data)
|
||||||
{
|
{
|
||||||
// Grab the first DRM FD that makes it in here. This will be the Qt
|
// Grab the first DRM Master FD that makes it in here. This will be the Qt
|
||||||
// EGLFS backend's DRM FD, which we will need later.
|
// EGLFS backend's DRM FD, on which we will call drmDropMaster() later.
|
||||||
if (g_QtDrmMasterFd == -1) {
|
if (g_QtDrmMasterFd == -1 && drmIsMaster(fd)) {
|
||||||
g_QtDrmMasterFd = fd;
|
g_QtDrmMasterFd = fd;
|
||||||
fstat64(g_QtDrmMasterFd, &g_DrmMasterStat);
|
fstat64(g_QtDrmMasterFd, &g_DrmMasterStat);
|
||||||
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
@@ -69,53 +80,30 @@ int drmModeAtomicCommit(int fd, drmModeAtomicReqPtr req,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Call into the real thing
|
// Call into the real thing
|
||||||
return ((typeof(drmModeAtomicCommit)*)dlsym(RTLD_NEXT, "drmModeAtomicCommit"))(fd, req, flags, user_data);
|
return ((typeof(drmModeAtomicCommit)*)dlsym(RTLD_NEXT, __FUNCTION__))(fd, req, flags, user_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
// This hook will handle SDL's open() on the DRM device. We just need to
|
// This hook will handle SDL's open() on the DRM device. We just need to
|
||||||
// hook this variant of open(), since that's what SDL uses. When we see
|
// hook this variant of open(), since that's what SDL uses. When we see
|
||||||
// the open a FD for the same card as the Qt DRM master FD, we'll drop
|
// the open a FD for the same card as the Qt DRM master FD, we'll drop
|
||||||
// master on the Qt FD to allow the new FD to have master.
|
// master on the Qt FD to allow the new FD to have master.
|
||||||
int open(const char *pathname, int flags)
|
int openHook(const char *funcname, const char *pathname, int flags, va_list va);
|
||||||
|
|
||||||
|
int open(const char *pathname, int flags, ...)
|
||||||
{
|
{
|
||||||
// Call the real thing to do the open operation
|
va_list va;
|
||||||
int fd = ((typeof(open)*)dlsym(RTLD_NEXT, "open"))(pathname, flags);
|
va_start(va, flags);
|
||||||
|
int fd = openHook(__FUNCTION__, pathname, flags, va);
|
||||||
// If the file was successfully opened and we have a DRM master FD,
|
va_end(va);
|
||||||
// check if the FD we just opened is a DRM device.
|
return fd;
|
||||||
if (fd >= 0 && g_QtDrmMasterFd != -1) {
|
}
|
||||||
if (strncmp(pathname, "/dev/dri/card", 13) == 0) {
|
|
||||||
// It's a DRM device, but is it _our_ DRM device?
|
|
||||||
struct stat64 fdstat;
|
|
||||||
|
|
||||||
fstat64(fd, &fdstat);
|
|
||||||
if (g_DrmMasterStat.st_dev == fdstat.st_dev &&
|
|
||||||
g_DrmMasterStat.st_ino == fdstat.st_ino) {
|
|
||||||
// It is our device. Time to do the magic!
|
|
||||||
|
|
||||||
// This code assumes SDL only ever opens a single FD
|
|
||||||
// for a given DRM device.
|
|
||||||
SDL_assert(g_SdlDrmMasterFd == -1);
|
|
||||||
|
|
||||||
// Drop master on Qt's FD so we can pick it up for SDL.
|
|
||||||
if (drmDropMaster(g_QtDrmMasterFd) < 0) {
|
|
||||||
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
|
||||||
"Failed to drop master on Qt DRM FD: %d",
|
|
||||||
errno);
|
|
||||||
// Hope for the best
|
|
||||||
return fd;
|
|
||||||
}
|
|
||||||
|
|
||||||
// We are not allowed to call drmSetMaster() without CAP_SYS_ADMIN,
|
|
||||||
// but since we just dropped the master, we can become master by
|
|
||||||
// simply creating a new FD. Let's do it.
|
|
||||||
close(fd);
|
|
||||||
fd = ((typeof(open)*)dlsym(RTLD_NEXT, "open"))(pathname, flags);
|
|
||||||
g_SdlDrmMasterFd = fd;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
int open64(const char *pathname, int flags, ...)
|
||||||
|
{
|
||||||
|
va_list va;
|
||||||
|
va_start(va, flags);
|
||||||
|
int fd = openHook(__FUNCTION__, pathname, flags, va);
|
||||||
|
va_end(va);
|
||||||
return fd;
|
return fd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -124,7 +112,7 @@ int open(const char *pathname, int flags)
|
|||||||
int close(int fd)
|
int close(int fd)
|
||||||
{
|
{
|
||||||
// Call the real thing
|
// Call the real thing
|
||||||
int ret = ((typeof(close)*)dlsym(RTLD_NEXT, "close"))(fd);
|
int ret = ((typeof(close)*)dlsym(RTLD_NEXT, __FUNCTION__))(fd);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
// If we just closed the SDL DRM master FD, restore master
|
// If we just closed the SDL DRM master FD, restore master
|
||||||
// to the Qt DRM FD. This works because the Qt DRM master FD
|
// to the Qt DRM FD. This works because the Qt DRM master FD
|
||||||
|
|||||||
@@ -0,0 +1,90 @@
|
|||||||
|
// This file contains the private implementation of the open() hook
|
||||||
|
// which must be in a separate compilation unit due to fcntl.h doing
|
||||||
|
// unwanted redirection of open() to open64().
|
||||||
|
|
||||||
|
#define _GNU_SOURCE
|
||||||
|
|
||||||
|
#include <SDL.h>
|
||||||
|
#include <dlfcn.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <xf86drm.h>
|
||||||
|
#include <xf86drmMode.h>
|
||||||
|
|
||||||
|
// __OPEN_NEEDS_MODE is a glibc-ism, so define it ourselves for other libc
|
||||||
|
#ifndef __OPEN_NEEDS_MODE
|
||||||
|
#ifdef __O_TMPFILE
|
||||||
|
# define __OPEN_NEEDS_MODE(oflag) \
|
||||||
|
(((oflag) & O_CREAT) != 0 || ((oflag) & __O_TMPFILE) == __O_TMPFILE)
|
||||||
|
#else
|
||||||
|
# define __OPEN_NEEDS_MODE(oflag) (((oflag) & O_CREAT) != 0)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if SDL_VERSION_ATLEAST(2, 0, 15)
|
||||||
|
|
||||||
|
extern int g_QtDrmMasterFd;
|
||||||
|
extern struct stat64 g_DrmMasterStat;
|
||||||
|
extern int g_SdlDrmMasterFd;
|
||||||
|
|
||||||
|
int openHook(const char *funcname, const char *pathname, int flags, va_list va)
|
||||||
|
{
|
||||||
|
int fd;
|
||||||
|
mode_t mode;
|
||||||
|
|
||||||
|
// Call the real thing to do the open operation
|
||||||
|
if (__OPEN_NEEDS_MODE(flags)) {
|
||||||
|
mode = va_arg(va, mode_t);
|
||||||
|
fd = ((typeof(open)*)dlsym(RTLD_NEXT, funcname))(pathname, flags, mode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
mode = 0;
|
||||||
|
fd = ((typeof(open)*)dlsym(RTLD_NEXT, funcname))(pathname, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the file was successfully opened and we have a DRM master FD,
|
||||||
|
// check if the FD we just opened is a DRM device.
|
||||||
|
if (fd >= 0 && g_QtDrmMasterFd != -1) {
|
||||||
|
if (strncmp(pathname, "/dev/dri/card", 13) == 0) {
|
||||||
|
// It's a DRM device, but is it _our_ DRM device?
|
||||||
|
struct stat64 fdstat;
|
||||||
|
|
||||||
|
fstat64(fd, &fdstat);
|
||||||
|
if (g_DrmMasterStat.st_dev == fdstat.st_dev &&
|
||||||
|
g_DrmMasterStat.st_ino == fdstat.st_ino) {
|
||||||
|
// It is our device. Time to do the magic!
|
||||||
|
|
||||||
|
// This code assumes SDL only ever opens a single FD
|
||||||
|
// for a given DRM device.
|
||||||
|
SDL_assert(g_SdlDrmMasterFd == -1);
|
||||||
|
|
||||||
|
// Drop master on Qt's FD so we can pick it up for SDL.
|
||||||
|
if (drmDropMaster(g_QtDrmMasterFd) < 0) {
|
||||||
|
SDL_LogError(SDL_LOG_CATEGORY_APPLICATION,
|
||||||
|
"Failed to drop master on Qt DRM FD: %d",
|
||||||
|
errno);
|
||||||
|
// Hope for the best
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
|
||||||
|
// We are not allowed to call drmSetMaster() without CAP_SYS_ADMIN,
|
||||||
|
// but since we just dropped the master, we can become master by
|
||||||
|
// simply creating a new FD. Let's do it.
|
||||||
|
close(fd);
|
||||||
|
if (__OPEN_NEEDS_MODE(flags)) {
|
||||||
|
fd = ((typeof(open)*)dlsym(RTLD_NEXT, funcname))(pathname, flags, mode);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fd = ((typeof(open)*)dlsym(RTLD_NEXT, funcname))(pathname, flags);
|
||||||
|
}
|
||||||
|
g_SdlDrmMasterFd = fd;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return fd;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
@@ -18,5 +18,6 @@
|
|||||||
<file>gui/NavigableMessageDialog.qml</file>
|
<file>gui/NavigableMessageDialog.qml</file>
|
||||||
<file>gui/NavigableDialog.qml</file>
|
<file>gui/NavigableDialog.qml</file>
|
||||||
<file>gui/CenteredGridView.qml</file>
|
<file>gui/CenteredGridView.qml</file>
|
||||||
|
<file>gui/CliPair.qml</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
@@ -37,6 +37,33 @@
|
|||||||
<file>languages/qml_th.qm</file>
|
<file>languages/qml_th.qm</file>
|
||||||
<file>languages/qml_ko.ts</file>
|
<file>languages/qml_ko.ts</file>
|
||||||
<file>languages/qml_ko.qm</file>
|
<file>languages/qml_ko.qm</file>
|
||||||
|
<file>languages/qml_hu.ts</file>
|
||||||
|
<file>languages/qml_hu.qm</file>
|
||||||
|
<file>languages/qml_nl.ts</file>
|
||||||
|
<file>languages/qml_nl.qm</file>
|
||||||
|
<file>languages/qml_sv.ts</file>
|
||||||
|
<file>languages/qml_sv.qm</file>
|
||||||
|
<file>languages/qml_tr.ts</file>
|
||||||
|
<file>languages/qml_tr.qm</file>
|
||||||
|
<file>languages/qml_uk.ts</file>
|
||||||
|
<file>languages/qml_uk.qm</file>
|
||||||
|
<file>languages/qml_zh_Hant.ts</file>
|
||||||
|
<file>languages/qml_zh_Hant.qm</file>
|
||||||
|
<file>languages/qml_el.ts</file>
|
||||||
|
<file>languages/qml_el.qm</file>
|
||||||
|
<file>languages/qml_hi.ts</file>
|
||||||
|
<file>languages/qml_hi.qm</file>
|
||||||
|
<file>languages/qml_it.ts</file>
|
||||||
|
<file>languages/qml_it.qm</file>
|
||||||
|
<file>languages/qml_pt.ts</file>
|
||||||
|
<file>languages/qml_pt.qm</file>
|
||||||
|
<file>languages/qml_pl.ts</file>
|
||||||
|
<file>languages/qml_pl.qm</file>
|
||||||
|
<file>languages/qml_cs.ts</file>
|
||||||
|
<file>languages/qml_cs.qm</file>
|
||||||
|
<!-- Don't include pt_BR until it is more complete -->
|
||||||
|
<!--file>languages/qml_pt_BR.qm</file-->
|
||||||
|
<!--file>languages/qml_pt_BR.ts</file-->
|
||||||
</qresource>
|
</qresource>
|
||||||
<qresource prefix="/data">
|
<qresource prefix="/data">
|
||||||
<file alias="gamecontrollerdb.txt">SDL_GameControllerDB/gamecontrollerdb.txt</file>
|
<file alias="gamecontrollerdb.txt">SDL_GameControllerDB/gamecontrollerdb.txt</file>
|
||||||
@@ -47,5 +74,10 @@
|
|||||||
<file alias="egl_opaque.vert">shaders/egl_opaque.vert</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.frag">shaders/egl_overlay.frag</file>
|
||||||
<file alias="egl_overlay.vert">shaders/egl_overlay.vert</file>
|
<file alias="egl_overlay.vert">shaders/egl_overlay.vert</file>
|
||||||
|
<file alias="d3d11_vertex.fxc">shaders/d3d11_vertex.fxc</file>
|
||||||
|
<file alias="d3d11_overlay_pixel.fxc">shaders/d3d11_overlay_pixel.fxc</file>
|
||||||
|
<file alias="d3d11_genyuv_pixel.fxc">shaders/d3d11_genyuv_pixel.fxc</file>
|
||||||
|
<file alias="d3d11_bt601lim_pixel.fxc">shaders/d3d11_bt601lim_pixel.fxc</file>
|
||||||
|
<file alias="d3d11_bt2020lim_pixel.fxc">shaders/d3d11_bt2020lim_pixel.fxc</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#include "streamingpreferences.h"
|
#include "streamingpreferences.h"
|
||||||
|
#include "utils.h"
|
||||||
|
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
#include <QTranslator>
|
#include <QTranslator>
|
||||||
@@ -41,9 +42,10 @@
|
|||||||
#define SER_REVERSESCROLL "reversescroll"
|
#define SER_REVERSESCROLL "reversescroll"
|
||||||
#define SER_SWAPFACEBUTTONS "swapfacebuttons"
|
#define SER_SWAPFACEBUTTONS "swapfacebuttons"
|
||||||
#define SER_CAPTURESYSKEYS "capturesyskeys"
|
#define SER_CAPTURESYSKEYS "capturesyskeys"
|
||||||
|
#define SER_KEEPAWAKE "keepawake"
|
||||||
#define SER_LANGUAGE "language"
|
#define SER_LANGUAGE "language"
|
||||||
|
|
||||||
#define CURRENT_DEFAULT_VER 1
|
#define CURRENT_DEFAULT_VER 2
|
||||||
|
|
||||||
StreamingPreferences::StreamingPreferences(QObject *parent)
|
StreamingPreferences::StreamingPreferences(QObject *parent)
|
||||||
: QObject(parent),
|
: QObject(parent),
|
||||||
@@ -68,7 +70,13 @@ void StreamingPreferences::reload()
|
|||||||
#ifdef Q_OS_DARWIN
|
#ifdef Q_OS_DARWIN
|
||||||
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN_DESKTOP;
|
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN_DESKTOP;
|
||||||
#else
|
#else
|
||||||
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN;
|
// Wayland doesn't support modesetting, so use fullscreen desktop mode.
|
||||||
|
if (WMUtils::isRunningWayland()) {
|
||||||
|
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN_DESKTOP;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
recommendedFullScreenMode = WindowMode::WM_FULLSCREEN;
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
width = settings.value(SER_WIDTH, 1280).toInt();
|
width = settings.value(SER_WIDTH, 1280).toInt();
|
||||||
@@ -95,6 +103,7 @@ void StreamingPreferences::reload()
|
|||||||
backgroundGamepad = settings.value(SER_BACKGROUNDGAMEPAD, false).toBool();
|
backgroundGamepad = settings.value(SER_BACKGROUNDGAMEPAD, false).toBool();
|
||||||
reverseScrollDirection = settings.value(SER_REVERSESCROLL, false).toBool();
|
reverseScrollDirection = settings.value(SER_REVERSESCROLL, false).toBool();
|
||||||
swapFaceButtons = settings.value(SER_SWAPFACEBUTTONS, false).toBool();
|
swapFaceButtons = settings.value(SER_SWAPFACEBUTTONS, false).toBool();
|
||||||
|
keepAwake = settings.value(SER_KEEPAWAKE, true).toBool();
|
||||||
captureSysKeysMode = static_cast<CaptureSysKeysMode>(settings.value(SER_CAPTURESYSKEYS,
|
captureSysKeysMode = static_cast<CaptureSysKeysMode>(settings.value(SER_CAPTURESYSKEYS,
|
||||||
static_cast<int>(CaptureSysKeysMode::CSK_OFF)).toInt());
|
static_cast<int>(CaptureSysKeysMode::CSK_OFF)).toInt());
|
||||||
audioConfig = static_cast<AudioConfig>(settings.value(SER_AUDIOCFG,
|
audioConfig = static_cast<AudioConfig>(settings.value(SER_AUDIOCFG,
|
||||||
@@ -115,7 +124,7 @@ void StreamingPreferences::reload()
|
|||||||
|
|
||||||
|
|
||||||
// Perform default settings updates as required based on last default version
|
// Perform default settings updates as required based on last default version
|
||||||
if (defaultVer == 0) {
|
if (defaultVer < 1) {
|
||||||
#ifdef Q_OS_DARWIN
|
#ifdef Q_OS_DARWIN
|
||||||
// Update window mode setting on macOS from full-screen (old default) to borderless windowed (new default)
|
// Update window mode setting on macOS from full-screen (old default) to borderless windowed (new default)
|
||||||
if (windowMode == WindowMode::WM_FULLSCREEN) {
|
if (windowMode == WindowMode::WM_FULLSCREEN) {
|
||||||
@@ -123,6 +132,11 @@ void StreamingPreferences::reload()
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
if (defaultVer < 2) {
|
||||||
|
if (windowMode == WindowMode::WM_FULLSCREEN && WMUtils::isRunningWayland()) {
|
||||||
|
windowMode = WindowMode::WM_FULLSCREEN_DESKTOP;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool StreamingPreferences::retranslate()
|
bool StreamingPreferences::retranslate()
|
||||||
@@ -203,6 +217,32 @@ QString StreamingPreferences::getSuffixFromLanguage(StreamingPreferences::Langua
|
|||||||
return "th";
|
return "th";
|
||||||
case LANG_KO:
|
case LANG_KO:
|
||||||
return "ko";
|
return "ko";
|
||||||
|
case LANG_HU:
|
||||||
|
return "hu";
|
||||||
|
case LANG_NL:
|
||||||
|
return "nl";
|
||||||
|
case LANG_SV:
|
||||||
|
return "sv";
|
||||||
|
case LANG_TR:
|
||||||
|
return "tr";
|
||||||
|
case LANG_UK:
|
||||||
|
return "uk";
|
||||||
|
case LANG_ZH_HANT:
|
||||||
|
return "zh_Hant";
|
||||||
|
case LANG_PT:
|
||||||
|
return "pt";
|
||||||
|
case LANG_PT_BR:
|
||||||
|
return "pt_BR";
|
||||||
|
case LANG_EL:
|
||||||
|
return "el";
|
||||||
|
case LANG_IT:
|
||||||
|
return "it";
|
||||||
|
case LANG_HI:
|
||||||
|
return "hi";
|
||||||
|
case LANG_PL:
|
||||||
|
return "pl";
|
||||||
|
case LANG_CS:
|
||||||
|
return "cs";
|
||||||
case LANG_AUTO:
|
case LANG_AUTO:
|
||||||
default:
|
default:
|
||||||
return QLocale::system().name();
|
return QLocale::system().name();
|
||||||
@@ -245,6 +285,7 @@ void StreamingPreferences::save()
|
|||||||
settings.setValue(SER_REVERSESCROLL, reverseScrollDirection);
|
settings.setValue(SER_REVERSESCROLL, reverseScrollDirection);
|
||||||
settings.setValue(SER_SWAPFACEBUTTONS, swapFaceButtons);
|
settings.setValue(SER_SWAPFACEBUTTONS, swapFaceButtons);
|
||||||
settings.setValue(SER_CAPTURESYSKEYS, captureSysKeysMode);
|
settings.setValue(SER_CAPTURESYSKEYS, captureSysKeysMode);
|
||||||
|
settings.setValue(SER_KEEPAWAKE, keepAwake);
|
||||||
}
|
}
|
||||||
|
|
||||||
int StreamingPreferences::getDefaultBitrate(int width, int height, int fps)
|
int StreamingPreferences::getDefaultBitrate(int width, int height, int fps)
|
||||||
|
|||||||
@@ -76,7 +76,20 @@ public:
|
|||||||
LANG_JA,
|
LANG_JA,
|
||||||
LANG_VI,
|
LANG_VI,
|
||||||
LANG_TH,
|
LANG_TH,
|
||||||
LANG_KO
|
LANG_KO,
|
||||||
|
LANG_HU,
|
||||||
|
LANG_NL,
|
||||||
|
LANG_SV,
|
||||||
|
LANG_TR,
|
||||||
|
LANG_UK,
|
||||||
|
LANG_ZH_HANT,
|
||||||
|
LANG_PT,
|
||||||
|
LANG_PT_BR,
|
||||||
|
LANG_EL,
|
||||||
|
LANG_IT,
|
||||||
|
LANG_HI,
|
||||||
|
LANG_PL,
|
||||||
|
LANG_CS,
|
||||||
};
|
};
|
||||||
Q_ENUM(Language);
|
Q_ENUM(Language);
|
||||||
|
|
||||||
@@ -117,6 +130,7 @@ public:
|
|||||||
Q_PROPERTY(bool backgroundGamepad MEMBER backgroundGamepad NOTIFY backgroundGamepadChanged)
|
Q_PROPERTY(bool backgroundGamepad MEMBER backgroundGamepad NOTIFY backgroundGamepadChanged)
|
||||||
Q_PROPERTY(bool reverseScrollDirection MEMBER reverseScrollDirection NOTIFY reverseScrollDirectionChanged)
|
Q_PROPERTY(bool reverseScrollDirection MEMBER reverseScrollDirection NOTIFY reverseScrollDirectionChanged)
|
||||||
Q_PROPERTY(bool swapFaceButtons MEMBER swapFaceButtons NOTIFY swapFaceButtonsChanged)
|
Q_PROPERTY(bool swapFaceButtons MEMBER swapFaceButtons NOTIFY swapFaceButtonsChanged)
|
||||||
|
Q_PROPERTY(bool keepAwake MEMBER keepAwake NOTIFY keepAwakeChanged)
|
||||||
Q_PROPERTY(CaptureSysKeysMode captureSysKeysMode MEMBER captureSysKeysMode NOTIFY captureSysKeysModeChanged)
|
Q_PROPERTY(CaptureSysKeysMode captureSysKeysMode MEMBER captureSysKeysMode NOTIFY captureSysKeysModeChanged)
|
||||||
Q_PROPERTY(Language language MEMBER language NOTIFY languageChanged);
|
Q_PROPERTY(Language language MEMBER language NOTIFY languageChanged);
|
||||||
|
|
||||||
@@ -146,6 +160,7 @@ public:
|
|||||||
bool backgroundGamepad;
|
bool backgroundGamepad;
|
||||||
bool reverseScrollDirection;
|
bool reverseScrollDirection;
|
||||||
bool swapFaceButtons;
|
bool swapFaceButtons;
|
||||||
|
bool keepAwake;
|
||||||
int packetSize;
|
int packetSize;
|
||||||
AudioConfig audioConfig;
|
AudioConfig audioConfig;
|
||||||
VideoCodecConfig videoCodecConfig;
|
VideoCodecConfig videoCodecConfig;
|
||||||
@@ -184,6 +199,7 @@ signals:
|
|||||||
void reverseScrollDirectionChanged();
|
void reverseScrollDirectionChanged();
|
||||||
void swapFaceButtonsChanged();
|
void swapFaceButtonsChanged();
|
||||||
void captureSysKeysModeChanged();
|
void captureSysKeysModeChanged();
|
||||||
|
void keepAwakeChanged();
|
||||||
void languageChanged();
|
void languageChanged();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
fxc /T vs_4_0_level_9_3 /Fo d3d11_vertex.fxc d3d11_vertex.hlsl
|
||||||
|
|
||||||
|
fxc /T ps_4_0_level_9_3 /Fo d3d11_overlay_pixel.fxc d3d11_overlay_pixel.hlsl
|
||||||
|
fxc /T ps_4_0_level_9_3 /Fo d3d11_genyuv_pixel.fxc d3d11_genyuv_pixel.hlsl
|
||||||
|
fxc /T ps_4_0_level_9_3 /Fo d3d11_bt601lim_pixel.fxc d3d11_bt601lim_pixel.hlsl
|
||||||
|
fxc /T ps_4_0_level_9_3 /Fo d3d11_bt2020lim_pixel.fxc d3d11_bt2020lim_pixel.hlsl
|
||||||
Binary file not shown.
@@ -0,0 +1,15 @@
|
|||||||
|
#include "d3d11_video_pixel_start.hlsli"
|
||||||
|
|
||||||
|
static const min16float3x3 cscMatrix =
|
||||||
|
{
|
||||||
|
1.1644, 1.1644, 1.1644,
|
||||||
|
0.0, -0.1874, 2.1418,
|
||||||
|
1.6781, -0.6505, 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const min16float3 offsets =
|
||||||
|
{
|
||||||
|
16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "d3d11_video_pixel_end.hlsli"
|
||||||
Binary file not shown.
@@ -0,0 +1,15 @@
|
|||||||
|
#include "d3d11_video_pixel_start.hlsli"
|
||||||
|
|
||||||
|
static const min16float3x3 cscMatrix =
|
||||||
|
{
|
||||||
|
1.1644, 1.1644, 1.1644,
|
||||||
|
0.0, -0.3917, 2.0172,
|
||||||
|
1.5960, -0.8129, 0.0,
|
||||||
|
};
|
||||||
|
|
||||||
|
static const min16float3 offsets =
|
||||||
|
{
|
||||||
|
16.0 / 255.0, 128.0 / 255.0, 128.0 / 255.0
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "d3d11_video_pixel_end.hlsli"
|
||||||
Binary file not shown.
@@ -0,0 +1,9 @@
|
|||||||
|
#include "d3d11_video_pixel_start.hlsli"
|
||||||
|
|
||||||
|
cbuffer CSC_CONST_BUF : register(b0)
|
||||||
|
{
|
||||||
|
min16float3x3 cscMatrix;
|
||||||
|
min16float3 offsets;
|
||||||
|
};
|
||||||
|
|
||||||
|
#include "d3d11_video_pixel_end.hlsli"
|
||||||
Binary file not shown.
@@ -0,0 +1,13 @@
|
|||||||
|
Texture2D<min16float4> theTexture : register(t0);
|
||||||
|
SamplerState theSampler : register(s0);
|
||||||
|
|
||||||
|
struct ShaderInput
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
float2 tex : TEXCOORD0;
|
||||||
|
};
|
||||||
|
|
||||||
|
min16float4 main(ShaderInput input) : SV_TARGET
|
||||||
|
{
|
||||||
|
return theTexture.Sample(theSampler, input.tex);
|
||||||
|
}
|
||||||
Binary file not shown.
@@ -0,0 +1,19 @@
|
|||||||
|
struct ShaderInput
|
||||||
|
{
|
||||||
|
float2 pos : POSITION;
|
||||||
|
float2 tex : TEXCOORD0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct ShaderOutput
|
||||||
|
{
|
||||||
|
float4 pos : SV_POSITION;
|
||||||
|
float2 tex : TEXCOORD0;
|
||||||
|
};
|
||||||
|
|
||||||
|
ShaderOutput main(ShaderInput input)
|
||||||
|
{
|
||||||
|
ShaderOutput output;
|
||||||
|
output.pos = float4(input.pos, 0.0, 1.0);
|
||||||
|
output.tex = input.tex;
|
||||||
|
return output;
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
min16float4 main(ShaderInput input) : SV_TARGET
|
||||||
|
{
|
||||||
|
min16float3 yuv = min16float3(luminancePlane.Sample(theSampler, input.tex),
|
||||||
|
chrominancePlane.Sample(theSampler, input.tex));
|
||||||
|
|
||||||
|
// Subtract the YUV offset for limited vs full range
|
||||||
|
yuv -= offsets;
|
||||||
|
|
||||||
|
// Multiply by the conversion matrix for this colorspace
|
||||||
|
yuv = mul(yuv, cscMatrix);
|
||||||
|
|
||||||
|
return min16float4(yuv, 1.0);
|
||||||
|
}
|
||||||
Loaded 100 of 157 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user