Compare commits
257 commits
Author | SHA1 | Date | |
---|---|---|---|
|
cc971d1c4e | ||
|
d46ecf6698 | ||
|
0db5786ce2 | ||
|
9b40391806 | ||
|
485df7659d | ||
|
0d62a6a599 | ||
|
3f72a3e16f | ||
|
2f8cf79c69 | ||
|
f3738d95d0 | ||
|
442fb2f923 | ||
|
61ce91350b | ||
|
feb4ac828d | ||
|
920b8ac36d | ||
|
c283152667 | ||
|
9ddc684bac | ||
|
5c8864878a | ||
|
47ae19ff6e | ||
|
9320fdf6fc | ||
|
6344e02458 | ||
|
bd1903656f | ||
|
1b35fbd15b | ||
|
722a1a204a | ||
|
3b20d34062 | ||
|
0c92ad070a | ||
|
c1497d31a5 | ||
|
a65f173a20 | ||
|
f7c1f6e9e4 | ||
|
9e7edaec23 | ||
|
d5f4632133 | ||
|
a43655e29f | ||
|
380845114d | ||
|
4e35897fb9 | ||
|
6e1320f1ce | ||
|
917f74fece | ||
|
7157844bad | ||
|
e11debd9c3 | ||
|
f2e6b36119 | ||
|
8867ea2b2f | ||
|
194d332fc1 | ||
|
fdaa980f57 | ||
|
0ce6ca518b | ||
|
a6fd46fbb7 | ||
|
91ee094e60 | ||
|
4dd86ac4eb | ||
|
2188e6bedf | ||
|
846908da2d | ||
|
9ac9d3ea40 | ||
|
597eac1be3 | ||
|
f276b7dd85 | ||
|
d90be16d52 | ||
|
0f040850ba | ||
|
64deb252fd | ||
|
e3fbf1c438 | ||
|
b26fa14f4a | ||
|
b75b544496 | ||
|
979dc2a1c1 | ||
|
54ca9ae320 | ||
|
447f84b98d | ||
|
ddba3b426b | ||
|
28fa04cea3 | ||
|
2093642ed8 | ||
|
140cb016f6 | ||
|
09ff11fb12 | ||
|
84e23ca517 | ||
|
83536678b1 | ||
|
cd2464fa00 | ||
|
180352a297 | ||
|
757b0b652b | ||
|
92586714e2 | ||
|
5e3bcbfa61 | ||
|
389793ce0c | ||
|
db40fcaed9 | ||
|
3389e20ebf | ||
|
dec3dde534 | ||
|
f01fae0e31 | ||
|
375f8530ce | ||
|
755da33df9 | ||
|
b10f466bc5 | ||
|
024a044f92 | ||
|
b4aa5a9384 | ||
|
3cd9b9b8c2 | ||
|
890c5b2dc8 | ||
|
1c4356a33b | ||
|
ce9a93dec5 | ||
|
de4c5587a5 | ||
|
fb408cfc1a | ||
|
320ec6fdc4 | ||
|
ce2d253b31 | ||
|
4e5696f6d3 | ||
|
c5bf39ea99 | ||
|
8ac6ce8741 | ||
|
746aecb36e | ||
|
ea05e7ddcf | ||
|
2fb26e407e | ||
|
99441b6dd7 | ||
|
00cedc78fa | ||
|
cca5680533 | ||
|
aafbb7cd49 | ||
|
ea9c6c32cd | ||
|
961332abec | ||
|
74ef891ae6 | ||
|
490bfb8813 | ||
|
6ac6fce9b4 | ||
|
32822ab2bc | ||
|
3194c5c10b | ||
|
e87ac27e84 | ||
|
d0d4dfa33b | ||
|
bba1a1ab48 | ||
|
9a96ec728f | ||
|
b0f3656e1a | ||
|
5f2c9efc9b | ||
|
5cd1e638cd | ||
|
9eb167b9ab | ||
|
b27076dcd9 | ||
|
ccf32a9125 | ||
|
95538a76a2 | ||
|
05768061e6 | ||
|
1f45e77145 | ||
|
fab2d4c91f | ||
|
be280435c7 | ||
|
63d598bb20 | ||
|
7e8d8e815a | ||
|
3b68b7e97a | ||
|
04da687e6b | ||
|
4b6b23f93b | ||
|
bf17eac0a5 | ||
|
39a597237a | ||
|
bbe0c8f477 | ||
|
fc18c854a5 | ||
|
297d2072e6 | ||
|
a599858ece | ||
|
20d84cf0b4 | ||
|
5d85da5edd | ||
|
c0098e308c | ||
|
656b4005ca | ||
|
23a6643dcf | ||
|
16f2400c66 | ||
|
ce2ae362f6 | ||
|
8f92486f23 | ||
|
c734ff53d2 | ||
|
191facb122 | ||
|
53bfd071c8 | ||
|
065f4bad5c | ||
|
101b783ae3 | ||
|
56c4b1de9e | ||
|
1cef9ab604 | ||
|
07be57302c | ||
|
50cb768941 | ||
|
bc2288cb83 | ||
|
b6acfe51b4 | ||
|
e1c1cccf90 | ||
|
32aa5fea39 | ||
|
08b84b0d61 | ||
|
7b70a2617b | ||
|
aecf908249 | ||
|
4769567c96 | ||
|
23baec66b7 | ||
|
d553077da5 | ||
|
b957b0b736 | ||
|
1208d609b5 | ||
|
e2d8955076 | ||
|
a7d0362a55 | ||
|
fa4eb58d8a | ||
|
2f6913fa66 | ||
|
3b53f9b5d8 | ||
|
bb63fcd61f | ||
|
1954ec3d26 | ||
|
1969b8764d | ||
|
927c8f4fa7 | ||
|
274354138a | ||
|
96d5bdaaab | ||
|
83339c7044 | ||
|
94e5860d5d | ||
|
1da1487915 | ||
|
2cf2ccb71d | ||
|
0ef5e53851 | ||
|
9a3529db69 | ||
|
acaf2f7c85 | ||
|
bdafb05df9 | ||
|
4c32d45d37 | ||
|
0936ecf53f | ||
|
c17e4c83fc | ||
|
4538aa094e | ||
|
96ca112ebb | ||
|
88476a73c8 | ||
|
5fbc6a137b | ||
|
d62b9081d7 | ||
|
1b364c80dd | ||
|
f33f788936 | ||
|
735762a3d1 | ||
|
a83c5e82c5 | ||
|
d8ccfb7443 | ||
|
abc67c87b8 | ||
|
b41697e4ac | ||
|
8dc17461fb | ||
|
6e94e6ded9 | ||
|
0a23e825e0 | ||
|
41b49a1a78 | ||
|
89bac12565 | ||
|
b657554ace | ||
|
975c084f1e | ||
|
d3293a22dd | ||
|
97ec61b463 | ||
|
f0c180fcc0 | ||
|
95cf06000f | ||
|
26ca3f10c3 | ||
|
054a03129a | ||
|
07b9569184 | ||
|
d337d13996 | ||
|
a24e56ea71 | ||
|
dc2f836207 | ||
|
170e237f84 | ||
|
c77820391e | ||
|
2789c144c6 | ||
|
b45ce02b7a | ||
|
c958326c41 | ||
|
6b52749712 | ||
|
da1e9ca93a | ||
|
8b87abdd9e | ||
|
078936675f | ||
|
f467845cc8 | ||
|
a9b3d25d19 | ||
|
b24cc351e5 | ||
|
cb20fc00ea | ||
|
1f10a51741 | ||
|
8749c883fa | ||
|
5483e1267a | ||
|
29d16604f5 | ||
|
8dd8d2b3fb | ||
|
09f613d295 | ||
|
630f826578 | ||
|
1094582c88 | ||
|
2727147df6 | ||
|
5c0b58594c | ||
|
bf8c73a588 | ||
|
ca84d82a77 | ||
|
64759ded7b | ||
|
d64fdcc8b8 | ||
|
1d1d5f353c | ||
|
183936074f | ||
|
ffab664eaf | ||
|
359c80da4c | ||
|
af6ed2ed43 | ||
|
1b913e708f | ||
|
e6a5c3c88b | ||
|
d4afc897bf | ||
|
f2e61b31a1 | ||
|
cbd5916374 | ||
|
df84455cbd | ||
|
db9f99ff5c | ||
|
8420fff71d | ||
|
4e9bae728c | ||
|
109c26dba8 | ||
|
e9604e3349 | ||
|
d359359874 | ||
|
b069a8586c | ||
|
e8a3a86855 |
26
.gitignore
vendored
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Paths
|
||||
Games/
|
||||
Nwjs/
|
||||
Emu/
|
||||
|
||||
# Paths generated by fpPS4
|
||||
shader_dump/
|
||||
savedata/
|
||||
|
||||
# Launcher settings
|
||||
Settings.json
|
||||
|
||||
# Misc. Files
|
||||
*.tar.gz
|
||||
*.info
|
||||
*.nexe
|
||||
*.dump
|
||||
*.sprx
|
||||
*.exe
|
||||
*.dll
|
||||
*.pak
|
||||
*.zip
|
||||
*.pkg
|
||||
*.log
|
||||
*.dat
|
||||
*.sh
|
|
@ -1,19 +1,22 @@
|
|||
/*
|
||||
******************************************************************************
|
||||
fpPS4 Temmie's Launcher
|
||||
Styles.css
|
||||
styles.css
|
||||
|
||||
Main application stylesheet
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
html, body {
|
||||
color: #fff;
|
||||
overflow: hidden;
|
||||
user-select: none;
|
||||
touch-action: none;
|
||||
font-family: monospace;
|
||||
scroll-behavior: smooth;
|
||||
background-color: #0f1e3e;
|
||||
text-shadow: 2px 2px 4px #000;
|
||||
background-image: linear-gradient(146deg, #090f1b, #162a50);
|
||||
}
|
||||
code {
|
||||
padding: 6px;
|
||||
|
@ -28,11 +31,19 @@ select, input[type='button'], input[type='checkbox'] {
|
|||
}
|
||||
input[type='range'] {
|
||||
outline: none;
|
||||
margin-left: 6px;
|
||||
cursor: col-resize;
|
||||
}
|
||||
input[disabled='disabled'], input[disabled] {
|
||||
cursor: no-drop;
|
||||
}
|
||||
input[type='checkbox'] {
|
||||
margin-right: 8px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
input[type='color'] {
|
||||
cursor: pointer;
|
||||
}
|
||||
img {
|
||||
-webkit-user-drag: none;
|
||||
}
|
||||
|
@ -81,31 +92,33 @@ img {
|
|||
Divs
|
||||
*/
|
||||
.DIV_LIST {
|
||||
top: 38px;
|
||||
top: 0;
|
||||
left: 0px;
|
||||
z-index: 20;
|
||||
width: 100%;
|
||||
transition: 0.2s;
|
||||
overflow: hidden;
|
||||
transition: 0.2s;
|
||||
position: absolute;
|
||||
background-color: #162a50;
|
||||
height: calc(100% - 202px);
|
||||
background-image: linear-gradient(146deg, #090f1b, #162a50);
|
||||
background-color: #0000;
|
||||
height: calc(100% - 164px);
|
||||
transition-timing-function: cubic-bezier(0,1,0,1);
|
||||
}
|
||||
.DIV_LOG {
|
||||
left: 0px;
|
||||
bottom: 0px;
|
||||
width: 100%;
|
||||
z-index: 20;
|
||||
height: 164px;
|
||||
position: absolute;
|
||||
background-size: auto 50%;
|
||||
background-color: #010114c7;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-image: url('../img/logo.png');
|
||||
}
|
||||
.DIV_ACTIONS {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
z-index: 30;
|
||||
width: 100%;
|
||||
height: 22px;
|
||||
padding: 8px;
|
||||
|
@ -115,31 +128,37 @@ img {
|
|||
align-items: center;
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
background-image: linear-gradient(45deg, #28467f, #1c325f);
|
||||
background-color: #0000;
|
||||
backdrop-filter: blur(10px);
|
||||
background-image: linear-gradient(45deg, #28467fc0, #1c325fc0);
|
||||
}
|
||||
.DIV_OPTIONS {
|
||||
top: 38px;
|
||||
right: 0px;
|
||||
z-index: 20;
|
||||
padding: 6px;
|
||||
width: 268px;
|
||||
width: 288px;
|
||||
display: none;
|
||||
transition: 0.1s;
|
||||
position: absolute;
|
||||
background-color: #0000;
|
||||
height: calc(100% - 150px);
|
||||
background-image: linear-gradient(0deg, #162a50, #2a4a86);
|
||||
backdrop-filter: blur(10px);
|
||||
transition-timing-function: cubic-bezier(0,1,0,1);
|
||||
background-image: linear-gradient(0deg, #162a50b0, #2a4a86b0);
|
||||
}
|
||||
.DIV_GAME_OPTIONS {
|
||||
width: 268px;
|
||||
bottom: 60px;
|
||||
font-size: 14px;
|
||||
width: 288px;
|
||||
bottom: 68px;
|
||||
overflow: auto;
|
||||
font-size: 14px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
height: calc(100% - 120px);
|
||||
height: calc(100% - 128px);
|
||||
}
|
||||
.DIV_HACK_LIST {
|
||||
text-align: left;
|
||||
margin: 10px 0px 10px 0px;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
.DIV_TITLE {
|
||||
z-index: 10;
|
||||
|
@ -167,6 +186,7 @@ img {
|
|||
text-align: center;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
align-content: stretch;
|
||||
justify-content: center;
|
||||
}
|
||||
.DIV_GAMELIST_BG {
|
||||
|
@ -196,7 +216,6 @@ img {
|
|||
align-items: center;
|
||||
align-content: center;
|
||||
width: calc(100% - 12px);
|
||||
box-shadow: 0px 0px 4px #000;
|
||||
backdrop-filter: blur(4px) invert(0.1);
|
||||
background-image: linear-gradient(90deg, #3a4b6b82, #0000);
|
||||
}
|
||||
|
@ -208,7 +227,15 @@ img {
|
|||
backdrop-filter: sepia(0.5) blur(6px);
|
||||
background-image: linear-gradient(180deg, #97a7ff85, #6464a578);
|
||||
}
|
||||
.GAME_ENTRY_FIRST_INDEX {
|
||||
margin-top: 44px;
|
||||
}
|
||||
.GAME_ENTRY_COMPACT {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
align-content: center;
|
||||
max-height: 24px !important;
|
||||
padding-left: 10px !important;
|
||||
width: calc(100% - 22px) !important;
|
||||
|
@ -218,14 +245,15 @@ img {
|
|||
padding: 0px;
|
||||
display: table;
|
||||
box-shadow: none;
|
||||
min-width: 50px;
|
||||
min-height: 50px;
|
||||
height: max-content;
|
||||
border-radius: 8px;
|
||||
min-width: 92.93px;
|
||||
min-height: 92.93px;
|
||||
height: max-content;
|
||||
max-width: max-content;
|
||||
max-height: max-content;
|
||||
background-color: #0000;
|
||||
text-align: -webkit-right;
|
||||
backdrop-filter: blur(10px);
|
||||
background-color: #192e546e;
|
||||
}
|
||||
.GAME_ENTRY_GRID:hover {
|
||||
animation-duration: 4s;
|
||||
|
@ -261,9 +289,23 @@ img {
|
|||
cursor: pointer;
|
||||
width: calc(100% - 88px);
|
||||
}
|
||||
.DIV_RUN_BTN {
|
||||
bottom: 4px;
|
||||
.GAME_DETAILS_COMPACT {
|
||||
width: calc(100% - 10px);
|
||||
}
|
||||
.GAME_DETAILS_GRID {
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
position: absolute;
|
||||
background-color: #000a;
|
||||
padding: 2px 6px 2px 6px;
|
||||
backdrop-filter: blur(4px);
|
||||
text-shadow: 0px 0px 4px #000;
|
||||
border-radius: 6px 0px 0px 0px;
|
||||
}
|
||||
.DIV_RUN_BTN {
|
||||
bottom: 8px;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
width: calc(100% - 12px);
|
||||
}
|
||||
.DIV_GAME_DETAILS {
|
||||
|
@ -287,15 +329,18 @@ img {
|
|||
margin-left: 24px;
|
||||
}
|
||||
.DIV_SETTINGS {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
top: 10%;
|
||||
left: 5%;
|
||||
width: 90%;
|
||||
z-index: 10;
|
||||
height: 100%;
|
||||
display: none;
|
||||
height: 80%;
|
||||
display: block;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
text-align: center;
|
||||
background-image: linear-gradient(180deg, #2a3a56, #0d1932);
|
||||
border-radius: 10px;
|
||||
box-shadow: 0px 0px 30px #000a;
|
||||
background-image: linear-gradient(180deg, #2f405f, #131f38);
|
||||
}
|
||||
.DIV_SETTINGS_BG {
|
||||
top: 0px;
|
||||
|
@ -310,6 +355,17 @@ img {
|
|||
box-shadow: 0px 0px 10px #0002 inset;
|
||||
background-image: url('../img/logo.png');
|
||||
}
|
||||
.DIV_SETTINGS_HOLDER {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 100;
|
||||
display: none;
|
||||
position: absolute;
|
||||
background-color: #0004;
|
||||
backdrop-filter: blur(4px) grayscale(0.4);
|
||||
}
|
||||
.DIV_SETTINGS_LIST {
|
||||
z-index: 10;
|
||||
padding: 8px;
|
||||
|
@ -318,7 +374,7 @@ img {
|
|||
text-align: left;
|
||||
margin-left: 8px;
|
||||
margin-bottom: 8px;
|
||||
border-radius: 6px;
|
||||
border-radius: 4px;
|
||||
font-family: sans-serif;
|
||||
background-color: #111d;
|
||||
width: calc(100% - 32px);
|
||||
|
@ -334,14 +390,14 @@ img {
|
|||
}
|
||||
.DIV_settingsEntryFlex {
|
||||
display: flex;
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
align-content: center;
|
||||
}
|
||||
.DIV_settingsH2 {
|
||||
font-size: 20px;
|
||||
font-style: italic;
|
||||
font-family: monospace;
|
||||
font-weight: 600;
|
||||
font-family: system-ui;
|
||||
margin: 0px 0px 8px 2px;
|
||||
}
|
||||
.DIV_settingsSave {
|
||||
|
@ -355,27 +411,72 @@ img {
|
|||
flex-wrap: wrap;
|
||||
text-align: center;
|
||||
align-items: center;
|
||||
margin-bottom: 10px;
|
||||
margin-bottom: 4px;
|
||||
align-content: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.DIV_selectedGameStatus {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
width: 114px;
|
||||
cursor: help;
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
font-size: small;
|
||||
max-width: 114px;
|
||||
max-height: 42px;
|
||||
margin-left: 4px;
|
||||
border-radius: 100%;
|
||||
flex-wrap: nowrap;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
border-radius: 10px;
|
||||
align-content: center;
|
||||
background-color: #000;
|
||||
justify-content: center;
|
||||
padding: 4px 0px 4px 0px;
|
||||
transition-duration: 0.4s;
|
||||
text-shadow: 1px 1px 2px #000;
|
||||
box-shadow: 0px 0px 0px #0000 inset;
|
||||
}
|
||||
.DIV_ICON_STATUS_OK {
|
||||
background-image: linear-gradient(180deg, #0f0, #080);
|
||||
background-image: linear-gradient(180deg, #0f0, #0b0);
|
||||
}
|
||||
.DIV_ICON_STATUS_WARN {
|
||||
border-radius: 2px;
|
||||
background-image: linear-gradient(180deg, #fbe800, #9f8d0c);
|
||||
}
|
||||
.DIV_ICON_STATUS_HB {
|
||||
border-radius: 3px 8px 3px 8px;
|
||||
background-image: linear-gradient(180deg, #63fdf6, #28b1ab);
|
||||
}
|
||||
|
||||
/*
|
||||
Game compat status
|
||||
*/
|
||||
.DIV_COMPAT_STATUS_UNKNOWN {
|
||||
border-radius: 0px;
|
||||
background-image: linear-gradient(180deg, #aaa, #666);
|
||||
}
|
||||
.DIV_COMPAT_STATUS_BOOTS {
|
||||
border-radius: 10px 4px 10px 4px;
|
||||
background-image: linear-gradient(180deg, #f00, #a00);
|
||||
}
|
||||
.DIV_COMPAT_STATUS_MENUS {
|
||||
border-radius: 4px;
|
||||
background-image: linear-gradient(180deg, #45a6ff, #2157a5);
|
||||
}
|
||||
.DIV_COMPAT_STATUS_INGAME {
|
||||
border-radius: 8px 8px 4px 4px;
|
||||
background-image: linear-gradient(180deg, #fbe800, #9f8d0c);
|
||||
}
|
||||
.DIV_COMPAT_STATUS_NOTHING {
|
||||
border-radius: 4px;
|
||||
box-shadow: 0px 0px 10px #000 inset;
|
||||
background-image: linear-gradient(180deg, #000, #282828);
|
||||
}
|
||||
.DIV_COMPAT_STATUS_PLAYABLE {
|
||||
border-radius: 10px;
|
||||
background-image: linear-gradient(180deg, #0f0, #0b0);
|
||||
}
|
||||
|
||||
.DIV_noGameFound {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
|
@ -388,6 +489,7 @@ img {
|
|||
font-style: italic;
|
||||
align-items: center;
|
||||
align-content: center;
|
||||
font-family: system-ui;
|
||||
justify-content: center;
|
||||
text-shadow: 0px 0px 10px #f00;
|
||||
background-image: linear-gradient(45deg, #f002, #0000);
|
||||
|
@ -399,6 +501,64 @@ img {
|
|||
text-align: left;
|
||||
padding: 0px 6px 0px 6px;
|
||||
}
|
||||
.DIV_launcherOptionsTitle {
|
||||
font-size: 16px;
|
||||
text-align: center;
|
||||
margin-bottom: 2px;
|
||||
font-family: system-ui;
|
||||
}
|
||||
.DIV_FPPS4_UPDATER {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: 110;
|
||||
cursor: wait;
|
||||
display: none;
|
||||
transition: 0.4s;
|
||||
flex-wrap: nowrap;
|
||||
position: absolute;
|
||||
align-items: center;
|
||||
flex-direction: row;
|
||||
align-content: center;
|
||||
font-family: system-ui;
|
||||
justify-content: center;
|
||||
backdrop-filter: blur(4px);
|
||||
background-color: #03033144;
|
||||
}
|
||||
.DIV_PROGRESSBAR {
|
||||
width: 72%;
|
||||
height: 10px;
|
||||
cursor: wait;
|
||||
overflow: hidden;
|
||||
margin-top: 44px;
|
||||
border-width: 1px;
|
||||
position: absolute;
|
||||
border-style: solid;
|
||||
background-color: #c5c5c5ad;
|
||||
}
|
||||
.DIV_PROGRESSBAR_INTERNAL {
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
width: 0%;
|
||||
height: 100%;
|
||||
transition: 0.4s;
|
||||
position: absolute;
|
||||
background-image: linear-gradient(90deg, #ccc, #fff);
|
||||
}
|
||||
.DIV_DESIGN_LINES {
|
||||
left: 0px;
|
||||
width: 100%;
|
||||
height: 1px;
|
||||
position: absolute;
|
||||
background-color: #fffb;
|
||||
}
|
||||
.LINE_TOP {
|
||||
top: 12%;
|
||||
}
|
||||
.LINE_BOTTOM {
|
||||
bottom: 12%;
|
||||
}
|
||||
|
||||
/*
|
||||
Images
|
||||
|
@ -409,18 +569,17 @@ img {
|
|||
cursor: pointer;
|
||||
border-radius: 6px;
|
||||
margin: 6px 10px 6px 6px;
|
||||
box-shadow: 0px 0px 10px #0006;
|
||||
}
|
||||
.IMG_APP_ICON {
|
||||
width: 256px;
|
||||
border-radius: 6px;
|
||||
box-shadow: 0px 0px 10px #000;
|
||||
}
|
||||
.IMG_GRID {
|
||||
width: 116px;
|
||||
height: auto;
|
||||
padding: 0px;
|
||||
max-width: 512px;
|
||||
min-width: 92.93px;
|
||||
border-radius: 0px;
|
||||
margin: 0px 0px -3px 0px;
|
||||
}
|
||||
|
@ -435,11 +594,46 @@ img {
|
|||
margin: 2px 0px 2px 0px;
|
||||
}
|
||||
.BTN_actions {
|
||||
height: 28px;
|
||||
max-height: 28px;
|
||||
margin-left: 2px;
|
||||
margin-right: 2px;
|
||||
}
|
||||
.BTN_displayMode {
|
||||
box-shadow: 0px 0px 4px #000 inset;
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
border: initial;
|
||||
background-size: 68%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-color: #0000;
|
||||
}
|
||||
.BTN_displayMode:disabled {
|
||||
filter: invert(1);
|
||||
box-shadow: none;
|
||||
background-color: #000;
|
||||
}
|
||||
.BTN_displayMode_normal {
|
||||
background-image: url('../img/svg/list-filled.svg');
|
||||
}
|
||||
.BTN_displayMode_compact {
|
||||
background-image: url('../img/svg/view-list.svg');
|
||||
}
|
||||
.BTN_displayMode_grid {
|
||||
background-image: url('../img/svg/app-menu.svg');
|
||||
}
|
||||
.BTN_displayMode_holder {
|
||||
width: auto;
|
||||
height: 32px;
|
||||
display: flex;
|
||||
overflow: hidden;
|
||||
border-radius: 4px;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
.INPUT_gameListSearch {
|
||||
width: 196px;
|
||||
width: 195px;
|
||||
margin: -8px;
|
||||
border: none;
|
||||
outline: none;
|
||||
|
@ -459,35 +653,51 @@ img {
|
|||
resize: none;
|
||||
border: none;
|
||||
cursor: text;
|
||||
padding: 6px;
|
||||
outline: none;
|
||||
transition: 0.16s;
|
||||
width: calc(100% - 4px);
|
||||
height: calc(100% - 4px);
|
||||
backdrop-filter: blur(1.4px);
|
||||
background-color: #0000;
|
||||
width: calc(100% - 12px);
|
||||
height: calc(100% - 12px);
|
||||
backdrop-filter: blur(10px);
|
||||
background-repeat: no-repeat;
|
||||
text-shadow: 2px 2px 2px #000;
|
||||
background-image: linear-gradient(180deg, #000e, #090f1b);
|
||||
box-shadow: 0px 0px 6px #000 inset;
|
||||
}
|
||||
.BTN_RUN {
|
||||
left: 8px;
|
||||
width: 100%;
|
||||
bottom: 18px;
|
||||
color: #000;
|
||||
height: 50px;
|
||||
border: none;
|
||||
font-size: 18px;
|
||||
margin-top: 2px;
|
||||
border-radius: 6px;
|
||||
width: calc(100% - 6px);
|
||||
background-image: linear-gradient(180deg, #fff, #ccc);
|
||||
}
|
||||
.BTN_RUN:active {
|
||||
color: #888;
|
||||
box-shadow: 0px 0px 6px #000 inset;
|
||||
background-image: linear-gradient(0deg, #fff, #ccc);
|
||||
}
|
||||
.BTN_STOP {
|
||||
max-height: 28px;
|
||||
margin: 0px 4px 0px 4px;
|
||||
padding: 1px 70px 1px 70px;
|
||||
padding: 5px 30px 5px 30px;
|
||||
}
|
||||
.BTN_SAVE {
|
||||
border: none;
|
||||
font-size: 18px;
|
||||
min-width: 300px;
|
||||
min-height: 60px;
|
||||
border-radius: 6px;
|
||||
background-image: linear-gradient(180deg, #fff, #ccc);
|
||||
}
|
||||
.BTN_SAVE:active {
|
||||
color: #888;
|
||||
box-shadow: 0px 0px 6px #000 inset;
|
||||
background-image: linear-gradient(0deg, #fff, #ccc);
|
||||
}
|
||||
.BTN_selectPath {
|
||||
float: right;
|
||||
min-width: 100px;
|
||||
min-width: 120px;
|
||||
font-style: italic;
|
||||
border-radius: 4px;
|
||||
padding: 4px 14px 4px 14px;
|
||||
|
@ -498,11 +708,23 @@ img {
|
|||
}
|
||||
.SELECT_settings {
|
||||
margin-left: 4px;
|
||||
margin-bottom: 4px;
|
||||
font-style: italic;
|
||||
border-radius: 4px;
|
||||
padding: 4px 10px 4px 10px;
|
||||
background-image: linear-gradient(180deg, #fff, #bbb);
|
||||
}
|
||||
.SETTINGS_TEXT {
|
||||
color: #0f0;
|
||||
border: none;
|
||||
outline: none;
|
||||
min-width: 160px;
|
||||
margin-left: 4px;
|
||||
border-radius: 4px;
|
||||
font-family: monospace;
|
||||
background-color: #000;
|
||||
padding: 6px 0px 6px 6px;
|
||||
}
|
||||
|
||||
/*
|
||||
Labels
|
||||
|
@ -521,7 +743,7 @@ img {
|
|||
}
|
||||
.LABEL_checkbox {
|
||||
cursor: pointer;
|
||||
font-size: 16px;
|
||||
font-size: 14px;
|
||||
font-style: italic;
|
||||
}
|
||||
.LABEL_emuColor {
|
||||
|
@ -536,13 +758,25 @@ img {
|
|||
cursor: pointer;
|
||||
}
|
||||
.LABEL_settingsPath {
|
||||
left: 170px;
|
||||
cursor: text;
|
||||
position: sticky;
|
||||
font-style: initial;
|
||||
font-family: monospace;
|
||||
user-select: all !important;
|
||||
}
|
||||
.LABEL_settingsExperimental {
|
||||
padding: 6px;
|
||||
cursor: pointer;
|
||||
font-family: monospace;
|
||||
background-color: #000;
|
||||
text-shadow: 0px 0px 10px #f00;
|
||||
}
|
||||
.LABEL_FLEX_MARGIN {
|
||||
margin: 4px;
|
||||
}
|
||||
.LABEL_monospace {
|
||||
font-family: monospace;
|
||||
}
|
||||
|
||||
/*
|
||||
Animations
|
||||
|
@ -593,6 +827,9 @@ img {
|
|||
/*
|
||||
Misc
|
||||
*/
|
||||
.float-right {
|
||||
float: right;
|
||||
}
|
||||
.align-center {
|
||||
text-align: center;
|
||||
}
|
||||
|
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 3.8 MiB |
BIN
App/img/banner.jpg
Normal file
After Width: | Height: | Size: 355 KiB |
BIN
App/img/logo.ico
Normal file
After Width: | Height: | Size: 136 KiB |
1
App/img/svg/app-menu.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --><svg width="800px" height="800px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><title>app-menu</title><desc>Created with sketchtool.</desc><g id="web-app" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd"><g id="app-menu" fill="#fff"><path d="M16,16 L20,16 L20,20 L16,20 L16,16 Z M10,16 L14,16 L14,20 L10,20 L10,16 Z M4,16 L8,16 L8,20 L4,20 L4,16 Z M16,10 L20,10 L20,14 L16,14 L16,10 Z M10,10 L14,10 L14,14 L10,14 L10,10 Z M4,10 L8,10 L8,14 L4,14 L4,10 Z M16,4 L20,4 L20,8 L16,8 L16,4 Z M10,4 L14,4 L14,8 L10,8 L10,4 Z M4,4 L8,4 L8,8 L4,8 L4,4 Z" id="Shape"></path></g></g></svg>
|
After Width: | Height: | Size: 777 B |
1
App/img/svg/list-filled.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --><svg fill="#fff" width="800px" height="800px" viewBox="0 0 32 32" version="1.1" xmlns="http://www.w3.org/2000/svg"><title>list-filled</title><path d="M30 15.25h-17c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75v0h17c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75v0zM13 5.75h17c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75v0h-17c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75v0zM30 26.25h-17c-0.414 0-0.75 0.336-0.75 0.75s0.336 0.75 0.75 0.75v0h17c0.414 0 0.75-0.336 0.75-0.75s-0.336-0.75-0.75-0.75v0zM4 1.25h2c1.519 0 2.75 1.231 2.75 2.75v2c0 1.519-1.231 2.75-2.75 2.75h-2c-1.519 0-2.75-1.231-2.75-2.75v-2c0-1.519 1.231-2.75 2.75-2.75zM3.997 12.25h2c1.519 0 2.75 1.231 2.75 2.75v2c0 1.519-1.231 2.75-2.75 2.75h-2c-1.519 0-2.75-1.231-2.75-2.75v-2c0-1.519 1.231-2.75 2.75-2.75zM3.997 23.25h2c1.519 0 2.75 1.231 2.75 2.75v2c0 1.519-1.231 2.75-2.75 2.75h-2c-1.519 0-2.75-1.231-2.75-2.75v-2c0-1.519 1.231-2.75 2.75-2.75z"></path></svg>
|
After Width: | Height: | Size: 1 KiB |
1
App/img/svg/view-list.svg
Normal file
|
@ -0,0 +1 @@
|
|||
<?xml version="1.0" encoding="utf-8"?><!-- Uploaded to: SVG Repo, www.svgrepo.com, Generator: SVG Repo Mixer Tools --><svg width="800px" height="800px" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg" fill="none"><path stroke="#fff" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 10h16M4 14h16M4 18h16"/></svg>
|
After Width: | Height: | Size: 346 B |
550
App/index.htm
|
@ -4,201 +4,336 @@
|
|||
<head>
|
||||
<meta charset="utf-8">
|
||||
<title>fpPS4 Temmie's Launcher - Loading...</title>
|
||||
<link rel="stylesheet" type="text/css" href="css/style.css">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<link rel="stylesheet" id="stylesheet" type="text/css" href="css/style.css">
|
||||
<link rel="shortcut icon" type="image/png" href="img/logo.png" sizes="551x547"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<!-- fpPS4 Updater -->
|
||||
<div class="DIV_FPPS4_UPDATER" id="DIV_FPPS4_UPDATER">
|
||||
|
||||
<!-- GUI Design -->
|
||||
<div class="DIV_DESIGN_LINES LINE_TOP"></div>
|
||||
<div class="DIV_DESIGN_LINES LINE_BOTTOM"></div>
|
||||
|
||||
<!-- Status -->
|
||||
<label class="LABEL_FLEX_MARGIN">
|
||||
<label id="LABEL_FPPS4_UPDATER_STATUS_LANG">Status</label>:
|
||||
</label>
|
||||
<label id="LABEL_FPPS4_UPDATER_STATUS">???</label>
|
||||
|
||||
<!-- Progressbar -->
|
||||
<div class="DIV_PROGRESSBAR">
|
||||
<div class="DIV_PROGRESSBAR_INTERNAL" id="DIV_PROGRESSBAR_UPDATE_FPPS4"></div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Launcher Settings -->
|
||||
<div class="DIV_SETTINGS" id="DIV_SETTINGS">
|
||||
<div class="DIV_SETTINGS_HOLDER" id="DIV_SETTINGS">
|
||||
|
||||
<div class="DIV_TITLE">Launcher Settings</div>
|
||||
<div class="DIV_SETTINGS">
|
||||
<div class="DIV_TITLE" id="DIV_SETTINGS_TITLE">Launcher Settings</div>
|
||||
|
||||
<!-- BG -->
|
||||
<div class="DIV_SETTINGS_BG"></div>
|
||||
|
||||
<!-- Settings List -->
|
||||
<div class="DIV_SETTINGS_LIST">
|
||||
|
||||
<!-- General -->
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_GENERAL">General</div>
|
||||
|
||||
<!-- BG -->
|
||||
<div class="DIV_SETTINGS_BG"></div>
|
||||
<div class="DIV_settingsEntry">
|
||||
<div class="DIV_settingsEntryFlex">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GUI_ZOOM_SCALE">
|
||||
Interface zoom scale:
|
||||
</label>
|
||||
<input type="range" min="1" max="1.5" step="0.01" value="1" id="RANGE_settingsGuiZoomScale" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
</div>
|
||||
|
||||
<!-- Settings List -->
|
||||
<div class="DIV_SETTINGS_LIST">
|
||||
|
||||
<div class="DIV_settingsH2">Paths</div>
|
||||
<div class="DIV_settingsEntry">
|
||||
Games / Homebrew Path:
|
||||
<label id="LBL_SETTINGS_gamePath" class="LABEL_settingsPath">???</label>
|
||||
<input type="button" class="BTN_selectPath" value="Select path" onclick="APP.settings.selectPath({
|
||||
settings: 'gamePath',
|
||||
label: 'LBL_SETTINGS_gamePath'
|
||||
});">
|
||||
<input type="button" class="BTN_selectPath" value="Open folder" onclick="APP.fileManager.openDir(APP.settings.data.gamePath);">
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
fpPS4 Path:
|
||||
<label id="LBL_SETTINGS_emuPath" class="LABEL_settingsPath">???</label>
|
||||
<input type="button" class="BTN_selectPath" value="Select File" onclick="APP.settings.selectFile({
|
||||
extension: '.exe',
|
||||
settings: 'emuPath',
|
||||
label: 'LBL_SETTINGS_emuPath'
|
||||
});">
|
||||
</div>
|
||||
|
||||
<!-- Game List -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2">Game List</div>
|
||||
<i>(<label id="LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO">
|
||||
Warning: It's not recommended changing this setting if your screen res. is lower than <code>1920x1080</code>
|
||||
</label>)</i>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
Display mode:
|
||||
<select id="SELECT_settingsDisplayMode" class="SELECT_settings" onchange="APP.design.updateLauncherSettingsGUI();">
|
||||
<option value="normal">Normal</option>
|
||||
<option value="compact">Compact</option>
|
||||
<option value="grid">Grid</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Grid Options -->
|
||||
<div id="DIV_settingsGridOptions">
|
||||
<div class="SEPARATOR_00"></div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsGridBorderRadius">
|
||||
Grid Border-Radius:
|
||||
<input type="range" min="0" max="26" step="1" value="8" id="RANGE_settingsGridIconBorderRadius" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGridBorderRadius">???</label>%
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsStartEmuFullscreen">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_START_EMU_FULLSCREEN" onclick="APP.tools.processCheckbox('CHECKBOX_settingsStartEmuFullscreen');">
|
||||
Start fpPS4 in fullscreen mode
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="SEPARATOR_00"></div>
|
||||
|
||||
<!-- Language -->
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_LANGUAGE">Language</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
<label id="LABEL_SETTINGS_CURRENT_LANGUAGE">Current Language</label>:
|
||||
<select id="SELECT_settingsLanguage" class="SELECT_settings">
|
||||
<!-- Language goes here -->
|
||||
</select><br>
|
||||
(<label id="LABEL_SETTINGS_LANGUAGE_RESTART">You must restart launcher to take effect</label>)
|
||||
</div>
|
||||
<div class="SEPARATOR_00"></div>
|
||||
|
||||
<!-- Paths -->
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_PATHS">Paths</div>
|
||||
<div class="DIV_settingsEntry">
|
||||
|
||||
<label id="LABEL_SETTINGS_APP_GAMES_PATH">App / Games Path</label>:
|
||||
<label id="LBL_SETTINGS_gamePath" class="LABEL_settingsPath">???</label>
|
||||
|
||||
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_APPS_GAMES_PATH" value="Select path" onclick="APP.settings.selectPath({
|
||||
settings: 'gamePath',
|
||||
label: 'LBL_SETTINGS_gamePath'
|
||||
});">
|
||||
|
||||
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_OPEN_APPS_GAMES_PATH" value="Open folder" onclick="APP.fileManager.openDir(APP.settings.data.gamePath);">
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
|
||||
<label id="LABEL_SETTINGS_FPPS4_PATH">fpPS4 Path</label>:
|
||||
<label id="LBL_SETTINGS_emuPath" class="LABEL_settingsPath">???</label>
|
||||
|
||||
<input type="button" class="BTN_selectPath" id="BTN_SETTINGS_SELECT_FPPS4_PATH" value="Select File" onclick="APP.settings.selectFile({
|
||||
extension: '.exe',
|
||||
settings: 'emuPath',
|
||||
label: 'LBL_SETTINGS_emuPath'
|
||||
});">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Game List -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_GAME_LIST">Game List</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
|
||||
<label id="LABEL_SETTINGS_GAME_SEARCH_MODE">Game search mode</label>:
|
||||
<select id="SELECT_settingsSearchMode" class="SELECT_settings">
|
||||
<option value="appName">Name</option>
|
||||
<option value="titleId">Title ID</option>
|
||||
</select>
|
||||
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
|
||||
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR">Background Blur</label>:
|
||||
|
||||
<input type="range" min="0" max="6" step="0.01" value="2" id="RANGE_settingsGameListBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGameListBgBlur">???</label>%
|
||||
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsGridBorderRadius">
|
||||
|
||||
<label id="LABEL_SETTINGS_GRID_BORDER_RADIUS">(Grid) Border-Radius</label>:
|
||||
<input type="range" min="0" max="15" step="0.1" value="8" id="RANGE_settingsGridIconBorderRadius" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGridBorderRadius">???</label>%
|
||||
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
|
||||
<label id="LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY">Background Opacity</label>:
|
||||
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.6" id="RANGE_settingsGameListBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGameListBgOpacity">???</label>%
|
||||
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsGameSearchCaseSensitive">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE" onclick="APP.tools.processCheckbox('CHECKBOX_settingsGameSearchCaseSensitive');">
|
||||
Enable case-sentitive search on game list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsShowBgOnGameEntry">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowBgOnGameEntry">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowBgOnGameEntry');">
|
||||
Show background image for every game entry on list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowExecList">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecList');">
|
||||
Show app / game metadata (or executable path) for every title in game list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_enableCompatStatusCheck">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK" onclick="APP.tools.processCheckbox('CHECKBOX_enableCompatStatusCheck');">
|
||||
Enable game compatibility check
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- fpPS4 running -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_EMU_RUNNING">fpPS4 Running</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR">Background Blur</label>:
|
||||
<input type="range" min="0" max="6" step="0.01" value="6" id="RANGE_settingsEmuRunningBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsEmuRunningBgBlur">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<label id="LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY">Background Opacity</label>:
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" id="RANGE_settingsEmuRunningBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design. renderSettings(!0);">
|
||||
<label id="LABEL_settingsEmuRunningBgOpacity">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowGameMetadata">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_GUI" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowGameMetadata');">
|
||||
Display icon / name GUI while fpPS4 is running
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowExecRunning">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecRunning');">
|
||||
Display app / game metadata (or executable path) below game title
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Log options -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_LOG_OPTIONS">Log Options</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
<label id="LABEL_SETTINGS_LOG_START_WINDOW_STATE">Start console window</label>:
|
||||
<select id="SELECT_settingsStartExternalWindow" class="SELECT_settings" onchange="APP.design.updateLauncherSettingsGUI();">
|
||||
<option value="normal">Normal</option>
|
||||
<option value="max">Maximized</option>
|
||||
<option value="min">Minimized</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsExternalWindowPrompt">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExternalWindowPrompt');">
|
||||
Prompt user to press any key when fpPS4 closes
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsExperimentalIntLog">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExperimentalIntLog');">
|
||||
<label class="LABEL_settingsExperimental">EXPERIMENTAL</label> Log fpPS4 process output (<code>stdout</code> and <code>stderr</code>) on intenal log (Press F12 --> Console)
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- fpPS4 Updater -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_FPPS4_UPDATER">fpPS4 Updater</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsEnableFpps4Updates">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableFpps4Updates');">
|
||||
Enable fpPS4 updater
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Selected CI -->
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<label id="LABEL_SETTINGS_UPDATER_SELECTED_CI">Current workflow</label>:
|
||||
<select id="SELECT_settingsUpdaterCurrentCI" class="SELECT_settings">
|
||||
<!-- Workflow list goes here -->
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_FPPS4_UPDATE_BRANCH">
|
||||
Search updates from branch
|
||||
</label>:
|
||||
<input type="text" placeholder="main, trunk, kern..." class="SETTINGS_TEXT" id="INPUT_settingsUpdateFpps4Branch">
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_FORCE_FPPS4_UPDATE" value="Force fpPS4 update" onclick="APP.emuManager.update.check({forceUpdate: !0, silent: !0});">
|
||||
</div>
|
||||
|
||||
<!-- Misc. -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2" id="DIV_SETTINGS_MISC">Misc.</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsEnableParamSfo">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableParamSfo');">
|
||||
Enable <code>PARAM.SFO</code> support <i>(Click on "Delete all game settings" and restart launcher to take effect)</i>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsEnableChangeGamepadLedColor">
|
||||
<label class="LABEL_checkbox" id="LABEL_SETTINGS_GAMEPAD_LED_COLOR" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableChangeGamepadLedColor');">
|
||||
Enable change gamepad led color (requires <code>SDL2.dll</code>)
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS" value="Delete all game settings" onclick="APP.settings.resetAllGameSettings();">
|
||||
<input type="button" class="SELECT_settings" id="BTN_SETTINGS_RESTART_LAUNCHER" value="Restart launcher" onclick="chrome.runtime.reload();">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Save & Exit Buttons -->
|
||||
<div class="DIV_settingsSave">
|
||||
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_APPLY_CLOSE" onclick="APP.design.saveSettings();" value="Apply & Close">
|
||||
<input type="button" class="BTN_SAVE" id="BTN_SETTINGS_CLOSE" onclick="APP.design.toggleSettings(!0);" value="Close">
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
Game search mode:
|
||||
<select id="SELECT_settingsSearchMode" class="SELECT_settings">
|
||||
<option value="appName">Name</option>
|
||||
<option value="titleId">Title ID</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
Background Blur:
|
||||
<input type="range" min="0" max="6" step="0.01" value="2" id="RANGE_settingsGameListBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGameListBgBlur">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
Background Opacity:
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.6" id="RANGE_settingsGameListBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsGameListBgOpacity">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsGameSearchCaseSensitive">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsGameSearchCaseSensitive');">
|
||||
Enable case-sentitive search on game list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex" id="DIV_settingsShowBgOnGameEntry">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowBgOnGameEntry">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowBgOnGameEntry');">
|
||||
Show background image for every game entry on list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowExecList">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecList');">
|
||||
Show App / Game metadata <i>(or executable path)</i> for every title in game list
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Emu running -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2">Emu Running</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
Background Blur:
|
||||
<input type="range" min="0" max="6" step="0.01" value="6" id="RANGE_settingsEmuRunningBgBlur" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsEmuRunningBgBlur">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
Background Opacity:
|
||||
<input type="range" min="0" max="1" step="0.01" value="0.7" id="RANGE_settingsEmuRunningBgOpacity" onmouseup="APP.design.renderSettings(!0);" onkeyup="APP.design.renderSettings(!0);">
|
||||
<label id="LABEL_settingsEmuRunningBgOpacity">???</label>%
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsShowExecRunning">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsShowExecRunning');">
|
||||
Display App Game metadata <i>(or executable path)</i> below game title
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Log options -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2">Log Options</div>
|
||||
|
||||
<div class="DIV_settingsEntry">
|
||||
Start console window:
|
||||
<select id="SELECT_settingsStartExternalWindow" class="SELECT_settings" onchange="APP.design.updateLauncherSettingsGUI();">
|
||||
<option value="normal">Normal</option>
|
||||
<option value="max">Maximized</option>
|
||||
<option value="min">Minimized</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsExternalWindowPrompt">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsExternalWindowPrompt');">
|
||||
Prompt user to press any key when fpPS4 closes
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Misc. -->
|
||||
<div class="SEPARATOR_00"></div>
|
||||
<div class="DIV_settingsH2">Misc.</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="checkbox" id="CHECKBOX_settingsEnableParamSfo">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_settingsEnableParamSfo');">
|
||||
Enable <code>PARAM.SFO</code> support <i>(Click on "Delete all game settings" and restart launcher to take effect)</i>
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<div class="DIV_settingsEntry DIV_settingsEntryFlex">
|
||||
<input type="button" class="SELECT_settings" value="Delete all game settings" onclick="APP.settings.resetAllGameSettings();">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Save & Exit Buttons -->
|
||||
<div class="DIV_settingsSave">
|
||||
<input type="button" class="BTN_SAVE" onclick="APP.design.saveSettings();" value="Apply & Close">
|
||||
<input type="button" class="BTN_SAVE" onclick="APP.design.toggleSettings(!0);" value="Close">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Top Menu -->
|
||||
<div class="DIV_ACTIONS" id="DIV_ACTIONS">
|
||||
|
||||
|
||||
<!-- Search -->
|
||||
<input type="text" class="INPUT_gameListSearch" id="INPUT_gameListSearch" placeholder="Search: Insert game name..." oninput="APP.gameList.search();">
|
||||
|
||||
<!-- Grid icon size -->
|
||||
<input type="range" min="50" max="512" step="0.01" value="116" id="RANGE_settingsGridIconSize" oninput="APP.design.renderSettings(!0);APP.design.renderGameList({displayLog: !1});">
|
||||
<!-- Display modes -->
|
||||
<div class="BTN_displayMode_holder" id="BTN_displayMode_holder">
|
||||
<input type="button" onclick="APP.settings.setDisplayMode('normal');" class="BTN_displayMode BTN_displayMode_normal" id="BTN_displayMode_normal">
|
||||
<input type="button" onclick="APP.settings.setDisplayMode('compact');" class="BTN_displayMode BTN_displayMode_compact" id="BTN_displayMode_compact">
|
||||
<input type="button" onclick="APP.settings.setDisplayMode('grid');" class="BTN_displayMode BTN_displayMode_grid" id="BTN_displayMode_grid">
|
||||
</div>
|
||||
|
||||
<input type="button" class="APP_btn BTN_actions" id="BTN_REFRESH" onclick="APP.gameList.load();" value="Refresh game list">
|
||||
<input type="button" class="APP_btn BTN_actions" id="BTN_SETTINGS" onclick="APP.design.toggleSettings();" value="Settings">
|
||||
<input type="button" class="APP_btn BTN_actions" id="BTN_CLEAR_LOG" onclick="APP.clearLog();" value="Clear Log">
|
||||
<input type="button" class="APP_btn BTN_actions" onclick="APP.about();" value="About">
|
||||
<input type="button" class="APP_btn BTN_STOP" id="BTN_KILL" onclick="APP.emuManager.killEmu();" disabled="disabled" value="Stop fpPS4">
|
||||
<!-- Grid icon size -->
|
||||
<input type="range" min="92.93" max="512" step="0.01" value="116" id="RANGE_settingsGridIconSize" oninput="APP.design.renderSettings(!0);APP.design.renderGameList({displayLog: !1});">
|
||||
|
||||
<!-- Actions -->
|
||||
<input type="button" class="BTN_actions" id="BTN_REFRESH" onclick="APP.gameList.load();" value="Refresh game list">
|
||||
<input type="button" class="BTN_actions" id="BTN_SETTINGS" onclick="APP.design.toggleSettings();" value="Settings">
|
||||
<input type="button" class="BTN_actions" id="BTN_CLEAR_LOG" onclick="APP.clearLog();" value="Clear Log">
|
||||
<input type="button" class="BTN_actions" id="BTN_UPDATE_FPPS4" onclick="APP.emuManager.update.check();" value="Update fpPS4" disabled="disabled">
|
||||
<input type="button" class="BTN_actions" id="BTN_ABOUT" onclick="APP.about();" value="About">
|
||||
<input type="button" class="BTN_STOP" id="BTN_KILL" onclick="APP.emuManager.killEmu();" disabled="disabled" value="Stop fpPS4">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Game list background image -->
|
||||
<div id="DIV_GAMELIST_BG" class="DIV_GAMELIST_BG"></div>
|
||||
|
||||
<!-- fpPS4 Options -->
|
||||
<div class="DIV_OPTIONS" id="DIV_OPTIONS">
|
||||
|
||||
|
||||
<div class="DIV_TITLE">
|
||||
<label class="LABEL_emuColor">fp</label>PS4 Options
|
||||
<label id="LABEL_FPPS4_OPTIONS">
|
||||
<label class="LABEL_emuColor">fp</label>PS4 Options
|
||||
</label>
|
||||
</div>
|
||||
|
||||
<!-- Game Options -->
|
||||
|
@ -209,42 +344,77 @@
|
|||
No game selected
|
||||
</div>
|
||||
|
||||
<!-- App / Game Version -->
|
||||
<div class="DIV_labelSelectedGame" id="DIV_FPPS4_OPTIONS_APP_VERSION">
|
||||
<label id="LABEL_FPPS4_OPTIONS_APP_VERSION">Version</label>: <label id="LABEL_FPPS4_OPTIONS_APP_VER">???</label>
|
||||
</div>
|
||||
|
||||
<!-- Dump Status -->
|
||||
<div class="DIV_labelSelectedGame">
|
||||
<label id="LABEL_FPPS4_OPTIONS_DUMP_STATUS">Dump status</label>: <div class="DIV_selectedGameStatus" id="DIV_selectedGameStatus_dump"></div>
|
||||
</div>
|
||||
|
||||
<!-- fpPS4 Compat Status -->
|
||||
<div class="DIV_labelSelectedGame" id="DIV_FPPS4_GAME_STATUS">
|
||||
<label id="LABEL_FPPS4_OPTIONS_GAME_STATUS">Compat status</label>: <div class="DIV_selectedGameStatus" id="DIV_selectedGameStatus_compat"></div>
|
||||
</div>
|
||||
|
||||
<!-- Hack List -->
|
||||
<div class="DIV_launcherOptionsTitle" id="LABEL_FPPS4_OPTIONS_HACKS">Hacks</div>
|
||||
<div class="DIV_HACK_LIST" id="DIV_HACK_LIST">
|
||||
<!-- Hacks goes here -->
|
||||
</div>
|
||||
|
||||
<!-- App / Game integrity -->
|
||||
<div class="DIV_labelSelectedGame">
|
||||
Dump status: <div class="DIV_selectedGameStatus" id="DIV_selectedGameStatus"></div>
|
||||
</div>
|
||||
|
||||
<!-- Patch options -->
|
||||
<input type="checkbox" id="CHECKBOX_optionsEnablePatch" oninput="APP.gameList.saveGameSettings(!0);APP.design.update();">
|
||||
<label class="LABEL_checkbox" onclick="APP.tools.processCheckbox('CHECKBOX_optionsEnablePatch');APP.gameList.saveGameSettings(!0);APP.design.update();"> Enable game patch</label>
|
||||
|
||||
<label class="LABEL_checkbox" id="LABEL_FPPS4_OPTIONS_ENABLE_PATCHES" onclick="APP.gameList.toggleGamePatch();"> Enable game patch</label>
|
||||
|
||||
<div class="DIV_launcherOptions" id="DIV_launcherOptionsPatchVersion">
|
||||
<input type="button" class="BTN_launcherOptions" value="Select patch location" onclick="APP.gameList.loadGamePatch();">
|
||||
|
||||
<input type="button" id="BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION" class="BTN_launcherOptions" value="Select patch location" onclick="APP.gameList.loadGamePatch();">
|
||||
|
||||
<!-- Patch details -->
|
||||
<div class="DIV_launcherOptionsPatchVersionMetadata" id="DIV_launcherOptionsPatchVersionMetadata">
|
||||
|
||||
<div id="LABEL_launcherOptionsPatchTitle" class="LABEL_gameTitleOptions">Unknown</div>
|
||||
<div class="DIV_launcherOptions">
|
||||
Version: <label id="LABEL_launcherOptionsPatchVersion">Unknown</label><br>
|
||||
Type: <label id="LABEL_launcherOptionsPatchType">Unknown</label>
|
||||
<label id="LABEL_FPPS4_OPTIONS_PATCH_VERSION">Version</label>: <label id="LABEL_launcherOptionsPatchVersion">Unknown</label><br>
|
||||
<label id="LABEL_FPPS4_OPTIONS_PATCH_TYPE">Type</label>: <label id="LABEL_launcherOptionsPatchType">Unknown</label>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Misc. Options -->
|
||||
<div class="DIV_launcherOptions">
|
||||
<div class="DIV_launcherOptionsTitle" id="LABEL_FPPS4_OPTIONS_MISC">
|
||||
Misc. Options
|
||||
</div>
|
||||
|
||||
<!-- Select gamepad mode -->
|
||||
<label class="LABEL_checkbox" id="LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE">Select gamepad mode:</label>
|
||||
<select class="SELECT_settings" id="FPPS4_OPTIONS_SELECT_GAMEPAD_MODE" onchange="APP.gameList.saveGameSettings(!0);APP.gameList.checkSdl2();APP.design.update();">
|
||||
<option value="xinput">xinput</option>
|
||||
<option value="sdl2">sdl2</option>
|
||||
<option value="keyboard">Keyboard</option>
|
||||
</select>
|
||||
|
||||
<!-- (SDL2) Select gamepad led color -->
|
||||
<div id="DIV_sdlSelectGamepadColor" style="display: none;">
|
||||
<label id="LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR">Gamepad led color:</label>
|
||||
<input type="color" id="INPUT_cGameLedColor" onchange="APP.gameList.saveGameSettings(!0);APP.gameList.checkSdl2();APP.design.update();console.table(APP.gameList.cGameSettings);">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<!-- Launcher Options -->
|
||||
<div class="DIV_launcherOptions">
|
||||
Launcher Options
|
||||
<input type="button" class="BTN_launcherOptions" value="Open App / Game location" onclick="APP.gameList.openGameLocation();">
|
||||
<input type="button" class="BTN_launcherOptions" value="Reset settings file" onclick="APP.gameList.resetGameSettings();">
|
||||
<input type="button" class="BTN_launcherOptions" disabled="disabled" id="BTN_launcherOptionsExportMetadata" value="Export metadata" onclick="APP.gameList.exportGameMetadata();">
|
||||
<div class="DIV_launcherOptionsTitle" id="LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS">
|
||||
Launcher Options
|
||||
</div>
|
||||
|
||||
<input type="button" class="BTN_launcherOptions" id="BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION" value="Open App / Game location" onclick="APP.gameList.openGameLocation();">
|
||||
<input type="button" class="BTN_launcherOptions" id="BTN_FPPS4_OPTIONS_RESET_SETTINGS" value="Reset settings file" onclick="APP.gameList.resetGameSettings();">
|
||||
<input type="button" class="BTN_launcherOptions" id="BTN_launcherOptionsExportMetadata" value="Export metadata" onclick="APP.gameList.exportGameMetadata();" disabled="disabled">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
@ -258,9 +428,6 @@
|
|||
|
||||
<!-- Game List -->
|
||||
<div class="DIV_LIST" id="DIV_LIST">
|
||||
|
||||
<!-- Background Image -->
|
||||
<div id="DIV_GAMELIST_BG" class="DIV_GAMELIST_BG"></div>
|
||||
|
||||
<!-- List -->
|
||||
<div class="DIV_LIST_INTERNAL" id="DIV_LIST_INTERNAL">
|
||||
|
@ -277,7 +444,7 @@
|
|||
<div id="DIV_GAME_DETAILS_currentExec">
|
||||
<!-- Game metadata goes here -->
|
||||
</div>
|
||||
Status: <label id="LABEL_GAME_DETAILS_STATUS">???</label>
|
||||
<label id="LABEL_EMU_RUNNING_STATUS">Status</label>: <label id="LABEL_GAME_DETAILS_STATUS">???</label>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -289,8 +456,13 @@
|
|||
</div>
|
||||
|
||||
<!-- Hidden Stuff -->
|
||||
<div class="none">
|
||||
|
||||
<div class="none" id="SCRIPT_LOADER">
|
||||
|
||||
<!-- Extra CSS -->
|
||||
<div class="none" id="DIV_EXTRA_CSS">
|
||||
<!-- Extra CSS will be placed here -->
|
||||
</div>
|
||||
|
||||
<!-- Folder loader -->
|
||||
<input type="file" id="APP_FILE_LOADER"/>
|
||||
<input type="file" id="APP_FILE_SAVE" nwsaveas/>
|
||||
|
@ -298,16 +470,18 @@
|
|||
|
||||
<!-- Scripts -->
|
||||
<script type="text/javascript" src="js/TMS.js"></script>
|
||||
<script type="text/javascript" src="js/language.js"></script>
|
||||
<script type="text/javascript" src="js/tools.js"></script>
|
||||
<script type="text/javascript" src="js/filemanager.js"></script>
|
||||
<script type="text/javascript" src="js/paramSfoDatabase.js"></script>
|
||||
<script type="text/javascript" src="js/paramSfoParser.js"></script>
|
||||
<script type="text/javascript" src="js/gamelist.js"></script>
|
||||
<script type="text/javascript" src="js/settings.js"></script>
|
||||
<script type="text/javascript" src="js/design.js"></script>
|
||||
<script type="text/javascript" src="js/updateEmu.js"></script>
|
||||
<script type="text/javascript" src="js/emumanager.js"></script>
|
||||
<script type="text/javascript" src="js/design.js"></script>
|
||||
<script type="text/javascript" src="js/main.js"></script>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
|
838
App/js/TMS.js
|
@ -1,308 +1,558 @@
|
|||
/*
|
||||
*******************************************************************************
|
||||
TMS.js - By TemmieHeartz (@TheMitoSan)
|
||||
|
||||
This file is an original replacement - Because I don't want to deal with jQuery
|
||||
anymore!
|
||||
**************************************************************************************
|
||||
|
||||
Original source / motivation: http://youmightnotneedjquery.com/
|
||||
*******************************************************************************
|
||||
TMS.js
|
||||
Created by TheMitoSan (@themitosan)
|
||||
https://github.com/themitosan/TMS.js
|
||||
|
||||
This file exists because I don't want to deal with jQuery anymore!
|
||||
|
||||
Original source / motivation:
|
||||
http://youmightnotneedjquery.com/
|
||||
|
||||
**************************************************************************************
|
||||
*/
|
||||
tmsTemp = {};
|
||||
tmsTemp['logWarnings'] = false;
|
||||
/*
|
||||
Warn if something goes wrong
|
||||
*/
|
||||
tmsTemp['warn'] = function(warnText){
|
||||
if (TMS.logWarnings === true){
|
||||
console.warn(warnText);
|
||||
};
|
||||
};
|
||||
/*
|
||||
CSS
|
||||
*/
|
||||
tmsTemp['css'] = function(elementId, cssChanges){
|
||||
var canStart = true, eReason = '';
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId === null){
|
||||
canStart = false;
|
||||
eReason = eReason + '\nDOM does not exist! (' + elementId + ')';
|
||||
};
|
||||
if (typeof cssChanges !== 'object'){
|
||||
canStart = false;
|
||||
eReason = eReason + '\nYou must insert an object for CSS data (Current type: ' + typeof cssChanges + ')';
|
||||
};
|
||||
// End
|
||||
if (canStart === true){
|
||||
Object.keys(cssChanges).forEach(function(cItem){
|
||||
elId.style[cItem] = cssChanges[cItem];
|
||||
});
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to apply CSS data!' + eReason);
|
||||
};
|
||||
};
|
||||
/*
|
||||
Animate
|
||||
|
||||
const TMS = Object.freeze(Object.seal({
|
||||
|
||||
// Log warning
|
||||
logWarnings: !1,
|
||||
|
||||
// Warn if something go wrong
|
||||
warn: function(warnText){
|
||||
if (this.logWarnings === !0){
|
||||
console.warn(`[TMS] ${warnText}`);
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
TMS Functions
|
||||
*/
|
||||
|
||||
/*
|
||||
Get element
|
||||
*/
|
||||
getElement: function(elementId){
|
||||
|
||||
var res = document.getElementById(elementId);
|
||||
|
||||
if (res === null){
|
||||
res = document.getElementsByTagName(elementId)[0];
|
||||
}
|
||||
|
||||
if (res === void 0){
|
||||
res = null;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
CSS
|
||||
*/
|
||||
css: function(elementId, cssChanges){
|
||||
|
||||
var eReason = '',
|
||||
canStart = !0,
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId === null){
|
||||
canStart = !1;
|
||||
eReason = eReason + '\nDOM or Tag does not exist! (' + elementId + ')';
|
||||
}
|
||||
if (typeof cssChanges !== 'object'){
|
||||
canStart = !1;
|
||||
eReason = eReason + '\nYou must insert an object for CSS data (Current type: ' + typeof cssChanges + ')';
|
||||
}
|
||||
|
||||
// End
|
||||
if (canStart === !0){
|
||||
|
||||
Object.keys(cssChanges).forEach(function(cItem){
|
||||
elId.style[cItem] = cssChanges[cItem];
|
||||
});
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to apply CSS data!' + eReason);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Animate
|
||||
|
||||
elementId = HTML DOM id
|
||||
cssChanges = Object {width: x, height, y}
|
||||
animationTime = Number (Min: 0)
|
||||
animationEase = CSS for transition option, like cubic-bezier
|
||||
*/
|
||||
tmsTemp['animate'] = function(elementId, cssChanges, animationTime, animationEase){
|
||||
var canStart = true, eReason = transitionString = '';
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId === null){
|
||||
canStart = false;
|
||||
eReason = eReason + '\nDOM does not exist! (' + elementId + ')';
|
||||
}
|
||||
if (typeof cssChanges !== 'object'){
|
||||
canStart = false;
|
||||
eReason = eReason + '\nYou must insert an object for CSS data (Current type: ' + typeof cssChanges + ')';
|
||||
}
|
||||
if (typeof animationTime !== 'number'){
|
||||
canStart = false;
|
||||
eReason = eReason + '\nYou must insert a number on animation time (Current type: ' + typeof animationTime + ')';
|
||||
}
|
||||
// End
|
||||
if (canStart === true){
|
||||
if (animationEase === undefined){
|
||||
animationEase = '';
|
||||
elementId = HTML DOM id
|
||||
cssChanges = Object {width: x, height, y}
|
||||
animationTime = Number (Min: 0)
|
||||
animationEase = CSS for transition option, like cubic-bezier
|
||||
*/
|
||||
animate: function(elementId, cssChanges, animationTime, animationEase){
|
||||
|
||||
var eReason = '',
|
||||
canStart = !0,
|
||||
transitionString = '';
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId === null){
|
||||
canStart = !1;
|
||||
eReason = eReason + '\nDOM does not exist! (' + elementId + ')';
|
||||
}
|
||||
if (animationTime < 0){
|
||||
animationTime = 0;
|
||||
if (typeof cssChanges !== 'object'){
|
||||
canStart = !1;
|
||||
eReason = eReason + '\nYou must insert an object for CSS data (Current type: ' + typeof cssChanges + ')';
|
||||
}
|
||||
Object.keys(cssChanges).forEach(function(cItem){
|
||||
elId.style[cItem] = cssChanges[cItem];
|
||||
transitionString = transitionString + cItem + ' ' + (animationTime / 1000) + 's ';
|
||||
elId.style['transition'] = transitionString + animationEase;
|
||||
});
|
||||
setTimeout(function(){
|
||||
elId.style['transition'] = 'none 0s';
|
||||
}, (animationTime + 1));
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to animate!' + eReason);
|
||||
}
|
||||
}
|
||||
/*
|
||||
Focus Element
|
||||
sTimeout = time [ms]
|
||||
*/
|
||||
tmsTemp['focus'] = function(elementId, sTimeout){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
if (sTimeout !== undefined && parseInt(sTimeout) !== NaN){
|
||||
if (typeof animationTime !== 'number'){
|
||||
canStart = !1;
|
||||
eReason = eReason + '\nYou must insert a number on animation time (Current type: ' + typeof animationTime + ')';
|
||||
}
|
||||
|
||||
// End
|
||||
if (canStart === !0){
|
||||
|
||||
if (animationEase === void 0){
|
||||
animationEase = '';
|
||||
}
|
||||
if (animationTime < 0){
|
||||
animationTime = 0;
|
||||
}
|
||||
|
||||
Object.keys(cssChanges).forEach(function(cItem){
|
||||
elId.style[cItem] = cssChanges[cItem];
|
||||
transitionString = transitionString + cItem + ' ' + (animationTime / 1000) + 's ';
|
||||
elId.style['transition'] = transitionString + animationEase;
|
||||
});
|
||||
|
||||
setTimeout(function(){
|
||||
elId.style['transition'] = 'none 0s';
|
||||
}, (animationTime + 1));
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to animate!' + eReason);
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Focus Element
|
||||
sTimeout = time [ms]
|
||||
*/
|
||||
focus: function(elementId, sTimeout){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
if (sTimeout !== void 0 && parseInt(sTimeout) !== NaN){
|
||||
|
||||
setTimeout(function(){
|
||||
elId.focus();
|
||||
}, sTimeout);
|
||||
|
||||
} else {
|
||||
elId.focus();
|
||||
}, sTimeout);
|
||||
}
|
||||
|
||||
} else {
|
||||
elId.focus();
|
||||
};
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to focus element because it does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
Disable Element
|
||||
*/
|
||||
tmsTemp['disableElement'] = function(idList){
|
||||
var disableList = [];
|
||||
if (typeof idList === 'object'){
|
||||
disableList = idList;
|
||||
} else {
|
||||
disableList.push(idList);
|
||||
};
|
||||
// End
|
||||
disableList.forEach(function(cItem){
|
||||
const elId = document.getElementById(cItem);
|
||||
TMS.warn('Unable to focus element because it does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Disable Element
|
||||
*/
|
||||
disableElement: function(idList){
|
||||
|
||||
var disableList = [];
|
||||
|
||||
if (typeof idList === 'object'){
|
||||
disableList = idList;
|
||||
} else {
|
||||
disableList.push(idList);
|
||||
}
|
||||
|
||||
// End
|
||||
disableList.forEach(function(cItem){
|
||||
|
||||
const elId = TMS.getElement(cItem);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
elId.disabled = !0;
|
||||
elId.disabled = 'disabled';
|
||||
|
||||
// If is <input>
|
||||
if (elId.type === 'button'){
|
||||
TMS.css(cItem, {'filter': 'grayscale(1) blur(0.8px)', 'cursor': 'not-allowed', 'opacity': '0.6'});
|
||||
}
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to disable element because it does not exist! (' + cItem + ')');
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Enable Element
|
||||
*/
|
||||
enableElement: function(elementId){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.disabled = 'disabled';
|
||||
// If is <input>
|
||||
|
||||
elId.disabled = '';
|
||||
elId.disabled = !1;
|
||||
|
||||
if (elId.type === 'button'){
|
||||
TMS.css(cItem, {'filter': 'grayscale(1) blur(0.8px)', 'cursor': 'not-allowed', 'opacity': '0.6'});
|
||||
};
|
||||
TMS.css(elementId, {'filter': 'grayscale(0) blur(0px)', 'cursor': 'pointer', 'opacity': '1'});
|
||||
}
|
||||
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to disable element because it does not exist! (' + cItem + ')');
|
||||
};
|
||||
});
|
||||
};
|
||||
/*
|
||||
Enable Element
|
||||
*/
|
||||
tmsTemp['enableElement'] = function(elementId){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
elId.disabled = '';
|
||||
// If is <input>
|
||||
if (elId.type === 'button'){
|
||||
TMS.css(elementId, {'filter': 'grayscale(0) blur(0px)', 'cursor': 'pointer', 'opacity': '1'});
|
||||
};
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to enable element because it does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
Get CSS data
|
||||
Returns the attr value from CSS propriety
|
||||
*/
|
||||
tmsTemp['getCssData'] = function(elementId, cssAttrName){
|
||||
var elId = document.getElementById(elementId),
|
||||
result = '';
|
||||
if (elId !== null){
|
||||
result = elId.style[cssAttrName];
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to get element because it does not exist! (' + elementId + ')');
|
||||
};
|
||||
return result;
|
||||
};
|
||||
/*
|
||||
Scroll top
|
||||
Usage: elementObjects = {HTML_DOM_ID_0: scrollInt, HTML_DOM_ID_1: scrollInt2} and goes on
|
||||
*/
|
||||
tmsTemp['scrollTop'] = function(elementObjects){
|
||||
Object.keys(elementObjects).forEach(function(cItem){
|
||||
const elId = document.getElementById(cItem);
|
||||
TMS.warn('TMS - Unable to enable element because it does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Get CSS data
|
||||
Returns the attr value from CSS propriety
|
||||
*/
|
||||
getCssData: function(elementId, cssAttrName){
|
||||
|
||||
var result = '',
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.scrollTop = elementObjects[cItem];
|
||||
|
||||
result = elId.style[cssAttrName];
|
||||
|
||||
// Get computed style
|
||||
if (result === ''){
|
||||
result = window.getComputedStyle(elId)[cssAttrName];
|
||||
}
|
||||
|
||||
// Get from DOM
|
||||
if (result === void 0){
|
||||
result = elId[cssAttrName];
|
||||
}
|
||||
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to scroll element because it does not exist! (' + elementId + ')');
|
||||
};
|
||||
});
|
||||
};
|
||||
/*
|
||||
Append data
|
||||
*/
|
||||
tmsTemp['append'] = function(elementId, newData){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
var pHTML = elId.innerHTML;
|
||||
elId.innerHTML = pHTML + newData;
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to append element data because parent DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
Add Class
|
||||
*/
|
||||
tmsTemp['addClass'] = function(elementId, className){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
elId.classList.add(className);
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to add class because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
Add Class
|
||||
*/
|
||||
tmsTemp['removeClass'] = function(elementId, className){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
elId.classList.remove(className);
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to remove class because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
Clear
|
||||
Removes all HTML inside
|
||||
*/
|
||||
tmsTemp['clear'] = function(elementId){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
elId.innerHTML = '';
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to clear inner data because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
triggerClick
|
||||
*/
|
||||
tmsTemp['triggerClick'] = function(elementId){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
elId.click();
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to clear inner data because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
fadeIn
|
||||
*/
|
||||
tmsTemp['fadeIn'] = function(elementId, animationTime){
|
||||
const elId = document.getElementById(elementId), tagType = {
|
||||
'DIV': 'block',
|
||||
'IMG': 'inline'
|
||||
};
|
||||
if (elId !== null){
|
||||
var dTime = 1000, dMode = 'block', finalOpacity = 1, eStyles = getComputedStyle(elId);
|
||||
if (animationTime !== undefined && animationTime !== NaN){
|
||||
dTime = parseInt(animationTime);
|
||||
if (dTime < 0){
|
||||
dTime = 1;
|
||||
};
|
||||
};
|
||||
if (tagType[elId.tagType] !== undefined){
|
||||
dMode = tagType[elId.tagType];
|
||||
};
|
||||
if (eStyles.opacity !== ''){
|
||||
finalOpacity = eStyles.opacity;
|
||||
};
|
||||
TMS.css(elementId, {'display': dMode, 'opacity': finalOpacity, 'transition': 'opacity ' + dTime + 'ms'});
|
||||
setTimeout(function(){
|
||||
TMS.css(elementId, {'transition': 'none'});
|
||||
}, (dTime + 1));
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to fade in because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
fadeOut
|
||||
*/
|
||||
tmsTemp['fadeOut'] = function(elementId, animationTime){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
var dTime = 1000;
|
||||
if (animationTime !== undefined && animationTime !== NaN){
|
||||
dTime = parseInt(animationTime);
|
||||
if (dTime < 0){
|
||||
dTime = 1;
|
||||
};
|
||||
};
|
||||
TMS.css(elementId, {'opacity': '0', 'transition': 'opacity ' + dTime + 'ms'});
|
||||
setTimeout(function(){
|
||||
TMS.css(elementId, {'transition': 'none', 'display': 'none'});
|
||||
}, (dTime + 1));
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to fade out because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
scrollCenter
|
||||
*/
|
||||
tmsTemp['scrollCenter'] = function(elementId){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
var parentDom = elId.parentElement,
|
||||
parentHeight = parentDom.offsetHeight;
|
||||
parentDom.scrollTo(0, (elId.offsetTop - (parentHeight / 2)))
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to fade out because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
setInnerHtml
|
||||
*/
|
||||
tmsTemp['setInnerHtml'] = function(elementId, htmlData){
|
||||
const elId = document.getElementById(elementId);
|
||||
if (elId !== null){
|
||||
document.getElementById(elementId).innerHTML = htmlData;
|
||||
} else {
|
||||
TMS.warn('TMS - Unable to set innerHTML because DOM does not exist! (' + elementId + ')');
|
||||
};
|
||||
};
|
||||
/*
|
||||
END
|
||||
*/
|
||||
const TMS = tmsTemp;
|
||||
delete(tmsTemp);
|
||||
TMS.warn('Unable to get element because it does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
return result;
|
||||
},
|
||||
|
||||
/*
|
||||
Scroll top
|
||||
Usage: elementObjects = {HTML_DOM_ID_0: scrollInt, HTML_DOM_ID_1: scrollInt2} and goes on
|
||||
*/
|
||||
scrollTop: function(elementObjects){
|
||||
Object.keys(elementObjects).forEach(function(elementId){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.scrollTop = elementObjects[elementId];
|
||||
} else {
|
||||
TMS.warn('Unable to scroll element because it does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
});
|
||||
},
|
||||
|
||||
/*
|
||||
Append data
|
||||
*/
|
||||
append: function(elementId, newData){
|
||||
|
||||
var elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.insertAdjacentHTML('beforeend', newData);
|
||||
} else {
|
||||
TMS.warn('Unable to append element data because parent DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Add Class
|
||||
*/
|
||||
addClass: function(elementId, className){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.classList.add(className);
|
||||
} else {
|
||||
TMS.warn('Unable to add class because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Remove Class
|
||||
*/
|
||||
removeClass: function(elementId, className){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
elId.classList.remove(className);
|
||||
} else {
|
||||
TMS.warn('Unable to remove class because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Clear
|
||||
Removes all HTML inside
|
||||
*/
|
||||
clear: function(elementId){
|
||||
const elId = TMS.getElement(elementId);
|
||||
if (elId !== null){
|
||||
elId.innerHTML = '';
|
||||
} else {
|
||||
TMS.warn('Unable to clear inner data because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
triggerClick
|
||||
*/
|
||||
triggerClick: function(elementId){
|
||||
const elId = TMS.getElement(elementId);
|
||||
if (elId !== null){
|
||||
elId.click();
|
||||
} else {
|
||||
TMS.warn('Unable to clear inner data because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
fadeIn
|
||||
*/
|
||||
fadeIn: function(elementId, animationTime){
|
||||
|
||||
const elId = TMS.getElement(elementId),
|
||||
tagType = {
|
||||
'DIV': 'block',
|
||||
'IMG': 'inline'
|
||||
}
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
var dTime = 1000,
|
||||
dMode = 'block',
|
||||
finalOpacity = 1,
|
||||
eStyles = getComputedStyle(elId);
|
||||
|
||||
if (animationTime !== void 0 && animationTime !== NaN){
|
||||
dTime = parseInt(animationTime);
|
||||
if (dTime < 0){
|
||||
dTime = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (tagType[elId.tagType] !== void 0){
|
||||
dMode = tagType[elId.tagType];
|
||||
}
|
||||
if (eStyles.opacity !== '' && parseFloat(eStyles.opacity) !== 0){
|
||||
finalOpacity = eStyles.opacity;
|
||||
}
|
||||
|
||||
TMS.css(elementId, {'display': dMode, 'opacity': 0});
|
||||
|
||||
setTimeout(function(){
|
||||
TMS.css(elementId, {'opacity': finalOpacity, 'transition': 'opacity ' + dTime + 'ms linear 0ms'});
|
||||
}, 10);
|
||||
|
||||
setTimeout(function(){
|
||||
TMS.css(elementId, {'transition': 'none'});
|
||||
}, (dTime + 1));
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to fade in because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
fadeOut
|
||||
*/
|
||||
fadeOut: function(elementId, animationTime){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
var dTime = 1000;
|
||||
|
||||
if (animationTime !== void 0 && animationTime !== NaN){
|
||||
dTime = parseInt(animationTime);
|
||||
if (dTime < 0){
|
||||
dTime = 1;
|
||||
}
|
||||
}
|
||||
|
||||
TMS.css(elementId, {'opacity': '0', 'transition': 'opacity ' + dTime + 'ms'});
|
||||
|
||||
setTimeout(function(){
|
||||
TMS.css(elementId, {'transition': 'none', 'display': 'none'});
|
||||
}, (dTime + 1));
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to fade out because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
scrollCenter
|
||||
*/
|
||||
scrollCenter: function(elementId, delay){
|
||||
|
||||
const elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
var parentDom = elId.parentElement,
|
||||
parentHeight = parentDom.offsetHeight,
|
||||
elHeight = parseFloat(window.getComputedStyle(elId).height.replace('px', ''));
|
||||
|
||||
if (delay === void 0 || parseInt(delay) === NaN){
|
||||
delay = 0;
|
||||
}
|
||||
|
||||
setTimeout(function(){
|
||||
parentDom.scrollTo(0, (elId.offsetTop - ((parentHeight / 2) - (elHeight / 2))));
|
||||
}, delay);
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to scroll because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
setInnerHtml
|
||||
*/
|
||||
setInnerHtml: function(elementId, htmlData){
|
||||
const elId = TMS.getElement(elementId);
|
||||
if (elId !== null && elId.innerHTML !== htmlData){
|
||||
document.getElementById(elementId).innerHTML = htmlData;
|
||||
} else {
|
||||
TMS.warn('Unable to set innerHTML because DOM does not exist or it contains the same innerHTML data (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Remove HTML DOM
|
||||
*/
|
||||
removeDOM: function(elementId){
|
||||
const elId = TMS.getElement(elementId);
|
||||
if (elId !== null){
|
||||
document.getElementById(elementId).remove();
|
||||
} else {
|
||||
TMS.warn('Unable to remove DOM because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Blur element
|
||||
*/
|
||||
blur: function(elementId){
|
||||
const elId = TMS.getElement(elementId);
|
||||
if (elId !== null){
|
||||
document.getElementById(elementId).blur();
|
||||
} else {
|
||||
TMS.warn('Unable to blur DOM because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
},
|
||||
|
||||
/*
|
||||
Get HTML child count
|
||||
*/
|
||||
getChildCount: function(elementId){
|
||||
|
||||
var res = 0,
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
res = document.getElementById(elementId).childElementCount;
|
||||
if (res < 0){
|
||||
res = 0;
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to get html collection because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Get HTML element rect
|
||||
*/
|
||||
getRect: function(elementId){
|
||||
|
||||
var res,
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
res = elId.getBoundingClientRect();
|
||||
} else {
|
||||
TMS.warn('Unable to get rect because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
return res;
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Get HTML dom coords.
|
||||
Get element coords based on parent element
|
||||
|
||||
T: Y
|
||||
L: X
|
||||
W: Width
|
||||
H: Height
|
||||
WL: X Pos. + It's own width
|
||||
TH: Y Pos. + It's own height
|
||||
*/
|
||||
getCoords: function(elementId){
|
||||
|
||||
var res,
|
||||
elId = TMS.getElement(elementId);
|
||||
|
||||
if (elId !== null){
|
||||
|
||||
var top = elId.offsetTop,
|
||||
left = elId.offsetLeft,
|
||||
width = elId.getBoundingClientRect().width,
|
||||
height = elId.getBoundingClientRect().height;
|
||||
|
||||
res = {
|
||||
T: top,
|
||||
L: left,
|
||||
W: width,
|
||||
H: height,
|
||||
WL: parseFloat(width + left),
|
||||
TH: parseFloat(top + height)
|
||||
}
|
||||
|
||||
} else {
|
||||
TMS.warn('Unable to get coords because DOM does not exist! (' + elementId + ')');
|
||||
}
|
||||
|
||||
return res;
|
||||
}
|
||||
|
||||
}));
|
||||
|
||||
// Export
|
||||
exports = TMS;
|
558
App/js/design.js
|
@ -17,7 +17,7 @@ temp_DESIGN = {
|
|||
|
||||
/*
|
||||
Hack List
|
||||
If red-prig implements a new one, just add it on this list!
|
||||
If red-prig implements a new one, just add it here!
|
||||
*/
|
||||
hackList: [
|
||||
'DEPTH_DISABLE_HACK',
|
||||
|
@ -25,74 +25,150 @@ temp_DESIGN = {
|
|||
'MEMORY_BOUND_HACK',
|
||||
'IMAGE_TEST_HACK',
|
||||
'IMAGE_LOAD_HACK',
|
||||
'DISABLE_SRGB_HACK'
|
||||
'DISABLE_SRGB_HACK',
|
||||
'DISABLE_FMV_HACK',
|
||||
'SKIP_UNKNOW_TILING'
|
||||
],
|
||||
|
||||
|
||||
// Game list display modes
|
||||
gameListDisplayModes: ['normal', 'compact', 'grid'],
|
||||
|
||||
// Render hack list
|
||||
renderHacklist: function(){
|
||||
|
||||
var htmlTemp = '';
|
||||
this.hackList.forEach(function(hackName){
|
||||
htmlTemp = htmlTemp + '<input type="checkbox" id="CHECK_' + hackName + '"><label class="LABEL_checkbox" onclick="APP.tools.processCheckbox(\'CHECK_' + hackName +
|
||||
'\');">Enable ' + hackName + '</label><br>';
|
||||
htmlTemp = `${htmlTemp}<input type="checkbox" id="CHECK_${hackName}"><label class="LABEL_checkbox" onclick="APP.tools.processCheckbox(\'CHECK_${hackName}\');">${APP.lang.getVariable('labelEnableHack')} ${hackName}</label><br>`;
|
||||
});
|
||||
|
||||
// Append html
|
||||
// Append html and render gui
|
||||
document.getElementById('DIV_HACK_LIST').innerHTML = htmlTemp;
|
||||
|
||||
// Render GUI
|
||||
this.update();
|
||||
|
||||
},
|
||||
|
||||
// Render label titles
|
||||
renderLabelTitles: function(){
|
||||
// Update GUI lang
|
||||
updateLang: function(){
|
||||
|
||||
// App / game status
|
||||
document.getElementById('DIV_selectedGameStatus').title = 'Green: All files are present\nYellow: Some files are missing - check log for more details\nCyan: Executable is a .elf file';
|
||||
// Update titles
|
||||
Object.keys(APP.lang.selected.title).forEach(function(domId){
|
||||
if (document.getElementById(domId) !== null && APP.lang.selected.title[domId] !== ''){
|
||||
document.getElementById(domId).title = APP.lang.selected.title[domId];
|
||||
}
|
||||
});
|
||||
|
||||
// If current lang isn't english, update remaining GUI
|
||||
if (APP.settings.data.appLanguage !== 'english'){
|
||||
|
||||
// Update input text
|
||||
Object.keys(APP.lang.selected.input_text).forEach(function(domId){
|
||||
if (document.getElementById(domId) !== null){
|
||||
document.getElementById(domId).value = APP.lang.selected.input_text[domId].value;
|
||||
document.getElementById(domId).placeholder = APP.lang.selected.input_text[domId].placeholder;
|
||||
}
|
||||
});
|
||||
|
||||
// Update select
|
||||
Object.keys(APP.lang.selected.select).forEach(function(domId){
|
||||
if (document.getElementById(domId) !== null){
|
||||
|
||||
var optionsHtml = '';
|
||||
Object.keys(APP.lang.selected.select[domId]).forEach(function(option){
|
||||
optionsHtml = `${optionsHtml}<option value="${option}">${APP.lang.selected.select[domId][option]}</option>`;
|
||||
});
|
||||
|
||||
// Append HTML
|
||||
document.getElementById(domId).innerHTML = optionsHtml;
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
// Update innerHTML
|
||||
Object.keys(APP.lang.selected.innerHTML).forEach(function(domId){
|
||||
if (document.getElementById(domId) !== null && APP.lang.selected.innerHTML[domId] !== ''){
|
||||
document.getElementById(domId).innerHTML = APP.lang.selected.innerHTML[domId];
|
||||
}
|
||||
});
|
||||
|
||||
// Update value
|
||||
Object.keys(APP.lang.selected.value).forEach(function(domId){
|
||||
if (document.getElementById(domId) !== null && APP.lang.selected.value[domId] !== ''){
|
||||
document.getElementById(domId).value = APP.lang.selected.value[domId];
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Render game list
|
||||
renderGameList: function(data){
|
||||
|
||||
// Create main vars
|
||||
var tempHtml = '',
|
||||
gList = APP.gameList.list,
|
||||
sQuery = document.getElementById('INPUT_gameListSearch').value;
|
||||
|
||||
if (data === void 0){
|
||||
gList = APP.gameList.list;
|
||||
|
||||
// Check data var
|
||||
if (data === void 0 || typeof data !== 'object'){
|
||||
data = {};
|
||||
}
|
||||
|
||||
// Check custom list
|
||||
if (data.customList !== void 0){
|
||||
gList = data.customList;
|
||||
}
|
||||
|
||||
// Process game list
|
||||
Object.keys(gList).forEach(function(cGame){
|
||||
Object.keys(gList).forEach(function(cGame, cIndex){
|
||||
|
||||
// Settings for display mode: Normal
|
||||
var appTitle = '',
|
||||
gameName = '',
|
||||
gameBgAndIcon,
|
||||
appVersion = '',
|
||||
patchParamSfo = {},
|
||||
gameEntryStyle = '',
|
||||
classDisplayEntryMode = '',
|
||||
appNameClass = 'LABEL_gameTitle',
|
||||
classGameDetailsMode = 'GAME_DETAILS',
|
||||
gameMetadata = '<br>Path: ' + gList[cGame].exe,
|
||||
settingsFile = gList[cGame].settingsFile,
|
||||
gridIconSize = APP.settings.data.gridIconSize,
|
||||
bgPath = 'url(\'' + gList[cGame].bg.replace(RegExp('\'', 'gi'), '\\\'') + '\')';
|
||||
gameMetadata = `<br>${APP.lang.getVariable('path')}: ${gList[cGame].exe}`,
|
||||
bgPath = `url(\'file://${gList[cGame].bg.replace(RegExp('\'', 'gi'), '\\\'')}\')`;
|
||||
|
||||
// Disable background image
|
||||
if (APP.settings.data.showBgOnEntry !== !0){
|
||||
bgPath = 'none';
|
||||
}
|
||||
|
||||
// Background and Icon
|
||||
gameBgAndIcon = '<div class="GAME_ENTRY_BG" style="background-image: ' + bgPath + ';"></div><img class="IMG_GAME_ICON" src="' + gList[cGame].icon + '">';
|
||||
// Check if current entry is the first one
|
||||
if (cIndex === 0){
|
||||
classDisplayEntryMode = ' GAME_ENTRY_FIRST_INDEX';
|
||||
}
|
||||
|
||||
// Set background, icon and check if path is available / active
|
||||
gameBgAndIcon = `<div class="GAME_ENTRY_BG" style="background-image: ${bgPath};"></div><img class="IMG_GAME_ICON" src="file://${gList[cGame].icon}">`;
|
||||
if (Object.keys(settingsFile).length !== 0 && settingsFile.usePatch === !0 && APP.fs.existsSync(`${settingsFile.patchLocation}/sce_sys/param.sfo`) === !0){
|
||||
|
||||
// Get PARAM.SFO patch data and check if PARAM.SFO from patch is loaded and isn't an DLC
|
||||
patchParamSfo = APP.paramSfo.parse(`${settingsFile.patchLocation}/sce_sys/param.sfo`);
|
||||
if (Object.keys(patchParamSfo).keys !== 0 && patchParamSfo.CATEGORY !== 'ac'){
|
||||
appVersion = `<label class="LABEL_emuColor">${patchParamSfo.APP_VER}</label>`;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If PARAM.SFO metadata exists, show serial and game version instead
|
||||
if (Object.keys(gList[cGame].paramSfo).length !== 0){
|
||||
gameMetadata = '<br>' + gList[cGame].paramSfo.TITLE_ID + ' - Version ' + gList[cGame].paramSfo.APP_VER;
|
||||
|
||||
// If patch isn't enabled or patch location does not exists but is enabled
|
||||
if (settingsFile.usePatch !== !0 || settingsFile.usePatch === !0 && APP.fs.existsSync(`${settingsFile.patchLocation}/sce_sys/param.sfo`) !== !0){
|
||||
appVersion = gList[cGame].paramSfo.APP_VER;
|
||||
}
|
||||
|
||||
// Set game data
|
||||
gameMetadata = `<br>${gList[cGame].paramSfo.TITLE_ID} - ${APP.lang.getVariable('gameListVersion')} ${appVersion}`;
|
||||
|
||||
}
|
||||
|
||||
// Settings: Show App / Game version (or executable path) for every title in game list
|
||||
|
@ -108,42 +184,58 @@ temp_DESIGN = {
|
|||
gameMetadata = '';
|
||||
gameBgAndIcon = '';
|
||||
appNameClass = 'LABEL_gameTitleCompact';
|
||||
classDisplayEntryMode = ' GAME_ENTRY_COMPACT';
|
||||
classDisplayEntryMode = `${classDisplayEntryMode} GAME_ENTRY_COMPACT`;
|
||||
classGameDetailsMode = 'GAME_DETAILS GAME_DETAILS_COMPACT';
|
||||
|
||||
// Check if PARAM.SFO is available
|
||||
if (Object.keys(gList[cGame].paramSfo).length !== 0){
|
||||
gameMetadata = `<div class="float-right">${gList[cGame].paramSfo.TITLE_ID} - ${APP.lang.getVariable('gameListVersion')} ${appVersion}</div>`;
|
||||
}
|
||||
|
||||
// Check if is Homebrew
|
||||
if (gList[cGame].isHomebrew === !0){
|
||||
gameMetadata = '<div class="float-right">Homebrew</div>';
|
||||
}
|
||||
break;
|
||||
|
||||
// Display mode: Grid
|
||||
case 'grid':
|
||||
|
||||
// Check if is Homebrew
|
||||
if (gList[cGame].isHomebrew === !0){
|
||||
appVersion = 'HB';
|
||||
}
|
||||
|
||||
classGameDetailsMode = '';
|
||||
appTitle = gList[cGame].name;
|
||||
classGameDetailsMode = 'none';
|
||||
classDisplayEntryMode = ' GAME_ENTRY_GRID';
|
||||
gameEntryStyle = 'border-radius: ' + APP.settings.data.gridBorderRadius + 'px;'
|
||||
gameBgAndIcon = '<div class="none" style="background-image: ' + bgPath + '";></div><img class="IMG_GAME_ICON IMG_GRID" style="width: ' + gridIconSize + 'px;" src="' + gList[cGame].icon + '">';
|
||||
gameMetadata = `<div class="GAME_DETAILS_GRID">${appVersion}</div>`;
|
||||
gameEntryStyle = `border-radius: ${APP.settings.data.gridBorderRadius}px;`;
|
||||
gameBgAndIcon = `<div class="none" style="background-image: ${bgPath};"></div><img class="IMG_GAME_ICON IMG_GRID" style="width: ${gridIconSize}px;" src="file://${gList[cGame].icon}">`;
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
Add entry
|
||||
*/
|
||||
tempHtml = tempHtml + '<div class="GAME_ENTRY' + classDisplayEntryMode + '" title="' + appTitle + '" style="' + gameEntryStyle + '" onclick="APP.design.selectGame(\'' + cGame + '\');" id="GAME_ENTRY_' + cGame + '">' +
|
||||
gameBgAndIcon + '<div class="' + classGameDetailsMode + '"><label class="' + appNameClass + '">' + gList[cGame].name + '</label>' + gameMetadata + '</div></div>';
|
||||
// Fix for non-grid mode and add entry
|
||||
if (APP.settings.data.gameListMode !== 'grid'){
|
||||
gameName = `<label class="${appNameClass}">${gList[cGame].name}</label>`;
|
||||
}
|
||||
tempHtml = `${tempHtml}<div class="GAME_ENTRY${classDisplayEntryMode}" title="${appTitle}" style="${gameEntryStyle}" onclick="APP.design.selectGame(\'${cGame}\');" id="GAME_ENTRY_${cGame}">${gameBgAndIcon}<div class="${classGameDetailsMode}">${gameName + gameMetadata}</div></div>`;
|
||||
|
||||
});
|
||||
|
||||
// Insert HTML
|
||||
// Insert HTML and log status
|
||||
document.getElementById('DIV_LIST_INTERNAL').innerHTML = tempHtml;
|
||||
|
||||
// Log status
|
||||
if (data.displayLog !== !1){
|
||||
APP.log('INFO - Game list was loaded sucessfully! (' + Object.keys(gList).length + ' entries found)');
|
||||
APP.log(APP.lang.getVariable('gameListLoadSuccessful', [Object.keys(gList).length]));
|
||||
}
|
||||
|
||||
// Clear BG image
|
||||
TMS.css('DIV_GAMELIST_BG', {'background-image': 'none'});
|
||||
TMS.css('DIV_GAMELIST_BG', { 'background-image': 'none' });
|
||||
TMS.css('DIV_GAME_DETAILS', { 'display': 'none' });
|
||||
|
||||
// Focus search field
|
||||
// Focus search field and update GUI
|
||||
TMS.focus('INPUT_gameListSearch');
|
||||
|
||||
// Update GUI
|
||||
this.update();
|
||||
|
||||
},
|
||||
|
@ -155,16 +247,16 @@ temp_DESIGN = {
|
|||
this.gamePatchLoaded = !1;
|
||||
|
||||
var hList = {},
|
||||
updatesettingsFile = !1,
|
||||
gData = APP.gameList.list[gameName],
|
||||
folderName = gData.folderName,
|
||||
exportButtonStatus = 'disabled',
|
||||
settingsFile = APP.settings.data.gamePath + '/' + folderName + '/launcherSettings.json';
|
||||
settingsFile = `${APP.settings.data.gamePath}/${folderName}/launcherSettings.json`;
|
||||
|
||||
if (gData !== void 0){
|
||||
|
||||
// Select game and update GUI
|
||||
APP.gameList.selectedGame = gameName;
|
||||
APP.gameList.checkDumpStatus();
|
||||
APP.gameList.checkGameStatus();
|
||||
|
||||
// Check if game config exists
|
||||
if (APP.fs.existsSync(settingsFile) === !1){
|
||||
|
@ -183,6 +275,8 @@ temp_DESIGN = {
|
|||
patchLocation: '',
|
||||
path: settingsFile,
|
||||
importedModules: [],
|
||||
gamepadMode: 'xinput',
|
||||
gPadLedColor: '5232E6',
|
||||
isHomebrew: gData.isHomebrew
|
||||
});
|
||||
|
||||
|
@ -192,9 +286,20 @@ temp_DESIGN = {
|
|||
const gSettings = JSON.parse(APP.fs.readFileSync(settingsFile, 'utf-8'));
|
||||
APP.gameList.cGameSettings = gSettings;
|
||||
|
||||
// Set hacks
|
||||
// Check if settings file has all available hacks - if so, set flag to update settings file
|
||||
this.hackList.forEach(function(cHack){
|
||||
if (gSettings.hacks[cHack] === void 0){
|
||||
updatesettingsFile = !0;
|
||||
document.getElementById(`CHECK_${cHack}`).checked = !1;
|
||||
}
|
||||
});
|
||||
if (updatesettingsFile === !0){
|
||||
APP.gameList.saveGameSettings();
|
||||
}
|
||||
|
||||
// Enable / disable selected hacks on settings file
|
||||
Object.keys(gSettings.hacks).forEach(function(hackName){
|
||||
document.getElementById('CHECK_' + hackName).checked = JSON.parse(gSettings.hacks[hackName]);
|
||||
document.getElementById(`CHECK_${hackName}`).checked = JSON.parse(gSettings.hacks[hackName]);
|
||||
});
|
||||
|
||||
// Load patch data
|
||||
|
@ -204,27 +309,38 @@ temp_DESIGN = {
|
|||
// Try reading PARAM.SFO
|
||||
try {
|
||||
|
||||
const paramSfoMetadata = APP.paramSfo.parse(gSettings.patchLocation + '/sce_sys/param.sfo');
|
||||
// Get PARAM.SFO data
|
||||
var paramSfoMetadata = APP.paramSfo.parse(`${gSettings.patchLocation}/sce_sys/param.sfo`),
|
||||
patchVersion = paramSfoMetadata.VERSION;
|
||||
|
||||
// Update GUI
|
||||
document.getElementById('LABEL_launcherOptionsPatchTitle').innerHTML = paramSfoMetadata.TITLE;
|
||||
document.getElementById('LABEL_launcherOptionsPatchVersion').innerHTML = paramSfoMetadata.VERSION;
|
||||
// If App version is available, show it instead
|
||||
if (paramSfoMetadata.APP_VER !== void 0){
|
||||
patchVersion = paramSfoMetadata.APP_VER;
|
||||
}
|
||||
|
||||
// Update GUI and set patch loaded flag
|
||||
document.getElementById('LABEL_launcherOptionsPatchVersion').innerHTML = patchVersion;
|
||||
document.getElementById('LABEL_launcherOptionsPatchType').innerHTML = APP.paramSfo.database.DB_CATEGORY[paramSfoMetadata.CATEGORY];
|
||||
|
||||
APP.design.gamePatchLoaded = !0;
|
||||
|
||||
} catch (err) {
|
||||
|
||||
console.error(err);
|
||||
APP.log('ERROR - Unable to read PARAM.SFO from this patch!\n' + err);
|
||||
APP.log(APP.lang.getVariable('selectGameLoadPatchErrorParamSfo', [err]));
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Load gamepad mode and led color
|
||||
if (gSettings.gamepadMode === void 0){
|
||||
gSettings.gamepadMode = 'xinput';
|
||||
}
|
||||
document.getElementById('INPUT_cGameLedColor').value = `#${gSettings.gPadLedColor}`;
|
||||
document.getElementById('FPPS4_OPTIONS_SELECT_GAMEPAD_MODE').value = gSettings.gamepadMode;
|
||||
|
||||
// Update GUI
|
||||
APP.design.update();
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
@ -235,40 +351,35 @@ temp_DESIGN = {
|
|||
// Update background image
|
||||
const sGame = APP.gameList.list[APP.gameList.selectedGame];
|
||||
if (sGame !== '' && sGame !== void 0){
|
||||
TMS.css('DIV_GAMELIST_BG', {'background-image': 'url("' + sGame.bg + '")'});
|
||||
TMS.css('DIV_GAMELIST_BG', { 'background-image': `url(\"file://${sGame.bg}\")` });
|
||||
}
|
||||
|
||||
// Check if emu is present before allowing to run
|
||||
if (APP.fs.existsSync(APP.settings.data.emuPath) === !0 && APP.gameList.selectedGame !== ''){
|
||||
|
||||
var btnRun = '',
|
||||
btnLog = '',
|
||||
btnRefresh = '',
|
||||
btnSettings = '',
|
||||
// Create main vars
|
||||
var btnDisabled = '',
|
||||
btnKill = 'disabled',
|
||||
logDisplay = 'block',
|
||||
emuRunPath = 'block',
|
||||
disableGridIconSize = '',
|
||||
bgBlur = APP.settings.data.bgListBlur,
|
||||
showGuiMetadata = {'display': 'none'},
|
||||
bgOpacity = APP.settings.data.bgListOpacity,
|
||||
optionsCss = {'height': 'calc(100% - 214px)', 'display': 'block'},
|
||||
listCss = {'width': 'calc(100% - 280px)', 'height': 'calc(100% - 202px)'};
|
||||
logCss = {'display' :'block', 'width': 'calc(100% - 300px)'},
|
||||
optionsCss = {'height': 'calc(100% - 50px)', 'display': 'block'},
|
||||
listCss = {'width': 'calc(100% - 300px)', 'height': 'calc(100% - 164px)'};
|
||||
|
||||
// If emu is running
|
||||
if (APP.emuManager.emuRunning === !0){
|
||||
|
||||
|
||||
btnKill = '';
|
||||
btnLog = 'disabled';
|
||||
btnRun = 'disabled';
|
||||
logDisplay = 'none';
|
||||
btnRefresh = 'disabled';
|
||||
btnSettings = 'disabled';
|
||||
disableGridIconSize = 'disabled';
|
||||
btnDisabled = 'disabled';
|
||||
bgBlur = APP.settings.data.bgEmuBlur;
|
||||
showGuiMetadata = {'display': 'flex'};
|
||||
bgOpacity = APP.settings.data.bgEmuOpacity;
|
||||
logCss = {'display' :'none', 'width': '100%'};
|
||||
optionsCss = {'height': '350px', 'display': 'none'};
|
||||
listCss = {'width': '100%', 'height': 'calc(100% - 38px)'};
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Show / Hide path on game run
|
||||
|
@ -277,23 +388,27 @@ temp_DESIGN = {
|
|||
}
|
||||
|
||||
// Update GUI
|
||||
TMS.css('DIV_LOG', logCss);
|
||||
TMS.css('DIV_LIST', listCss);
|
||||
TMS.css('DIV_OPTIONS', optionsCss);
|
||||
TMS.css('DIV_LOG', {'display': logDisplay});
|
||||
TMS.css('DIV_GAME_DETAILS_currentExec', {'display': emuRunPath});
|
||||
TMS.css('DIV_GAMELIST_BG', {'filter': 'blur(' + bgBlur + 'px) opacity(' + bgOpacity + ')'});
|
||||
|
||||
TMS.css('DIV_GAME_DETAILS', showGuiMetadata);
|
||||
TMS.css('DIV_GAME_DETAILS_currentExec', { 'display': emuRunPath });
|
||||
TMS.css('DIV_GAMELIST_BG', {'filter': `blur(${bgBlur}px) opacity(${bgOpacity})`});
|
||||
|
||||
// Update Buttons
|
||||
document.getElementById('BTN_RUN').disabled = btnRun;
|
||||
document.getElementById('BTN_KILL').disabled = btnKill;
|
||||
document.getElementById('BTN_CLEAR_LOG').disabled = btnLog;
|
||||
document.getElementById('BTN_REFRESH').disabled = btnRefresh;
|
||||
document.getElementById('BTN_SETTINGS').disabled = btnSettings;
|
||||
document.getElementById('INPUT_gameListSearch').disabled = btnRun;
|
||||
document.getElementById('RANGE_settingsGridIconSize').disabled = disableGridIconSize;
|
||||
if (APP.os.platform() === 'win32'){
|
||||
document.getElementById('BTN_KILL').disabled = btnKill;
|
||||
}
|
||||
document.getElementById('BTN_RUN').disabled = btnDisabled;
|
||||
document.getElementById('BTN_REFRESH').disabled = btnDisabled;
|
||||
document.getElementById('BTN_SETTINGS').disabled = btnDisabled;
|
||||
document.getElementById('BTN_CLEAR_LOG').disabled = btnDisabled;
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = btnDisabled;
|
||||
document.getElementById('INPUT_gameListSearch').disabled = btnDisabled;
|
||||
|
||||
} else {
|
||||
|
||||
TMS.css('DIV_LOG', {'width': '100%'});
|
||||
TMS.css('DIV_LIST', {'width': '100%'});
|
||||
TMS.css('DIV_OPTIONS', {'display': 'none'});
|
||||
|
||||
|
@ -310,8 +425,10 @@ temp_DESIGN = {
|
|||
var cGame = APP.gameList.list[APP.gameList.selectedGame],
|
||||
exportButtonStatus = 'disabled',
|
||||
displayPatchContainer = 'none',
|
||||
displayGameVersion = 'none',
|
||||
gName = 'No game selected',
|
||||
displayPatchData = 'none';
|
||||
displayPatchData = 'none',
|
||||
cGameVersion = '';
|
||||
|
||||
// If no game is selected, disable run button
|
||||
if (APP.gameList.selectedGame === ''){
|
||||
|
@ -321,26 +438,36 @@ temp_DESIGN = {
|
|||
// If selected game exists
|
||||
if (cGame !== void 0){
|
||||
|
||||
// Set game name
|
||||
gName = '<div class="LABEL_gameTitleOptions">' + cGame.name + '</div>';
|
||||
|
||||
// If PARAM.SFO exists for selected game
|
||||
// Set game name and check if param.sfo exists for current title
|
||||
gName = `<div class="LABEL_gameTitleOptions">${cGame.name}</div>`;
|
||||
if (Object.keys(cGame.paramSfo).length !== 0){
|
||||
|
||||
// Enable GUI
|
||||
exportButtonStatus = '';
|
||||
gName = '<div class="LABEL_gameTitleOptions">' + cGame.name + '</div><br><label class="user-can-select">' + cGame.paramSfo.TITLE_ID + '</label>';
|
||||
displayGameVersion = 'block';
|
||||
|
||||
// Set data
|
||||
cGameVersion = cGame.paramSfo.APP_VER;
|
||||
gName = `<div class="LABEL_gameTitleOptions">${cGame.name}</div><br><label class="user-can-select">${cGame.paramSfo.TITLE_ID}</label>`;
|
||||
|
||||
}
|
||||
|
||||
// (SDL2) Display led color
|
||||
var displayLedColorGui = { 'display': 'none' };
|
||||
if (APP.gameList.cGameSettings.gamepadMode === 'sdl2' && APP.settings.data.sdlEnableGamepadLed === !0){
|
||||
displayLedColorGui.display = 'block';
|
||||
}
|
||||
TMS.css('DIV_sdlSelectGamepadColor', displayLedColorGui);
|
||||
|
||||
// If app / game patch is enabled, show metadata
|
||||
if (APP.gameList.cGameSettings.usePatch === !0){
|
||||
displayPatchContainer = 'block';
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Enable / disable export metadata
|
||||
|
||||
// Enable / disable export metadata and show / hide patch
|
||||
document.getElementById('BTN_launcherOptionsExportMetadata').disabled = exportButtonStatus;
|
||||
|
||||
// Show / hide patch
|
||||
TMS.css('DIV_launcherOptionsPatchVersion', {'display': displayPatchContainer});
|
||||
|
||||
// Show / hide patch details
|
||||
|
@ -349,10 +476,10 @@ temp_DESIGN = {
|
|||
}
|
||||
TMS.css('DIV_launcherOptionsPatchVersionMetadata', {'display': displayPatchData});
|
||||
|
||||
// Render current game name
|
||||
// Render current game name, version and settings
|
||||
document.getElementById('DIV_labelSelectedGame').innerHTML = gName;
|
||||
|
||||
// Render Settings
|
||||
document.getElementById('LABEL_FPPS4_OPTIONS_APP_VER').innerHTML = cGameVersion;
|
||||
TMS.css('DIV_FPPS4_OPTIONS_APP_VERSION', {'display': displayGameVersion});
|
||||
this.renderSettings();
|
||||
|
||||
},
|
||||
|
@ -360,54 +487,96 @@ temp_DESIGN = {
|
|||
// Change game list to display mode
|
||||
toggleDisplayMode: function(gameData){
|
||||
|
||||
// Check if game data exists
|
||||
if (gameData !== void 0){
|
||||
|
||||
var gameDetails = {'display': 'flex'},
|
||||
gameMetadata = 'Path: <label class="user-can-select">' + gameData.appPath + '</label>',
|
||||
listInternal = {'transition': '0.4s', 'filter': 'blur(' + APP.settings.data.bgEmuBlur +'px) opacity(' + APP.settings.data.bgEmuOpacity + ')'};
|
||||
|
||||
|
||||
// Declare default var
|
||||
var gameVersion = '',
|
||||
patchParamSfo = {},
|
||||
disableGridIconSize = '',
|
||||
gameDetails = { 'display': 'flex' },
|
||||
displayListMode = { 'display': 'flex' },
|
||||
usePatch = APP.gameList.cGameSettings.usePatch,
|
||||
patchLocation = APP.gameList.cGameSettings.patchLocation,
|
||||
gameMetadata = `${APP.lang.getVariable('path')}: <label class="user-can-select">${gameData.appPath}</label>`,
|
||||
listInternal = {
|
||||
'transition': '0.4s',
|
||||
'filter': `blur(${APP.settings.data.bgEmuBlur}px) opacity(${APP.settings.data.bgEmuOpacity})`
|
||||
};
|
||||
|
||||
// If emu isn't running
|
||||
if (APP.emuManager.emuRunning === !1){
|
||||
|
||||
gameDetails = {'display': 'none'};
|
||||
listInternal = {'transition': 'none', 'filter': 'blur(' + APP.settings.data.bgListBlur +'px) opacity(' + APP.settings.data.bgListOpacity + ')'};
|
||||
APP.design.renderGameList();
|
||||
// Update CSS
|
||||
gameDetails = { 'display': 'none' };
|
||||
listInternal = {
|
||||
'transition': 'none',
|
||||
'filter': `blur(${APP.settings.data.bgListBlur}px) opacity(${APP.settings.data.bgListOpacity})`
|
||||
};
|
||||
|
||||
// Restore app title
|
||||
document.title = APP.title;
|
||||
APP.design.renderGameList();
|
||||
APP.design.updateLauncherSettingsGUI();
|
||||
|
||||
// Reset log color
|
||||
TMS.css('APP_LOG', {
|
||||
'color': '#0f0',
|
||||
'background-image': 'linear-gradient(180deg, #000000db, #090f1b)'
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
// Clear search input
|
||||
// Disable grid size, update app title and hide game metadata
|
||||
disableGridIconSize = 'disabled';
|
||||
displayListMode.display = 'none';
|
||||
TMS.css('DIV_LIST', { 'top': '0px', 'height': '100%' });
|
||||
document.title = `${APP.title} - ${APP.lang.getVariable('logWindowTitle')} [ ${APP.gameList.selectedGame} ]`;
|
||||
if (APP.settings.data.showGuiMetadata === !1){
|
||||
gameDetails.display = 'none';
|
||||
}
|
||||
|
||||
// Clear search input and disable display mode buttons
|
||||
document.getElementById('INPUT_gameListSearch').value = '';
|
||||
APP.design.gameListDisplayModes.forEach(function(cMode){
|
||||
document.getElementById(`BTN_displayMode_${cMode}`).disabled = 'disabled';
|
||||
});
|
||||
|
||||
// Check if PARAM.SFO patch exists
|
||||
if (APP.fs.existsSync(patchLocation) === !0){
|
||||
patchParamSfo = APP.paramSfo.parse(`${patchLocation}/sce_sys/param.sfo`);
|
||||
}
|
||||
if (Object.keys(patchParamSfo).length !== 0 && usePatch === !0){
|
||||
gameVersion = `<label class="LABEL_emuColor">${patchParamSfo.APP_VER}</label>`;
|
||||
}
|
||||
|
||||
// If PARAM.SFO metadata exists, display serial and game version instead
|
||||
if (Object.keys(gameData.paramSfo).length !== 0){
|
||||
gameMetadata = gameData.paramSfo.TITLE_ID + ' - Version ' + gameData.paramSfo.APP_VER;
|
||||
|
||||
// Check if patch is enabled
|
||||
if (usePatch !== !0){
|
||||
gameVersion = gameData.paramSfo.APP_VER;
|
||||
}
|
||||
|
||||
// Set new game data
|
||||
gameMetadata = `${gameData.paramSfo.TITLE_ID} - ${APP.lang.getVariable('gameListVersion')} ${gameVersion}`;
|
||||
}
|
||||
|
||||
|
||||
// Clear game list
|
||||
document.getElementById('DIV_LIST_INTERNAL').innerHTML = '';
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Fix undefined path
|
||||
if (gameData.appIcon === void 0){
|
||||
gameData.appIcon = APP.settings.data.nwPath + '/App/img/404.png';
|
||||
gameData.appIcon = `file://${APP.settings.data.nwPath}/App/img/404.png`;
|
||||
}
|
||||
|
||||
// Set game metadata
|
||||
document.getElementById('IMG_APP_ICON').src = gameData.appIcon;
|
||||
document.getElementById('IMG_APP_ICON').src = `file://${gameData.appIcon}`;
|
||||
document.getElementById('DIV_GAME_DETAILS_currentExec').innerHTML = gameMetadata;
|
||||
document.getElementById('LABEL_GAME_DETAILS_STATUS').innerHTML = gameData.appStatus;
|
||||
document.getElementById('LABEL_GAME_DETAILS_APP_NAME').innerHTML = gameData.appName;
|
||||
|
||||
document.getElementById('RANGE_settingsGridIconSize').disabled = disableGridIconSize;
|
||||
|
||||
// Set CSS
|
||||
TMS.css('DIV_GAMELIST_BG', listInternal);
|
||||
TMS.css('DIV_GAME_DETAILS', gameDetails);
|
||||
TMS.css('BTN_displayMode_holder', displayListMode);
|
||||
|
||||
}
|
||||
|
||||
|
@ -416,29 +585,20 @@ temp_DESIGN = {
|
|||
// Display / Hide Settings
|
||||
toggleSettings: function(hide){
|
||||
|
||||
// Reset selected game
|
||||
APP.gameList.selectedGame = '';
|
||||
|
||||
var showList = ['DIV_SETTINGS'],
|
||||
hideList = [
|
||||
'DIV_ACTIONS',
|
||||
'DIV_OPTIONS',
|
||||
'DIV_LIST',
|
||||
'DIV_LOG'
|
||||
];
|
||||
hideList = [];
|
||||
|
||||
// Close settings
|
||||
if (hide === !0){
|
||||
|
||||
hideList = ['DIV_SETTINGS'];
|
||||
showList = [
|
||||
'DIV_ACTIONS',
|
||||
'DIV_OPTIONS',
|
||||
'DIV_LIST',
|
||||
'DIV_LOG'
|
||||
];
|
||||
showList = [];
|
||||
|
||||
// Render game list
|
||||
// Render game list and update GUI
|
||||
APP.design.renderGameList();
|
||||
|
||||
// Update GUI
|
||||
APP.design.update();
|
||||
|
||||
}
|
||||
|
@ -470,9 +630,25 @@ temp_DESIGN = {
|
|||
APP.design.saveSettings(requestSave);
|
||||
}
|
||||
|
||||
// Shortcut
|
||||
// Create shortcut const and get lang files
|
||||
const cSettings = APP.settings.data;
|
||||
|
||||
var langSelectHtml = '<option value="english">English (Default)</option>',
|
||||
langList = APP.fs.readdirSync(`${APP.settings.data.nwPath}/Lang`);
|
||||
|
||||
// Process file list
|
||||
langList.forEach(function(cEntry){
|
||||
|
||||
// Check if file extension is json. If so, include on lang list
|
||||
if (APP.path.parse(cEntry).ext.toLowerCase() === '.json'){
|
||||
const getLangInfo = JSON.parse(APP.fs.readFileSync(`${APP.settings.data.nwPath}/Lang/${cEntry}`, 'utf-8'));
|
||||
langSelectHtml = `${langSelectHtml}<option value="${APP.path.parse(cEntry).name}">${getLangInfo.lang}</option>`;
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Append Language list
|
||||
document.getElementById('SELECT_settingsLanguage').innerHTML = langSelectHtml;
|
||||
|
||||
// Labels
|
||||
document.getElementById('LBL_SETTINGS_emuPath').innerHTML = cSettings.emuPath
|
||||
document.getElementById('LBL_SETTINGS_gamePath').innerHTML = cSettings.gamePath;
|
||||
|
@ -480,11 +656,12 @@ temp_DESIGN = {
|
|||
document.getElementById('LABEL_settingsEmuRunningBgBlur').innerHTML = APP.tools.parsePercentage(cSettings.bgEmuBlur, 6);
|
||||
document.getElementById('LABEL_settingsGameListBgOpacity').innerHTML = APP.tools.parsePercentage(cSettings.bgListOpacity, 1);
|
||||
document.getElementById('LABEL_settingsEmuRunningBgOpacity').innerHTML = APP.tools.parsePercentage(cSettings.bgEmuOpacity, 1);
|
||||
document.getElementById('LABEL_settingsGridBorderRadius').innerHTML = APP.tools.parsePercentage(cSettings.gridBorderRadius, 26);
|
||||
document.getElementById('LABEL_settingsGridBorderRadius').innerHTML = APP.tools.parsePercentage(cSettings.gridBorderRadius, 15);
|
||||
|
||||
// Select
|
||||
document.getElementById('SELECT_settingsDisplayMode').value = cSettings.gameListMode;
|
||||
document.getElementById('SELECT_settingsLanguage').value = cSettings.appLanguage;
|
||||
document.getElementById('SELECT_settingsSearchMode').value = cSettings.gameSearchMode;
|
||||
document.getElementById('SELECT_settingsUpdaterCurrentCI').value = cSettings.fpps4selectedCI;
|
||||
document.getElementById('SELECT_settingsStartExternalWindow').value = cSettings.logExternalWindowStartMode;
|
||||
|
||||
// Checkbox
|
||||
|
@ -492,60 +669,93 @@ temp_DESIGN = {
|
|||
document.getElementById('CHECKBOX_settingsEnableParamSfo').checked = JSON.parse(cSettings.enableParamSfo);
|
||||
document.getElementById('CHECKBOX_settingsShowExecRunning').checked = JSON.parse(cSettings.showPathRunning);
|
||||
document.getElementById('CHECKBOX_settingsShowBgOnGameEntry').checked = JSON.parse(cSettings.showBgOnEntry);
|
||||
document.getElementById('CHECKBOX_settingsShowGameMetadata').checked = JSON.parse(cSettings.showGuiMetadata);
|
||||
document.getElementById('CHECKBOX_settingsEnableFpps4Updates').checked = JSON.parse(cSettings.enableEmuUpdates);
|
||||
document.getElementById('CHECKBOX_settingsStartEmuFullscreen').checked = JSON.parse(cSettings.enableEmuFullscreen);
|
||||
document.getElementById('CHECKBOX_enableCompatStatusCheck').checked = JSON.parse(cSettings.enableCompatStatusCheck);
|
||||
document.getElementById('CHECKBOX_settingsGameSearchCaseSensitive').checked = JSON.parse(cSettings.searchCaseSensitive);
|
||||
document.getElementById('CHECKBOX_settingsExternalWindowPrompt').checked = JSON.parse(cSettings.logExternalWindowPrompt);
|
||||
document.getElementById('CHECKBOX_settingsEnableChangeGamepadLedColor').checked = JSON.parse(cSettings.sdlEnableGamepadLed);
|
||||
|
||||
// Debug
|
||||
document.getElementById('CHECKBOX_settingsExperimentalIntLog').checked = JSON.parse(cSettings.debugTestLog);
|
||||
|
||||
// Range
|
||||
document.getElementById('RANGE_settingsGridIconSize').value = cSettings.gridIconSize;
|
||||
document.getElementById('RANGE_settingsGuiZoomScale').value = cSettings.guiZoomScale;
|
||||
document.getElementById('RANGE_settingsGameListBgBlur').value = cSettings.bgListBlur;
|
||||
document.getElementById('RANGE_settingsEmuRunningBgBlur').value = cSettings.bgEmuBlur;
|
||||
document.getElementById('RANGE_settingsGameListBgOpacity').value = cSettings.bgListOpacity;
|
||||
document.getElementById('RANGE_settingsEmuRunningBgOpacity').value = cSettings.bgEmuOpacity;
|
||||
document.getElementById('RANGE_settingsGridIconBorderRadius').value = cSettings.gridBorderRadius;
|
||||
|
||||
// Fix for grid size
|
||||
// Text
|
||||
document.getElementById('INPUT_settingsUpdateFpps4Branch').value = cSettings.fpps4BranchName;
|
||||
|
||||
// Fix for grid size / border-radius
|
||||
if (cSettings.gridIconSize > 512){
|
||||
cSettings.gridIconSize = 512;
|
||||
}
|
||||
if (cSettings.gridBorderRadius > 15){
|
||||
cSettings.gridBorderRadius = 15;
|
||||
}
|
||||
|
||||
// Check if needs to disable options if current os isn't windows
|
||||
if (APP.os.platform() !== 'win32'){
|
||||
document.getElementById('CHECKBOX_settingsExternalWindowPrompt').disabled = !0;
|
||||
}
|
||||
|
||||
// Update settings GUI
|
||||
this.updateLauncherSettingsGUI();
|
||||
|
||||
},
|
||||
|
||||
// Update settings GUI without loading / save data
|
||||
updateLauncherSettingsGUI: function(){
|
||||
|
||||
// Grid options
|
||||
var cDisplayMode = document.getElementById('SELECT_settingsDisplayMode').value;
|
||||
switch (cDisplayMode) {
|
||||
// Variables
|
||||
var guiZoomScale = APP.settings.data.guiZoomScale,
|
||||
cDisplayMode = APP.settings.data.gameListMode,
|
||||
gListMode = { 'top': '0px', 'height': 'calc(100% - 164px)' };
|
||||
extraCss = '<style>div.DIV_LIST_INTERNAL::-webkit-scrollbar-track { margin: 50px 0px 14px 0px; }</style>';
|
||||
|
||||
// Switch options
|
||||
switch (cDisplayMode){
|
||||
|
||||
case 'normal':
|
||||
TMS.css('DIV_settingsGridOptions', {'display': 'none'});
|
||||
TMS.css('RANGE_settingsGridIconSize', {'display': 'none'});
|
||||
document.getElementById('RANGE_settingsGridIconSize').disabled = 'disabled';
|
||||
TMS.css('DIV_settingsShowBgOnGameEntry', {'display': 'flex'});
|
||||
break;
|
||||
|
||||
case 'compact':
|
||||
TMS.css('RANGE_settingsGridIconSize', {'display': 'none'});
|
||||
document.getElementById('RANGE_settingsGridIconSize').disabled = 'disabled';
|
||||
break;
|
||||
|
||||
case 'grid':
|
||||
TMS.css('DIV_settingsGridOptions', {'display': 'block'});
|
||||
extraCss = '';
|
||||
gListMode = { 'top': '38px', 'height': 'calc(100% - 202px)' };
|
||||
TMS.css('DIV_settingsShowBgOnGameEntry', {'display': 'none'});
|
||||
TMS.css('RANGE_settingsGridIconSize', {'display': 'inline-block'});
|
||||
document.getElementById('RANGE_settingsGridIconSize').disabled = '';
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// Update display modes and update zoom scale
|
||||
TMS.css('DIV_LIST', gListMode);
|
||||
document.getElementById('DIV_EXTRA_CSS').innerHTML = extraCss;
|
||||
this.gameListDisplayModes.forEach(function(cMode){
|
||||
document.getElementById(`BTN_displayMode_${cMode}`).disabled = '';
|
||||
});
|
||||
document.getElementById(`BTN_displayMode_${cDisplayMode}`).disabled = 'disabled';
|
||||
document.body.style.zoom = guiZoomScale;
|
||||
|
||||
},
|
||||
|
||||
// Save user settings
|
||||
saveSettings: function(skipCloseSettings){
|
||||
|
||||
// Select
|
||||
APP.settings.data.gameListMode = document.getElementById('SELECT_settingsDisplayMode').value;
|
||||
APP.settings.data.appLanguage = document.getElementById('SELECT_settingsLanguage').value;
|
||||
APP.settings.data.gameSearchMode = document.getElementById('SELECT_settingsSearchMode').value;
|
||||
APP.settings.data.fpps4selectedCI = document.getElementById('SELECT_settingsUpdaterCurrentCI').value;
|
||||
APP.settings.data.logExternalWindowStartMode = document.getElementById('SELECT_settingsStartExternalWindow').value;
|
||||
|
||||
// Checkbox
|
||||
|
@ -553,29 +763,83 @@ temp_DESIGN = {
|
|||
APP.settings.data.enableParamSfo = JSON.parse(document.getElementById('CHECKBOX_settingsEnableParamSfo').checked);
|
||||
APP.settings.data.showBgOnEntry = JSON.parse(document.getElementById('CHECKBOX_settingsShowBgOnGameEntry').checked);
|
||||
APP.settings.data.showPathRunning = JSON.parse(document.getElementById('CHECKBOX_settingsShowExecRunning').checked);
|
||||
APP.settings.data.showGuiMetadata = JSON.parse(document.getElementById('CHECKBOX_settingsShowGameMetadata').checked);
|
||||
APP.settings.data.enableEmuUpdates = JSON.parse(document.getElementById('CHECKBOX_settingsEnableFpps4Updates').checked);
|
||||
APP.settings.data.enableEmuFullscreen = JSON.parse(document.getElementById('CHECKBOX_settingsStartEmuFullscreen').checked);
|
||||
APP.settings.data.enableCompatStatusCheck = JSON.parse(document.getElementById('CHECKBOX_enableCompatStatusCheck').checked);
|
||||
APP.settings.data.searchCaseSensitive = JSON.parse(document.getElementById('CHECKBOX_settingsGameSearchCaseSensitive').checked);
|
||||
APP.settings.data.logExternalWindowPrompt = JSON.parse(document.getElementById('CHECKBOX_settingsExternalWindowPrompt').checked);
|
||||
APP.settings.data.sdlEnableGamepadLed = JSON.parse(document.getElementById('CHECKBOX_settingsEnableChangeGamepadLedColor').checked);
|
||||
|
||||
// Debug
|
||||
APP.settings.data.debugTestLog = JSON.parse(document.getElementById('CHECKBOX_settingsExperimentalIntLog').checked);
|
||||
|
||||
// Range
|
||||
APP.settings.data.bgListBlur = parseFloat(document.getElementById('RANGE_settingsGameListBgBlur').value);
|
||||
APP.settings.data.guiZoomScale = parseFloat(document.getElementById('RANGE_settingsGuiZoomScale').value);
|
||||
APP.settings.data.gridIconSize = parseFloat(document.getElementById('RANGE_settingsGridIconSize').value);
|
||||
APP.settings.data.bgEmuBlur = parseFloat(document.getElementById('RANGE_settingsEmuRunningBgBlur').value);
|
||||
APP.settings.data.bgListOpacity = parseFloat(document.getElementById('RANGE_settingsGameListBgOpacity').value);
|
||||
APP.settings.data.bgEmuOpacity = parseFloat(document.getElementById('RANGE_settingsEmuRunningBgOpacity').value);
|
||||
APP.settings.data.gridBorderRadius = parseFloat(document.getElementById('RANGE_settingsGridIconBorderRadius').value);
|
||||
|
||||
// Text
|
||||
APP.settings.data.fpps4BranchName = document.getElementById('INPUT_settingsUpdateFpps4Branch').value;
|
||||
|
||||
// Fix gui zoom scale
|
||||
if (APP.settings.data.guiZoomScale > 1.5){
|
||||
APP.settings.data.guiZoomScale = 1.5;
|
||||
}
|
||||
if (APP.settings.data.guiZoomScale < 1){
|
||||
APP.settings.data.guiZoomScale = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
End
|
||||
*/
|
||||
|
||||
// Save settings
|
||||
// Save settings and close settings
|
||||
APP.settings.save();
|
||||
|
||||
// GUI: Close settings
|
||||
if (skipCloseSettings !== !0){
|
||||
APP.design.toggleSettings(!0);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Updater
|
||||
*/
|
||||
|
||||
// Display / Hide GUI
|
||||
toggleEmuUpdateGUI: function(mode){
|
||||
|
||||
var cssData;
|
||||
switch (mode) {
|
||||
|
||||
case 'show':
|
||||
cssData = {'display': 'flex'};
|
||||
break;
|
||||
|
||||
case 'hide':
|
||||
cssData = {'display': 'none'};
|
||||
break;
|
||||
|
||||
default:
|
||||
cssData = {'display': 'none'};
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// Reset progressbar status abd update display mode
|
||||
TMS.css('DIV_PROGRESSBAR_UPDATE_FPPS4', {'width': '0%'});
|
||||
TMS.css('DIV_FPPS4_UPDATER', cssData);
|
||||
|
||||
},
|
||||
|
||||
// Update status
|
||||
updateProgressbarStatus: function(percentage, status){
|
||||
TMS.css('DIV_PROGRESSBAR_UPDATE_FPPS4', {'width': `${percentage}%`});
|
||||
document.getElementById('LABEL_FPPS4_UPDATER_STATUS').innerHTML = status;
|
||||
}
|
||||
|
||||
}
|
|
@ -4,7 +4,7 @@
|
|||
emumanager.js
|
||||
|
||||
This file contains all functions / variables about running main project
|
||||
executable and game module checks.
|
||||
executable, game module checks and updating fpPS4 executable.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
@ -13,60 +13,72 @@ temp_EMUMANAGER = {
|
|||
// Emulator is running
|
||||
emuRunning: !1,
|
||||
|
||||
// Update functions
|
||||
update: temp_EMU_UPDATE,
|
||||
|
||||
// Run emu
|
||||
runGame: function(){
|
||||
|
||||
// Get selected game details
|
||||
// Get selected game details and check if user selected a game
|
||||
const mainGameData = APP.gameList.list[APP.gameList.selectedGame];
|
||||
|
||||
// If user selected a game
|
||||
if (mainGameData !== void 0){
|
||||
|
||||
// Reset Error List
|
||||
// Reset Error List and clear log on emu running (if needed)
|
||||
APP.emuManager.emuErrorList = [];
|
||||
|
||||
// Options: Clear log on emu starts
|
||||
if (APP.settings.data.clearLogOnEmuLoad === !0 && APP.emuManager.emuRunCounter !== 0){
|
||||
APP.clearLog(!0);
|
||||
}
|
||||
|
||||
// If (by some reason) main emu still running, close it!
|
||||
// If (by some reason) main emu still running, close it and set main variables
|
||||
this.killEmu(!0);
|
||||
|
||||
// Set main variables
|
||||
var ebootPath = APP.gameList.list[APP.gameList.selectedGame].exe,
|
||||
var ebootPath = mainGameData.exe,
|
||||
emuArgs = ['-e', ebootPath],
|
||||
hList = APP.design.hackList;
|
||||
|
||||
|
||||
// Check if patches are available
|
||||
if (APP.gameList.cGameSettings.usePatch === !0 && APP.design.gamePatchLoaded === !0){
|
||||
emuArgs.push('-p');
|
||||
emuArgs.push(APP.gameList.cGameSettings.patchLocation);
|
||||
emuArgs.push(`\"${APP.gameList.cGameSettings.patchLocation}\"`);
|
||||
}
|
||||
|
||||
// Get enabled hacks
|
||||
hList.forEach(function(hackName){
|
||||
if (document.getElementById('CHECK_' + hackName).checked === !0){
|
||||
if (document.getElementById(`CHECK_${hackName}`).checked === !0){
|
||||
emuArgs.push('-h');
|
||||
emuArgs.push(hackName);
|
||||
}
|
||||
});
|
||||
|
||||
// Log emu location and args
|
||||
APP.log('\nINFO - Running fpPS4 with args: ' + emuArgs.toString().replace(RegExp(',', 'gi'), ' ') + '\nEmu location: ' + APP.settings.data.emuPath);
|
||||
// Push gamepad mode
|
||||
const padMode = document.getElementById('FPPS4_OPTIONS_SELECT_GAMEPAD_MODE').value;
|
||||
if (padMode === 'sdl2' && APP.gameList.checkSdl2() === !1){
|
||||
emuArgs.push('-pad "keyboard"');
|
||||
} else {
|
||||
emuArgs.push(`-pad "${padMode}"`);
|
||||
}
|
||||
|
||||
// Run fpPS4
|
||||
// If current gameppad mode is SDL2 and change led bar color is enabled, push led args
|
||||
if (padMode === 'sdl2' && APP.settings.data.sdlEnableGamepadLed === !0){
|
||||
emuArgs.push(`-led $${APP.gameList.cGameSettings.gPadLedColor}`);
|
||||
}
|
||||
|
||||
// Add fullscreen flag if it's enabled
|
||||
if (APP.settings.data.enableEmuFullscreen === !0){
|
||||
emuArgs.push('-w');
|
||||
}
|
||||
|
||||
// Log emu location and args and run fpPS4
|
||||
APP.log(APP.lang.getVariable('runEmuArgs', [emuArgs.toString().replace(RegExp(',', 'gi'), ' '), APP.settings.data.emuPath]));
|
||||
APP.runfpPS4(APP.settings.data.emuPath, emuArgs);
|
||||
this.emuRunning = !0;
|
||||
|
||||
// Update main GUI
|
||||
APP.design.update();
|
||||
APP.design.toggleDisplayMode({
|
||||
appStatus: 'Running',
|
||||
appPath: mainGameData.exe,
|
||||
appIcon: mainGameData.icon,
|
||||
appName: mainGameData.name,
|
||||
paramSfo: mainGameData.paramSfo
|
||||
paramSfo: mainGameData.paramSfo,
|
||||
appStatus: APP.lang.getVariable('emuStatusRunning')
|
||||
});
|
||||
|
||||
// Save game settings
|
||||
|
@ -78,16 +90,19 @@ temp_EMUMANAGER = {
|
|||
|
||||
// Stop fpPS4
|
||||
killEmu: function(){
|
||||
|
||||
|
||||
// Update status
|
||||
if (this.emuRunning === !0){
|
||||
document.getElementById('LABEL_GAME_DETAILS_STATUS').innerHTML = APP.lang.getVariable('killEmuStatus');
|
||||
TMS.css('DIV_GAME_DETAILS', {'display': 'flex'});
|
||||
}
|
||||
|
||||
// Kill process and set emu running var to false
|
||||
APP.getProcessInfo('fpPS4.exe', function(pData){
|
||||
APP.getProcessInfo(APP.path.parse(APP.settings.data.emuPath).base, function(pData){
|
||||
process.kill(pData.th32ProcessID);
|
||||
this.emuRunning = !1;
|
||||
});
|
||||
|
||||
// Update status
|
||||
document.getElementById('LABEL_GAME_DETAILS_STATUS').innerHTML = 'Main process closed - close fpPS4 log window to go back';
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -12,7 +12,7 @@ temp_FILEMANAGER = {
|
|||
// Select path
|
||||
selectPath: function(postAction){
|
||||
|
||||
if (postAction !== void 0){
|
||||
if (postAction !== void 0 && typeof postAction === 'function'){
|
||||
|
||||
document.getElementById('APP_FOLDER_LOADER').onchange = function(){
|
||||
|
||||
|
@ -35,7 +35,7 @@ temp_FILEMANAGER = {
|
|||
// Select file
|
||||
selectFile: function(ext, postAction){
|
||||
|
||||
if (ext !== void 0 && postAction !== void 0){
|
||||
if (ext !== void 0 && postAction !== void 0 && typeof postAction === 'function'){
|
||||
|
||||
if (ext === ''){
|
||||
ext = '*.*';
|
||||
|
@ -75,13 +75,13 @@ temp_FILEMANAGER = {
|
|||
try {
|
||||
|
||||
APP.fs.writeFileSync(location, content, mode);
|
||||
if (postAction !== void 0){
|
||||
if (postAction !== void 0 && typeof postAction === 'function'){
|
||||
postAction(APP.tools.fixPath(location));
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
APP.log('ERROR - Unable to save file!\nReason: ' + err);
|
||||
APP.log(APP.lang.getVariable('errorSaveFile', [err]));
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -92,6 +92,7 @@ temp_FILEMANAGER = {
|
|||
|
||||
}
|
||||
|
||||
// Open save dialog
|
||||
TMS.triggerClick('APP_FILE_SAVE');
|
||||
|
||||
},
|
||||
|
@ -99,8 +100,18 @@ temp_FILEMANAGER = {
|
|||
// Open game folder
|
||||
openDir: function(path){
|
||||
|
||||
// Spawn explorer
|
||||
APP.childProcess.exec('start "" "' + path + '"');
|
||||
// Switch platform
|
||||
switch (APP.os.platform()){
|
||||
|
||||
case 'win32':
|
||||
APP.childProcess.exec(`start "" "${path}"`);
|
||||
break;
|
||||
|
||||
case 'linux':
|
||||
APP.childProcess.exec(`browse "${path}"`);
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -3,8 +3,7 @@
|
|||
fpPS4 Temmie's Launcher
|
||||
gamelist.js
|
||||
|
||||
This file contains all functions / variables related to creating and managing
|
||||
gamelist
|
||||
This file contains all functions / variables related to gamelist
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
@ -19,6 +18,50 @@ temp_GAMELIST = {
|
|||
// Selected game settings
|
||||
cGameSettings: {},
|
||||
|
||||
// Current compat list
|
||||
cCompatList: [],
|
||||
|
||||
// Create compat list
|
||||
createCompatList: function(){
|
||||
|
||||
// Requisites to create compat list
|
||||
const proceedCheck = [
|
||||
APP.webConnection === !0,
|
||||
Object.keys(APP.gameList.list).length !== 0,
|
||||
APP.settings.data.enableCompatStatusCheck === !0
|
||||
];
|
||||
|
||||
// Check if can create list
|
||||
if (proceedCheck.indexOf(!1) === -1){
|
||||
|
||||
// Reset the current compat list
|
||||
APP.gameList.cCompatList = [];
|
||||
|
||||
// fetch database
|
||||
fetch(`https://api.fpps4.net/database.json`)
|
||||
.then(function(resp){
|
||||
return resp.json();
|
||||
})
|
||||
.then(function(respData){
|
||||
|
||||
// If response data exists, update current compat list
|
||||
if (respData !== void 0){
|
||||
|
||||
// renames some variables and discards unneeded ones
|
||||
APP.gameList.cCompatList = respData.map(({title, code, status, labels}) => ({
|
||||
title: title,
|
||||
id: code,
|
||||
status: status,
|
||||
labels: labels // maybe you can do something cool with this ;)
|
||||
}));
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Make game settings
|
||||
createGameSettings: function(data){
|
||||
|
||||
|
@ -29,21 +72,26 @@ temp_GAMELIST = {
|
|||
hacks: data.hacks,
|
||||
usePatch: data.usePatch,
|
||||
isHomebrew: data.isHomebrew,
|
||||
patchLocation: data.patchLocation,
|
||||
importedModules: data.importedModules
|
||||
gamepadMode: data.gamepadMode,
|
||||
gPadLedColor: data.gPadLedColor,
|
||||
patchLocation: data.patchLocation
|
||||
};
|
||||
|
||||
// Check if title location exists
|
||||
if (APP.fs.existsSync(APP.path.parse(data.path).dir) === !0){
|
||||
|
||||
// Write file
|
||||
try {
|
||||
APP.fs.writeFileSync(data.path, JSON.stringify(gameSettings), 'utf-8');
|
||||
logMessage = APP.lang.getVariable('createdSettingsFile', [data.name]);
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
logMessage = APP.lang.getVariable('errorCreateSettingsFile', [data.name, data.path, err]);
|
||||
}
|
||||
|
||||
// Write file
|
||||
try {
|
||||
|
||||
APP.fs.writeFileSync(data.path, JSON.stringify(gameSettings), 'utf-8');
|
||||
logMessage = 'INFO - Settings file was created successfully for ' + data.name;
|
||||
|
||||
} catch (err) {
|
||||
|
||||
console.error(err);
|
||||
logMessage = 'ERROR - Unable to create settings file for ' + data.name + ' at ' + data.path + '!\nReason: ' + err;
|
||||
|
||||
} else {
|
||||
logMessage = APP.lang.getVariable('errorListUnableLocateGamePath', [data.name, data.path]);
|
||||
APP.gameList.load();
|
||||
}
|
||||
|
||||
// Log result
|
||||
|
@ -59,7 +107,7 @@ temp_GAMELIST = {
|
|||
logMessage = '',
|
||||
tempData = APP.gameList.cGameSettings,
|
||||
prevSettings = JSON.stringify(APP.gameList.cGameSettings),
|
||||
fPath = APP.path.parse(this.list[this.selectedGame].exe).dir + '/launcherSettings.json';
|
||||
fPath = `${APP.path.parse(this.list[this.selectedGame].exe).dir}/launcherSettings.json`;
|
||||
|
||||
/*
|
||||
Update settings
|
||||
|
@ -67,11 +115,13 @@ temp_GAMELIST = {
|
|||
|
||||
// Update hack data
|
||||
APP.design.hackList.forEach(function(hName){
|
||||
cHacks[hName] = JSON.parse(document.getElementById('CHECK_' + hName).checked);
|
||||
cHacks[hName] = JSON.parse(document.getElementById(`CHECK_${hName}`).checked);
|
||||
});
|
||||
tempData.hacks = cHacks;
|
||||
|
||||
// Update patch data
|
||||
// Update patch data, gamepad mode and led color
|
||||
tempData.gPadLedColor = document.getElementById('INPUT_cGameLedColor').value.slice(1);
|
||||
tempData.gamepadMode = document.getElementById('FPPS4_OPTIONS_SELECT_GAMEPAD_MODE').value;
|
||||
tempData.usePatch = JSON.parse(document.getElementById('CHECKBOX_optionsEnablePatch').checked);
|
||||
|
||||
/*
|
||||
|
@ -81,21 +131,17 @@ temp_GAMELIST = {
|
|||
|
||||
// Write file
|
||||
try {
|
||||
|
||||
APP.fs.writeFileSync(fPath, JSON.stringify(tempData), 'utf-8');
|
||||
logMessage = 'INFO - (' + APP.gameList.selectedGame + ') Settings file was updated successfully!';
|
||||
|
||||
logMessage = APP.lang.getVariable('updateGameSettings', [APP.gameList.selectedGame]);
|
||||
} catch (err) {
|
||||
|
||||
console.error(err);
|
||||
logMessage = 'ERROR - Unable to update settings file for ' + APP.gameList.selectedGame + ' at ' + fPath + '!\nReason: ' + err;
|
||||
|
||||
logMessage = APP.lang.getVariable('updateGameSettingsError', [APP.gameList.selectedGame, fPath, err]);
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Skip updating settings
|
||||
logMessage = 'INFO - (' + APP.gameList.selectedGame + ') Skip updating settings file since it has no changes!';
|
||||
logMessage = APP.lang.getVariable('skipUpdateGameSettings', [APP.gameList.selectedGame]);
|
||||
|
||||
}
|
||||
|
||||
|
@ -106,47 +152,83 @@ temp_GAMELIST = {
|
|||
|
||||
},
|
||||
|
||||
// Toggle enable / disable game patch
|
||||
toggleGamePatch: function(){
|
||||
|
||||
// Get current game id
|
||||
const
|
||||
cGame = this.selectedGame,
|
||||
listTop = document.getElementById('DIV_LIST_INTERNAL').scrollTop;
|
||||
|
||||
// Update GUI
|
||||
APP.tools.processCheckbox('CHECKBOX_optionsEnablePatch');
|
||||
this.saveGameSettings(!0);
|
||||
APP.design.update();
|
||||
this.load();
|
||||
|
||||
// Select current game and update scroll
|
||||
APP.design.selectGame(cGame);
|
||||
document.getElementById('DIV_LIST_INTERNAL').scrollTop = listTop;
|
||||
|
||||
},
|
||||
|
||||
// Check for SDL2.dll in emu folder
|
||||
checkSdl2: function(){
|
||||
|
||||
// Check if gamepad mode is sdl2
|
||||
if (document.getElementById('FPPS4_OPTIONS_SELECT_GAMEPAD_MODE').value === 'sdl2'){
|
||||
|
||||
// Get path for sdl2.dll and check if exists. If not, give an alert when its not found.
|
||||
const
|
||||
sdl2Path = `${APP.tools.fixPath(nw.__dirname)}/Emu/SDL2.dll`,
|
||||
dllExists = APP.fs.existsSync(sdl2Path);
|
||||
if (!dllExists){
|
||||
window.alert(APP.lang.getVariable("Sdl2NotFound"));
|
||||
}
|
||||
|
||||
return dllExists;
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Load game patch
|
||||
loadGamePatch: function(){
|
||||
|
||||
if (this.selectedGame !== ''){
|
||||
|
||||
// Get current game name
|
||||
const cGame = this.selectedGame;
|
||||
|
||||
// Create main vars
|
||||
var logMessage = '',
|
||||
cGame = this.selectedGame;
|
||||
|
||||
// Read path
|
||||
APP.fileManager.selectPath(function(pLocation){
|
||||
|
||||
var logMessage = '';
|
||||
|
||||
// Check if exists PARAM.SFO
|
||||
if (APP.fs.existsSync(pLocation + '/sce_sys/param.sfo') === !0){
|
||||
if (APP.fs.existsSync(`${pLocation}/sce_sys/param.sfo`) === !0){
|
||||
|
||||
// Read PARAM.SFO
|
||||
const getParamSfo = APP.paramSfo.parse(pLocation + '/sce_sys/param.sfo');
|
||||
// Read PARAM.SFO and check if TITLE_ID matches current game
|
||||
const getParamSfo = APP.paramSfo.parse(`${pLocation}/sce_sys/param.sfo`);
|
||||
if (getParamSfo.TITLE_ID === cGame && getParamSfo.CATEGORY !== 'ac'){
|
||||
|
||||
// Check if TITLE_ID matches current game
|
||||
if (getParamSfo.TITLE_ID === cGame){
|
||||
|
||||
// Set variables
|
||||
// Set variables and log message
|
||||
APP.gameList.cGameSettings.patchLocation = pLocation;
|
||||
APP.gameList.saveGameSettings(!0);
|
||||
APP.gameList.load();
|
||||
APP.design.selectGame(cGame);
|
||||
|
||||
// Set log message
|
||||
logMessage = 'INFO - Patch loaded sucessfully!\nName: ' + getParamSfo.TITLE + '\nType: ' + APP.paramSfo.database.DB_CATEGORY[getParamSfo.CATEGORY];
|
||||
logMessage = APP.lang.getVariable('patchLoadedSucessfully', [getParamSfo.TITLE, APP.paramSfo.database.DB_CATEGORY[getParamSfo.CATEGORY]]);
|
||||
|
||||
} else {
|
||||
|
||||
// Version does not match current app / game
|
||||
logMessage = 'ERROR - This patch does not match for this app / game!\nPatch ID: ' + getParamSfo.TITLE_ID + '\nSelected app / game: ' + cGame;
|
||||
logMessage = APP.lang.getVariable('patchLoadErrorMismatch', [getParamSfo.TITLE_ID, cGame]);
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Unable to find PARAM.SFO
|
||||
logMessage = 'ERROR - Unable to find PARAM.SFO for this patch!';
|
||||
logMessage = APP.lang.getVariable('patchLoadErrorParamSfo404');
|
||||
|
||||
}
|
||||
|
||||
|
@ -165,23 +247,34 @@ temp_GAMELIST = {
|
|||
// Check if path exists
|
||||
if (APP.fs.existsSync(APP.settings.data.gamePath) === !0){
|
||||
|
||||
// Reset selected game
|
||||
this.selectedGame = '';
|
||||
|
||||
// Reset search box
|
||||
document.getElementById('INPUT_gameListSearch').value = '';
|
||||
|
||||
// Reset game list
|
||||
// Reset selected game, reset search box, reset game list and read game list path
|
||||
APP.gameList.list = {};
|
||||
|
||||
// Get game list
|
||||
this.selectedGame = '';
|
||||
document.getElementById('INPUT_gameListSearch').value = '';
|
||||
const gList = APP.fs.readdirSync(APP.settings.data.gamePath);
|
||||
|
||||
// Check if game list isn't empty
|
||||
if (gList.length > 0){
|
||||
|
||||
// Process game list
|
||||
gList.forEach(function(gPath){
|
||||
|
||||
|
||||
// Create skip homebrew list
|
||||
const commonHbList = [
|
||||
'CUSA00000',
|
||||
'CUSA11111',
|
||||
'CUSA22222',
|
||||
'CUSA33333',
|
||||
'CUSA44444',
|
||||
'CUSA55555',
|
||||
'CUSA66666',
|
||||
'CUSA77777',
|
||||
'CUSA88888',
|
||||
'CUSA99999',
|
||||
'CUSA36666'
|
||||
];
|
||||
|
||||
// Create main vars
|
||||
var appBg,
|
||||
appIcon,
|
||||
addGame = !0,
|
||||
|
@ -189,122 +282,147 @@ temp_GAMELIST = {
|
|||
appId = gPath,
|
||||
appName = gPath,
|
||||
isHomebrew = !1,
|
||||
iconList = [
|
||||
'sce_sys/icon0.png',
|
||||
'sce_sys/icon1.png'
|
||||
],
|
||||
backgroundList = [
|
||||
'sce_sys/pic1.png',
|
||||
'sce_sys/pic0.png'
|
||||
],
|
||||
pathBase = APP.settings.data.gamePath + '/' + gPath + '/',
|
||||
executableName = pathBase + 'eboot.bin',
|
||||
paramSfoPath = pathBase + 'sce_sys/param.sfo',
|
||||
playGoPath = pathBase + 'sce_sys/playgo-chunk.dat',
|
||||
settingsFile = {},
|
||||
pathBase = `${APP.settings.data.gamePath}/${gPath}/`,
|
||||
executableName = `${pathBase}eboot.bin`,
|
||||
paramSfoPath = `${pathBase}sce_sys/param.sfo`,
|
||||
playGoPath = `${pathBase}sce_sys/playgo-chunk.dat`,
|
||||
playGoAvailable = APP.fs.existsSync(playGoPath),
|
||||
paramSfoAvailable = APP.fs.existsSync(paramSfoPath);
|
||||
|
||||
// If eboot.bin doesn't exists, look for any .elf file
|
||||
if (APP.fs.existsSync(executableName) !== !0){
|
||||
paramSfoAvailable = APP.fs.existsSync(paramSfoPath),
|
||||
iconList = ['sce_sys/icon0.png', 'sce_sys/icon1.png'],
|
||||
backgroundList = ['sce_sys/pic1.png', 'sce_sys/pic0.png'];
|
||||
|
||||
// Seek .elf files on root dir
|
||||
var fList = APP.fs.readdirSync(pathBase),
|
||||
execName = fList.filter(function(fName){
|
||||
if (fName.toLowerCase().indexOf('.elf') !== -1){
|
||||
isHomebrew = !0;
|
||||
return fName;
|
||||
}
|
||||
})[0];
|
||||
// Check if can skip entry
|
||||
if (gPath.slice(0, 1) !== '!'){
|
||||
|
||||
// If eboot.bin doesn't exists, look for any .elf file
|
||||
if (APP.fs.existsSync(executableName) !== !0){
|
||||
|
||||
// Seek .elf files on root dir
|
||||
var fList = APP.fs.readdirSync(pathBase),
|
||||
execName = fList.filter(function(fName){
|
||||
if (fName.toLowerCase().indexOf('.elf') !== -1){
|
||||
isHomebrew = !0;
|
||||
return fName;
|
||||
}
|
||||
})[0];
|
||||
|
||||
// Set executable name - if not found (undefined), skip entry!
|
||||
executableName = pathBase + execName;
|
||||
if (execName === void 0){
|
||||
addGame = !1;
|
||||
}
|
||||
|
||||
// Set executable name - if not found (undefined), skip entry!
|
||||
executableName = pathBase + execName;
|
||||
if (execName === void 0){
|
||||
addGame = !1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Seek App Icon
|
||||
for (var i = 0; i < iconList.length; i++){
|
||||
if (APP.fs.existsSync(pathBase + iconList[i]) === !0){
|
||||
appIcon = pathBase + iconList[i];
|
||||
break;
|
||||
// Seek App Icon
|
||||
for (var i = 0; i < iconList.length; i++){
|
||||
if (APP.fs.existsSync(pathBase + iconList[i]) === !0){
|
||||
appIcon = pathBase + iconList[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Seek App Background
|
||||
for (var i = 0; i < backgroundList.length; i++){
|
||||
if (APP.fs.existsSync(pathBase + backgroundList[i]) === !0){
|
||||
appBg = pathBase + backgroundList[i];
|
||||
break;
|
||||
|
||||
// Seek App Background
|
||||
for (var i = 0; i < backgroundList.length; i++){
|
||||
if (APP.fs.existsSync(pathBase + backgroundList[i]) === !0){
|
||||
appBg = pathBase + backgroundList[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Check if Icon and Background exists - if not, use 404
|
||||
if (APP.fs.existsSync(appIcon) === !1){
|
||||
appIcon = APP.settings.data.nwPath + '/app/img/404.png';
|
||||
}
|
||||
if (APP.fs.existsSync(appBg) === !1){
|
||||
appBg = APP.settings.data.nwPath + '/app/img/404_BG.png';
|
||||
}
|
||||
// Check if Icon and Background exists - if not, use 404
|
||||
if (APP.fs.existsSync(appIcon) === !1){
|
||||
appIcon = `${APP.settings.data.nwPath}/App/img/404.png`;
|
||||
}
|
||||
if (APP.fs.existsSync(appBg) === !1){
|
||||
appBg = `${APP.settings.data.nwPath}/App/img/404_BG.png`;
|
||||
}
|
||||
|
||||
// Warn if playgo-chunk.dat isn't available
|
||||
if (isHomebrew === !1 && playGoAvailable !== !0){
|
||||
APP.log('WARN - Unable to locate playgo-chunk.dat for ' + appName + '!\nIf this isn\'t a homebrew, check if this App / Game was dumped properly.');
|
||||
}
|
||||
// Warn if playgo-chunk.dat isn't available
|
||||
if (isHomebrew === !1 && playGoAvailable !== !0){
|
||||
APP.log(APP.lang.getVariable('gameListLoadWarnPlayGo', [appName]));
|
||||
}
|
||||
|
||||
// Warn if PARAM.SFO isn't available
|
||||
if (isHomebrew === !1 && paramSfoAvailable !== !0){
|
||||
APP.log('WARN - Unable to locate PARAM.SFO for ' + appName + '!\nIf this isn\'t a homebrew, check if this App / Game was dumped properly.');
|
||||
}
|
||||
// Warn if PARAM.SFO isn't available
|
||||
if (isHomebrew === !1 && paramSfoAvailable !== !0){
|
||||
APP.log(APP.lang.getVariable('gameListLoadWarnParamSfo', [appName]));
|
||||
}
|
||||
|
||||
// If PARAM.SFO is present (and enabled), get metadata
|
||||
if (APP.settings.data.enableParamSfo === !0 && paramSfoAvailable === !0){
|
||||
|
||||
// Set PARAM.SFO variables
|
||||
paramSfo = APP.paramSfo.parse(paramSfoPath);
|
||||
// If PARAM.SFO is present (and enabled), get metadata
|
||||
if (APP.settings.data.enableParamSfo === !0 && paramSfoAvailable === !0){
|
||||
|
||||
// Set game entry
|
||||
appName = paramSfo.TITLE;
|
||||
appId = paramSfo.TITLE_ID;
|
||||
// Set PARAM.SFO variables and game entry
|
||||
paramSfo = APP.paramSfo.parse(paramSfoPath);
|
||||
appId = paramSfo.TITLE_ID;
|
||||
appName = paramSfo.TITLE;
|
||||
|
||||
}
|
||||
|
||||
// Check if current game matches CUSA pattern. if not, set as homebrew
|
||||
if (appId.indexOf('CUSA') === -1 || commonHbList.indexOf(appId) !== -1){
|
||||
isHomebrew = !0;
|
||||
}
|
||||
|
||||
// Check if settings file exists for current game
|
||||
if (APP.fs.existsSync(`${pathBase}/launcherSettings.json`) === !0){
|
||||
settingsFile = JSON.parse(APP.fs.readFileSync(`${pathBase}/launcherSettings.json`));
|
||||
}
|
||||
|
||||
} else {
|
||||
addGame = !1;
|
||||
}
|
||||
|
||||
// If executable exists, set data
|
||||
if (addGame === !0){
|
||||
|
||||
// Add game to list
|
||||
APP.gameList.list[appId] = {
|
||||
// Create metadata
|
||||
const metadata = {
|
||||
bg: appBg,
|
||||
name: appName,
|
||||
icon: appIcon,
|
||||
folderName: gPath,
|
||||
paramSfo: paramSfo,
|
||||
exe: executableName,
|
||||
isHomebrew: isHomebrew
|
||||
isHomebrew: isHomebrew,
|
||||
settingsFile: settingsFile
|
||||
};
|
||||
|
||||
// Add game to list
|
||||
if (APP.gameList.list[appId] === void 0){
|
||||
APP.gameList.list[appId] = metadata;
|
||||
} else {
|
||||
APP.log(APP.lang.getVariable('gameListDoubleIdError', [appName, APP.gameList.list[appId].name]));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
// No games / homebrew found
|
||||
APP.log('INFO - No apps / games were detected on current path (' + APP.settings.data.gamePath + ')');
|
||||
APP.log(APP.lang.getVariable('gameListNoGameFound', [APP.settings.data.gamePath]))
|
||||
|
||||
}
|
||||
|
||||
// Render game list
|
||||
APP.gameList.createCompatList();
|
||||
APP.design.renderGameList();
|
||||
|
||||
} else {
|
||||
|
||||
// Unable to find selected game path
|
||||
APP.log(APP.lang.getVariable('gamelistGamePath404', [APP.settings.data.gamePath]));
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Process Search List
|
||||
// Process search list
|
||||
search: function(){
|
||||
|
||||
// Create main search vars
|
||||
var gameListArray = Object.keys(APP.gameList.list),
|
||||
searchQuery = document.getElementById('INPUT_gameListSearch').value;
|
||||
|
||||
|
@ -316,10 +434,8 @@ temp_GAMELIST = {
|
|||
APP.design.update();
|
||||
}
|
||||
|
||||
// Process search query
|
||||
// Create vars and process search query if current search mode is title id
|
||||
var tempList, listRender = {};
|
||||
|
||||
// Case game search mode is TITLE_ID
|
||||
if (APP.settings.data.gameSearchMode === 'titleId'){
|
||||
|
||||
tempList = gameListArray.filter(function(cItem){
|
||||
|
@ -333,12 +449,12 @@ temp_GAMELIST = {
|
|||
// If game search mode is APP_NAME
|
||||
if (APP.settings.data.gameSearchMode === 'appName'){
|
||||
|
||||
// Reset temp list and process game list
|
||||
tempList = [];
|
||||
|
||||
gameListArray.forEach(function(cTitle){
|
||||
|
||||
// Get title name and check if current search is case-sensitive
|
||||
var titleName = APP.gameList.list[cTitle].name;
|
||||
|
||||
if (APP.settings.data.searchCaseSensitive === !1){
|
||||
titleName = APP.gameList.list[cTitle].name.toLowerCase();
|
||||
searchQuery = searchQuery.toLowerCase();
|
||||
|
@ -361,66 +477,119 @@ temp_GAMELIST = {
|
|||
if (Object.keys(listRender).length !== 0){
|
||||
APP.design.renderGameList({customList: listRender, displayLog: !1});
|
||||
} else {
|
||||
document.getElementById('DIV_LIST_INTERNAL').innerHTML = '<div class="DIV_noGameFound">Unable to find \"' + searchQuery + '\" </div>';
|
||||
document.getElementById('DIV_LIST_INTERNAL').innerHTML = `<div class="DIV_noGameFound">${APP.lang.getVariable('gameListSearch404')} \"${searchQuery}\"</div>`;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Render normal game list
|
||||
APP.gameList.load();
|
||||
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Check dump status
|
||||
checkDumpStatus: function(){
|
||||
// Check game status
|
||||
checkGameStatus: function(){
|
||||
|
||||
var cGameStatus = 'DIV_ICON_STATUS_OK',
|
||||
// Declare main consts
|
||||
const
|
||||
fileList = [ 'param.sfo' ],
|
||||
cGame = this.list[this.selectedGame],
|
||||
fileList = [
|
||||
'param.sfo'
|
||||
],
|
||||
cGameStatusList = ['DIV_ICON_STATUS_OK', 'DIV_ICON_STATUS_WARN', 'DIV_ICON_STATUS_HB'],
|
||||
gPath = APP.settings.data.gamePath + '/' + cGame.folderName;
|
||||
cGameId = structuredClone(APP.gameList.selectedGame),
|
||||
gPath = `${APP.settings.data.gamePath}/${cGame.folderName}`,
|
||||
cDumpStatusList = [ 'DIV_ICON_STATUS_OK', 'DIV_ICON_STATUS_WARN', 'DIV_ICON_STATUS_HB' ],
|
||||
cGameComapStatusList = [ 'BOOTS', 'MENUS', 'INGAME', 'UNKNOWN', 'NOTHING', 'PLAYABLE', 'HOMEBREW' ];
|
||||
|
||||
// Declare main vars
|
||||
var cGameStatus = 'OK',
|
||||
cGameComapStatus = 'UNKNOWN',
|
||||
displayGameCompatHolderCss = { 'display': 'none' };
|
||||
|
||||
// Process check for single files (like param.sfo)
|
||||
fileList.forEach(function(cFile){
|
||||
if (APP.fs.existsSync(gPath + '/sce_sys/' + cFile) !== !0){
|
||||
cGameStatus = 'DIV_ICON_STATUS_WARN';
|
||||
if (APP.fs.existsSync(`${gPath}/sce_sys/${cFile}`) !== !0){
|
||||
cGameStatus = 'WARN';
|
||||
}
|
||||
});
|
||||
|
||||
// Check if playgo-chunk.dat exists
|
||||
if (APP.fs.existsSync(gPath + '/sce_sys/playgo-chunk.dat') !== !0){
|
||||
cGameStatus = 'DIV_ICON_STATUS_WARN';
|
||||
|
||||
// Check if playgo-chunk.dat is inside app folder
|
||||
if (APP.fs.existsSync(gPath + '/sce_sys/app/playgo-chunk.dat') === !0){
|
||||
APP.fs.copyFileSync(gPath + '/sce_sys/app/playgo-chunk.dat', gPath + '/sce_sys/playgo-chunk.dat');
|
||||
APP.log('INFO - (' + this.list[this.selectedGame].name + ') playgo-chunk.dat was found inside sce_sys/app - a new copy was created on sce_sys.');
|
||||
if (APP.fs.existsSync(`${gPath}/sce_sys/playgo-chunk.dat`) !== !0){
|
||||
|
||||
// Set current game status to warn and check if playgo-chunk.dat is inside app folder
|
||||
cGameStatus = 'WARN';
|
||||
if (APP.fs.existsSync(`${gPath}/sce_sys/app/playgo-chunk.dat`) === !0){
|
||||
APP.fs.copyFileSync(`${gPath}/sce_sys/app/playgo-chunk.dat`, `${gPath}/sce_sys/playgo-chunk.dat`);
|
||||
APP.log(APP.lang.getVariable('checkDumpPlayGoOnApp', [cGame.name]));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Set current compat CSS / status
|
||||
const updateCompat = function(){
|
||||
|
||||
// Remove all other conditions and set current one
|
||||
TMS.css('DIV_FPPS4_GAME_STATUS', displayGameCompatHolderCss);
|
||||
cGameComapStatusList.forEach(function(cStatus){
|
||||
TMS.removeClass('DIV_selectedGameStatus_compat', `DIV_COMPAT_STATUS_${cStatus}`);
|
||||
});
|
||||
TMS.addClass('DIV_selectedGameStatus_compat', `DIV_COMPAT_STATUS_${cGameComapStatus}`);
|
||||
document.getElementById('DIV_selectedGameStatus_compat').innerHTML = APP.lang.getVariable(`cGameCompatStatus_${cGameComapStatus}`);
|
||||
|
||||
}
|
||||
|
||||
// Check if can display game compat status
|
||||
if (APP.webConnection === !0 && APP.settings.data.enableCompatStatusCheck === !0){
|
||||
|
||||
// Update display CSS
|
||||
var searchQuery = structuredClone(cGameId);
|
||||
displayGameCompatHolderCss = { 'display': 'flex' };
|
||||
|
||||
// If current title is a homebrew, search for game name
|
||||
if (cGame.isHomebrew === !0){
|
||||
searchQuery = cGame.name;
|
||||
}
|
||||
|
||||
// get the current issues matching either the id or title
|
||||
let foundIssues = APP.gameList.cCompatList.filter( issue => issue.id.toUpperCase() === searchQuery.toUpperCase() || issue.title.toUpperCase() === searchQuery.toUpperCase() );
|
||||
|
||||
// Check if the current title isn't on the compat list
|
||||
if (foundIssues.length <= 0) {
|
||||
|
||||
cGameComapStatus = 'UNKNOWN';
|
||||
APP.log(APP.lang.getVariable('warnUnableFindGameCompatDb', [APP.gameList.list[searchQuery].name, searchQuery]));
|
||||
updateCompat();
|
||||
|
||||
} else {
|
||||
// Get data from current database and update compat mode
|
||||
cGameComapStatus = foundIssues[0].status.toUpperCase();
|
||||
updateCompat();
|
||||
}
|
||||
|
||||
} else {
|
||||
updateCompat();
|
||||
}
|
||||
|
||||
// Check if is homebrew (.elf)
|
||||
if (cGame.isHomebrew === !0){
|
||||
cGameStatus = 'DIV_ICON_STATUS_HB';
|
||||
cGameStatus = 'HB';
|
||||
}
|
||||
|
||||
// Set app / game dump status
|
||||
cGameStatusList.forEach(function(cList){
|
||||
TMS.removeClass('DIV_selectedGameStatus', cList)
|
||||
cDumpStatusList.forEach(function(cList){
|
||||
TMS.removeClass('DIV_selectedGameStatus_dump', cList);
|
||||
});
|
||||
TMS.addClass('DIV_selectedGameStatus', cGameStatus);
|
||||
TMS.addClass('DIV_selectedGameStatus_dump', `DIV_ICON_STATUS_${cGameStatus}`);
|
||||
document.getElementById('DIV_selectedGameStatus_dump').innerHTML = APP.lang.getVariable(`dumpStatus_${cGameStatus}`);
|
||||
|
||||
},
|
||||
|
||||
// Open selected game location
|
||||
openGameLocation: function(){
|
||||
|
||||
// Check if there's game selected
|
||||
if (this.selectedGame !== ''){
|
||||
APP.fileManager.openDir(APP.settings.data.gamePath + '/' + this.list[this.selectedGame].folderName);
|
||||
APP.fileManager.openDir(`${APP.settings.data.gamePath}/${this.list[this.selectedGame].folderName}`);
|
||||
}
|
||||
|
||||
},
|
||||
|
@ -430,9 +599,9 @@ temp_GAMELIST = {
|
|||
|
||||
if (this.selectedGame !== '' && Object.keys(this.list[this.selectedGame].paramSfo).length !== 0){
|
||||
|
||||
APP.fileManager.saveFile(this.selectedGame + '_metadata', '.json', 'utf-8', JSON.stringify(this.list[this.selectedGame].paramSfo), function(cPath){
|
||||
window.alert('INFO - Save successfull!\nPath: ' + cPath);
|
||||
APP.log('INFO - Save successfull!\nPath: ' + cPath);
|
||||
APP.fileManager.saveFile(`${this.selectedGame}_metadata`, '.json', 'utf8', JSON.stringify(this.list[this.selectedGame].paramSfo), function(cPath){
|
||||
window.alert(APP.lang.getVariable('saveSucessfullPath', [cPath]));
|
||||
APP.log(APP.lang.getVariable('saveSucessfullPath', [cPath]));
|
||||
});
|
||||
|
||||
}
|
||||
|
@ -442,103 +611,35 @@ temp_GAMELIST = {
|
|||
// Reset current game settings
|
||||
resetGameSettings: function(){
|
||||
|
||||
const cGame = this.selectedGame,
|
||||
fName = APP.settings.data.gamePath + '/' + this.list[cGame].folderName + '/launcherSettings.json',
|
||||
conf = window.confirm('WARN - This will delete all saved settings for \n' + this.list[cGame].name + '\n\nDo you want to continue?');
|
||||
// Create main vars
|
||||
const
|
||||
cGame = this.selectedGame,
|
||||
fName = `${APP.settings.data.gamePath}/${this.list[cGame].folderName}/launcherSettings.json`,
|
||||
conf = window.confirm(APP.lang.getVariable('settingsConfirmRemoveGameSettings', [this.list[cGame].name]));
|
||||
|
||||
if (this.selectedGame !== '' && APP.fs.existsSync(fName) === !0 && conf === !0){
|
||||
|
||||
// Remove file
|
||||
try {
|
||||
|
||||
// Remove settings file
|
||||
// Remove settings file and reload data
|
||||
APP.fs.unlinkSync(fName);
|
||||
|
||||
// Reload data
|
||||
setTimeout(function(){
|
||||
APP.gameList.selectedGame = '';
|
||||
APP.gameList.load();
|
||||
APP.design.selectGame(cGame);
|
||||
TMS.scrollCenter('GAME_ENTRY_' + cGame);
|
||||
TMS.scrollCenter(`GAME_ENTRY_${cGame}`);
|
||||
}, 50);
|
||||
|
||||
} catch (err) {
|
||||
|
||||
APP.log(APP.lang.getVariable('settingsRemoveGameSettingsError', [cGame, err]));
|
||||
console.error(err);
|
||||
APP.log('ERROR - Unable to remove settings file!\nReason: ' + err);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Process remove modules
|
||||
removeAllModules: function(){
|
||||
|
||||
// Check if this process already happened
|
||||
if (APP.settings.data.removedLibModules === !1){
|
||||
|
||||
try {
|
||||
|
||||
const gList = Object.keys(APP.gameList.list);
|
||||
gList.forEach(function(gName){
|
||||
|
||||
APP.design.selectGame(gName);
|
||||
APP.gameList.removeImportedModules();
|
||||
|
||||
});
|
||||
|
||||
// Update settings
|
||||
APP.settings.data.removedLibModules = !0;
|
||||
APP.settings.save();
|
||||
|
||||
APP.log('INFO - All previous imported modules using this launcher was removed since it could be harmful to your game dumps.');
|
||||
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Removed Imported modules
|
||||
removeImportedModules: function(){
|
||||
|
||||
if (this.selectedGame !== '' && this.cGameSettings.importedModules.length > 0){
|
||||
|
||||
var cMessage = '',
|
||||
gName = this.selectedGame,
|
||||
mList = this.cGameSettings.importedModules,
|
||||
mDir = APP.settings.data.gamePath + '/' + APP.gameList.list[gName].folderName + '/sce_module/';
|
||||
|
||||
// Try removing modules
|
||||
mList.forEach(function(mName){
|
||||
|
||||
try {
|
||||
|
||||
APP.fs.unlinkSync(mDir + mName);
|
||||
mList.splice(mList.indexOf(mName), 1);
|
||||
cMessage = 'INFO - (' + gName + ') Removing module: ' + mName;
|
||||
|
||||
} catch (err) {
|
||||
|
||||
console.error(err);
|
||||
cMessage = 'ERROR - Unable to remove modules!\nReason: ' + err;
|
||||
|
||||
}
|
||||
|
||||
// Log status
|
||||
APP.log(cMessage);
|
||||
|
||||
});
|
||||
|
||||
// Update settings file
|
||||
this.saveGameSettings(!0);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
138
App/js/language.js
Normal file
|
@ -0,0 +1,138 @@
|
|||
/*
|
||||
******************************************************************************
|
||||
fpPS4 Temmie's Launcher
|
||||
language.js
|
||||
|
||||
This file is a database with all labels and strings for different
|
||||
languages
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
temp_LANGUAGE = {
|
||||
|
||||
// Get variable string
|
||||
getVariable: function(name, list){
|
||||
|
||||
// Fix settings
|
||||
if (Object.keys(this.selected).length === 0){
|
||||
this.selected = this.english;
|
||||
}
|
||||
|
||||
// Declare main var
|
||||
var lPatch = [],
|
||||
res = this.selected.variables[name];
|
||||
|
||||
// If variable is not found or an empty string, get English instead
|
||||
if (res === void 0 || res === ''){
|
||||
res = this.english.variables[name];
|
||||
}
|
||||
|
||||
// If list is undefined, set patch list as a empty array
|
||||
if (list !== void 0){
|
||||
lPatch = list;
|
||||
}
|
||||
|
||||
// Apply variables and return string
|
||||
lPatch.forEach(function(fix, entry){
|
||||
res = res.replace(`%VARIABLE_${entry}%`, fix);
|
||||
});
|
||||
return res;
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Database
|
||||
*/
|
||||
|
||||
// English (Default)
|
||||
english: {
|
||||
|
||||
"lang": "English (Default)",
|
||||
|
||||
"variables": {
|
||||
|
||||
"labelEnableHack": "Enable",
|
||||
"emuStatusRunning": "Running",
|
||||
"logWindowTitle": "Running fpPS4",
|
||||
"killEmuStatus": "Main process closed - close the fpPS4 log window to go back",
|
||||
"logCleared": "INFO - Previous log was cleared!",
|
||||
"about": "fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\n\nCreated by TheMitoSan [Previously known as TemmieHeartz]\n(https://twitter.com/themitosan)\n\nfpPS4 is created by red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs is created by Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip is created by antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG icons were obtained from https://www.svgrepo.com/",
|
||||
"mainLog": 'fpPS4 Temmie\'s Launcher - Version: %VARIABLE_0%\nRunning on nw.js version %VARIABLE_1% [%VARIABLE_2%]',
|
||||
"settingsErrorCreatePath": "ERROR - Unable to create path!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERROR - Unable to locate the main fpPS4 executable!\nMake sure to select it in Settings or insert it in the \"Emu\" folder and click OK.",
|
||||
"settingsConfirmRemoveAllGameSettings": "WARNING - This option will remove all saved settings from your game list.\nDo you want to continue?",
|
||||
"settingsRemovedGameSettings": "INFO - ( %VARIABLE_0% ) Settings file was removed successfully!",
|
||||
"settingsConfirmRemoveGameSettings": "WARNING - This action will delete all saved settings for %VARIABLE_0%\n\nDo you want to continue?",
|
||||
"settingsRemoveGameSettingsError": 'ERROR - ( %VARIABLE_0% ) Unable to delete settings file!\nReason: %VARIABLE_1%',
|
||||
"settingsRemoveGameSettings404": 'WARNING - ( %VARIABLE_0% ) Unable to find the settings file for this app / game!',
|
||||
"infoProcessComplete": "INFO - Process complete!\nCheck the log for more details",
|
||||
"infoSettingsUpdated": "INFO - Settings file was updated successfully!",
|
||||
"settingsLoadError": "ERROR - Unable to load the settings file!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ERROR - Unable to save the settings file!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "\nINFO - Running fpPS4 with args: %VARIABLE_0%\nEmu location: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% was closed, returning code %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - All the previously imported modules using this launcher were removed since it can be harmful to your game dumps.",
|
||||
"removeLibModule": "INFO - ( %VARIABLE_0% ) Removing module: %VARIABLE_1%",
|
||||
"removeModuleError": "ERROR - Unable to remove modules!\nReason: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - ( %VARIABLE_0% ) Settings file was updated successfully!",
|
||||
"updateGameSettingsError": "ERROR - Unable to update the settings file for %VARIABLE_0% at %VARIABLE_1%!\nReason: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - ( %VARIABLE_0% ) Skipped updating the settings file since it has no changes!",
|
||||
"errorSaveFile": "ERROR - Unable to save the file!\nReason: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - Save successful!\nPath: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - Settings file was created successfully for %VARIABLE_0%",
|
||||
"errorCreateSettingsFile": "ERROR - Unable to create the settings file for %VARIABLE_0% at %VARIABLE_1%!\nReason: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - Patch loaded successfully!\nName: %VARIABLE_0%\nType: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERROR - This isn\'t a patch or it isn't made for this app / game!\nPatch ID: %VARIABLE_0%\nSelected app / game: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERROR - Unable to find the PARAM.SFO for this patch!",
|
||||
"gameListLoadWarnPlayGo": "WARNING - Unable to locate the playgo-chunk.dat for %VARIABLE_0%!\nIf this isn\'t a homebrew, check if this app / game was dumped properly.",
|
||||
"gameListLoadWarnParamSfo": "WARNING - Unable to locate the PARAM.SFO for %VARIABLE_0%!\nIf this isn\'t a homebrew, check if this app / game was dumped properly.",
|
||||
"gameListDoubleIdError": "WARNING - Unable to add %VARIABLE_0% to game list because another app / game with the same title ID already exists! ( %VARIABLE_1% )",
|
||||
"gameListNoGameFound": "INFO - No apps / games were detected on current path ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Unable to find",
|
||||
"checkDumpPlayGoOnApp": "INFO - ( %VARIABLE_0% ) playgo-chunk.dat was found inside sce_sys/app - a new copy was created in sce_sys.",
|
||||
"gameListLoadSuccessful": "INFO - Game list was loaded successfully! ( %VARIABLE_0% entries found )",
|
||||
"gameListVersion": "Version",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERROR - Unable to read the PARAM.SFO from this patch!\n%VARIABLE_0%",
|
||||
"path": "Path",
|
||||
"gamelistGamePath404": "ERROR - Unable to find the selected app / game path!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERROR - Unable to fetch GitHub actions data!",
|
||||
"updateEmuIsLatestVersion": "INFO - You are already using the latest fpPS4 version available!\nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - A new fpPS4 update is available!\n\nLocal version: %VARIABLE_0%\nUpstream version: %VARIABLE_1%\n\nDo you want to update?",
|
||||
"updateEmuShaUnavailable": "INFO - This Launcher detected that you didn\'t updated fpPS4 yet (or the fpPS4 executable was not found!)\n\nYou can fix this by running the fpPS4 updater process.\nDo you want to proceed?",
|
||||
"updateEmuDownloadFailed": "ERROR - Unable to download the fpPS4 update!\nResponse status: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - Update complete! - New fpPS4 version (Commit ID / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Downloading fpPS4 update (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Extracting update",
|
||||
"updateEmu-3-4": "Removing leftover files",
|
||||
"updateEmu-4-4": "Update complete!",
|
||||
"settingsLogEmuSha": "INFO - fpPS4 version: %VARIABLE_0%",
|
||||
"dumpStatus_OK": "Fine",
|
||||
"dumpStatus_WARN": "Missing files",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "ERROR - (Updater) Unable to load the workflow list from the fpPS4 GitHub!",
|
||||
"updater_noWorkflowListAvailable": "No workflow list available",
|
||||
"Sdl2NotFound": "SDL2.dll is not found in the Emu folder, please install it to use SDL2.",
|
||||
"errorListUnableLocateGamePath": "ERROR - Unable to locate \"%VARIABLE_0%\" settings path! In order to prevent issues, the game list will be reloaded.\nPath: %VARIABLE_1%",
|
||||
"updateEmuSettingsWorkflow404": "ERROR - (Updater) Unable to find (%VARIABLE_0%) on the fpPS4 workflow list! %VARIABLE_1% will be used as a fallback.",
|
||||
"nonWindowsOsWarn": "WARN - You are running fpPS4 Temmie's Launcher on a non-windows operating system!\n\nIn order to run fpPS4, you will need Wine installed on your OS.\n\nBe aware that running fpPS4 through tools like Wine can result in more glitches and a degraded performance / experience.",
|
||||
"cGameCompatStatus_BOOTS": "Boots",
|
||||
"cGameCompatStatus_MENUS": "Menus",
|
||||
"cGameCompatStatus_INGAME": "In-Game",
|
||||
"cGameCompatStatus_UNKNOWN": "Unknown",
|
||||
"cGameCompatStatus_NOTHING": "Nothing",
|
||||
"cGameCompatStatus_PLAYABLE": "Playable",
|
||||
"warnUnableFindGameCompatDb": "WARN - Unable to find the compatibility status for \"%VARIABLE_0%\" (%VARIABLE_1%) on the fpPS4 database!",
|
||||
"warnUserOffline": "WARN - You are offline! Some features (like the game compatibility status and the fpPS4 updater) will not be available until you reconnect to the internet."
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Green: All files are present\nYellow: Some files are missing - check the log for more details\nCyan: Executable is a .elf file",
|
||||
"DIV_selectedGameStatus_compat": "Playable: You can play this title from start to finish.\nIn-game: You can play parts / segments of this title, but you can't finish it.\nMenus: This title boots into the main menu, but you can't play the main game.\nBoots: This title starts loading the game, but fails at some point.\nNothing: This title doesn't do anything.\nUnknown: There is no data about this title on the fpPS4 database."
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Selected lang
|
||||
selected: {}
|
||||
|
||||
}
|
292
App/js/main.js
|
@ -4,25 +4,50 @@
|
|||
main.js
|
||||
|
||||
This file contains all modules and required functions to initialize
|
||||
launcher
|
||||
launcher.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
var APP = {
|
||||
const APP = {
|
||||
|
||||
// Import nw modules
|
||||
fs: require('fs'),
|
||||
path: require('path'),
|
||||
childProcess: require('child_process'),
|
||||
packageJson: require('../package.json'),
|
||||
memoryjs: require('App/node_modules/memoryjs'),
|
||||
// Load nwjs / node.js modules
|
||||
loadModules: function(){
|
||||
|
||||
try{
|
||||
|
||||
// Require global modules
|
||||
APP.fs = require('fs');
|
||||
APP.os = require('os');
|
||||
APP.win = nw.Window.get();
|
||||
APP.path = require('path');
|
||||
APP.https = require('https');
|
||||
APP.childProcess = require('child_process');
|
||||
APP.packageJson = require('../package.json');
|
||||
APP.streamZip = require('App/node_modules/node-stream-zip');
|
||||
|
||||
// If current OS is windows, load memoryjs
|
||||
if (APP.os.platform() === 'win32'){
|
||||
APP.memoryjs = require('App/node_modules/memoryjs');
|
||||
}
|
||||
|
||||
} catch(e) {
|
||||
console.error(e);
|
||||
window.alert(`ERROR - Unable to load node modules!\n${e}`);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// App version
|
||||
title: '',
|
||||
version: '',
|
||||
appVersion: void 0,
|
||||
|
||||
// Internet connection
|
||||
webConnection: !1,
|
||||
|
||||
// Import app modules
|
||||
tools: temp_TOOLS,
|
||||
lang: temp_LANGUAGE,
|
||||
design: temp_DESIGN,
|
||||
gameList: temp_GAMELIST,
|
||||
settings: temp_SETTINGS,
|
||||
|
@ -32,12 +57,15 @@ var APP = {
|
|||
|
||||
// Log function and variables
|
||||
logData: '',
|
||||
logLine: '',
|
||||
log: function(text){
|
||||
|
||||
if (text !== '' && text !== void 0){
|
||||
|
||||
var previousLog = APP.logData,
|
||||
newLog = previousLog + '\n' + text;
|
||||
// Delclare main vars
|
||||
var canLog = !0,
|
||||
previousLog = APP.logData,
|
||||
newLog = `${previousLog}\n${text}`;
|
||||
|
||||
// Fix log with white line
|
||||
if (previousLog == ''){
|
||||
|
@ -47,12 +75,21 @@ var APP = {
|
|||
newLog = previousLog + text;
|
||||
}
|
||||
|
||||
// Append log
|
||||
document.getElementById('APP_LOG').value = newLog;
|
||||
APP.logData = newLog;
|
||||
// Fix duplicate lines
|
||||
if (APP.logLine === text){
|
||||
canLog = !1;
|
||||
}
|
||||
|
||||
// Scroll log
|
||||
document.getElementById('APP_LOG').scrollTop = document.getElementById('APP_LOG').scrollHeight;
|
||||
// Check if can append log
|
||||
if (canLog === !0){
|
||||
|
||||
// Set current line, append log and scroll log view
|
||||
APP.logLine = text;
|
||||
document.getElementById('APP_LOG').value = newLog;
|
||||
APP.logData = newLog;
|
||||
document.getElementById('APP_LOG').scrollTop = document.getElementById('APP_LOG').scrollHeight;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -61,14 +98,24 @@ var APP = {
|
|||
// Clear Log
|
||||
clearLog: function(){
|
||||
|
||||
// Get current date
|
||||
var d = new Date(),
|
||||
logName = 'Log_' + d.toDateString().replace(RegExp(' ', 'gi'), '_') + '_' + d.getHours() + '_' + d.getMinutes() + '_' + d.getSeconds() + '.log';
|
||||
|
||||
// Reset log
|
||||
APP.logData = APP.appVersion;
|
||||
document.getElementById('APP_LOG').value = APP.appVersion;
|
||||
APP.log('INFO - Previous log was cleared!\n ');
|
||||
APP.log(APP.lang.getVariable('logCleared'));
|
||||
|
||||
},
|
||||
|
||||
// DEBUG: Process fpPS4 output data
|
||||
processStdOutput: function(data, type){
|
||||
|
||||
const logSplit = data.split('\n');
|
||||
logSplit.forEach(function(logLine){
|
||||
|
||||
if (logLine !== '' && logLine !== '\r'){
|
||||
console[type](logLine);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
|
@ -84,44 +131,69 @@ var APP = {
|
|||
*/
|
||||
process.chdir(APP.path.parse(exe).dir);
|
||||
|
||||
// Window state
|
||||
var winMode;
|
||||
switch (APP.settings.data.logExternalWindowStartMode){
|
||||
// Run external window
|
||||
if (APP.settings.data.debugTestLog === !1){
|
||||
|
||||
case 'normal':
|
||||
winMode = '';
|
||||
break;
|
||||
// Window state
|
||||
var winMode,
|
||||
pressAnyKey = '',
|
||||
emuExecPath = APP.path.parse(APP.settings.data.emuPath).base,
|
||||
cmdWinTitle = `"${APP.lang.getVariable('logWindowTitle')} - ${APP.gameList.selectedGame}"`;
|
||||
|
||||
case 'max':
|
||||
winMode = '/MAX';
|
||||
break;
|
||||
// Switch cmd window mode
|
||||
switch (APP.settings.data.logExternalWindowStartMode){
|
||||
|
||||
case 'min':
|
||||
winMode = '/MIN';
|
||||
break;
|
||||
case 'normal':
|
||||
winMode = '';
|
||||
break;
|
||||
|
||||
case 'max':
|
||||
winMode = '/MAX';
|
||||
break;
|
||||
|
||||
case 'min':
|
||||
winMode = '/MIN';
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
// Ask user to press any key
|
||||
if (APP.settings.data.logExternalWindowPrompt === !0){
|
||||
pressAnyKey = '^& pause';
|
||||
}
|
||||
|
||||
// Transform args into string
|
||||
var gPath = `"${args[args.indexOf('-e') + 1]}"`,
|
||||
parseArgs = args.toString().replace(RegExp(',', 'gi'), ' ').replace(args[args.indexOf('-e') + 1], gPath),
|
||||
execLine = `start ${cmdWinTitle} ${winMode} cmd /C ${emuExecPath} ${parseArgs} ${pressAnyKey}`;
|
||||
|
||||
// Check if needs to change exec line and run process
|
||||
if (APP.os.platform() !== 'win32'){
|
||||
execLine = `wine wineconsole "Z:${APP.settings.data.emuPath}" ${parseArgs}`
|
||||
}
|
||||
APP.execProcess = APP.childProcess.exec(execLine);
|
||||
|
||||
} else {
|
||||
|
||||
/*
|
||||
Debug
|
||||
*/
|
||||
console.clear();
|
||||
APP.execProcess = APP.childProcess.spawn(exe, args, { detached: !0 });
|
||||
|
||||
}
|
||||
|
||||
// Ask user to press any key
|
||||
var pressAnyKey = '';
|
||||
if (APP.settings.data.logExternalWindowPrompt === !0){
|
||||
pressAnyKey = '^& pause';
|
||||
}
|
||||
|
||||
// Transform args into string
|
||||
var gPath = '"' + args[args.indexOf('-e') + 1] + '"',
|
||||
parseArgs = args.toString().replace(RegExp(',', 'gi'), ' ').replace(args[args.indexOf('-e') + 1], gPath),
|
||||
execLine = 'start "Running fpPS4 - ' + APP.gameList.selectedGame + '" ' + winMode + ' cmd /C ' + APP.path.parse(APP.settings.data.emuPath).base + ' ' + parseArgs + ' ' + pressAnyKey;
|
||||
|
||||
// Run
|
||||
APP.execProcess = APP.childProcess.exec(execLine);
|
||||
// Set emu running and stream as string (UTF-8)
|
||||
APP.emuManager.emuRunning = !0;
|
||||
APP.execProcess.stdout.setEncoding('utf-8');
|
||||
APP.execProcess.stderr.setEncoding('utf-8');
|
||||
|
||||
// Log on stdout and stderr
|
||||
APP.execProcess.stdout.on('data', function(data){
|
||||
APP.processStdOutput(data);
|
||||
APP.processStdOutput(data, 'info');
|
||||
});
|
||||
APP.execProcess.stderr.on('data', function(data){
|
||||
APP.processStdOutput(data);
|
||||
APP.processStdOutput(data, 'error');
|
||||
});
|
||||
|
||||
// Log on close
|
||||
|
@ -136,23 +208,21 @@ var APP = {
|
|||
APP.design.toggleDisplayMode({
|
||||
appStatus: 'idle'
|
||||
});
|
||||
|
||||
// Log exit code
|
||||
APP.log('INFO - ' + APP.path.parse(exe).base + ' was closed returning code ' + code);
|
||||
|
||||
// Save log if APP.settings.data.saveLogOnEmuClose is true
|
||||
// Log exit code and save log if APP.settings.data.saveLogOnEmuClose is true
|
||||
APP.log(APP.lang.getVariable('closeEmuStatus', [APP.path.parse(exe).base, code]));
|
||||
if (APP.settings.data.saveLogOnEmuClose === !0){
|
||||
APP.clearLog();
|
||||
}
|
||||
|
||||
// Scroll game list to last selected game
|
||||
if (APP.gameList.selectedGame !== ''){
|
||||
TMS.css('GAME_ENTRY_' + APP.gameList.selectedGame, {'animation': '0.8s hintGameFocus'});
|
||||
TMS.css(`GAME_ENTRY_${APP.gameList.selectedGame}`, {'animation': '0.8s hintGameFocus'});
|
||||
TMS.focus('INPUT_gameListSearch', 100);
|
||||
|
||||
|
||||
setTimeout(function(){
|
||||
APP.design.selectGame(APP.gameList.selectedGame);
|
||||
TMS.scrollCenter('GAME_ENTRY_' + APP.gameList.selectedGame);
|
||||
TMS.scrollCenter(`GAME_ENTRY_${APP.gameList.selectedGame}`);
|
||||
}, 100);
|
||||
|
||||
}
|
||||
|
@ -169,30 +239,67 @@ var APP = {
|
|||
// MemoryJS - Get Process Info
|
||||
getProcessInfo: function(processName, postAction){
|
||||
|
||||
// Get process list
|
||||
var res, pList = this.memoryjs.getProcesses();
|
||||
// Check if current os is windows
|
||||
if (APP.os.platform() === 'win32'){
|
||||
|
||||
// Seek process
|
||||
Object.keys(pList).forEach(function(pName){
|
||||
// Get process list and start seek
|
||||
var res, pList = this.memoryjs.getProcesses();
|
||||
Object.keys(pList).forEach(function(pName){
|
||||
|
||||
if (pList[pName].szExeFile.toLowerCase() === processName.toLowerCase()){
|
||||
res = pList[pName];
|
||||
if (pList[pName].szExeFile.toLowerCase() === processName.toLowerCase()){
|
||||
res = pList[pName];
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// If found and post-action function is present, execute it!
|
||||
if (postAction !== void 0 && res !== void 0){
|
||||
postAction(res);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// If found and post-action function is present, execute it!
|
||||
if (postAction !== void 0 && res !== void 0){
|
||||
postAction(res);
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Check current operating system
|
||||
checkCurrentOs: function(){
|
||||
|
||||
// Check if needs to display warn
|
||||
if (APP.os.platform() !== 'win32' && APP.settings.data.nonWindowsOsWarn === !1){
|
||||
window.alert(APP.lang.getVariable('nonWindowsOsWarn'));
|
||||
APP.log(APP.lang.getVariable('nonWindowsOsWarn'));
|
||||
APP.settings.data.nonWindowsOsWarn = !0;
|
||||
APP.settings.save();
|
||||
APP.emuManager.update.check({forceUpdate: !0, silent: !0});
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Check current user internet connection
|
||||
startOnlineCheck: function(){
|
||||
|
||||
// Create update connection function
|
||||
const updateConnectionStatus = function(){
|
||||
APP.webConnection = navigator.onLine;
|
||||
};
|
||||
|
||||
// Set current connection status and crerate event listeners
|
||||
APP.webConnection = navigator.onLine;
|
||||
window.addEventListener('online', function(){
|
||||
updateConnectionStatus();
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = !1;
|
||||
});
|
||||
window.addEventListener('offline', function(){
|
||||
updateConnectionStatus();
|
||||
APP.log(APP.lang.getVariable('warnUserOffline'));
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = !0;
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// About screen
|
||||
about: function(){
|
||||
window.alert('fpPS4 Temmie\'s Launcher - Version: ' + this.version + '\nCreated by TemmieHeartz\n(https://twitter.com/themitosan)\n\n' +
|
||||
'fpPS4 main emulator is created by red-prig\n(https://github.com/red-prig/fpPS4)\n\n' +
|
||||
'Plugin memoryjs is created by Rob--\n(https://github.com/rob--/memoryjs)');
|
||||
window.alert(this.lang.getVariable('about', [this.version]));
|
||||
},
|
||||
|
||||
// Reload app
|
||||
|
@ -207,7 +314,9 @@ delete temp_TOOLS;
|
|||
delete temp_DESIGN;
|
||||
delete temp_SETTINGS;
|
||||
delete temp_GAMELIST;
|
||||
delete temp_LANGUAGE;
|
||||
delete temp_EMUMANAGER;
|
||||
delete temp_EMU_UPDATE;
|
||||
delete temp_FILEMANAGER;
|
||||
delete temp_PARAMSFO_PARSER;
|
||||
|
||||
|
@ -216,38 +325,43 @@ window.onload = function(){
|
|||
|
||||
try {
|
||||
|
||||
// Main log
|
||||
APP.version = APP.packageJson.version;
|
||||
document.title = APP.packageJson.name + ' - Ver. ' + APP.version + ' [' + process.versions['nw-flavor'].toUpperCase() + ']';
|
||||
APP.appVersion = 'fpPS4 Temmie\'s Launcher - Version: ' + APP.version + '\nRunning on nw.js (node-webkit) version ' + process.versions.nw + ' [' + process.versions['nw-flavor'].toUpperCase() + ']';
|
||||
APP.log(APP.appVersion);
|
||||
|
||||
// Load settings
|
||||
// Load nwjs / node.js modules and start loding settings ( 1 / 2 )
|
||||
APP.loadModules();
|
||||
APP.settings.load();
|
||||
APP.settings.loadLang();
|
||||
|
||||
// App title
|
||||
APP.version = APP.packageJson.version;
|
||||
APP.title = `${APP.packageJson.name} - Ver. ${APP.version} [${process.versions['nw-flavor'].toUpperCase()}]`;
|
||||
document.title = APP.title;
|
||||
|
||||
// App Log
|
||||
APP.appVersion = APP.lang.getVariable('mainLog', [APP.version, process.versions.nw, process.versions['nw-flavor'].toUpperCase()]);
|
||||
APP.log(APP.appVersion);
|
||||
|
||||
// Start connection check, load remaining settings, kill fpPS4 process if is active and check currert OS
|
||||
APP.settings.checkPaths();
|
||||
APP.design.renderSettings();
|
||||
|
||||
// Load game list
|
||||
APP.gameList.load();
|
||||
|
||||
// Rener hack list
|
||||
APP.design.renderHacklist();
|
||||
APP.design.renderLabelTitles();
|
||||
|
||||
// Kill fpPS4 process if is active
|
||||
APP.emuManager.killEmu(!0);
|
||||
APP.startOnlineCheck();
|
||||
APP.checkCurrentOs();
|
||||
|
||||
// Focus search field
|
||||
// Rener hack list, gamepad modes and focus input search field
|
||||
APP.design.renderHacklist();
|
||||
TMS.focus('INPUT_gameListSearch');
|
||||
|
||||
// Remove all previous imported modules
|
||||
APP.gameList.removeAllModules();
|
||||
// Load game list, Get all available workflows from updater and check if fpPS4 have any update (silently)
|
||||
APP.gameList.load();
|
||||
APP.emuManager.update.getWorkflows();
|
||||
if (APP.emuManager.update.skipLoadingCheck === !1){
|
||||
APP.emuManager.update.check({ silent: !0 });
|
||||
}
|
||||
|
||||
} catch (err) {
|
||||
|
||||
// Log it
|
||||
// Log error
|
||||
console.error(err);
|
||||
window.confirm('ERROR - Unable to start main application!\n\nReason:\n' + err + '\n\nTo know more, hit F12 and go to console tab to see more details.');
|
||||
window.alert(`ERROR - Unable to start main application!\n\nReason:\n${err}\n\nTo know more, hit F12 and go to console tab to see more details.`);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
This file is responsible for holding all funcions / database for reading
|
||||
PARAM.SFO files!
|
||||
|
||||
Many thanks to Control eXecute (@notzecoxao) for this sassy-challenge!
|
||||
Many thanks to Control eXecute (@notzecoxao) for this challenge!
|
||||
|
||||
Article used as reference:
|
||||
https://www.psdevwiki.com/ps4/Param.sfo
|
||||
|
@ -14,7 +14,7 @@
|
|||
*/
|
||||
|
||||
temp_PARAMSFO_PARSER = {
|
||||
|
||||
|
||||
// PARAM.SFO Key Database
|
||||
database: temp_PARAMSFO_DATABASE,
|
||||
|
||||
|
@ -35,7 +35,7 @@ temp_PARAMSFO_PARSER = {
|
|||
|
||||
// Read file as hex (String)
|
||||
const sfoHex = APP.fs.readFileSync(fLocation, 'hex');
|
||||
|
||||
|
||||
var sfoMetadata = {},
|
||||
|
||||
// SFO Header
|
||||
|
@ -46,7 +46,7 @@ temp_PARAMSFO_PARSER = {
|
|||
keyTableStart: APP.tools.parseEndian(sfoHex.slice(16, 24)), // (0x04) Key table start offset
|
||||
dataTableStart: APP.tools.parseEndian(sfoHex.slice(24, 32)), // (0x04) Data table start offset
|
||||
totalIndexEntries: APP.tools.parseEndian(sfoHex.slice(32, 40)) // (0x04) Total entries in index table
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -72,9 +72,8 @@ temp_PARAMSFO_PARSER = {
|
|||
// Get key table data info
|
||||
listAttrArray.forEach(function(cAttr){
|
||||
|
||||
// Slice Current Data
|
||||
// Slice current data and set current read mode
|
||||
const cReadingMode = hexStartLocation.slice(readerLocation, parseInt(readerLocation + 32));
|
||||
|
||||
readMode[cAttr] = {
|
||||
|
||||
keyTableOffset: cReadingMode.slice(0, 4), // Key table offset
|
||||
|
@ -82,7 +81,7 @@ temp_PARAMSFO_PARSER = {
|
|||
paramLength: cReadingMode.slice(8, 16), // Parameter length
|
||||
paramMaxLength: cReadingMode.slice(16, 24), // Parameter Max Length
|
||||
dataOffset: cReadingMode.slice(24, 32) // Data Offset
|
||||
|
||||
|
||||
}
|
||||
|
||||
// Update position for next location
|
||||
|
@ -91,9 +90,9 @@ temp_PARAMSFO_PARSER = {
|
|||
});
|
||||
|
||||
/*
|
||||
Set Metadata Info
|
||||
Set metadata info
|
||||
*/
|
||||
|
||||
|
||||
// Set location to data table start create first slice
|
||||
var pointerLocation = 0,
|
||||
dataTableSlice = sfoHex.slice(parseInt(sfoHeader.dataTableStart, 16) * 2);
|
||||
|
@ -104,9 +103,8 @@ temp_PARAMSFO_PARSER = {
|
|||
// Get hex file starting from current location
|
||||
var keyData = '',
|
||||
convertUft8 = !1,
|
||||
cSlice = dataTableSlice.slice(pointerLocation),
|
||||
stopLocation = parseInt(pointerLocation + 8); // Default: int32
|
||||
|
||||
|
||||
/*
|
||||
Check param length
|
||||
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
*/
|
||||
|
||||
temp_SETTINGS = {
|
||||
|
||||
|
||||
// Settings list
|
||||
data: {
|
||||
|
||||
|
@ -17,15 +17,24 @@ temp_SETTINGS = {
|
|||
General
|
||||
*/
|
||||
|
||||
// Remove previous imported modules
|
||||
removedLibModules: !1,
|
||||
// App Version
|
||||
launcherVersion: '',
|
||||
|
||||
// Language
|
||||
appLanguage: 'english',
|
||||
|
||||
// Paths
|
||||
nwPath: '',
|
||||
emuPath: '',
|
||||
gamePath: '',
|
||||
|
||||
// Enable / Disable PARAM.SFO support
|
||||
// Run fpPS4 on fullscreen
|
||||
enableEmuFullscreen: !1,
|
||||
|
||||
// Enable / disable change led color
|
||||
sdlEnableGamepadLed: !0,
|
||||
|
||||
// Enable / disable PARAM.SFO support
|
||||
enableParamSfo: !0,
|
||||
|
||||
// Log External window
|
||||
|
@ -36,6 +45,18 @@ temp_SETTINGS = {
|
|||
GUI
|
||||
*/
|
||||
|
||||
// Zoom scale
|
||||
guiZoomScale: 1,
|
||||
|
||||
// Game list
|
||||
showBgOnEntry: !0,
|
||||
showPathEntry: !0,
|
||||
gameListMode: 'compact',
|
||||
|
||||
// Emu running
|
||||
showPathRunning: !0,
|
||||
showGuiMetadata: !0,
|
||||
|
||||
// Game search mode (appName or titleId)
|
||||
gameSearchMode: 'appName',
|
||||
searchCaseSensitive: !1,
|
||||
|
@ -52,11 +73,27 @@ temp_SETTINGS = {
|
|||
gridIconSize: 116,
|
||||
gridBorderRadius: 8,
|
||||
|
||||
showBgOnEntry: !0,
|
||||
showPathEntry: !0,
|
||||
showPathRunning: !0,
|
||||
gameListMode: 'normal'
|
||||
|
||||
// Enable compat status check
|
||||
enableCompatStatusCheck: !0,
|
||||
|
||||
/*
|
||||
fpPS4 Update
|
||||
*/
|
||||
latestCommitSha: '',
|
||||
enableEmuUpdates: !0,
|
||||
fpps4BranchName: 'trunk',
|
||||
fpps4selectedCI: 'Main CI',
|
||||
|
||||
/*
|
||||
Warning messages
|
||||
*/
|
||||
nonWindowsOsWarn: !1,
|
||||
|
||||
/*
|
||||
Debug
|
||||
*/
|
||||
debugTestLog: !1
|
||||
|
||||
},
|
||||
|
||||
// Load settings
|
||||
|
@ -64,19 +101,18 @@ temp_SETTINGS = {
|
|||
|
||||
// Get launcher main dir before settings load
|
||||
var updateSettings = !1,
|
||||
nwPath = APP.tools.fixPath(nw.__dirname);
|
||||
nwPath = APP.tools.fixPath(nw.__dirname),
|
||||
settingsPath = `${nwPath}/Settings.json`;
|
||||
|
||||
// Create save
|
||||
if (APP.fs.existsSync(nwPath + '/Settings.json') === !1){
|
||||
if (APP.fs.existsSync(settingsPath) === !1){
|
||||
APP.settings.save();
|
||||
}
|
||||
|
||||
try {
|
||||
|
||||
// Read settings file
|
||||
var loadSettings = JSON.parse(APP.fs.readFileSync(nwPath + '/Settings.json', 'utf8'));
|
||||
|
||||
// Check for obsolete settings
|
||||
// Read settings file and check for obsolete keys
|
||||
var loadSettings = JSON.parse(APP.fs.readFileSync(settingsPath, 'utf8'));
|
||||
Object.keys(loadSettings).forEach(function(cSettings){
|
||||
|
||||
if (APP.settings.data[cSettings] === void 0){
|
||||
|
@ -96,18 +132,19 @@ temp_SETTINGS = {
|
|||
|
||||
});
|
||||
|
||||
// Load settings
|
||||
// Load settings and check if needs to update settings file
|
||||
this.data = loadSettings;
|
||||
|
||||
// Check if need to update settings file
|
||||
if (updateSettings === !0){
|
||||
APP.log('INFO - Settings file was updated successfully!');
|
||||
APP.log(APP.lang.getVariable('infoSettingsUpdated'));
|
||||
APP.settings.save();
|
||||
}
|
||||
|
||||
// Fix path
|
||||
this.data.nwPath = APP.tools.fixPath(nw.__dirname);
|
||||
|
||||
} catch (err) {
|
||||
|
||||
console.error('ERROR - Unable to load settings!\n' + err);
|
||||
console.error(APP.lang.getVariable('settingsLoadError', [err]));
|
||||
|
||||
}
|
||||
|
||||
|
@ -115,27 +152,60 @@ temp_SETTINGS = {
|
|||
|
||||
// Save settings
|
||||
save: function(){
|
||||
|
||||
// Get launcher main dir before settings load
|
||||
|
||||
// Get launcher main dir before settings load and include current launcher version on settings
|
||||
const nwPath = APP.tools.fixPath(nw.__dirname);
|
||||
this.data.launcherVersion = APP.packageJson.version;
|
||||
|
||||
try {
|
||||
APP.fs.writeFileSync(nwPath + '/Settings.json', JSON.stringify(this.data), 'utf8');
|
||||
APP.fs.writeFileSync(`${nwPath}/Settings.json`, JSON.stringify(this.data), 'utf-8');
|
||||
} catch (err) {
|
||||
console.error('ERROR - Unable to save settings!\n' + err);
|
||||
console.error(APP.lang.getVariable('settingsSaveError', [err]));
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Load selected language
|
||||
loadLang: function(){
|
||||
|
||||
try {
|
||||
|
||||
// Get lang data
|
||||
var cLang = this.data.appLanguage,
|
||||
fileLocation = `${APP.settings.data.nwPath}/Lang/${cLang}.json`;
|
||||
|
||||
// Check if lang file exists and if lang isn't english
|
||||
if (cLang !== 'english' && APP.fs.existsSync(fileLocation) === !0){
|
||||
|
||||
// Get selected lang
|
||||
var getLangFile = APP.fs.readFileSync(fileLocation, 'utf-8');
|
||||
APP.lang.selected = JSON.parse(getLangFile);
|
||||
|
||||
} else {
|
||||
|
||||
// Set english as default lang
|
||||
APP.lang.selected = APP.lang.english;
|
||||
|
||||
}
|
||||
|
||||
// Update GUI
|
||||
APP.design.updateLang();
|
||||
|
||||
} catch (err) {
|
||||
|
||||
console.error(err);
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Check paths
|
||||
checkPaths: function(){
|
||||
|
||||
// Fix path
|
||||
this.data.nwPath = APP.tools.fixPath(nw.__dirname);
|
||||
|
||||
// Create main vars
|
||||
var logMessage = '',
|
||||
mainPath = this.data.nwPath,
|
||||
pathList = ['/Emu', '/Games'];
|
||||
pathList = ['/Emu', '/Games', '/Lang'];
|
||||
|
||||
// Try create required paths
|
||||
pathList.forEach(function(cPath){
|
||||
|
@ -145,37 +215,40 @@ temp_SETTINGS = {
|
|||
try {
|
||||
APP.fs.mkdirSync(mainPath + cPath);
|
||||
} catch (err) {
|
||||
APP.log('ERROR - Unable to create path!\n(' + mainPath + cPath + ')\n' + err);
|
||||
APP.log(APP.lang.getVariable(settingsErrorCreatePath, [mainPath + cPath, err]));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// Set Games / Emu paths and check if both exists
|
||||
if (this.data.gamePath === '' && APP.fs.existsSync(this.data.gamePath) === !1){
|
||||
APP.settings.data.gamePath = mainPath + '/Games';
|
||||
APP.settings.data.gamePath = `${mainPath}/Games`;
|
||||
}
|
||||
|
||||
// fpPS4 path
|
||||
if (this.data.emuPath === '' || APP.fs.existsSync(this.data.emuPath) === !1){
|
||||
APP.settings.data.emuPath = mainPath + '/Emu/fpPS4.exe';
|
||||
}
|
||||
if (APP.fs.existsSync(this.data.emuPath) === !0){
|
||||
|
||||
logMessage = 'INFO - Main fpPS4 was found!\nPath: ' + APP.settings.data.emuPath + '\n ';
|
||||
|
||||
} else {
|
||||
|
||||
logMessage = 'ERROR - Unable to locate main fpPS4 executable!\nMake sure to select it on settings or insert it on \"Emu\" folder and click on ok.';
|
||||
window.alert(logMessage);
|
||||
|
||||
APP.settings.data.emuPath = `${mainPath}/Emu/fpPS4.exe`;
|
||||
}
|
||||
|
||||
// Log message
|
||||
// If fpPS4 is not found, reset latest commit sha and request update
|
||||
if (APP.fs.existsSync(this.data.emuPath) !== !0){
|
||||
|
||||
// Set flag to skip update check on window.onload
|
||||
APP.emuManager.update.skipLoadingCheck = !0;
|
||||
this.data.latestCommitSha = '';
|
||||
APP.emuManager.update.check();
|
||||
|
||||
}
|
||||
|
||||
// If latestCommitSha isn't empty, log it
|
||||
if (this.data.latestCommitSha !== ''){
|
||||
APP.log(APP.lang.getVariable('settingsLogEmuSha', [APP.settings.data.latestCommitSha.slice(0, 7)]));
|
||||
}
|
||||
APP.log(logMessage);
|
||||
|
||||
},
|
||||
},
|
||||
|
||||
// Select path
|
||||
selectPath: function(data){
|
||||
|
@ -201,11 +274,28 @@ temp_SETTINGS = {
|
|||
|
||||
},
|
||||
|
||||
// Set display mode from buttons
|
||||
setDisplayMode: function(cMode){
|
||||
|
||||
if (cMode !== void 0){
|
||||
|
||||
// Update display mode and clear previous search
|
||||
this.data.gameListMode = cMode;
|
||||
document.getElementById('INPUT_gameListSearch').value = '';
|
||||
|
||||
// Render GUI
|
||||
APP.design.renderSettings(!0);
|
||||
APP.design.renderGameList({displayLog: !1});
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Reset all game settings
|
||||
resetAllGameSettings: function(){
|
||||
|
||||
// Confirm action
|
||||
const conf = window.confirm('WARN - This option will remove ALL saved settings from your game list.\nDo you want to continue?');
|
||||
const conf = window.confirm(APP.lang.getVariable('settingsConfirmRemoveAllGameSettings'));
|
||||
if (conf === !0){
|
||||
|
||||
// Reset search form
|
||||
|
@ -222,16 +312,16 @@ temp_SETTINGS = {
|
|||
gList.forEach(function(cGame){
|
||||
|
||||
// Check if settings file exists
|
||||
if (APP.fs.existsSync(APP.path.parse(APP.gameList.list[cGame].exe).dir + '/launcherSettings.json') === !0){
|
||||
if (APP.fs.existsSync(`${APP.path.parse(APP.gameList.list[cGame].exe).dir}/launcherSettings.json`) === !0){
|
||||
|
||||
try {
|
||||
|
||||
APP.fs.unlinkSync(APP.path.parse(APP.gameList.list[cGame].exe).dir + '/launcherSettings.json');
|
||||
cMessage = 'INFO - ( ' + APP.gameList.list[cGame].name + ' ) Settings file was removed sucessfully!';
|
||||
APP.fs.unlinkSync(`${APP.path.parse(APP.gameList.list[cGame].exe).dir}/launcherSettings.json`);
|
||||
cMessage = APP.lang.getVariable('settingsRemovedGameSettings', [APP.gameList.list[cGame].name]);
|
||||
|
||||
} catch (err) {
|
||||
|
||||
cMessage = 'ERROR - ( ' + APP.gameList.list[cGame].name + ' ) Unable to delete settings file!\nReason: ' + err;
|
||||
cMessage = APP.lang.getVariable('settingsRemoveGameSettingsError', [APP.gameList.list[cGame].name, err]);
|
||||
console.error(err);
|
||||
|
||||
}
|
||||
|
@ -239,7 +329,7 @@ temp_SETTINGS = {
|
|||
} else {
|
||||
|
||||
// Unable to find settings file
|
||||
cMessage = 'WARN - ( ' + APP.gameList.list[cGame].name + ' ) Unable to find settings for this App / Game!';
|
||||
cMessage = APP.lang.getVariable('settingsRemoveGameSettings404', [APP.gameList.list[cGame].name]);
|
||||
|
||||
}
|
||||
|
||||
|
@ -249,10 +339,9 @@ temp_SETTINGS = {
|
|||
});
|
||||
|
||||
// Process complete
|
||||
window.alert('INFO - Process Complete!\nCheck log for more details.');
|
||||
APP.log('INFO - Reset Game Settings: Process Complete!');
|
||||
window.alert(APP.lang.getVariable('infoProcessComplete'));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -11,7 +11,7 @@ temp_TOOLS = {
|
|||
|
||||
// Solve Hex
|
||||
solveHex: function(hex){
|
||||
|
||||
|
||||
if (hex !== void 0){
|
||||
return hex.toLowerCase().replace(RegExp(' ', 'gi'), '');
|
||||
}
|
||||
|
@ -41,7 +41,7 @@ temp_TOOLS = {
|
|||
|
||||
var textValue = '';
|
||||
if (hex !== void 0 && hex !== ''){
|
||||
textValue = decodeURIComponent('%' + hex.match(/.{2,2}/g).join('%'));
|
||||
textValue = decodeURIComponent(`%${hex.match(/.{2,2}/g).join('%')}`);
|
||||
}
|
||||
|
||||
return textValue;
|
||||
|
@ -55,7 +55,7 @@ temp_TOOLS = {
|
|||
if (current !== void 0 && maximum !== void 0){
|
||||
res = Math.floor((current / maximum) * 100);
|
||||
}
|
||||
|
||||
|
||||
return res;
|
||||
|
||||
},
|
||||
|
|
349
App/js/updateEmu.js
Normal file
|
@ -0,0 +1,349 @@
|
|||
/*
|
||||
******************************************************************************
|
||||
fpPS4 Temmie's Launcher
|
||||
updateEmu.js
|
||||
|
||||
This file is responsible for feching latest data from red-prig fpPS4 actions
|
||||
and update.
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
temp_EMU_UPDATE = {
|
||||
|
||||
// Skip main loading call
|
||||
skipLoadingCheck: !1,
|
||||
|
||||
// Log fetch error
|
||||
logFetchError: function(msg){
|
||||
const errMsg = APP.lang.getVariable(msg);
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = '';
|
||||
console.error(errMsg);
|
||||
APP.log(errMsg);
|
||||
},
|
||||
|
||||
// Fetch data from url
|
||||
fetchData: async function(url, callback){
|
||||
|
||||
// If url was provided
|
||||
if (url !== void 0 && APP.webConnection === !0 && typeof callback === 'function'){
|
||||
|
||||
// Get error message and fetch data
|
||||
fetch(url).then(function(resp){
|
||||
|
||||
// Check if fetch status is ok
|
||||
if (resp.ok === !0){
|
||||
|
||||
resp.json().then(function(jsonData){
|
||||
callback(jsonData);
|
||||
});
|
||||
|
||||
} else {
|
||||
APP.emuManager.update.logFetchError('updateEmuFetchActionsError');
|
||||
}
|
||||
|
||||
}, function(err){
|
||||
APP.emuManager.update.logFetchError('updateEmuFetchActionsError');
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Get all available workflows
|
||||
getWorkflows: function(){
|
||||
|
||||
// Process workflows
|
||||
const processWorkflows = function(data){
|
||||
|
||||
// Create variables and check if data was provided
|
||||
var htmlTemp = `<option disabled>${APP.lang.getVariable('updater_noWorkflowListAvailable')}</option>`;
|
||||
if (data !== void 0){
|
||||
|
||||
// Reset html temp and process workflow list
|
||||
htmlTemp = '';
|
||||
data.workflows.forEach(function(cData){
|
||||
htmlTemp = `${htmlTemp}<option value="${cData.name}">${cData.name}</option>`;
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
// Append HTML
|
||||
document.getElementById('SELECT_settingsUpdaterCurrentCI').innerHTML = htmlTemp;
|
||||
document.getElementById('SELECT_settingsUpdaterCurrentCI').value = APP.settings.data.fpps4selectedCI;
|
||||
|
||||
}
|
||||
|
||||
// Fetch data
|
||||
fetch('https://api.github.com/repos/red-prig/fpPS4/actions/workflows').then(function(resp){
|
||||
|
||||
// Check if fetch status is ok
|
||||
if (resp.ok === !0){
|
||||
|
||||
resp.json().then(function(jsonData){
|
||||
processWorkflows(jsonData);
|
||||
});
|
||||
|
||||
} else {
|
||||
APP.emuManager.update.logFetchError('updateEmuFetchActionsError');
|
||||
}
|
||||
|
||||
}, function(err){
|
||||
APP.emuManager.update.logFetchError('updateEmuFetchActionsError');
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Fetch latest github actions
|
||||
|
||||
options: Object
|
||||
jsonData: Object - GitHub actions list (json)
|
||||
forceUpdate: Boolean - Skip checks and download latest version available
|
||||
silent: Boolean - Don't show message if user already have latest version
|
||||
*/
|
||||
check: function(options){
|
||||
|
||||
// Process options
|
||||
if (options === void 0){
|
||||
options = { forceUpdate: !1, silent: !1 };
|
||||
}
|
||||
var fetchData = this.fetchData,
|
||||
workflowLink = 'https://api.github.com/repos/red-prig/fpPS4/actions/workflows',
|
||||
optionsList = ['forceUpdate', 'silent'].forEach(function(optId){
|
||||
if (options[optId] === void 0){
|
||||
options[optId] = !1;
|
||||
}
|
||||
});
|
||||
|
||||
// If Emu updates is available, has internet and fpPS4 isn't running
|
||||
if (APP.settings.data.enableEmuUpdates === !0 && navigator.onLine === !0 && APP.emuManager.emuRunning === !1){
|
||||
|
||||
// Disable check for updates emu and fetch workflow list
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = 'disabled';
|
||||
fetchData(workflowLink, function(data){
|
||||
|
||||
// Set json and declare variables
|
||||
options['wList'] = data;
|
||||
var sWorkflow,
|
||||
wList = options.wList.workflows;
|
||||
|
||||
// Fix empty ci
|
||||
if (APP.settings.data.fpps4selectedCI === ''){
|
||||
APP.settings.data.fpps4selectedCI = 'Main CI';
|
||||
}
|
||||
|
||||
// Check if workflow list has items
|
||||
if (wList.length !== 0){
|
||||
|
||||
// Seek selected ci
|
||||
for (var i = 0; i < wList.length; i++){
|
||||
if (wList[i].name === APP.settings.data.fpps4selectedCI){
|
||||
sWorkflow = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Check if workflow was found. If not, use first available!
|
||||
if (sWorkflow === void 0){
|
||||
sWorkflow = 0;
|
||||
APP.log(APP.lang.getVariable('updateEmuSettingsWorkflow404', [APP.settings.data.fpps4selectedCI, wList[sWorkflow]]));
|
||||
}
|
||||
fetchData(`${workflowLink}/${wList[sWorkflow].id}/runs`, function(data){
|
||||
options['runs'] = data;
|
||||
APP.emuManager.update.processActions(options);
|
||||
});
|
||||
|
||||
} else {
|
||||
const errMsg = APP.lang.getVariable('updateEmuWorkflow404');
|
||||
console.error(errMsg);
|
||||
APP.log(errMsg);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Process github actions data
|
||||
processActions: function(options){
|
||||
|
||||
// Check if data was provided
|
||||
if (options !== void 0){
|
||||
|
||||
// Variables
|
||||
var winConf,
|
||||
msgData = '',
|
||||
artifactData,
|
||||
canPrompt = !0,
|
||||
canUpdate = !1,
|
||||
msgMode = 'confirm',
|
||||
settingsData = APP.settings.data;
|
||||
|
||||
// Seek for latest success run
|
||||
for (var i = 0; i < options.runs.workflow_runs.length; i++){
|
||||
|
||||
// Get current run data, check if status is completed (with a success build) and if is from same branch
|
||||
const cRun = options.runs.workflow_runs[i];
|
||||
if (cRun.status === 'completed' && cRun.conclusion === 'success' && cRun.head_branch === settingsData.fpps4BranchName){
|
||||
|
||||
// Set canUpdate on and run info
|
||||
canUpdate = !0;
|
||||
artifactData = {
|
||||
artifact: cRun.id,
|
||||
sha: cRun.head_sha
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// If found valid run
|
||||
if (artifactData !== void 0){
|
||||
|
||||
// Check if current version is latest commit (or force update is on)
|
||||
if (settingsData.latestCommitSha !== artifactData.sha || options.forceUpdate === !0){
|
||||
|
||||
// Set default update message
|
||||
msgData = APP.lang.getVariable('updateEmuShaAvailable', [settingsData.latestCommitSha.slice(0, 7), artifactData.sha.slice(0, 7)]);
|
||||
|
||||
// If user didn't updated yet using launcher or executable was not found
|
||||
if (settingsData.latestCommitSha === '' || APP.fs.existsSync(settingsData.emuPath) === !1){
|
||||
msgData = APP.lang.getVariable('updateEmuShaUnavailable');
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// If silent is active
|
||||
if (options.silent === !0){
|
||||
canPrompt = !1;
|
||||
}
|
||||
|
||||
// User already have latest version
|
||||
if (settingsData.latestCommitSha === artifactData.sha && APP.fs.existsSync(settingsData.emuPath) === !0){
|
||||
|
||||
// Set message mode to alert and get message for latest version
|
||||
msgMode = 'alert';
|
||||
msgData = APP.lang.getVariable('updateEmuIsLatestVersion', [settingsData.latestCommitSha.slice(0, 7)]);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Check if can update
|
||||
if (canUpdate === !0 && canPrompt === !0){
|
||||
winConf = window[msgMode](msgData);
|
||||
}
|
||||
|
||||
// If can update and user confirms action or can update and force update is on
|
||||
if (msgMode === 'confirm' && winConf === !0 || canUpdate === !0 && options.forceUpdate === !0){
|
||||
this.getZipFile(artifactData);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Enable updater button again
|
||||
document.getElementById('BTN_UPDATE_FPPS4').disabled = '';
|
||||
|
||||
},
|
||||
|
||||
/*
|
||||
Get zip from specific github action run
|
||||
|
||||
Since GitHub requires a token to be able to download artifacts, nightly.links service will be used instead.
|
||||
https://nightly.link
|
||||
*/
|
||||
getZipFile: function(actionsData){
|
||||
|
||||
// If (by some reason) fpPS4 is running - close it!
|
||||
APP.emuManager.killEmu();
|
||||
|
||||
// Display GUI and start download
|
||||
APP.design.toggleEmuUpdateGUI('show');
|
||||
APP.design.updateProgressbarStatus(25, APP.lang.getVariable('updateEmu-1-4', [actionsData.sha.slice(0, 7)]));
|
||||
fetch(`https://nightly.link/red-prig/fpPS4/actions/runs/${actionsData.artifact}/fpPS4.zip`).then(function(resp){
|
||||
|
||||
if (resp.ok === !0){
|
||||
|
||||
APP.https.get(resp.url, function(data){
|
||||
|
||||
const
|
||||
fPath = `${APP.settings.data.nwPath}/Emu/fpPS4.zip`,
|
||||
writeStream = APP.fs.createWriteStream(fPath);
|
||||
|
||||
data.pipe(writeStream);
|
||||
writeStream.on('finish', function(){
|
||||
|
||||
// Close writestream and extract emu executable
|
||||
writeStream.close();
|
||||
APP.emuManager.update.extractZip({
|
||||
actions: actionsData,
|
||||
path: fPath
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
console.error(resp);
|
||||
APP.log(APP.lang.getVariable('updateEmuDownloadFailed', [resp.status, resp.ok]));
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Extract zip
|
||||
extractZip: function(data){
|
||||
|
||||
// Update status, open and extract zip file
|
||||
APP.design.updateProgressbarStatus(50, APP.lang.getVariable('updateEmu-2-4'));
|
||||
const updateFile = new APP.streamZip.async({ file: data.path });
|
||||
updateFile.extract(null, `${APP.path.parse(data.path).dir}/`, function(err){
|
||||
if (err){
|
||||
console.error(err);
|
||||
}
|
||||
}).then(function(){
|
||||
|
||||
// Close zip and finish process
|
||||
updateFile.close();
|
||||
APP.emuManager.update.finish(data);
|
||||
|
||||
});
|
||||
|
||||
},
|
||||
|
||||
// Finish process
|
||||
finish: function(data){
|
||||
|
||||
// Update status, remove download file and update settings
|
||||
APP.design.updateProgressbarStatus(75, APP.lang.getVariable('updateEmu-3-4'));
|
||||
APP.fs.unlinkSync(data.path);
|
||||
APP.settings.data.latestCommitSha = data.actions.sha;
|
||||
APP.settings.data.emuPath = `${APP.path.parse(data.path).dir}/fpPS4.exe`;
|
||||
|
||||
// Save settings and update progressbar
|
||||
APP.settings.save();
|
||||
const processCompleteMsg = APP.lang.getVariable('updateEmuProcessComplete', [data.actions.sha.slice(0, 7)]);
|
||||
APP.design.updateProgressbarStatus(100, APP.lang.getVariable('updateEmu-4-4'));
|
||||
|
||||
// Timing out just to update GUI
|
||||
setTimeout(function(){
|
||||
|
||||
// Display message and hide update gui
|
||||
APP.log(processCompleteMsg);
|
||||
window.alert(processCompleteMsg);
|
||||
APP.design.toggleEmuUpdateGUI('hide');
|
||||
|
||||
}, 410);
|
||||
|
||||
}
|
||||
|
||||
}
|
2
App/node_modules/memoryjs/build/config.gypi
generated
vendored
|
@ -78,7 +78,7 @@
|
|||
"v8_use_siphash": 1,
|
||||
"want_separate_host_toolset": 0,
|
||||
"clang": "true",
|
||||
"nodedir": "C:\\Users\\TemmieHeartz\\.nw-gyp\\0.70.1",
|
||||
"nodedir": "",
|
||||
"standalone_static_library": 1,
|
||||
"msbuild_path": "C:\\Program Files (x86)\\Microsoft Visual Studio\\2017\\Community\\MSBuild\\15.0\\Bin\\MSBuild.exe",
|
||||
"target": "0.70.1"
|
||||
|
|
2
App/node_modules/memoryjs/package.json
generated
vendored
|
@ -22,7 +22,7 @@
|
|||
"_resolved": "https://registry.npmjs.org/memoryjs/-/memoryjs-3.5.1.tgz",
|
||||
"_shasum": "9156412cf18ad4ee0f6e57aa9753cc593884ff89",
|
||||
"_spec": "memoryjs",
|
||||
"_where": "C:\\Users\\TemmieHeartz\\Desktop\\teste",
|
||||
"_where": "",
|
||||
"author": {
|
||||
"name": "Rob--"
|
||||
},
|
||||
|
|
44
App/node_modules/node-stream-zip/LICENSE
generated
vendored
Normal file
|
@ -0,0 +1,44 @@
|
|||
Copyright (c) 2021 Antelle https://github.com/antelle
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
== dependency license: adm-zip ==
|
||||
|
||||
Copyright (c) 2012 Another-D-Mention Software and other contributors,
|
||||
http://www.another-d-mention.ro/
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining
|
||||
a copy of this software and associated documentation files (the
|
||||
"Software"), to deal in the Software without restriction, including
|
||||
without limitation the rights to use, copy, modify, merge, publish,
|
||||
distribute, sublicense, and/or sell copies of the Software, and to
|
||||
permit persons to whom the Software is furnished to do so, subject to
|
||||
the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
224
App/node_modules/node-stream-zip/README.md
generated
vendored
Normal file
|
@ -0,0 +1,224 @@
|
|||
# node-stream-zip 
|
||||
|
||||
node.js library for reading and extraction of ZIP archives.
|
||||
Features:
|
||||
|
||||
- it never loads entire archive into memory, everything is read by chunks
|
||||
- large archives support
|
||||
- all operations are non-blocking, no sync i/o
|
||||
- fast initialization
|
||||
- no dependencies, no binary addons
|
||||
- decompression with built-in zlib module
|
||||
- deflate, sfx, macosx/windows built-in archives
|
||||
- ZIP64 support
|
||||
|
||||
## Installation
|
||||
|
||||
```sh
|
||||
npm i node-stream-zip
|
||||
```
|
||||
|
||||
## Usage
|
||||
|
||||
There are two APIs provided:
|
||||
1. [promise-based / async](#async-api)
|
||||
2. [callbacks](#callback-api)
|
||||
|
||||
It's recommended to use the new, promise API, however the legacy callback API
|
||||
may be more flexible for certain operations.
|
||||
|
||||
### Async API
|
||||
|
||||
Open a zip file
|
||||
```javascript
|
||||
const StreamZip = require('node-stream-zip');
|
||||
const zip = new StreamZip.async({ file: 'archive.zip' });
|
||||
```
|
||||
|
||||
Stream one entry to stdout
|
||||
```javascript
|
||||
const stm = await zip.stream('path/inside/zip.txt');
|
||||
stm.pipe(process.stdout);
|
||||
stm.on('end', () => zip.close());
|
||||
```
|
||||
|
||||
Read a file as buffer
|
||||
```javascript
|
||||
const data = await zip.entryData('path/inside/zip.txt');
|
||||
await zip.close();
|
||||
```
|
||||
|
||||
Extract one file to disk
|
||||
```javascript
|
||||
await zip.extract('path/inside/zip.txt', './extracted.txt');
|
||||
await zip.close();
|
||||
```
|
||||
|
||||
List entries
|
||||
```javascript
|
||||
const entriesCount = await zip.entriesCount;
|
||||
console.log(`Entries read: ${entriesCount}`);
|
||||
|
||||
const entries = await zip.entries();
|
||||
for (const entry of Object.values(entries)) {
|
||||
const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
|
||||
console.log(`Entry ${entry.name}: ${desc}`);
|
||||
}
|
||||
|
||||
// Do not forget to close the file once you're done
|
||||
await zip.close();
|
||||
```
|
||||
|
||||
Extract a folder from archive to disk
|
||||
```javascript
|
||||
fs.mkdirSync('extracted');
|
||||
await zip.extract('path/inside/zip/', './extracted');
|
||||
await zip.close();
|
||||
```
|
||||
|
||||
Extract everything
|
||||
```javascript
|
||||
fs.mkdirSync('extracted');
|
||||
const count = await zip.extract(null, './extracted');
|
||||
console.log(`Extracted ${count} entries`);
|
||||
await zip.close();
|
||||
```
|
||||
|
||||
When extracting a folder, you can listen to `extract` event
|
||||
```javascript
|
||||
zip.on('extract', (entry, file) => {
|
||||
console.log(`Extracted ${entry.name} to ${file}`);
|
||||
});
|
||||
```
|
||||
|
||||
`entry` event is generated for every entry during loading
|
||||
```javascript
|
||||
zip.on('entry', entry => {
|
||||
// you can already stream this entry,
|
||||
// without waiting until all entry descriptions are read (suitable for very large archives)
|
||||
console.log(`Read entry ${entry.name}`);
|
||||
});
|
||||
```
|
||||
|
||||
### Callback API
|
||||
|
||||
Open a zip file
|
||||
```javascript
|
||||
const StreamZip = require('node-stream-zip');
|
||||
const zip = new StreamZip({ file: 'archive.zip' });
|
||||
|
||||
// Handle errors
|
||||
zip.on('error', err => { /*...*/ });
|
||||
```
|
||||
|
||||
List entries
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
console.log('Entries read: ' + zip.entriesCount);
|
||||
for (const entry of Object.values(zip.entries())) {
|
||||
const desc = entry.isDirectory ? 'directory' : `${entry.size} bytes`;
|
||||
console.log(`Entry ${entry.name}: ${desc}`);
|
||||
}
|
||||
// Do not forget to close the file once you're done
|
||||
zip.close();
|
||||
});
|
||||
```
|
||||
|
||||
Stream one entry to stdout
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
zip.stream('path/inside/zip.txt', (err, stm) => {
|
||||
stm.pipe(process.stdout);
|
||||
stm.on('end', () => zip.close());
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
Extract one file to disk
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
zip.extract('path/inside/zip.txt', './extracted.txt', err => {
|
||||
console.log(err ? 'Extract error' : 'Extracted');
|
||||
zip.close();
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
Extract a folder from archive to disk
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
fs.mkdirSync('extracted');
|
||||
zip.extract('path/inside/zip/', './extracted', err => {
|
||||
console.log(err ? 'Extract error' : 'Extracted');
|
||||
zip.close();
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
Extract everything
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
fs.mkdirSync('extracted');
|
||||
zip.extract(null, './extracted', (err, count) => {
|
||||
console.log(err ? 'Extract error' : `Extracted ${count} entries`);
|
||||
zip.close();
|
||||
});
|
||||
});
|
||||
```
|
||||
|
||||
Read a file as buffer in sync way
|
||||
```javascript
|
||||
zip.on('ready', () => {
|
||||
const data = zip.entryDataSync('path/inside/zip.txt');
|
||||
zip.close();
|
||||
});
|
||||
```
|
||||
|
||||
When extracting a folder, you can listen to `extract` event
|
||||
```javascript
|
||||
zip.on('extract', (entry, file) => {
|
||||
console.log(`Extracted ${entry.name} to ${file}`);
|
||||
});
|
||||
```
|
||||
|
||||
`entry` event is generated for every entry during loading
|
||||
```javascript
|
||||
zip.on('entry', entry => {
|
||||
// you can already stream this entry,
|
||||
// without waiting until all entry descriptions are read (suitable for very large archives)
|
||||
console.log(`Read entry ${entry.name}`);
|
||||
});
|
||||
```
|
||||
|
||||
## Options
|
||||
|
||||
You can pass these options to the constructor
|
||||
- `storeEntries: true` - you will be able to work with entries inside zip archive, otherwise the only way to access them is `entry` event
|
||||
- `skipEntryNameValidation: true` - by default, entry name is checked for malicious characters, like `../` or `c:\123`, pass this flag to disable validation errors
|
||||
|
||||
## Methods
|
||||
|
||||
- `zip.entries()` - get all entries description
|
||||
- `zip.entry(name)` - get entry description by name
|
||||
- `zip.stream(entry, function(err, stm) { })` - get entry data reader stream
|
||||
- `zip.entryDataSync(entry)` - get entry data in sync way
|
||||
- `zip.close()` - cleanup after all entries have been read, streamed, extracted, and you don't need the archive
|
||||
|
||||
## Building
|
||||
|
||||
The project doesn't require building. To run unit tests with [nodeunit](https://github.com/caolan/nodeunit):
|
||||
```sh
|
||||
npm test
|
||||
```
|
||||
|
||||
## Known issues
|
||||
|
||||
- [utf8](https://github.com/rubyzip/rubyzip/wiki/Files-with-non-ascii-filenames) file names
|
||||
|
||||
## Out of scope
|
||||
|
||||
- AES encrypted files: the library will throw an error if you try to open it
|
||||
|
||||
## Contributors
|
||||
|
||||
ZIP parsing code has been partially forked from [cthackers/adm-zip](https://github.com/cthackers/adm-zip) (MIT license).
|
199
App/node_modules/node-stream-zip/node_stream_zip.d.ts
generated
vendored
Normal file
|
@ -0,0 +1,199 @@
|
|||
/// <reference types="node" />
|
||||
|
||||
declare namespace StreamZip {
|
||||
interface StreamZipOptions {
|
||||
/**
|
||||
* File to read
|
||||
* @default undefined
|
||||
*/
|
||||
file?: string;
|
||||
|
||||
/**
|
||||
* Alternatively, you can pass fd here
|
||||
* @default undefined
|
||||
*/
|
||||
fd?: number;
|
||||
|
||||
/**
|
||||
* You will be able to work with entries inside zip archive,
|
||||
* otherwise the only way to access them is entry event
|
||||
* @default true
|
||||
*/
|
||||
storeEntries?: boolean;
|
||||
|
||||
/**
|
||||
* By default, entry name is checked for malicious characters, like ../ or c:\123,
|
||||
* pass this flag to disable validation error
|
||||
* @default false
|
||||
*/
|
||||
skipEntryNameValidation?: boolean;
|
||||
|
||||
/**
|
||||
* Filesystem read chunk size
|
||||
* @default automatic based on file size
|
||||
*/
|
||||
chunkSize?: number;
|
||||
|
||||
/**
|
||||
* Encoding used to decode file names
|
||||
* @default UTF8
|
||||
*/
|
||||
nameEncoding?: string;
|
||||
}
|
||||
|
||||
interface ZipEntry {
|
||||
/**
|
||||
* file name
|
||||
*/
|
||||
name: string;
|
||||
|
||||
/**
|
||||
* true if it's a directory entry
|
||||
*/
|
||||
isDirectory: boolean;
|
||||
|
||||
/**
|
||||
* true if it's a file entry, see also isDirectory
|
||||
*/
|
||||
isFile: boolean;
|
||||
|
||||
/**
|
||||
* file comment
|
||||
*/
|
||||
comment: string;
|
||||
|
||||
/**
|
||||
* if the file is encrypted
|
||||
*/
|
||||
encrypted: boolean;
|
||||
|
||||
/**
|
||||
* version made by
|
||||
*/
|
||||
verMade: number;
|
||||
|
||||
/**
|
||||
* version needed to extract
|
||||
*/
|
||||
version: number;
|
||||
|
||||
/**
|
||||
* encrypt, decrypt flags
|
||||
*/
|
||||
flags: number;
|
||||
|
||||
/**
|
||||
* compression method
|
||||
*/
|
||||
method: number;
|
||||
|
||||
/**
|
||||
* modification time
|
||||
*/
|
||||
time: number;
|
||||
|
||||
/**
|
||||
* uncompressed file crc-32 value
|
||||
*/
|
||||
crc: number;
|
||||
|
||||
/**
|
||||
* compressed size
|
||||
*/
|
||||
compressedSize: number;
|
||||
|
||||
/**
|
||||
* uncompressed size
|
||||
*/
|
||||
size: number;
|
||||
|
||||
/**
|
||||
* volume number start
|
||||
*/
|
||||
diskStart: number;
|
||||
|
||||
/**
|
||||
* internal file attributes
|
||||
*/
|
||||
inattr: number;
|
||||
|
||||
/**
|
||||
* external file attributes
|
||||
*/
|
||||
attr: number;
|
||||
|
||||
/**
|
||||
* LOC header offset
|
||||
*/
|
||||
offset: number;
|
||||
}
|
||||
|
||||
class StreamZipAsync {
|
||||
constructor(config: StreamZipOptions);
|
||||
|
||||
entriesCount: Promise<number>;
|
||||
comment: Promise<string>;
|
||||
|
||||
entry(name: string): Promise<ZipEntry | undefined>;
|
||||
entries(): Promise<{ [name: string]: ZipEntry }>;
|
||||
entryData(entry: string | ZipEntry): Promise<Buffer>;
|
||||
stream(entry: string | ZipEntry): Promise<NodeJS.ReadableStream>;
|
||||
extract(entry: string | ZipEntry | null, outPath: string): Promise<number | undefined>;
|
||||
|
||||
on(event: 'entry', handler: (entry: ZipEntry) => void): void;
|
||||
on(event: 'extract', handler: (entry: ZipEntry, outPath: string) => void): void;
|
||||
|
||||
close(): Promise<void>;
|
||||
}
|
||||
}
|
||||
|
||||
type StreamZipOptions = StreamZip.StreamZipOptions;
|
||||
type ZipEntry = StreamZip.ZipEntry;
|
||||
|
||||
declare class StreamZip {
|
||||
constructor(config: StreamZipOptions);
|
||||
|
||||
/**
|
||||
* number of entries in the archive
|
||||
*/
|
||||
entriesCount: number;
|
||||
|
||||
/**
|
||||
* archive comment
|
||||
*/
|
||||
comment: string;
|
||||
|
||||
on(event: 'error', handler: (error: any) => void): void;
|
||||
on(event: 'entry', handler: (entry: ZipEntry) => void): void;
|
||||
on(event: 'ready', handler: () => void): void;
|
||||
on(event: 'extract', handler: (entry: ZipEntry, outPath: string) => void): void;
|
||||
|
||||
entry(name: string): ZipEntry | undefined;
|
||||
|
||||
entries(): { [name: string]: ZipEntry };
|
||||
|
||||
stream(
|
||||
entry: string | ZipEntry,
|
||||
callback: (err: any | null, stream?: NodeJS.ReadableStream) => void
|
||||
): void;
|
||||
|
||||
entryDataSync(entry: string | ZipEntry): Buffer;
|
||||
|
||||
openEntry(
|
||||
entry: string | ZipEntry,
|
||||
callback: (err: any | null, entry?: ZipEntry) => void,
|
||||
sync: boolean
|
||||
): void;
|
||||
|
||||
extract(
|
||||
entry: string | ZipEntry | null,
|
||||
outPath: string,
|
||||
callback: (err?: any, res?: number) => void
|
||||
): void;
|
||||
|
||||
close(callback?: (err?: any) => void): void;
|
||||
|
||||
static async: typeof StreamZip.StreamZipAsync;
|
||||
}
|
||||
|
||||
export = StreamZip;
|
1210
App/node_modules/node-stream-zip/node_stream_zip.js
generated
vendored
Normal file
47
App/node_modules/node-stream-zip/package.json
generated
vendored
Normal file
|
@ -0,0 +1,47 @@
|
|||
{
|
||||
"name": "node-stream-zip",
|
||||
"version": "1.15.0",
|
||||
"description": "node.js library for reading and extraction of ZIP archives",
|
||||
"keywords": [
|
||||
"zip",
|
||||
"archive",
|
||||
"unzip",
|
||||
"stream"
|
||||
],
|
||||
"homepage": "https://github.com/antelle/node-stream-zip",
|
||||
"author": "Antelle <antelle.net@gmail.com> (https://github.com/antelle)",
|
||||
"bugs": {
|
||||
"email": "antelle.net@gmail.com",
|
||||
"url": "https://github.com/antelle/node-stream-zip/issues"
|
||||
},
|
||||
"license": "MIT",
|
||||
"files": [
|
||||
"LICENSE",
|
||||
"node_stream_zip.js",
|
||||
"node_stream_zip.d.ts"
|
||||
],
|
||||
"scripts": {
|
||||
"lint": "eslint node_stream_zip.js test/tests.js",
|
||||
"check-types": "tsc node_stream_zip.d.ts",
|
||||
"test": "nodeunit test/tests.js"
|
||||
},
|
||||
"main": "node_stream_zip.js",
|
||||
"types": "node_stream_zip.d.ts",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/antelle/node-stream-zip.git"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=0.12.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "^14.14.6",
|
||||
"eslint": "^7.19.0",
|
||||
"nodeunit": "^0.11.3",
|
||||
"prettier": "^2.2.1"
|
||||
},
|
||||
"funding": {
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/antelle"
|
||||
}
|
||||
}
|
184
Lang/Ar-ar.json
Normal file
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
|
||||
"lang": "العربية (Ar-ar)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "تفعيل",
|
||||
"emuStatusRunning": "قيد التشغيل",
|
||||
"logWindowTitle": "قيد التشغيل fpPS4",
|
||||
"killEmuStatus": "العملية الرئيسية اغلقت - اغلق النافذة للرجوع",
|
||||
"logCleared": " معلومة - السجل السابق تم حذفه",
|
||||
"about": "fpPS4 Temmie's Launcher - اصدار: %VARIABLE_0%\\n\\تم انشائه بواسطة TheMitoSan\\n(https://twitter.com/themitosan)\\n\\nfpPS4 تم انشائه بواسطة red-prig\\n(https://github.com/red-prig/fpPS4)\\n\\nplug-in memoryjs تم انشائه بواسطة Rob--\\n(https://github.com/rob--/memoryjs)\\n\\nplug-in node-stream-zip تم انشائه بواسطة antelle \\n(https://github.com/antelle/node-stream-zip)\\n\\n تم الحصول عليها من خلال SVGايقونات ال https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - اصدار: %VARIABLE_0%\nيعمل بواسطة nw.js (node-webkit) اصدار %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "خطأ - لايمكن انشاء مسار!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "خطأ - لا يمكن العثور على ملف التشغيل fpPS4\nتأكد من اختيار الملف من الاعدادات او وضعه في \"Emu\" ملف و اضغط ok.",
|
||||
"settingsConfirmRemoveAllGameSettings": "تحذير - هذا الخيار سيقوم بحذف جميع الاعدادات المخزنة من قائمة الالعاب\nهل تود في الاستمرار؟",
|
||||
"settingsConfirmRemoveGameSettings": "تحذير - هذا الخيار سيقوم بحذف جميع الاعدادت ل %VARIABLE_0%\\n\\هل تود بالاستمرار؟",
|
||||
"settingsRemovedGameSettings": "معلومة - ( %VARIABLE_0% ) تمت ازالة ملف الاعدادات بنجاح",
|
||||
"settingsRemoveGameSettingsError": "خطأ - ( %VARIABLE_0% ) لا يمكن ازالة ملف الاعدادات\nالسبب: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "تحذير - ( %VARIABLE_0% ) لايمكن العثور على ملف الاعدادات لهذا التطبيق",
|
||||
"infoProcessComplete": "معلومة - تمت العملية بنجاح\nانظر للسجل للمزيد من المعلومات",
|
||||
"infoSettingsUpdated": "معلومة - تم تحديث ملف الاعدادات بنجاح",
|
||||
"settingsLoadError": "خطأ - لايمكن تشغيل ملف الاعدادات\n %VARIABLE_0%",
|
||||
"settingsSaveError": "خطأ - لا يمكن تخزين ملف الاعدادات\n %VARIABLE_0%",
|
||||
"runEmuArgs": "معلومة - تشغيل fpPS4 بargs: %VARIABLE_0%\nموقع المحاكي: %VARIABLE_1%",
|
||||
"closeEmuStatus": "معلومة - %VARIABLE_0% تم اغلاقه, ارجاع كود %VARIABLE_1%",
|
||||
"removedLibModules": "معلومة - جميع الوحدات السابقة المستخرجة باستخدام هذا المشغل تمت ازالتها لانها قد تؤثر على لعبتك المستخرجة",
|
||||
"removeLibModule": "معلومة - ( %VARIABLE_0% ) ازالة الوحدة: %VARIABLE_1%",
|
||||
"removeModuleError": "خطأ - لا يمكن ازالة الوحدات\nMotivo: %VARIABLE_0%",
|
||||
"updateGameSettings": "معلومة - ( %VARIABLE_0% ) تم تحديث ملف الاعدادات بنجاح",
|
||||
"updateGameSettingsError": "خطأ - تعذر تحديث الاعدادت ل %VARIABLE_0% in %VARIABLE_1%!\nالسبب: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "معلومة - ( %VARIABLE_0% ) تخطي تحديث ملف الاعدادات لعدم وجود تغيير",
|
||||
"errorSaveFile": "خطأ - تعذر تخزين الملف\nالسبب: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "معلومة - تم التخزين بنجاح\nمسار: %VARIABLE_0%",
|
||||
"createdSettingsFile": "معلومة - ( %VARIABLE_0% ) تم انشاء ملف الاعدادات بنجاح",
|
||||
"errorCreateSettingsFile": "خطأ - لا يمكن انشاء ملف الاعدادات ل %VARIABLE_0% in %VARIABLE_1%!\nالسبب: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "معلومة - تم تحميل التحديث بنجاح\nاسم: %VARIABLE_0%\nنوع: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "خطأ - هذا ليس تحديث او لا يتطابق مع هذا البرنامج/لعبة\nمعرف التحديث: %VARIABLE_0%\nالتطبيق - اللعبة المختارة: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "خطأ - لايمكن العثور على PARAM.SFO لهذا التحديث",
|
||||
"gameListLoadWarnPlayGo": "تحذير - لايمكن العثور على playgo-chunk.dat ل %VARIABLE_0%!\nاذا لم يكن التطبيق home brew تاكد من انه تم استخراجه بطريقة صحيحة",
|
||||
"gameListLoadWarnParamSfo": "تحذير - لايمكن العثور على %VARIABLE_0% PARAM.SFO!\nاذا لم يكن التطبيق home brew تاكد من انه تم استخراجه بطريقة صحيحة",
|
||||
"gameListDoubleIdError": "تحذير - لا يمكن اضافة %VARIABLE_0% الى قائمة الالعاب لوجود تطبيق اخر بنفس الرقم التسلسلي (%VARIABILE_1%)",
|
||||
"gameListNoGameFound": "معلومة - لم يتم العثور على العاب او تطبيقات على المسار المختار ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "لا يمكن العثور",
|
||||
"checkDumpPlayGoOnApp": "معلومة - ( %VARIABLE_0% ) playgo-chunk.dat تم العثور عليه داخل sce_sys/app - تم انشاء نسخة جديدة في sce_sys.",
|
||||
"gameListLoadSuccessful": "معلومة - تم تحميل قائمة الاعاب بنجاح ( %VARIABLE_0% العاب موجودة )",
|
||||
"gameListVersion": "اصدار",
|
||||
"selectGameLoadPatchErrorParamSfo": "خطأ - لا يمكن قرائة PARAM.SFO من هذا التحديث\n%VARIABLE_0%",
|
||||
"path": "مسار",
|
||||
"gamelistGamePath404": "خطأ - لايمكن العثور على مسار التطبيقات او الالعاب\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "Github خطأ - لا يمكن جلب معلومات اجرائات ",
|
||||
"updateEmuIsLatestVersion": "معلومة - انت تستعمل احدث اصدار من fpPS4\nID commit (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "معلومة - يوجد تحديث جديد\n\nالاصدار الموجود: %VARIABLE_0%\nالاصدار الجديد: %VARIABLE_1%\n\nهل تود بالتحديث؟",
|
||||
"updateEmuShaUnavailable": "معلومة - المشغل اكتشف انك لم تقم بتحديث fpPS4\n(او ان ملف تشغيل fpPS4 لم يكن موجود)\n\nيمكنك اصلاح هذا الخطأ من خلال fpPS4 updater\n\nهل تود بالاستمرار؟",
|
||||
"updateEmuDownloadFailed": "خطأ - لا يمكن تنزيل تحديث fpPS4\nحالة الاستجابة: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "معلومة - تم التحديث بنجاح\nتحديث جديد (ID commit / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "تنزيل تحديث fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "استخراج التحديث",
|
||||
"updateEmu-3-4": "ازالة بواقي الملفات",
|
||||
"updateEmu-4-4": "تم التحديث بنجاح",
|
||||
"settingsLogEmuSha": "معلومة - اصدار fpPS4: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "جيد",
|
||||
"dumpStatus_WARN": "ملفات مفقودة",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "لم يتم العثور على قائمة workflow",
|
||||
"Sdl2NotFound": "",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "البحث: اسم اللعبة", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "اخضر: جميع الملفات موجودة\nاصفر: بعض الملفات مفقودة تأكد من السجل للمزيد من المعلومات\nسماوي: الملف من صيغة .elf",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "الاعدادات",
|
||||
"DIV_SETTINGS_LANGUAGE": "اللغة",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "اللغة المختارة",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "يجب اعادة تشغيل المشغل لتطبيق التغييرات",
|
||||
"DIV_SETTINGS_PATHS": "الملفات المحلية",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "موقع التطبيقات - العاب",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "موقع fpPS4",
|
||||
"DIV_SETTINGS_GAME_LIST": "قائمة الالعاب - التطبيقات",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "مدى دائرية اطارات الالعاب",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "طريقة البحث",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "تمويه الخلفية",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "عتمة الخلفية",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "تفعيل البحث الحساس (case-sensitive)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "اظهار الخلفية لكل الالعاب و التطبيقات في القائمة",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "اظهار الملفات الوصفية او الموقع تحت كل لعبة وتطبيق في القائمة",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "ملفات المحاكي",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "تمويه الخلفية",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "عتمة الخلفية",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "اظهار الملفات الوصفية او الموقع تحت كل لعبة وتطبيق في القائمة",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "اعدادات السجل",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "بدء نافذة السجل",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "طلب من المستخدام الضعط على اي زر عند اغلاق المحاكي",
|
||||
"DIV_SETTINGS_MISC": "الاعدادات الاخرى",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "دعم ملفات <code>PARAM.SFO</code> (اضغط على حذف الاعدادات من جميع الالعاب و التطبيقات و اعد تشغيل المحاكي)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "ازالة <code>Project.gp4</code> من اي لعبة عند تحميل القائمة",
|
||||
"LABEL_FPPS4_OPTIONS": "اعدادات <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "حال الاستخراجة",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "تفعيل التحديثات",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "اصدار",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "نوع",
|
||||
"LABEL_EMU_RUNNING_STATUS": "الحالة",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "اصدار",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "اعدادات المشغل",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "هاكات",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "اظهار الايقونة وواجهة المستخدم الرسومية خلال عمل المحاكي",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">تجريبي</label> تسجيل نتائج fpPS4 (<code>stdout</code> و <code>stderr</code>) في السجل الداخلي (F12 اضغط--> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "محدث fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "تفعيل محدث fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "الحصول على التحديثات من branch",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "الحالة",
|
||||
"DIV_SETTINGS_GENERAL": "عام",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "تكبير الواجهة",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "تحذير: لا ينصح بتغيير هذا الاعداد اذا كانت شاشتك وضوحها اقل من <code>1920x1080</code>",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "تشغيل المحاكي في نظام ملء الشاشة",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "الأسم",
|
||||
"titleId": "الرقم التسلسلي"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "طبيعي",
|
||||
"max": "مكبر",
|
||||
"min": "مصغر"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "اختار الملف",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "افتح الملف",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "اختار executable",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "حذف الاعدادات من جميع الالعاب و التطبيقات",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "تطبيق و غلق",
|
||||
"BTN_SETTINGS_CLOSE": "الرجوع",
|
||||
"BTN_REFRESH": "تحديث القائمة",
|
||||
"BTN_SETTINGS": "الاعدادات",
|
||||
"BTN_CLEAR_LOG": "حذف السجل",
|
||||
"BTN_ABOUT": "آخر",
|
||||
"BTN_KILL": "ايقاف fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "اختار التحديث",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "فتح موقع الالعاب والتطبيقات",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "اعادة تعيين الاعدادات",
|
||||
"BTN_launcherOptionsExportMetadata": "استخراج البيانات الوصفية",
|
||||
"BTN_RUN": "تشغيل fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "اعادة تشغيل المشغل",
|
||||
"BTN_UPDATE_FPPS4": "تحديث fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "فرض التحديث"
|
||||
|
||||
}
|
||||
}
|
14
Lang/about-translations.md
Normal file
|
@ -0,0 +1,14 @@
|
|||
### About translations
|
||||
I would like to thank everyone who contributed to the translation of this project - thanks to all of you, none of this would have been possible! 💜
|
||||
|
||||
- English (Default): [TheMitoSan](https://github.com/themitosan) _(Revisions by [ArbestRi](https://github.com/ArbestRi))_
|
||||
- Brazilian Portuguese: [TheMitoSan](https://github.com/themitosan)
|
||||
- French: [Mizmalik](https://github.com/Mizmalik)
|
||||
- Chinese (Simplified): [nini22P](https://github.com/nini22P)
|
||||
- Russian: ThatSameGuy _(Revisions by [gandalfthewhite](https://github.com/gandalfthewhite19890404) and [ArtemVideoGames](https://github.com/ArtemVideoGames))_
|
||||
- Italian: [Dan Adrian Radut (Aka. B8nee)](https://github.com/B8nee)
|
||||
- Japanese: [mktm235](https://github.com/mktm235)
|
||||
- Ukrainian: [ArtemVideoGames](https://github.com/ArtemVideoGames) _(Revision by ThatSameGuy)_
|
||||
- Dutch: [MrSn0wy](https://github.com/MrSn0wy)
|
||||
- Arabic: [Shrvzr](https://github.com/Shrvzr)
|
||||
- Turkish: [phyesix](https://github.com/phyesix)
|
184
Lang/fr-fr.json
Normal file
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
|
||||
"lang": "Français (FR-FR)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Activer",
|
||||
"emuStatusRunning": "fonctionnement",
|
||||
"logWindowTitle": "Exécution de fpPS4",
|
||||
"killEmuStatus": "Le processus principal a été fermé - fermez la fenêtre des logs pour continuer",
|
||||
"logCleared": "INFO - La liste des journaux a été effacée!",
|
||||
"about": "fpPS4 Temmie's Launcher - Version: %VARIABLE_0%\n\nCréé par TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4 a été créé/développé par red-prig\n(https://github.com/red -prig/fpPS4)\n\nLe plugin memoryjs a été créé/développé par Rob--\n(https://github.com/rob--/memoryjs)\n\nLe plugin node-stream-zip a été créé/développé par antelle \n(https://github.com/antelle/node-stream-zip)\n\nLes icônes SVG ont été obtenues à partir de https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Version: %VARIABLE_0%\nUtilisation de nw.js (node-webkit) version %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ERREUR - Impossible de créer le dossier!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERREUR - Impossible de trouver l'exécutable fpPS4!\nSélectionnez l'exécutable dans les paramètres ou placez-le dans le dossier \"Emu\" et cliquez sur OK.",
|
||||
"settingsConfirmRemoveAllGameSettings": "AVERTISSEMENT - Cette option supprimera tous les paramètres de la liste des jeux.\nConfirmez-vous cette action?",
|
||||
"settingsConfirmRemoveGameSettings": "AVERTISSEMENT - Cette action supprimera tous les paramètres de %VARIABLE_0%\n\nConfirmez-vous cette action?",
|
||||
"settingsRemovedGameSettings": "INFO - ( %VARIABLE_0% ) Le fichier de paramètres a été supprimé avec succès!",
|
||||
"settingsRemoveGameSettingsError": "ERREUR - ( %VARIABLE_0% ) Impossible de supprimer ce fichier !\nDétails: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "AVERTISSEMENT - ( %VARIABLE_0% ) Impossible de trouver le fichier de paramètres!",
|
||||
"infoProcessComplete": "INFO - Processus terminé!\nVoir les log pour plus de détails",
|
||||
"infoSettingsUpdated": "INFO - Le fichier de paramètres a été mis à jour avec succès!",
|
||||
"settingsLoadError": "ERREUR - Impossible de charger les paramètres !\n %VARIABLE 0%",
|
||||
"settingsSaveError": "ERREUR - Impossible d'enregistrer les paramètres!\n %VARIABLE 0%",
|
||||
"runEmuArgs": "INFO - Démarrage de fpPS4 avec les options: %VARIABLE_0%\nChemin de l'exécutable: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% quitté avec le code de sortie %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - Tous les modules précédemment importés ont été supprimés car ils peuvent être nocifs pour les dumps.",
|
||||
"removeLibModule": "INFO - ( %VARIABLE_0% ) Suppression du module: %VARIABLE_1%",
|
||||
"removeModuleError": "ERREUR - Impossible de supprimer ce module!\nRaison: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - ( %VARIABLE_0% ) Le fichier de paramètres a été mis à jour avec succès!",
|
||||
"updateGameSettingsError": "ERREUR - Impossible de mettre à jour le fichier de paramètres pour %VARIABLE_0% dans %VARIABLE_1%!\nDétails: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - ( %VARIABLE_0% ) Le fichier de configuration ne sera pas mis à jour car il n'y a eu aucun changement!",
|
||||
"errorSaveFile": "ERREUR - Impossible d'enregistrer le fichier!\nDétails: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - Le fichier a été écrit avec succès!\nEmplacement: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - ( %VARIABLE_0% ) Le fichier de paramètres a été généré avec succès!",
|
||||
"errorCreateSettingsFile": "ERREUR - Impossible de créer le fichier de paramètres %VARIABLE_0% dans %VARIABLE_1%!\nDétails: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - Le correctif a été chargé avec succès!\nNom: %VARIABLE_0%\nType: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERREUR - Ceci n'est pas un patch - ou si c'est le cas, celui sélectionné ne correspond pas au jeu actuel!\nIdentifiant du patch: %VARIABLE_0%\nApplication/jeu actuel: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERREUR - Impossible de trouver PARAM.SFO pour ce correctif!",
|
||||
"gameListLoadWarnPlayGo": "AVERTISSEMENT - Impossible de trouver playgo-chunk.dat à partir de %VARIABLE_0%!\nSi cette application/ce jeu n'est pas un homebrew, assurez-vous qu'il a été vidé correctement.",
|
||||
"gameListLoadWarnParamSfo": "AVERTISSEMENT - Impossible de trouver %VARIABLE_0% PARAM.SFO!\nSi cette application/ce jeu n'est pas un homebrew, assurez-vous qu'il a été vidé correctement.",
|
||||
"gameListDoubleIdError": "ATTENTION - Il n'a pas été possible d'ajouter %VARIABLE_0% à la liste des jeux car il existe déjà un autre titre avec le même identifiant! (%VARIABLE_1%)",
|
||||
"gameListNoGameFound": "INFO - Aucune application/jeu n'a été trouvé dans le dossier actuel ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Impossible de trouver",
|
||||
"checkDumpPlayGoOnApp": "INFO - ( %VARIABLE_0% ) playgo-chunk.dat a été trouvé dans sce_sys/app - une copie a été créée dans sce_sys.",
|
||||
"gameListLoadSuccessful": "INFO - La liste des jeux a été chargée avec succès! ( %VARIABLE_0% titres trouvés )",
|
||||
"gameListVersion": "Version",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERREUR - Impossible de charger PARAM.SFO de ce correctif!\n%VARIABLE_0%",
|
||||
"path": "Chemin",
|
||||
"gamelistGamePath404": "INFO - Le dossier app / jeux sélectionné n'existe pas!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERREUR - Impossible d'obtenir des informations de GitHub!",
|
||||
"updateEmuIsLatestVersion": "INFO - Vous utilisez déjà la dernière version !\nID de validation (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - Une nouvelle mise à jour est disponible!\n\nVersion locale:%VARIABLE_0%\nNouvelle version:%VARIABLE_1%\n\nVoulez-vous mettre à jour?",
|
||||
"updateEmuShaUnavailable": "INFO - Le lanceur a détecté qu'aucune mise à jour n'a été effectuée\n(Ou l'exécutable fpPS4 n'a pas été trouvé!)\n\nIl est possible de résoudre ce problème en utilisant la procédure de mise à jour automatique.\n\nVoulez-vous continuer?",
|
||||
"updateEmuDownloadFailed": "ERREUR - Impossible de télécharger la mise à jour fpPS4!\nÉtat de la réponse: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - Mise à jour terminée !\nNouvelle version (ID de validation / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Télécharger la mise à jour fpPS4 (<label css=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Extraction de la mise à jour",
|
||||
"updateEmu-3-4": "Suppression des fichiers restants",
|
||||
"updateEmu-4-4": "Mise à jour terminée!",
|
||||
"settingsLogEmuSha": "INFO - Version de fpPS4: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Parfait",
|
||||
"dumpStatus_WARN": "Fichiers manquants",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "Impossible d'obtenir la liste CI !",
|
||||
"Sdl2NotFound": "Impossible de trouver SDL2.dll dans le dossier Emu, vérifiez s'il est là pour activer \"SDL\".",
|
||||
"errorListUnableLocateGamePath": "ERREUR - Impossible de trouver le dossier de paramètres pour \"%VARIABLE_0%\" ! Pour éviter les erreurs, la liste des applications/jeux a été mise à jour.\nChemin : %VARIABLE_1%",
|
||||
"updateEmuSettingsWorkflow404": "ERREUR - (Updater) Impossible de trouver le flux de travail %VARIABLE_0%! Le flux de travail %VARIABLE_1% sera utilisé à la place.",
|
||||
"nonWindowsOsWarn": "AVERTISSEMENT - Vous exécutez le lanceur fpPS4 Temmie sur un système non-Windows !\n\nPour démarrer fpPS4, vous devez avoir Wine installé sur votre système.\n\nDe plus, gardez à l'esprit que l'exécution de la couche de compatibilité à l'aide d'outils comme Wine peut (et probablement causera) des problèmes, fonctionnant avec moins de performances que prévu.",
|
||||
"cGameCompatStatus_BOOTS": "Démarre",
|
||||
"cGameCompatStatus_MENUS": "Menu principal",
|
||||
"cGameCompatStatus_INGAME": "En jeu",
|
||||
"cGameCompatStatus_UNKNOWN": "Inconnu",
|
||||
"cGameCompatStatus_NOTHING": "Rien",
|
||||
"cGameCompatStatus_PLAYABLE": "Jouable",
|
||||
"warnUnableFindGameCompatDb": "AVERTISSEMENT - Impossible d'obtenir des informations sur \"%VARIABLE_0%\" (%VARIABLE_1%) dans la base de données de compatibilité des fpPS4 !",
|
||||
"warnUserOffline": "AVERTISSEMENT - Vous êtes hors ligne ! Certaines fonctionnalités (comme l'obtention de l'état de compatibilité et la mise à jour de fpPS4) ne seront pas disponibles tant que vous ne serez pas connecté à Internet."
|
||||
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "Recherche: Nom du jeu...", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Vert: tous les fichiers sont présents\nJaune: certains fichiers sont manquants - consultez le journal pour plus de détails\nCyan: l'exécutable est un fichier .elf",
|
||||
"DIV_selectedGameStatus_compat": "Jouable : Peut être joué / exécuté du début à la fin.\nEn jeu : Peut être démarré / exécuté, mais jusqu'à un certain point.\nMenu principal : Le titre peut accéder uniquement au menu principal.\nDémarre : Le titre démarre mais ne parvient pas à atteindre le menu principal.\nRien : Le titre n'affiche aucun graphique, se bloque peu de temps après le démarrage de l'exécution ou n'est pas présent dans la base de données des fpPS4.\nInconnu : Le lanceur fpPS4 Temmie n'a pas pu obtenir d'informations sur ce titre."
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "Configuration",
|
||||
"DIV_SETTINGS_LANGUAGE": "Langue",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "langue actuelle",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "Vous devez redémarrer le lanceur pour appliquer ce paramètre",
|
||||
"DIV_SETTINGS_PATHS": "Chemin",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "Dossier Applications/Jeux",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "Emplacement de l'émulateur",
|
||||
"DIV_SETTINGS_GAME_LIST": "Liste des applications / jeux",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Grid) Rayon de la bordure des icônes",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Mode de recherche",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Flou d'arrière-plan",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Opacité de fond",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Activer la recherche précise (majuscules et minuscules)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Afficher l'arrière-plan pour chaque jeu dans la liste",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Afficher les informations (ou le chemin du dossier) pour chaque jeu de la liste",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Émulation en cours",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Flou d'arrière-plan",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Opacité de fond",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Afficher les informations sur le jeu (ou le chemin de l'exécutable) sous le titre",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Options des logs",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Démarrer la fenêtre des logs",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Appuyez sur n'importe quelle touche pour fermer après la fermeture de fpPS4",
|
||||
"DIV_SETTINGS_MISC": "Autres Configuration",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Activer la prise en charge des fichiers <code>PARAM.SFO</code> (Cliquez sur \"Supprimer tous les paramètres du jeu\" et redémarrez le lanceur pour prendre l'appliquer)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Supprimer les fichiers <code>Project.gp4</code> lors du chargement de la liste des jeux",
|
||||
"LABEL_FPPS4_OPTIONS": "Choix de <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Status de dump",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Activer les correctifs",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Version",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Type",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Status",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Version",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Options du lanceur",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Afficher l'icône et le nom de l'application / du jeu pendant l'émulation",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Afficher la sortie de l'émulateur (<code>stdout</code> et <code>stderr</code>) dans le journal interne (Appuyez sur F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "Mises à jour fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Activer le programme de mise à jour fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Recevez les mises à jour de la branche",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Statut",
|
||||
"DIV_SETTINGS_GENERAL": "Général",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Taille de l'interface (échelle)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Avertissement : La modification de ce paramètre n'est pas recommandée si la résolution de votre écran est inférieure à <code>1920x1080</code>",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Démarrer fpPS4 en mode plein écran",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "Activer la vérification de compatibilité des titres / jeux",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "Possibilité de modifier le code de contrôle (demander <code>SDL2.dll</code>)",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": "(Contrôle) Couleur de LED :"
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Nom",
|
||||
"titleId": "Serial"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Normal",
|
||||
"max": "Maximum",
|
||||
"min": "Minimum"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Sélectionner le dossier",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Ouvrir le dossier",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Choisir le dossier",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Supprimer tous les paramètres du jeu",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Appliquer et retour",
|
||||
"BTN_SETTINGS_CLOSE": "Retour",
|
||||
"BTN_REFRESH": "Mettre à jour la liste",
|
||||
"BTN_SETTINGS": "Paramètres",
|
||||
"BTN_CLEAR_LOG": "Effacer les logs",
|
||||
"BTN_ABOUT": "À propos",
|
||||
"BTN_KILL": "Arrêter fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Sélectionner le patch",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Ouvrir l'emplacement de l'application / du jeu",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Réinitialiser les options",
|
||||
"BTN_launcherOptionsExportMetadata": "Exporter les métadonnées",
|
||||
"BTN_RUN": "Démarrer fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Redémarrer le lanceur",
|
||||
"BTN_UPDATE_FPPS4": "Mettre à jour fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Forcer la mise à jour fpPs4"
|
||||
|
||||
}
|
||||
}
|
184
Lang/it-it.json
Normal file
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
|
||||
"lang": "Italiano (it-IT)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Attivare",
|
||||
"emuStatusRunning": "In esecuzione",
|
||||
"logWindowTitle": "Eseguendo fpPS4",
|
||||
"killEmuStatus": "Il processo principale è stato chiuso: chiudi la finestra del log per continuare",
|
||||
"logCleared": "INFO - L'elenco dei log è stato cancellato!",
|
||||
"about": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\n\nCreato da TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4 è stato creato/sviluppato da red-prig\n(https://github.com/red-prig/fpPS4)\n\nIl plug-in memoryjs è stato creato/sviluppato da Rob--\n(https://github.com/rob--/memoryjs)\n\nIl plug-in node-stream-zip è stato creato/sviluppato da antelle \n(https://github.com/antelle/node-stream-zip)\n\nLe icone SVG sono state ottenute da https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Versione: %VARIABLE_0%\nUsando nw.js (node-webkit) versione %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ERRORE - Impossibile creare la cartella!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERRORE - Impossibile trovare l'eseguibile fpPS4!\nSelezionare l'eseguibile nelle impostazioni o posizionarlo all'interno della cartella \"Emu\" e fare clic su ok.",
|
||||
"settingsConfirmRemoveAllGameSettings": "ATTENZIONE - Questa opzione rimuoverà tutte le impostazioni dall'elenco dei giochi.\nConfermi questa azione?",
|
||||
"settingsConfirmRemoveGameSettings": "ATTENZIONE - Questa azione rimuoverà tutte le impostazioni per %VARIABLE_0%\n\nConfermi questa azione?",
|
||||
"settingsRemovedGameSettings": "INFO - ( %VARIABLE_0% ) Il file delle impostazioni è stato rimosso con successo!",
|
||||
"settingsRemoveGameSettingsError": "ERRORE - ( %VARIABLE_0% ) Impossibile rimuovere questo file!\nDettagli: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "ATTENZIONE - ( %VARIABLE_0% ) Impossibile trovare il file delle impostazioni!",
|
||||
"infoProcessComplete": "INFO - Processo completato!\nVedi log per maggiori dettagli",
|
||||
"infoSettingsUpdated": "INFO - Il file delle impostazioni è stato aggiornato con successo!",
|
||||
"settingsLoadError": "ERRORE - Impossibile caricare le impostazioni!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ERRORE - Impossibile salvare le impostazioni!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "INFO - Avvio di fpPS4 con opzioni: %VARIABLE_0%\nPercorso eseguibile: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% uscito con codice di uscita %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - Tutti i moduli precedentemente importati sono stati rimossi in quanto possono essere dannosi per i dump.",
|
||||
"removeLibModule": "INFO - ( %VARIABLE_0% ) Rimozione modulo: %VARIABLE_1%",
|
||||
"removeModuleError": "ERRORE - Impossibile rimuovere questo modulo!\nMotivo: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - ( %VARIABLE_0% ) Il file delle impostazioni è stato aggiornato con successo!",
|
||||
"updateGameSettingsError": "ERRORE - Impossibile aggiornare il file delle impostazioni per %VARIABLE_0% in %VARIABLE_1%!\nDettagli: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - ( %VARIABLE_0% ) Il file di configurazione non verrà aggiornato perché non ci sono state modifiche!",
|
||||
"errorSaveFile": "ERRORE - Impossibile salvare il file!\nDettagli: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - Il file è stato scritto correttamente!\nPosizione: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - ( %VARIABLE_0% ) Il file delle impostazioni è stato generato con successo!",
|
||||
"errorCreateSettingsFile": "ERRORE - Impossibile creare il file delle impostazioni %VARIABLE_0% in %VARIABLE_1%!\nDettagli: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - La patch è stata caricata con successo!\nNome: %VARIABLE_0%\nTipo: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERRORE - La posizione selezionata non è una patch o, se lo è, non corrisponde all'app/gioco corrente!\nSeriale: %VARIABLE_0%\nApp/gioco selezionato: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERRORE - Impossibile trovare PARAM.SFO per questa patch!",
|
||||
"gameListLoadWarnPlayGo": "ATTENZIONE - Impossibile trovare playgo-chunk.dat da %VARIABLE_0%!\nSe questa app/gioco non è homebrew, assicurati che sia stato scaricato correttamente.",
|
||||
"gameListLoadWarnParamSfo": "ATTENZIONE - Impossibile trovare %VARIABLE_0% PARAM.SFO!\nSe questa app/gioco non è homebrew, assicurati che sia stato scaricato correttamente.",
|
||||
"gameListDoubleIdError": "ATTENZIONE - Non è stato possibile aggiungere %VARIABLE_0% alla lista dei giochi perché c'è già un altro titolo con lo stesso id! (%VARIABILE_1%)",
|
||||
"gameListNoGameFound": "INFO - Nessuna app/gioco è stata trovata nella cartella corrente ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Non è stato possibile cercare",
|
||||
"checkDumpPlayGoOnApp": "INFO - ( %VARIABLE_0% ) playgo-chunk.dat è stato trovato all'interno di sce_sys/app - è stata creata una copia in sce_sys.",
|
||||
"gameListLoadSuccessful": "INFO - Lista dei giochi caricata con successo! ( trovati %VARIABLE_0% titoli )",
|
||||
"gameListVersion": "Versione",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERRORE - Impossibile caricare PARAM.SFO di questa patch!\n%VARIABLE_0%",
|
||||
"path": "Percorso",
|
||||
"gamelistGamePath404": "INFO - La cartella app/giochi selezionata non esiste!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERRORE - Impossibile ottenere informazioni da GitHub Actions!",
|
||||
"updateEmuIsLatestVersion": "INFO - Stai già utilizzando l'ultima versione!\nID commit (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - È disponibile un nuovo aggiornamento!\n\nVersione locale: %VARIABLE_0%\nNuova versione: %VARIABLE_1%\n\nVuoi aggiornare?",
|
||||
"updateEmuShaUnavailable": "INFO - Il launcher ha rilevato che non è stato effettuato alcun aggiornamento\n(O l'eseguibile fpPS4 non è stato trovato!)\n\nÈ possibile risolvere questo problema utilizzando la procedura di aggiornamento automatico.\n\nVuoi procedere?",
|
||||
"updateEmuDownloadFailed": "ERRORE - Impossibile scaricare l'aggiornamento di fpPS4!\nStato della risposta: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - Aggiornamento completato!\nNuova versione (ID commit / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Download aggiornamento fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Estrazione aggiornamento",
|
||||
"updateEmu-3-4": "Rimozione dei file rimanenti",
|
||||
"updateEmu-4-4": "Aggiornamento completato!",
|
||||
"settingsLogEmuSha": "INFO - Versione di fpPS4: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Perfetto",
|
||||
"dumpStatus_WARN": "File mancanti",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "Impossibile ottenere l'elenco CI!",
|
||||
"Sdl2NotFound": "",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "Cerca: nome del gioco...", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Verde: sono presenti tutti i file\nGiallo: mancano alcuni file - vedere il log per i dettagli\nCiano: l'eseguibile è un file .elf",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "Impostazioni",
|
||||
"DIV_SETTINGS_LANGUAGE": "Lingua",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "Lingua attuale",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "È necessario riavviare il launcher per applicare questa impostazione",
|
||||
"DIV_SETTINGS_PATHS": "Percorsi",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "Cartella App/Giochi",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "Posizione dell'Emulatore",
|
||||
"DIV_SETTINGS_GAME_LIST": "Elenco di App/Giochi",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Griglia) Raggio del bordo dell'icona",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Modalità di ricerca",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Sfocatura dello sfondo",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Opacità dello sfondo",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Abilita ricerca precisa (lettere maiuscole e minuscole)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Mostra lo sfondo per ogni gioco nell'elenco",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Mostra le informazioni (o il percorso della cartella) per ogni gioco nell'elenco",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Emulazione in corso",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Sfocatura dello sfondo",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Opacità dello sfondo",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Mostra le informazioni sul gioco (o il percorso eseguibile) sotto il titolo",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Opzioni log",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Avvia la finestra del log",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Premi un tasto qualsiasi per chiudere dopo la chiusura di fpPS4",
|
||||
"DIV_SETTINGS_MISC": "Altre impostazioni",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Abilita il supporto per i file <code>PARAM.SFO</code> (fai clic su \"Elimina tutte le impostazioni di gioco\" e riavvia il launcher per renderle effettive)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Rimuovi i file <code>Project.gp4</code> durante il caricamento dell'elenco dei giochi",
|
||||
"LABEL_FPPS4_OPTIONS": "Opzioni <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Stato di dump",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Abilitare le patch",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Versione",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Tipo",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Stato",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Versione",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Opzioni del launcher",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Mostra l'icona e il nome dell'app/gioco durante l'emulazione",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">SPERIMENTALE</label> Visualizza l'output dell'emulatore (<code>stdout</code> e <code>stderr</code>) nel log interno (premi F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "Aggiornamenti fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Abilita aggiornamento fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Ricevi gli aggiornamenti dal branch",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Stato",
|
||||
"DIV_SETTINGS_GENERAL": "Generale",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Dimensione dell'interfaccia (scala)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Avviso: la modifica di questa impostazione non è consigliata se la risoluzione dello schermo è inferiore a <code>1920x1080</code>",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Avvia fpPS4 in modalità a schermo intero",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Nome",
|
||||
"titleId": "Seriale"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Normale",
|
||||
"max": "Massimo",
|
||||
"min": "Minimo"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Seleziona cartella",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Apri la cartella",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Seleziona il file",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Elimina tutte le impostazioni di gioco",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Applica e torna indietro",
|
||||
"BTN_SETTINGS_CLOSE": "Torna indietro",
|
||||
"BTN_REFRESH": "Aggiorna elenco",
|
||||
"BTN_SETTINGS": "Impostazioni",
|
||||
"BTN_CLEAR_LOG": "Pulisci il log",
|
||||
"BTN_ABOUT": "Altro",
|
||||
"BTN_KILL": "Fermare fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Selezionare la patch",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Apri la posizione dell'app/gioco",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Ripristina le impostazioni",
|
||||
"BTN_launcherOptionsExportMetadata": "Esportare i metadati",
|
||||
"BTN_RUN": "Avvia fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Riavvia il launcher",
|
||||
"BTN_UPDATE_FPPS4": "Aggiorna fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Eseguire l'aggiornamento forzato"
|
||||
|
||||
}
|
||||
}
|
183
Lang/ja-ja.json
Normal file
|
@ -0,0 +1,183 @@
|
|||
{
|
||||
|
||||
"lang": "日本語 (JA-JA)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": " ",
|
||||
"emuStatusRunning": "動作中",
|
||||
"logWindowTitle": "fpPS4実行中",
|
||||
"killEmuStatus": "エミュレーションが終了しました。ログウィンドウを閉じて終了します。",
|
||||
"logCleared": "情報 - ログを削除しました!",
|
||||
"about": "fpPS4ランチャー by TheMitoSan - バージョン: %VARIABLE_0%\n\n作成者 TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4はred-prigによって作成/開発されました\n(https://github.com/red -prig/fpPS4)\n\nmemoryjsプラグインはRob--によって作成/開発されました\n(https://github.com/rob--/memoryjs)\n\nnode-stream-zipプラグインantelleによって作成/開発されました \n(https://github.com/antelle/node-stream-zip)\n\nSVGアイコンは https://www.svgrepo.com/ から取得しました",
|
||||
"mainLog": "fpPS4ランチャー by TheMitoSan - バージョン: %VARIABLE_0%\nnw.js (node-webkit) バージョン %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "エラー - フォルダの作成に失敗しました\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "エラー - fpPS4の実行ファイルが見つかりません\n設定で実行可能ファイルを選択するか、「Emu」フォルダーに配置して「OK」をクリックしてください",
|
||||
"settingsConfirmRemoveAllGameSettings": "警告 - このオプションはゲームリストからすべての設定を削除します\n実行しますか?",
|
||||
"settingsConfirmRemoveGameSettings": "警告 - %VARIABLE_0%からすべての設定が削除されます\n\n実行しますか?",
|
||||
"settingsRemovedGameSettings": "情報 - ( %VARIABLE_0% ) 設定ファイルが正常に削除されました",
|
||||
"settingsRemoveGameSettingsError": "エラー - ( %VARIABLE_0% ) ファイルを削除できません\n詳細: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "警告 - ( %VARIABLE_0% ) 設定ファイルが見つかりません",
|
||||
"infoProcessComplete": "情報 - プロセスが完了しました\n詳細についてはログを参照してください",
|
||||
"infoSettingsUpdated": "情報 - 設定ファイルが正常に更新されました",
|
||||
"settingsLoadError": "エラー - 設定の読み込みに失敗しました\n %VARIABLE 0%",
|
||||
"settingsSaveError": "エラー - 設定を保存できません\n %VARIABLE 0%",
|
||||
"runEmuArgs": "情報 - fpPS4を実行しています: %VARIABLE_0%\n実行ファイルパス: %VARIABLE_1%",
|
||||
"closeEmuStatus": "情報 - %VARIABLE_0%が終了コード %VARIABLE_1% で終了しました",
|
||||
"removedLibModules": "情報 - 以前にインポートされたすべてのモジュールはダンプに害を及ぼす可能性があるため削除されました",
|
||||
"removeLibModule": "情報 - ( %VARIABLE_0% ) 削除されたモジュール: %VARIABLE_1%",
|
||||
"removeModuleError": "エラー - このモジュールを削除できません\n理由: %VARIABLE_0%",
|
||||
"updateGameSettings": "情報 - ( %VARIABLE_0% ) 設定ファイルが正常に更新されました",
|
||||
"updateGameSettingsError": "エラー - %VARIABLE_1%の%VARIABLE_0%の設定ファイルを更新できませんでした\n詳細: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "情報 - ( %VARIABLE_0% ) 変更がないため設定ファイルは更新されません",
|
||||
"errorSaveFile": "エラー - ファイルを保存できません\n詳細: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "情報 - ファイルは正常に書き込まれました\n場所: %VARIABLE_0%",
|
||||
"createdSettingsFile": "情報 - ( %VARIABLE_0% ) 設定ファイルが正常に生成されました",
|
||||
"errorCreateSettingsFile": "エラー - 設定ファイル %VARIABLE_0% を %VARIABLE_1%に作成できませんでした\n詳細: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "情報 - パッチが正常にロードされました\n名前: %VARIABLE_0%\nタイプ: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "エラー - 選択されたものはパッチじゃないか、現在のゲームと一致しません\nパッチID: %VARIABLE_0%\n現在のアプリ/ゲーム: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "エラー - このパッチの PARAM.SFO が見つかりません",
|
||||
"gameListLoadWarnPlayGo": "警告 - %VARIABLE_0%からplaygo-chunk.datが見つかりません\nこのアプリ/ゲームが自作ではない場合は適切にダンプされていることを確認してください",
|
||||
"gameListLoadWarnParamSfo": "警告 - %VARIABLE_0% PARAM.SFOが見つかりません\nこのアプリ/ゲームが自作ではない場合は適切にダンプされていることを確認してください",
|
||||
"gameListDoubleIdError": "注意 - 同じIDを持つ別のタイトルが既に存在するため %VARIABLE_0% をゲームリストに追加できませんでした(%VARIABLE_1%)",
|
||||
"gameListNoGameFound": "情報 - 現在のフォルダーにアプリ/ゲームが見つかりません ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "見つけることができません",
|
||||
"checkDumpPlayGoOnApp": "情報 - ( %VARIABLE_0% ) playgo-chunk.dat が sce_sys/appに見つかりました - コピーが sce_sys に作成されました。",
|
||||
"gameListLoadSuccessful": "INFO - ゲームリストが正常に表示されました( %VARIABLE_0% 個 )",
|
||||
"gameListVersion": "バージョン",
|
||||
"selectGameLoadPatchErrorParamSfo": "エラー - このパッチから PARAM.SFO をロードできません\n%VARIABLE_0%",
|
||||
"path": "パス",
|
||||
"gamelistGamePath404": "情報 - 選択したアプリ/ゲームフォルダが存在しません\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "エラー - GitHubから情報を取得できませんでした",
|
||||
"updateEmuIsLatestVersion": "情報 - すでに最新バージョンを使用しています\n検証ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "情報 - 新しいバージョンが利用可能です\n\nローカルバージョン:%VARIABLE_0%\n新しいバージョン:%VARIABLE_1%\n\n更新しますか?",
|
||||
"updateEmuShaUnavailable": "情報 - ランチャーは更新が行われていないことを検出しました\n(またはfpPS4実行可能ファイルが見つかりませんでした)\n\nこの問題は自動更新手順を使用することで解決できます.\n\n続行しますか?",
|
||||
"updateEmuDownloadFailed": "エラー - fpPS4アップデートのダウンロードに失敗しました\n応答ステータス: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "情報 - アップデート完了\n新しいバージョン (検証ID / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "fpPS4のアップデートをダウンロード中 (<label css=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "アップデートの抽出中",
|
||||
"updateEmu-3-4": "残ったファイルの削除",
|
||||
"updateEmu-4-4": "アップデート完了",
|
||||
"settingsLogEmuSha": "INFO - fpPS4のバージョン: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "完全",
|
||||
"dumpStatus_WARN": "不完全",
|
||||
"dumpStatus_HB": "自作ソフト(Homebrew)",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "",
|
||||
"Sdl2NotFound": "",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "検索", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "緑 : すべてのファイルが存在します\n黄 : 一部のファイルが欠落しています-詳細についてはログを確認してください\nシアン : 実行可能ファイルは.elfファイルです",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "設定",
|
||||
"DIV_SETTINGS_LANGUAGE": "言語",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "選択中の言語",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "この設定を適用するにはランチャーの再起動が必要です",
|
||||
"DIV_SETTINGS_PATHS": "パス",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "アプリ/ゲームのフォルダ",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "エミュレータの場所",
|
||||
"DIV_SETTINGS_GAME_LIST": "アプリ/ゲームの一覧",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(グリッド) アイコンのボーダーのサイズ",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "検索モード",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "背景ぼかし",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "背景の不透明度",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "詳細検索を有効にする (大文字と小文字)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "リスト内の各ゲームの背景を表示",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "リスト内の各ゲームの情報(またはフォルダパス)を表示",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "エミュレータの実行",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "背景ぼかし",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "背景の不透明度",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "タイトルの下にメタデータ(またはファイルパス)を表示する",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "ログオプション",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "エミュレーション開始時のログウィンドウのサイズ",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "エミュレーション終了時にログウィンドウに「続行するには何かキーを押してください」(press any key)を表示",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "<code>PARAM.SFO</code>のサポートを有効にします(適用するには、「すべてのゲーム設定を削除」をクリックしランチャーを再起動してください)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "ゲームリストのロード時に<code>Project.gp4</code>を削除する",
|
||||
"LABEL_FPPS4_OPTIONS": "<label class=\"LABEL_emuColor\">fp</label>PS4 オプション",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "ダンプステータス",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "パッチを有効化",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "バージョン",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "タイプ",
|
||||
"LABEL_EMU_RUNNING_STATUS": "ステータス",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "バージョン",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "ランチャーオプション",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "ハック一覧",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "エミュレーション中にアプリ/ゲームのアイコンと名前を表示する",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">実験的</label> エミュレータの出力を表示します(<code>標準出力</code>と<code>エラー出力</code>)を内部ログに表示します( F12を押す --> コンソール)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "fpPS4をアップデート",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "fpPS4アップデータを有効化",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "アップデートを検索するブランチ",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "ステータス",
|
||||
"DIV_SETTINGS_GENERAL": "全般",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "インターフェースのサイズ(スケール)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "警告 : 画面の解像度が<code>1920x1080</code>未満の場合、この設定を変更することはおすすめしません",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "フルスクリーンでfpPS4を起動",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "名前",
|
||||
"titleId": "タイトルID"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "普通",
|
||||
"max": "最大",
|
||||
"min": "最小"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "フォルダーを選択",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "フォルダを開く",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "ファイルを選択",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "すべてのゲーム設定を削除",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "適用して閉じる",
|
||||
"BTN_SETTINGS_CLOSE": "閉じる",
|
||||
"BTN_REFRESH": "ゲームリスト再更新",
|
||||
"BTN_SETTINGS": "設定",
|
||||
"BTN_CLEAR_LOG": "ログ削除",
|
||||
"BTN_ABOUT": "fpPS4について",
|
||||
"BTN_KILL": "fpPS4を終了",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "パッチを選択",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "アプリ/ゲームのフォルダを開く",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "オプションをリセット",
|
||||
"BTN_launcherOptionsExportMetadata": "メタデータをエクスポート",
|
||||
"BTN_RUN": "fpPS4を起動",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "ランチャーを再起動",
|
||||
"BTN_UPDATE_FPPS4": "fpPS4を更新",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "fpPS4を強制的にアップデート"
|
||||
|
||||
}
|
||||
}
|
179
Lang/nl-nl.json
Normal file
|
@ -0,0 +1,179 @@
|
|||
{
|
||||
"lang": "Dutch (nl-NL)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Activeer",
|
||||
"emuStatusRunning": "Draained",
|
||||
"logWindowTitle": "fpPS4 is draaiend",
|
||||
"killEmuStatus": "Het hoofdproces is afgesloten - sluit het fpPS4 log venster om terug te gaan",
|
||||
"logCleared": "INFO - De laaste log is gewist!",
|
||||
"about": "fpPS4 Temmie's Launcher - Versie: %VARIABLE_0%\n\nGemaakt door TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4 is gemaakt door red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs is gemaakt door Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip is gemaakt door antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG iconen zijn van https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Version: %VARIABLE_0%\nDraaiend op nw.js (node-webkit) versie %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ERROR - De kocatie kon niet aangemaakt worden!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERROR - De fpPS4 executable is niet gevonden!\nZorg ervoor dat het geselecteerd is in de instellingen of plaats het in de map \"Emu\" en klik op OK.",
|
||||
"settingsConfirmRemoveAllGameSettings": "WAARSCHUWING - Deze actie verwijdert de instellingen van alle apps/games.\nWil je doorgaan?",
|
||||
"settingsRemovedGameSettings": "INFO - ( %VARIABLE_0% ) De instellingen zijn succesvol verwijderd!",
|
||||
"settingsConfirmRemoveGameSettings": "WAARSCHUWING - Deze actie verwijdert alle opgeslagen instellingen voor %VARIABLE_0%\n\nWil je doorgaan?",
|
||||
"settingsRemoveGameSettingsError": "ERROR - ( %VARIABLE_0% ) De instellingen konden niet verwijderd worden! \nReden: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "WAARSCHUWING - ( %VARIABLE_0% ) De instellingen voor deze app/game konden niet gevonden worden!",
|
||||
"infoProcessComplete": "INFO - Het Proces is voltooid!\nBekijk de logs voor meer details.",
|
||||
"infoSettingsUpdated": "INFO - De instellingen zijn succesvol bijgewerkt!",
|
||||
"settingsLoadError": "ERROR - De instellingen konden niet geladen worden!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ERROR - De instellingen konden niet opgeslagen worden!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "\nINFO - FpPS4 is draaiend met de argumenten: %VARIABLE_0%\n Emulatie locatie: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% is afgesloten, met de code %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - De vorige modules die via deze launcher geïmporteerde zijn zijn verwijderd omdat ze schadelijk kunnen zijn voor je spel dumps.",
|
||||
"removeLibModule": "INFO - ( %VARIABLE_0% ) Deze module wordt verwijderd: %VARIABLE_1%",
|
||||
"removeModuleError": "ERROR - De modules konden niet verwijderd worden!\nReden: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - ( %VARIABLE_0% ) De instellingen zijn succesvol bijgewerkt!",
|
||||
"updateGameSettingsError": "ERROR - De instellingen konden niet opgeslagen worden voor %VARIABLE_0% op %VARIABLE_1%!\nReden: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - ( %VARIABLE_0% ) De instellingen worden niet opgeslagen omdat er geen veranderingen zijn!",
|
||||
"errorSaveFile": "ERROR - Het bestand kon niet opgeslagen worden!\nReden: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - Succesvol opgeslagen!\nlocatie: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - De instellingen zijn succesvol aangemaakt voor %VARIABLE_0%",
|
||||
"errorCreateSettingsFile": "ERROR - De instellingen konden niet aangemaakt worden voor %VARIABLE_0% op %VARIABLE_1%!\nReden: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - De patch is succesvol geladen!\nNaam: %VARIABLE_0%\nType: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERROR - Dit is geen patch of het is niet voor deze app/game gemaakt!\nPatch ID: %VARIABLE_0%\nGeselecteerde app/game: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERROR - Het bestand PARAM.SFO is niet gevonden in deze patch!",
|
||||
"gameListLoadWarnPlayGo": "WAARSCHUWING - Het bestand playgo-chunk.dat is niet gevonden voor %VARIABLE_0%!\nAls dit geen homebrew is, controleer dan of deze app/game correct is gedumpt.",
|
||||
"gameListLoadWarnParamSfo": "WAARSCHUWING - Het bestand PARAM.SFO is niet gevonden voor %VARIABLE_0%!\nAls dit geen homebrew is, controleer dan of deze app/game correct is gedumpt.",
|
||||
"gameListDoubleIdError": "WAARSCHUWING - Het is niet mogelijk om %VARIABLE_0% toe te voegen omdat er al een app/game is met de zelfde title ID! ( %VARIABLE_1% )",
|
||||
"gameListNoGameFound": "INFO - Er zijn geen apps/games gedetecteerd in de huidige locatie. ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Er is niks gevonden op:",
|
||||
"checkDumpPlayGoOnApp": "INFO - ( %VARIABLE_0% ) Het bestand playgo-chunk.dat is gevonden in sce_sys/app - een copie is gemaakt in sce_sys.",
|
||||
"gameListLoadSuccessful": "INFO - De game lijst is succesvol ingeladen! ( %VARIABLE_0% items gevonden )",
|
||||
"gameListVersion": "Versie",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERROR - Het bestand PARAM.SFO is niet leesbaar in deze patch!\n%VARIABLE_0%",
|
||||
"path": "Locatie",
|
||||
"gamelistGamePath404": "ERROR - De geselecteerde locatie voor de app/game kan niet gevonden worden!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERROR - De Github actie data kan niet opgehaald worden!",
|
||||
"updateEmuIsLatestVersion": "INFO - U gebruikt al de nieuwste fpPS4 versie! \nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - Een nieuwe fpPS4 update is beschikbaar!\n\nLokale versie: %VARIABLE_0%\nNieuwe versie: %VARIABLE_1%\n\nWil je nu updaten?",
|
||||
"updateEmuShaUnavailable": "INFO - De Launcher heeft gedetecteerd dat fpPS4 nog niet is bijgewerkt. (of de fpPS4 executable is niet gevonden!)\n\nU kunt dit oplossen door een fpPS4 update uit te voeren.\nWilt u doorgaan?",
|
||||
"updateEmuDownloadFailed": "ERROR - De fpPS4 update kan niet gedownload worden!\nAntwoord status: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - De fpPS4 update is voltooid!\nNieuwe fpPS4 versie (commit ID / sha): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Bezig met de fpPS4 update te downloaden (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Bezig met update uit te pakken.",
|
||||
"updateEmu-3-4": "Bezig met overgebleven bestanden te verwijderen.",
|
||||
"updateEmu-4-4": "De fpPS4 update is voltooid!",
|
||||
"settingsLogEmuSha": "INFO - fpPS4 versie: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Prima",
|
||||
"dumpStatus_WARN": "Missende bestanden",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "ERROR - Workflow kan niet geupdate worden!",
|
||||
"updater_noWorkflowListAvailable": "Geen workflow lijst beschikbaar",
|
||||
"Sdl2NotFound": "SDL2.dll is niet gevonden in de Emu map, installeer het om SDL2 te gebruiken.",
|
||||
"errorListUnableLocateGamePath": "ERROR - Kan niet de settings voor \"%VARIABLE_0%\" vinden! Om problemen te voorkomen wordt de spel lijst ververst.\nPad: %VARIABLE_1%",
|
||||
"updateEmuSettingsWorkflow404": "ERROR - Kan %VARIABLE_0% niet vinden in de workflow lijst van fpPS4! %VARIABLE_1% wordt tijdelijk gebruikt.",
|
||||
"nonWindowsOsWarn": "WAARSCHUWING - Je gebruikt fpPS4 Temmie's Launcher op een niet-Windows besturingssysteem!\n\nOm fpPS4 te gebruiken moet je Wine hebben geinstalleerd op je systeem.\n\nWeet dat het uitvoeren van fpps4 met tools zoals Wine kan resulteren in meer problemen en een verminderde snelheid/ervaring.",
|
||||
"cGameCompatStatus_BOOTS": "Opent",
|
||||
"cGameCompatStatus_MENUS": "Menu",
|
||||
"cGameCompatStatus_INGAME": "In-Game",
|
||||
"cGameCompatStatus_UNKNOWN": "Onbekend",
|
||||
"cGameCompatStatus_NOTHING": "Niks",
|
||||
"cGameCompatStatus_PLAYABLE": "Speelbaar",
|
||||
"warnUnableFindGameCompatDb": "WAARSCHUWING - Kon niet de compatibiliteit status vinden voor dit spel \"%VARIABLE_0%\" (%VARIABLE_1%) op de fpPS4 database!",
|
||||
"warnUserOffline": "WAARSCHUWING - Je bent offline! Sommige functies (zoals de compatibiliteit status voor spellen en de updater voor fpPS4) zijn niet beschikbaar todat je weer met het internet verbonden bent."
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "Zoeken: Geef een spel naam", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Groen: Alle bestanden zijn aanwezig\nGeel: Sommige bestanden ontbreken - Bekijk de logs voor meer details.\nCyaan: Executable is een .elf-bestand",
|
||||
"DIV_selectedGameStatus_compat": "Speelbaar: Deze titel is volledig speelbaar.\nIn-Game Je kunt delen of segmenten spelen, maar je kunt deze titel niet voltooien.\nMenu: Deze titel werkt tot het menu maar kan de rest niet laden.\nOpent: Deze titel start met laden, maar faalt op een gegeven moment.\nNiks: deze titel doet niks\nOnbekend: Er zijn geen gevens over deze titel in de fpPS4 database gevonden."
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
"DIV_SETTINGS_TITLE": "Instellingen",
|
||||
"DIV_SETTINGS_LANGUAGE": "Taal",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "Geselecteerde Taal",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "U moet de launcher opnieuw opstarten om de wijziging toe te passen",
|
||||
"DIV_SETTINGS_PATHS": "Lokale bestanden",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "Apps/Games Locatie",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "fpPS4 Locatie",
|
||||
"DIV_SETTINGS_GAME_LIST": "Apps/Games lijst",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Raster) Rand radius",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Zoek modus",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Achtergrond Blur",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Achtergrond Intensiteit",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Schakel hoofdlettergevoelig zoeken in",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Toon de achtergrond voor elke app/game in de lijst",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Toon de metadata (of locatie) onder elke app/game in de lijst",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Emulator Instellingen",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Achtergrond Blur",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Achtergrond Intensiteit",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Toon de metadata (of locatie) onder de huidige app/game",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Console",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Standaard Console Groote",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Vraag de gebruiker een toets in te drukken wanneer fpPS4 sluit.",
|
||||
"DIV_SETTINGS_MISC": "Overige instellingen",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Ondersteuning voor <code>PARAM.SFO</code> inschakelen (klik op \"Verwijder instellingen van alle apps/games\" en start de launcher opnieuw op om de wijziging toe te passen)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Verwijder <code>Project.gp4</code> uit elke game als de lijst wordt ingeladen",
|
||||
"LABEL_FPPS4_OPTIONS": "<label class=\"LABEL_emuColor\">fp</label>PS4 Opties",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Dump Status",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Patches Activeren",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "Selecteer de gamepad modus:",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Versie",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Type",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Status",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Versie",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Launcher Instellingen",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Toon de pictogram/naam GUI terwijl fpPS4 draaiend is",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTEEL</label> Log de fpPs4 output (<code>stdout</code> & <code>stderr</code>) in de interne log (Druk op F12 ---> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "fpPS4 Updater",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "fpPS4 updater inschakelen",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Zoek updates van de branche",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Status",
|
||||
"DIV_SETTINGS_GENERAL": "Generaal",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Interface grootte (schaal)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Waarschuwing: Het wordt afgeraden deze instelling te wijzigen als uw schermresolutie lager is dan <code>1920x1080</code>",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Start fpPS4 in volledig scherm",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "Activeer de compatibiliteit status voor titels/games",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "Activeer het veranderen van de led kleur voor de gamepad (vereist <code>SDL2.dll</code>)",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": "Gamepad led kleur:"
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Naam",
|
||||
"titleId": "Title ID"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Normaal",
|
||||
"max": "Gemaximaliseerd",
|
||||
"min": "Geminimaliseerd"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Selecteer pad",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Open pad",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Selecteer executable",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Verwijder instellingen van alle apps/games",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Opslaan & Sluiten",
|
||||
"BTN_SETTINGS_CLOSE": "Terug",
|
||||
"BTN_REFRESH": "Lijst vernieuwen",
|
||||
"BTN_SETTINGS": "Instellingen",
|
||||
"BTN_CLEAR_LOG": "Logs wissen",
|
||||
"BTN_ABOUT": "Over",
|
||||
"BTN_KILL": "Sluit fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Selecteer patch",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Locatie van app/game openen",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Instellingen resetten",
|
||||
"BTN_launcherOptionsExportMetadata": "exporteer metadata",
|
||||
"BTN_RUN": "Start fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Herstart de launcher",
|
||||
"BTN_UPDATE_FPPS4": "Update fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Update forceren"
|
||||
}
|
||||
}
|
184
Lang/pt-br.json
Normal file
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
|
||||
"lang": "Português Brasileiro (PT-BR)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Ativar",
|
||||
"emuStatusRunning": "Em execução",
|
||||
"logWindowTitle": "Executando fpPS4",
|
||||
"killEmuStatus": "Processo principal foi fechado - feche a janela do log para continuar",
|
||||
"logCleared": "INFO - A lista de log foi limpa!",
|
||||
"about": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\n\nCriado por TheMitoSan\n[Anteriormente conhecida como TemmieHeartz]\n(https://twitter.com/themitosan)\n\nfpPS4 foi criado / desenvolvido por red-prig\n(https://github.com/red-prig/fpPS4)\n\nPlugin memoryjs foi criado / desenvolvido por Rob--\n(https://github.com/rob--/memoryjs)\n\nPlugin node-stream-zip foi criado / desenvolvido por antelle\n(https://github.com/antelle/node-stream-zip)\n\nÍcones SVG foram obtidos através do site https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Versão: %VARIABLE_0%\nUsando nw.js (node-webkit) versão %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ERRO - Não foi possível criar a pasta!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERRO - Não foi possível encontrar o executável do fpPS4!\nSelecione o executável nas configurações ou coloque ele dentro da pasta \"Emu\" e clique em ok.",
|
||||
"settingsConfirmRemoveAllGameSettings": "AVISO - Essa opção irá remover todas as configurações da lista de jogos.\nVocê confirma essa ação?",
|
||||
"settingsConfirmRemoveGameSettings": "AVISO - Essa ação irá remover todas as configurações de %VARIABLE_0%\n\nVocê confirma essa ação?",
|
||||
"settingsRemovedGameSettings": "INFO - ( %VARIABLE_0% ) Arquivo de configurações foi removido com sucesso!",
|
||||
"settingsRemoveGameSettingsError": "ERRO - ( %VARIABLE_0% ) Não foi possível remover esse arquivo!\nDetalhes: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "AVISO - ( %VARIABLE_0% ) Não foi possível encontrar o arquivo de configurações!",
|
||||
"infoProcessComplete": "INFO - Processo Concluído!\nVeja o log para obter mais detalhes",
|
||||
"infoSettingsUpdated": "INFO - Arquivo de configurações foi atualizado com sucesso!",
|
||||
"settingsLoadError": "ERRO - Não foi possível carregar as configurações!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ERRO - Não foi possível salvar as configurações!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "INFO - Iniciando fpPS4 com as opções: %VARIABLE_0%\nCaminho do executável: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% foi encerrado com o código de saída %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - Todos os modulos que foram importados anteriormente foram removidos visto que eles podem ser prejudiciais para as dumps.",
|
||||
"removeLibModule": "INFO - ( %VARIABLE_0% ) Removendo módulo: %VARIABLE_1%",
|
||||
"removeModuleError": "ERRO - Não foi possível remover esse módulo!\nMotivo: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - ( %VARIABLE_0% ) O arquivo de configurações foi atualizado com sucesso!",
|
||||
"updateGameSettingsError": "ERRO - Não foi possível atualizar o arquivo de configurações do %VARIABLE_0% em %VARIABLE_1%!\nDetalhes: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - ( %VARIABLE_0% ) O arquivo de configurações não será atualizado por que não houve alterações!",
|
||||
"errorSaveFile": "ERRO - Não foi possível salvar o arquivo!\nDetalhes: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - Arquivo foi gravado com sucesso!\nLocal: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - ( %VARIABLE_0% ) Arquivo de configurações foi gerado com sucesso!",
|
||||
"errorCreateSettingsFile": "ERRO - Não foi possível criar o arquivo de configurações %VARIABLE_0% em %VARIABLE_1%!\nDetalhes: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - Patch foi carregado com sucesso!\nNome: %VARIABLE_0%\nTipo: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERRO - O local selecionado não é um patch - ou se for - não corresponde ao app / game atual!\nSerial: %VARIABLE_0%\nApp / game selecionado: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERRO - Não foi possível encontrar PARAM.SFO desse patch!",
|
||||
"gameListLoadWarnPlayGo": "AVISO - Não foi possível localizar playgo-chunk.dat de %VARIABLE_0%!\nSe esse app / game não for homebrew, verifique se a dump foi feita corretamente.",
|
||||
"gameListLoadWarnParamSfo": "AVISO - Não foi possível localizar PARAM.SFO do %VARIABLE_0%!\nSe esse app / game não for homebrew, verifique se a dump foi feita corretamente.",
|
||||
"gameListDoubleIdError": "AVISO - Não foi possível adicionar %VARIABLE_0% na lista de jogos por que já tem outro título com a mesma id! ( %VARIABLE_1% )",
|
||||
"gameListNoGameFound": "INFO - Nenhum app / game foi encontrado na pasta atual ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Não foi possível encontrar",
|
||||
"checkDumpPlayGoOnApp": "INFO - ( %VARIABLE_0% ) playgo-chunk.dat foi encontrado dentro de sce_sys/app - uma cópia foi criada em sce_sys.",
|
||||
"gameListLoadSuccessful": "INFO - Lista de jogos foi carregada com sucesso! ( foram encontrados %VARIABLE_0% títulos )",
|
||||
"gameListVersion": "Versão",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERRO - Não foi possível carregar PARAM.SFO desse patch!\n%VARIABLE_0%",
|
||||
"path": "Caminho",
|
||||
"gamelistGamePath404": "INFO - A pasta de app / games selecionada não existe!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERRO - Não foi possível obter informações do GitHub Actions!",
|
||||
"updateEmuIsLatestVersion": "INFO - Você já está usando a versão mais recente!\nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - Uma nova atualização está disponível!\n\nVersão local: %VARIABLE_0%\nNova versão: %VARIABLE_1%\n\nVocê gostaria de atualizar?",
|
||||
"updateEmuShaUnavailable": "INFO - O launcher detectou que nenhuma atualização foi feita\n(Ou o executável do fpPS4 não foi encontrado!)\n\nÉ possível corrigir esse problema usando o procedimento de atualização automática.\n\nVocê deseja prosseguir?",
|
||||
"updateEmuDownloadFailed": "ERRO - Não foi possível baixar a atualização do fpPS4!\nStatus de resposta: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - Update concluído! - Nova versão (Commit ID / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Baixando update do fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Extraíndo update",
|
||||
"updateEmu-3-4": "Removendo arquivos de sobra",
|
||||
"updateEmu-4-4": "Update concluído!",
|
||||
"settingsLogEmuSha": "INFO - Versão do fpPS4: %VARIABLE_0%",
|
||||
"dumpStatus_OK": "Perfeito",
|
||||
"dumpStatus_WARN": "Faltam arquivos",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "ERRO - (Updater) Não foi possivel obter a lista de workflows do projeto no GitHub!",
|
||||
"updater_noWorkflowListAvailable": "Não foi possivel obter lista de CI!",
|
||||
"Sdl2NotFound": "Não foi possível encontrar SDL2.dll na pasta Emu!\nVerifique se o mesmo se encontra antes de habilitar \"SDL\".",
|
||||
"errorListUnableLocateGamePath": "ERRO - Não foi possível localizar a pasta de configurações para \"%VARIABLE_0%\"! Para prevenir erros, a lista de Apps / Games foi atualizada.\nCaminho: %VARIABLE_1%",
|
||||
"updateEmuSettingsWorkflow404": "ERRO - (Updater) Não foi possível encontrar a worflow %VARIABLE_0%! A workflow %VARIABLE_1% será usada no lugar.",
|
||||
"nonWindowsOsWarn": "AVSIO - Você está rodando fpPS4 Temmie's Launcher em um sistema não-windows!\n\nPara iniciar fpPS4, você irá precisar ter Wine instalado no seu sistema.\n\nAliás - Tenha em mente que rodar a camada de compatibilidade usando ferramentas como Wine podem (e provavelmente irão) causar glitches, rodar com menos performance do que o esperado.",
|
||||
"cGameCompatStatus_BOOTS": "Inicia",
|
||||
"cGameCompatStatus_MENUS": "Menu Inicial",
|
||||
"cGameCompatStatus_INGAME": "In-Game",
|
||||
"cGameCompatStatus_UNKNOWN": "Desconhecido",
|
||||
"cGameCompatStatus_NOTHING": "Nada",
|
||||
"cGameCompatStatus_PLAYABLE": "Jogável",
|
||||
"warnUnableFindGameCompatDb": "AVISO - Não possível obter informações de \"%VARIABLE_0%\" (%VARIABLE_1%) no banco de dados do fpPS4!",
|
||||
"warnUserOffline": "WARN - Você está offline! Algumas funcionalidades (como obter status de compatibilidade e atualizador do fpPS4) não estarão disponíveis até que você se conecte a internet novamente."
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": { "placeholder": "Pesquisa: Nome do título...", "value": "" }
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Verde: Todos os arquivos estão presentes\nAmarelo: Alguns arquivos estão faltando - veja o log para obter mais detalhes\nCiano: O executável é um arquivo .elf",
|
||||
"DIV_selectedGameStatus_compat": "Jogável: Pode ser jogado / executado do começo ao fim.\nIn-Game: Pode ser iniciado / executado, porém até certo ponto.\nMenu Inicial: O título consegue chegar apenas no menu inicial.\nInicia: O título inicia, sem conseguir chegar ao menu inicial.\nNada: O título não apresenta nenhum gráfico, travando nos primeiros momentos após iniciar a execução ou o mesmo não se encontra no banco de dados do fpPS4.\nDesconhecido: O fpPS4 Temmie's Launcher não conseguiu obter informações sobre esse título."
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "Configurações",
|
||||
"DIV_SETTINGS_LANGUAGE": "Idioma",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "Idioma atual",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "Você precisa reiniciar o launcher para aplicar essa configuração",
|
||||
"DIV_SETTINGS_PATHS": "Caminhos",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "Pasta de Apps / Games",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "Local do emulador",
|
||||
"DIV_SETTINGS_GAME_LIST": "Lista de Apps / Games",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Grid) Raio de borda dos ícones",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Modo de pesquisa",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Desfoque do plano de fundo",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Opacidade do plano de fundo",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Habilitar busca precisa (maiúsculas e minúsculas)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Mostrar plano de fundo para cada game na lista",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Mostrar informações (ou caminho da pasta) para cada game na lista",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Emulação em andamento",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Desfoque do plano de fundo",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Opacidade do plano de fundo",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Mostrar informações do game (ou caminho do executável) abaixo do título",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Opções de Log",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Iniciar janela do log",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Aperte alguma tecla para fechar após fpPS4 fechar",
|
||||
"DIV_SETTINGS_MISC": "Outras configurações",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Habilitar suporte para arquivos <code>PARAM.SFO</code> (Clique em \"Deletar todas as configurações dos jogos\" e reinicie o launcher para ter efeito)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Remover arquivos <code>Project.gp4</code> ao carregar a lista de jogos",
|
||||
"LABEL_FPPS4_OPTIONS": "Opções de <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Status da dump",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Habilitar patches",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "Modo de input:",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Versão",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Tipo",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Status",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Versão",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Opções do Launcher",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Mostrar ícone e nome do app / game durante a emulação",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">EXPERIMENTAL</label> Exibir output do emulador (<code>stdout</code> e <code>stderr</code>) no log interno (Aperte F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "Atualizações do fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Habilitar atualizador do fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Obter atualizações da branch",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Status",
|
||||
"DIV_SETTINGS_GENERAL": "Geral",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Tamanho da interface (escala)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Aviso: Não é recomendado alterar essa configuração caso sua resolução de tela seja menor que <code>1920x1080</code>",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Iniciar fpPS4 em modo de tela cheia",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "Habilitar verificação de compatibilidade de títulos / games",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "Habilitar opção de alterar cor do controle (requer <code>SDL2.dll</code>)",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": "(Controle) Cor do led:"
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Nome",
|
||||
"titleId": "Serial"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Normal",
|
||||
"max": "Maximizado",
|
||||
"min": "Minimizado"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Selecionar pasta",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Abrir pasta",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Selecionar arquivo",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Deletar todas as configurações dos jogos",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Aplicar e Voltar",
|
||||
"BTN_SETTINGS_CLOSE": "Voltar",
|
||||
"BTN_REFRESH": "Atualizar lista",
|
||||
"BTN_SETTINGS": "Configurações",
|
||||
"BTN_CLEAR_LOG": "Limpar log",
|
||||
"BTN_ABOUT": "Sobre",
|
||||
"BTN_KILL": "Parar fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Selecionar patch",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Abrir local do app / game",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Resetar configurações",
|
||||
"BTN_launcherOptionsExportMetadata": "Exportar metadados",
|
||||
"BTN_RUN": "Iniciar fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Reiniciar launcher",
|
||||
"BTN_UPDATE_FPPS4": "Atualizar fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Fazer atualização forçada"
|
||||
|
||||
}
|
||||
}
|
185
Lang/ru-ru.json
Normal file
|
@ -0,0 +1,185 @@
|
|||
{
|
||||
|
||||
"lang": "Русский (RU)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Включить",
|
||||
"emuStatusRunning": "Выполняется",
|
||||
"logWindowTitle": "Запуск fpPS4",
|
||||
"killEmuStatus": "Основной процесс был закрыт - закройте окно лога для продолжения работы",
|
||||
"logCleared": "ИНФО - Список логов был очищен!",
|
||||
"about": "fpPS4 Temmie's Launcher - Версия: %VARIABLE_0%\n\nСоздано TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4 создан red-prig\n(https://github.com/red-prig/fpPS4)\n\nПлагин memoryjs создан Rob--\n(https://github.com/rob--/memoryjs)\n\nПлагин node-stream-zip создан antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG иконки были взяты из https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Версия: %VARIABLE_0%\nИспользование nw.js (node-webkit) версия %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ОШИБКА - Невозможно создать папку!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ОШИБКА - Невозможно найти исполняемый файл fpPS4!\nВыберите исполняемый файл в настройках или поместите его внутрь \"Emu\" и нажмите OK.",
|
||||
"settingsConfirmRemoveAllGameSettings": "ВНИМАНИЕ - Эта опция удалит все настройки из списка игр.\nВы подтверждаете это действие?",
|
||||
"settingsConfirmRemoveGameSettings": "ПРЕДУПРЕЖДЕНИЕ - Это действие удалит все настройки %VARIABLE_0%.\n\nВы подтверждаете это действие?",
|
||||
"settingsRemovedGameSettings": "ИНФО - ( %VARIABLE_0% ) Файл конфигурации успешно удален!",
|
||||
"settingsRemoveGameSettingsError": "ОШИБКА - ( %VARIABLE_0% ) Невозможно удалить этот файл!\nПодробности: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "ВНИМАНИЕ - ( %VARIABLE_0% ) Невозможно найти файл конфигурации!",
|
||||
"infoProcessComplete": "ИНФО - Процесс завершен!\nСмотрите лог для получения более подробной информации",
|
||||
"infoSettingsUpdated": "ИНФО - Файл настроек успешно обновлен!",
|
||||
"settingsLoadError": "ОШИБКА - Невозможно загрузить настройки!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ОШИБКА - Невозможно сохранить настройки!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "ИНФО - Запуск fpPS4 с параметрами: %VARIABLE_0%\nПуть исполняемого файла: %VARIABLE_1%",
|
||||
"closeEmuStatus": "ИНФО - %VARIABLE_0% был закрыт с кодом выхода %VARIABLE_1%",
|
||||
"removedLibModules": "ИНФО - Все модули, которые были импортированы ранее, были удалены, так как они могут нанести вред дампам.",
|
||||
"removeLibModule": "ИНФО - ( %VARIABLE_0% ) Удаление модуля: %VARIABLE_1%",
|
||||
"removeModuleError": "ОШИБКА - Невозможно удалить этот модуль!\nПричина: %VARIABLE_0%",
|
||||
"updateGameSettings": "ИНФО - ( %VARIABLE_0% ) Файл конфигурации был успешно обновлен!",
|
||||
"updateGameSettingsError": "ОШИБКА - Невозможно обновить файл настроек %VARIABLE_0% в %VARIABLE_1%!\nПодробности: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "ИНФО - ( %VARIABLE_0% ) Файл настроек не будет обновлен, поскольку никаких изменений не было сделано!",
|
||||
"errorSaveFile": "ОШИБКА - Невозможно сохранить файл!\nПодробности: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "ИНФО - Файл успешно записан!\nМестоположение: %VARIABLE_0%",
|
||||
"createdSettingsFile": "ИНФО - ( %VARIABLE_0% ) Файл конфигурации успешно создан!",
|
||||
"errorCreateSettingsFile": "ОШИБКА - Невозможно создать файл конфигурации %VARIABLE_0% в %VARIABLE_1%!\nПодробности: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "ИНФО - Патч успешно загружен!\nИмя: %VARIABLE_0%\nТип: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ОШИБКА - Это не патч, а если и есть, то выбранный не соответствует текущей игре!\nИдентификатор патча: %VARIABLE_0%\nТекущее приложение/игра: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ОШИБКА - Невозможно найти PARAM.SFO этого патча!",
|
||||
"gameListLoadWarnPlayGo": "ВНИМАНИЕ - Невозможно найти файл playgo-chunk.dat из %VARIABLE_0%!\nЕсли это приложение / игра не является Homebrew, проверьте , что дамп был сделан правильно.",
|
||||
"gameListLoadWarnParamSfo": "ВНИМАНИЕ - Невозможно найти PARAM.SFO из %VARIABLE_0%!\nЕсли это приложение / игра не является Homebrew, проверьте, что дамп был сделан правильно.",
|
||||
"gameListDoubleIdError": "ВНИМАНИЕ - Невозможно добавить %VARIABLE_0% в список игр, потому что уже есть другое название с таким же ID! ( %VARIABLE_1% )",
|
||||
"gameListNoGameFound": "ИНФО - Не найдено приложений / игр в текущей папке ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Не найдено",
|
||||
"checkDumpPlayGoOnApp": "ИНФО - ( %VARIABLE_0% ) playgo-chunk.dat был найден внутри sce_sys/app - копия была создана в sce_sys.",
|
||||
"gameListLoadSuccessful": "ИНФО - Список игр был успешно загружен! ( %VARIABLE_0% названий найдено )",
|
||||
"gameListVersion": "Версия",
|
||||
"selectGameLoadPatchErrorParamSfo": "ОШИБКА - Невозможно загрузить PARAM.SFO из этого патча!\n%VARIABLE_0%",
|
||||
"path": "Путь",
|
||||
"gamelistGamePath404": "ОШИБКА - Невозможно найти путь к выбранному приложению / игре!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ОШИБКА - Невозможно получить данные GitHub действий!",
|
||||
"updateEmuIsLatestVersion": "ИНФО - Вы используете последнюю доступную версию fpPS4!\nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "ИНФО - Доступно новое обновление!\n\nВаша версия: %VARIABLE_0%\nНовая версия: %VARIABLE_1%\n\nХотите обновить?",
|
||||
"updateEmuShaUnavailable": "ИНФО - Лаунчер обнаружил что вы не обновили fpPS4 (или файл запуска fpPS4 не найден!)\n\nВы можете это исправить запуском процесса обновления fpPS4.\nХотите продолжить?",
|
||||
"updateEmuDownloadFailed": "ОШИБКА - Невозможно скачать обновление для fpPS4!\nСтатус ответа: %VARIABLE_0% - ОК: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "ИНФО - Обновление завершено!\nНовая версия fpPS4 (Commit ID / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Скачивание обновления fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Распаковка обновления",
|
||||
"updateEmu-3-4": "Удаление ненужных файлов",
|
||||
"updateEmu-4-4": "Обновление завершено!",
|
||||
"settingsLogEmuSha": "ИНФО - Версия fpPS4: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Отлично",
|
||||
"dumpStatus_WARN": "Недостающие файлы",
|
||||
"dumpStatus_HB": "",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "Нет доступного списка рабочих процессов",
|
||||
"Sdl2NotFound": "SDL2.dll не найден в папке Emu, пожалуйста установите его чтобы использовать SDL2.",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "Поиск: Название игры...", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Зелёный: Все файлы присутствуют\nЖёлтый: Некоторые файлы отсутствуют - смотрите лог для более подробной информации\nГолубой: Исполняемый файл представляет собой файл .elf",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "Настройки",
|
||||
"DIV_SETTINGS_LANGUAGE": "Язык",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "Текущий язык",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "Перезапустите лаунчер чтобы настройки вступили в силу.",
|
||||
"DIV_SETTINGS_PATHS": "Пути",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "К папке с приложениями / играми",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "К папке с эмулятором (fpPS4)",
|
||||
"DIV_SETTINGS_GAME_LIST": "Макет",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Сетка) Радиус границы значков",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Режим поиска",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Размытие фона",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Прозрачность фона",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Включить точный поиск (с учетом регистра)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Показать фон для каждой игры в списке",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Показать информацию (или путь к папке) для каждой игры в списке",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Выполняется эмуляция",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Размытие фона",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Прозрачность фона",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Показать информацию об игре (или путь к исполняемому файлу) под заголовком",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Параметры ведения лога",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Запуск окна лога",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Нажмите любую клавишу для закрытия после завершения работы fpPS4",
|
||||
"DIV_SETTINGS_MISC": "Другие конфигурации",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Включить поддержку файлов <code>PARAM.SFO</code> (Нажмите на \"Удалить все игровые настройки\" и перезапустите лаунчер, чтобы настройки вступили в силу)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Удалить файлы <code>Project.gp4</code> при загрузке списка игр",
|
||||
"LABEL_FPPS4_OPTIONS": "Настройки <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Состояние дампа",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Включить патчи",
|
||||
"LABEL_FPPS4_OPTIONS_MISC": "Другие Опции",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "Выберите режим геймпада:",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Версия",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Тип",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Статус",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Версия",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Параметры запуска",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Хаки",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Показывать иконку / имя когда fpPS4 выполняется",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">ЭКСПЕРЕМЕНТАЛЬНО</label> Логи процесса вывода fpPS4 (<code>stdout</code> и <code>stderr</code>) в внутреннем логе (Нажать F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "Автообновления fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Включить автообновления fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Искать обновления из ветки",
|
||||
"DIV_SETTINGS_GENERAL": "Основное",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Размер интерфейса: ",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Внимание: Не рекомендуется изменять этот параметр если разреш. экрана меньше чем <code>1920x1080</code>",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Статус",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Запустить fpPS4 в полноэкранном режиме",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Имя",
|
||||
"titleId": "Код игры"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Нормальное",
|
||||
"max": "Развернутое",
|
||||
"min": "Свернутое"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "XInput",
|
||||
"sdl2": "SDL2",
|
||||
"keyboard": "Клавиатура"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Выберите папку",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Открыть папку",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Выберите файл",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Удалить все игровые настройки",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Применить и закрыть",
|
||||
"BTN_SETTINGS_CLOSE": "Назад",
|
||||
"BTN_REFRESH": "Обновить список игр",
|
||||
"BTN_SETTINGS": "Настройки",
|
||||
"BTN_CLEAR_LOG": "Очистить лог",
|
||||
"BTN_ABOUT": "О программе",
|
||||
"BTN_KILL": "Остановить fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Выберите патч",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Папка приложения / игры",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Сброс настроек",
|
||||
"BTN_launcherOptionsExportMetadata": "Экспорт метаданных",
|
||||
"BTN_RUN": "Запустить",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Перезапустить лаунчер",
|
||||
"BTN_UPDATE_FPPS4": "Обновить fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Обновить fpPS4 принудительно"
|
||||
|
||||
}
|
||||
}
|
174
Lang/tr-tr.json
Normal file
|
@ -0,0 +1,174 @@
|
|||
{
|
||||
"lang": "Türkçe (TR-TR)",
|
||||
"variables": {
|
||||
"labelEnableHack": "Etkinleştir",
|
||||
"emuStatusRunning": "Çalışıyor",
|
||||
"logWindowTitle": "fpPS4 Çalıştırılıyor",
|
||||
"killEmuStatus": "Ana işlem kapatıldı - log penceresini kapatmak için devam edin",
|
||||
"logCleared": "BİLGİ - Log listesi temizlendi!",
|
||||
"about": "fpPS4 Temmie's Launcher - Versiyon: %VARIABLE_0%\n\nTheMitoSan tarafından oluşturuldu\n(https://twitter.com/themitosan)\n\nfpPS4, red-prig tarafından oluşturuldu/geliştirildi\n(https://github.com/red-prig/fpPS4)\n\nmemoryjs eklentisi, Rob-- tarafından oluşturuldu/geliştirildi\n(https://github.com/rob--/memoryjs)\n\nnode-stream-zip eklentisi, antelle tarafından oluşturuldu/geliştirildi\n(https://github.com/antelle/node-stream-zip)\n\nSVG ikonlar https://www.svgrepo.com adresinden alındı",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Versiyon: %VARIABLE_0%\n nw.js (node-webkit) versiyonu kullanılıyor %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "HATA - Klasör oluşturulamıyor!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "HATA - fpPS4 yürütülebilir dosyası bulunamadı!\nYürütülebilir dosyayı ayarlardan seçin veya \"Emu\" klasörüne yerleştirin ve OK tuşuna basın.",
|
||||
"settingsConfirmRemoveAllGameSettings": "UYARI - Bu seçenek, oyun listesindeki tüm ayarları silecektir.\nBu işlemi onaylıyor musunuz?",
|
||||
"settingsConfirmRemoveGameSettings": "UYARI - Bu işlem %VARIABLE_0% için tüm ayarları silecektir.\n\nBu işlemi onaylıyor musunuz?",
|
||||
"settingsRemovedGameSettings": "BİLGİ - ( %VARIABLE_0% ) Ayar dosyası başarıyla silindi!",
|
||||
"settingsRemoveGameSettingsError": "HATA - ( %VARIABLE_0% ) Bu dosya silinemedi!\nDetaylar: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "UYARI - ( %VARIABLE_0% ) Ayar dosyası bulunamadı!",
|
||||
"infoProcessComplete": "BİLGİ - İşlem tamamlandı!\nDaha fazla detay için loglara bakın",
|
||||
"infoSettingsUpdated": "BİLGİ - Ayar dosyası başarıyla güncellendi!",
|
||||
"settingsLoadError": "HATA - Ayarlar yüklenemedi!\n %VARIABLE 0%",
|
||||
"settingsSaveError": "HATA - Ayarlar kaydedilemedi!\n %VARIABLE 0%",
|
||||
"runEmuArgs": "BİLGİ - fpPS4 şu seçeneklerle başlatılıyor: %VARIABLE_0%\nYürütülebilir dosyanın yolu: %VARIABLE_1%",
|
||||
"closeEmuStatus": "BİLGİ - %VARIABLE_0% çıkış kodu ile kapandı %VARIABLE_1%",
|
||||
"removedLibModules": "BİLGİ - Daha önce içe aktarılan tüm modüller silindi çünkü dump'lar için zararlı olabilirler.",
|
||||
"removeLibModule": "BİLGİ - ( %VARIABLE_0% ) Modül kaldırılıyor: %VARIABLE_1%",
|
||||
"removeModuleError": "HATA - Bu modül kaldırılamadı!\nNeden: %VARIABLE_0%",
|
||||
"updateGameSettings": "BİLGİ - ( %VARIABLE_0% ) Ayar dosyası başarıyla güncellendi!",
|
||||
"updateGameSettingsError": "HATA - %VARIABLE_0% için ayar dosyası %VARIABLE_1% içinde güncellenemedi!\nDetaylar: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "BİLGİ - ( %VARIABLE_0% ) Yapılandırma dosyası güncellenmeyecek çünkü herhangi bir değişiklik yapılmadı!",
|
||||
"errorSaveFile": "HATA - Dosya kaydedilemedi!\nDetaylar: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "BİLGİ - Dosya başarıyla yazıldı!\nKonum: %VARIABLE_0%",
|
||||
"createdSettingsFile": "BİLGİ - ( %VARIABLE_0% ) Ayar dosyası başarıyla oluşturuldu!",
|
||||
"errorCreateSettingsFile": "HATA - %VARIABLE_0% içinde %VARIABLE_1% ayar dosyası oluşturulamadı!\nDetaylar: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "BİLGİ - Yama başarıyla yüklendi!\nAd: %VARIABLE_0%\nTip: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "HATA - Bu bir yama değil veya mevcut oyunla eşleşmiyor!\nYama kimliği: %VARIABLE_0%\nMevcut uygulama/oyun: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "HATA - Bu yama için PARAM.SFO bulunamadı!",
|
||||
"gameListLoadWarnPlayGo": "UYARI - %VARIABLE_0% içinden playgo-chunk.dat bulunamadı!\nBu uygulama/oyun bir homebrew değilse, doğru bir şekilde dump edildiğinden emin olun.",
|
||||
"gameListLoadWarnParamSfo": "UYARI - %VARIABLE_0% PARAM.SFO bulunamadı!\nBu uygulama/oyun bir homebrew değilse, doğru bir şekilde dump edildiğinden emin olun.",
|
||||
"gameListDoubleIdError": "DİKKAT - %VARIABLE_0% oyun listesine eklenemedi çünkü aynı kimliğe sahip başka bir başlık zaten var! (%VARIABLE_1%)",
|
||||
"gameListNoGameFound": "BİLGİ - Mevcut klasörde ( %VARIABLE_0% ) hiç uygulama/oyun bulunamadı",
|
||||
"gameListSearch404": "Bulunamadı",
|
||||
"checkDumpPlayGoOnApp": "BİLGİ - ( %VARIABLE_0% ) sce_sys/app içinde playgo-chunk.dat bulundu - sce_sys içine bir kopya oluşturuldu.",
|
||||
"gameListLoadSuccessful": "BİLGİ - Oyun listesi başarıyla yüklendi! ( %VARIABLE_0% başlık bulundu )",
|
||||
"gameListVersion": "Versiyon",
|
||||
"selectGameLoadPatchErrorParamSfo": "HATA - Bu yamanın PARAM.SFO'su yüklenemedi!\n%VARIABLE_0%",
|
||||
"path": "Yol",
|
||||
"gamelistGamePath404": "BİLGİ - Seçilen uygulama / oyun klasörü mevcut değil!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "HATA - GitHub'tan bilgi alınamıyor!",
|
||||
"updateEmuIsLatestVersion": "BİLGİ - Zaten en son versiyonu kullanıyorsunuz!\nCommit kimliği (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "BİLGİ - Yeni bir güncelleme mevcut!\n\nYerel versiyon:%VARIABLE_0%\nYeni versiyon:%VARIABLE_1%\n\nGüncellemek ister misiniz?",
|
||||
"updateEmuShaUnavailable": "BİLGİ - Launcher, herhangi bir güncelleme yapılmadığını algıladı\n(Veya fpPS4 yürütülebilir dosyası bulunamadı!)\n\nBu sorunu, otomatik güncelleme prosedürünü kullanarak çözebilirsiniz.\n\nDevam etmek ister misiniz?",
|
||||
"updateEmuDownloadFailed": "HATA - fpPS4 güncellemesi indirilemedi!\nYanıt durumu: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "BİLGİ - Güncelleme tamamlandı!\nYeni versiyon (Commit kimliği / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "fpPS4 güncellemesi indiriliyor (%VARIABLE_0%)",
|
||||
"updateEmu-2-4": "Güncelleme çıkarılıyor",
|
||||
"updateEmu-3-4": "Kalan dosyalar siliniyor",
|
||||
"updateEmu-4-4": "Güncelleme tamamlandı!",
|
||||
"settingsLogEmuSha": "BİLGİ - fpPS4 versiyonu: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Mükemmel",
|
||||
"dumpStatus_WARN": "Eksik dosyalar",
|
||||
"dumpStatus_HB": "Homebrew",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "CI listesi alınamadı!",
|
||||
"Sdl2NotFound": "SDL2.dll, Emu klasöründe bulunamadı, \"SDL\"yi etkinleştirmek için orada olduğundan emin olun.",
|
||||
"errorListUnableLocateGamePath": "HATA - \"%VARIABLE_0%\" için ayar klasörü bulunamadı! Hatalardan kaçınmak için uygulama/oyun listesi güncellendi.\nYol: %VARIABLE_1%",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {
|
||||
"placeholder": "Arama: Oyun adı...",
|
||||
"value": ""
|
||||
}
|
||||
},
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Yeşil: tüm dosyalar mevcut\nSarı: bazı dosyalar eksik - detaylar için loglara bakın\nCamgöbeği: yürütülebilir dosya bir .elf dosyası",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
"innerHTML": {
|
||||
"DIV_SETTINGS_TITLE": "Ayarlar",
|
||||
"DIV_SETTINGS_LANGUAGE": "Dil",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "mevcut dil",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "Bu ayarı uygulamak için launcher'ı yeniden başlatmanız gerekmektedir",
|
||||
"DIV_SETTINGS_PATHS": "Yol",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "Uygulamalar/Oyunlar Klasörü",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "Emülatör Konumu",
|
||||
"DIV_SETTINGS_GAME_LIST": "Uygulama / Oyun Listesi",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Grid) İkonların sınır yarıçapı",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Arama Modu",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Arka Plan Bulanıklığı",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Arka Plan Opaklığı",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Hassas aramayı etkinleştir (büyük/küçük harf duyarlı)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Listede her oyun için arka planı göster",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Listedeki her oyun için bilgileri (veya klasör yolunu) göster",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Emülasyon Çalışıyor",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Arka Plan Bulanıklığı",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Arka Plan Opaklığı",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Başlık altında oyun bilgilerini (veya yürütülebilir dosyanın yolunu) göster",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Log Seçenekleri",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Log penceresi başlangıç durumu",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "fpPS4 kapatıldıktan sonra kapatmak için herhangi bir tuşa basın",
|
||||
"DIV_SETTINGS_MISC": "Diğer Ayarlar",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "<code>PARAM.SFO</code> dosyalarını desteklemeyi etkinleştir (Uygulamak için \"Tüm oyun ayarlarını sil\"e tıklayın ve launcher'ı yeniden başlatın)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Oyun listesi yüklenirken <code>Project.gp4</code> dosyalarını sil",
|
||||
"LABEL_FPPS4_OPTIONS": "<label class=\"LABEL_emuColor\">fp</label>PS4 Seçenekleri",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Dump Durumu",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Yamaları Etkinleştir",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Versiyon",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Tip",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Durum",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Versiyon",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Launcher Seçenekleri",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hileler",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Emülasyon sırasında uygulama/oyun simgesini ve adını göster",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">DENEYSEL</label> Emülatör çıktısını (<code>stdout</code> ve <code>stderr</code>) iç logda göster (F12'ye basın --> Konsol)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "fpPS4 Güncellemeleri",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "fpPS4 güncelleme programını etkinleştir",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Güncellemeleri şu branştan al",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Durum",
|
||||
"DIV_SETTINGS_GENERAL": "Genel",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Arayüz boyutu (ölçek)",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Uyarı: Ekran çözünürlüğünüz <code>1920x1080</code>'den düşükse bu ayarı değiştirmeniz önerilmez",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "fpPS4'ü tam ekran modunda başlat",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
},
|
||||
"select": {
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Ad",
|
||||
"titleId": "Seri"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Normal",
|
||||
"max": "Maksimum",
|
||||
"min": "Minimum"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Klavye"
|
||||
}
|
||||
},
|
||||
"value": {
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Klasör Seç",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Klasörü Aç",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Klasör Seç",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Tüm Oyun Ayarlarını Sil",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Uygula ve Kapat",
|
||||
"BTN_SETTINGS_CLOSE": "Kapat",
|
||||
"BTN_REFRESH": "Listeyi Yenile",
|
||||
"BTN_SETTINGS": "Ayarlar",
|
||||
"BTN_CLEAR_LOG": "Logları Temizle",
|
||||
"BTN_ABOUT": "Hakkında",
|
||||
"BTN_KILL": "fpPS4'ü Durdur",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Yama Seç",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Uygulama/Oyun Konumunu Aç",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Ayarları Sıfırla",
|
||||
"BTN_launcherOptionsExportMetadata": "Metaveriyi Dışa Aktar",
|
||||
"BTN_RUN": "fpPS4'ü Başlat",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Launcher'ı Yeniden Başlat",
|
||||
"BTN_UPDATE_FPPS4": "fpPS4'ü Güncelle",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "fpPS4 Güncellemesini Zorla"
|
||||
}
|
||||
}
|
185
Lang/uk-ua.json
Normal file
|
@ -0,0 +1,185 @@
|
|||
{
|
||||
|
||||
"lang": "Українська (UA)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "Ввімкнути",
|
||||
"emuStatusRunning": "Виконання",
|
||||
"logWindowTitle": "Запуск fpPS4",
|
||||
"killEmuStatus": "Основний процес було закрито - закрийте вікно логу для продовження роботи",
|
||||
"logCleared": "ІНФО - Список логу був очищений!",
|
||||
"about": "fpPS4 Temmie's Launcher - Версія: %VARIABLE_0%\n\nСтворено TheMitoSan\n(https://twitter.com/themitosan)\n\nfpPS4 створено red-prig\n(https://github.com/red-prig/fpPS4)\n\nПлагин memoryjs створено Rob--\n(https://github.com/rob--/memoryjs)\n\nПлагин node-stream-zip створено antelle\n(https://github.com/antelle/node-stream-zip)\n\nSVG іконки були взяті з https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - Версія: %VARIABLE_0%\nВикористання nw.js (node-webkit) версія %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ПОМИЛКА - Неможливо створити папку!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ПОМИЛКА - Неможливо знайти виконавчий файл fpPS4!\nВиберіть виконавчий файл в налаштуваннях або помістіть його всередину \"Emu\" та натисніть OK.",
|
||||
"settingsConfirmRemoveAllGameSettings": "УВАГА - Ця опція видалить всі налаштування зі списку ігор.\nВи підтверджуєте цю дію?",
|
||||
"settingsConfirmRemoveGameSettings": "ПОПЕРЕДЖЕННЯ - Ця дія видалить всі налаштування %VARIABLE_0%.\n\nВи підтверджуєте цю дію?",
|
||||
"settingsRemovedGameSettings": "ІНФО - ( %VARIABLE_0% ) Файл конфігурації успішно видалений!",
|
||||
"settingsRemoveGameSettingsError": "ПОМИЛКА - ( %VARIABLE_0% ) Неможливо видалити цей файл!\nПодробиці: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "УВАГА - ( %VARIABLE_0% ) Неможливо знайти файл конфігурації!",
|
||||
"infoProcessComplete": "ІНФО - Процесс завершено!\nДивіться лог для отримання більш детальної інформації",
|
||||
"infoSettingsUpdated": "ІНФО - Файл налаштувань успішно оновлений!",
|
||||
"settingsLoadError": "ПОМИЛКА - Неможливо завантажити налаштування!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ПОМИЛКА - Неможливо зберегти налаштування!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "ІНФО - Запуск fpPS4 з параметрами: %VARIABLE_0%\nШлях виконавчого файлу: %VARIABLE_1%",
|
||||
"closeEmuStatus": "ІНФО - %VARIABLE_0% був закритий з кодом виходу %VARIABLE_1%",
|
||||
"removedLibModules": "ІНФО - Всі модулі, які були імпортовані раніше, були видалені, так як вони можуть нанести шкоди дампам.",
|
||||
"removeLibModule": "ІНФО - ( %VARIABLE_0% ) Видалення модуля: %VARIABLE_1%",
|
||||
"removeModuleError": "ПОМИЛКА - Неможливо видалити цей модуль!\nПричина: %VARIABLE_0%",
|
||||
"updateGameSettings": "ІНФО - ( %VARIABLE_0% ) Файл конфігурації був успішно оновлений!",
|
||||
"updateGameSettingsError": "ПОМИЛКА - Неможливо оновити файл налаштувань %VARIABLE_0% в %VARIABLE_1%!\nПодробиці: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "ІНФО - ( %VARIABLE_0% ) Файл налаштувань не буде оновлений, оскільки ніяких змін не було зроблено!",
|
||||
"errorSaveFile": "ПОМИЛКА - Неможливо зберегти файл!\nПодробиці: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "ІНФО - Файл успішно записаний!\nМістоположення: %VARIABLE_0%",
|
||||
"createdSettingsFile": "ІНФО - ( %VARIABLE_0% ) Файл конфігурації успішно створено!",
|
||||
"errorCreateSettingsFile": "ПОМИЛКА - Неможливо створити файл конфігурації %VARIABLE_0% в %VARIABLE_1%!\nПодробиці: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "ІНФО - Патч успішно завантажено!\nІм'я: %VARIABLE_0%\nТип: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ПОМИЛКА - Це не патч, а якщо и є, то вибраний не відповідає поточній грі!\nІдентифікатор патчу: %VARIABLE_0%\nПоточний додаток/гра: %VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ПОМИЛКА - Неможливо знайти PARAM.SFO цього патчу!",
|
||||
"gameListLoadWarnPlayGo": "УВАГА - Неможливо знайти файл playgo-chunk.dat із %VARIABLE_0%!\nЯкщо цей додаток / гра не являється Homebrew, перевірте, що дамп був зроблений правильно.",
|
||||
"gameListLoadWarnParamSfo": "УВАГА - Неможливо знайти PARAM.SFO із %VARIABLE_0%!\nЯкщо цей додаток / гра не являється Homebrew, перевірте, що дамп був зроблений правильно.",
|
||||
"gameListDoubleIdError": "УВАГА - Неможливо додати %VARIABLE_0% до списку ігор, тому що вже є друга назва з таким же ID! ( %VARIABLE_1% )",
|
||||
"gameListNoGameFound": "ІНФО - Не знайдено додаток / гру в поточній папці ( %VARIABLE_0% )",
|
||||
"gameListSearch404": "Не знайдено",
|
||||
"checkDumpPlayGoOnApp": "ІНФО - ( %VARIABLE_0% ) playgo-chunk.dat був знайдений всередині sce_sys/app - копія була створена в sce_sys.",
|
||||
"gameListLoadSuccessful": "ІНФО - Список ігор був успішно завантажений! ( %VARIABLE_0% назв знайдено )",
|
||||
"gameListVersion": "Версія",
|
||||
"selectGameLoadPatchErrorParamSfo": "ПОМИЛКА - Неможливо завантажити PARAM.SFO із цього патчу!\n%VARIABLE_0%",
|
||||
"path": "Шлях",
|
||||
"gamelistGamePath404": "ПОМИЛКА - Неможливо знайти шлях до вибраного додатка / гри!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ПОМИЛКА - Неможливо отримати данні GitHub дій!",
|
||||
"updateEmuIsLatestVersion": "ІНФО - Ви використовуєте послідню доступну версію fpPS4!\nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "ІНФО - Доступне нове оновлення!\n\nВаша версія: %VARIABLE_0%\nНова версія: %VARIABLE_1%\n\nХочете оновити?",
|
||||
"updateEmuShaUnavailable": "ІНФО - Лаунчер виявив що ви не оновили fpPS4 (або виконавчий файл fpPS4 не знайдено!)\n\nВи можете це виправити виконавши процес оновлення fpPS4.\nХочете продовжити?",
|
||||
"updateEmuDownloadFailed": "ПОМИЛКА - Неможливо завантажити оновлення для fpPS4!\nСтатус відповіді: %VARIABLE_0% - ОК: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "ІНФО - Оновлення завершено!\nНова версія fpPS4 (Commit ID / SHA): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "Скачування оновлення fpPS4 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "Розпаковка оновлення",
|
||||
"updateEmu-3-4": "Видалення непотрібних файлів",
|
||||
"updateEmu-4-4": "Оновлення завершено!",
|
||||
"settingsLogEmuSha": "ІНФО - Версія fpPS4: (%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "Добре",
|
||||
"dumpStatus_WARN": "Недостатньо файлів",
|
||||
"dumpStatus_HB": "",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "Немає доступного списку робочих процесів",
|
||||
"Sdl2NotFound": "SDL2.dll не знайдено в папці Emu, будь ласка встановіть його щоб використовувати SDL2.",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "Пошук: Назва гри...", "value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "Зелений: Всі файли присутні\nЖовтий: Деякі файли відсутні - дивіться лог для більш детальної інформації\nГолубий: Виконавчий файл представляє собою файл .elf",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "Налаштування",
|
||||
"DIV_SETTINGS_LANGUAGE": "Мова",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "Поточна мова",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "Перезапустіть лаунчер щоб налаштування вступили в силу.",
|
||||
"DIV_SETTINGS_PATHS": "Шляхи",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "До папки з додатками / іграми",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "До папки з емулятором (fpPS4)",
|
||||
"DIV_SETTINGS_GAME_LIST": "Макет",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(Сітка) Радіус границі значків",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "Режим пошуку",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "Розмиття фону",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "Прозорість фону",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "Ввімкнути точний пошук (з урахуванням регістра)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "Показати фон для кожної гри у списку",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "Показати інформацію (або шлях до папки) для кожної гри у списку",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "Виконується емуляція",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "Розмиття фону",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "Прозорість фону",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "Показати інформацію про гру (або шлях до виконавчого файлу) під заголовком",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "Налаштування ведення логу",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "Запуск вікна логу",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "Натисніть любу клавішу для закриття після завершення роботи fpPS4",
|
||||
"DIV_SETTINGS_MISC": "Інші конфігурації",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "Ввімкнути підтримку файлів <code>PARAM.SFO</code> (Натисніть на \"Видалити всі ігрові налаштування\" та перезапустіть лаунчер, щоб налаштування вступили в силу)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "Видалити файли <code>Project.gp4</code> при завантаженні списку ігор",
|
||||
"LABEL_FPPS4_OPTIONS": "Налаштування <label class=\"LABEL_emuColor\">fp</label>PS4",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Стан дампу",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "Ввімкнути патчі",
|
||||
"LABEL_FPPS4_OPTIONS_OPTIONS_MISC": "Інші Опції",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "Оберіть режим геймпаду:",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "Версія",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "Тип",
|
||||
"LABEL_EMU_RUNNING_STATUS": "Статус",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "Версія",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "Параметри запуску",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Хаки",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "Показувати іконку / ім'я коли fpPS4 виконується",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">ЕКСПЕРИМЕНТАЛЬНО</label> Логи процесу виводу fpPS4 (<code>stdout</code> та <code>stderr</code>) в внутрішньому лозі (Натиснути F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "Автооновлення fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "Ввімкнути автооновлення fpPS4",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "Шукати оновлення з гілки",
|
||||
"DIV_SETTINGS_GENERAL": "Головне",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "Розмір інтерфейсу: ",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "Увага: Не рекомендується зміняти цей параметр якщо розмір екрану менше ніж <code>1920x1080</code>",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "Статус",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "Запустити fpPS4 в повноекранному режимі",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "Ім'я",
|
||||
"titleId": "Код гри"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "Нормальне",
|
||||
"max": "Розгорнуте",
|
||||
"min": "Згорнуте"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "XInput",
|
||||
"sdl2": "SDL2",
|
||||
"keyboard": "Клавіатура"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "Виберіть папку",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "Відкрити папку",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "Виберіть файл",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "Видалити всі ігрові налаштування",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "Застосувати та закрити",
|
||||
"BTN_SETTINGS_CLOSE": "Назад",
|
||||
"BTN_REFRESH": "Оновити список ігор",
|
||||
"BTN_SETTINGS": "Налаштування",
|
||||
"BTN_CLEAR_LOG": "Очистити лог",
|
||||
"BTN_ABOUT": "Про програму",
|
||||
"BTN_KILL": "Зупинити fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "Виберіть патч",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "Папка додатку / гри",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "Скидання налаштувань",
|
||||
"BTN_launcherOptionsExportMetadata": "Експорт метаданих",
|
||||
"BTN_RUN": "Запустити",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "Перезапустити лаунчер",
|
||||
"BTN_UPDATE_FPPS4": "Оновити fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "Оновити fpPS4 примусово"
|
||||
|
||||
}
|
||||
}
|
184
Lang/zh-s.json
Normal file
|
@ -0,0 +1,184 @@
|
|||
{
|
||||
|
||||
"lang": "简体中文 (ZH-S)",
|
||||
|
||||
"variables": {
|
||||
"labelEnableHack": "启用",
|
||||
"emuStatusRunning": "模拟器运行中",
|
||||
"logWindowTitle": "Running fpPS4",
|
||||
"killEmuStatus": "主进程被关闭 - 关闭日志窗口以继续",
|
||||
"logCleared": "INFO - 日志已被清除!",
|
||||
"about": "fpPS4 Temmie's Launcher - 版本:%VARIABLE_0%\n\n由 TheMitoSan 创建\n(https://twitter.com/themitosan)\n\nfpPS4 由 red-prig 创建\n(https://github.com/red-prig/fpPS4)\n\n插件 memoryjs 由 Rob-- 创建\n(https://github.com/rob--/memoryjs)\n\n插件 node-stream-zip 由 antelle 创建\n(https://github.com/antelle/node-stream-zip)\n\nSVG 图标来自 https://www.svgrepo.com/",
|
||||
"mainLog": "fpPS4 Temmie's Launcher - 版本: %VARIABLE_0%\n运行中的 nw.js (node-webkit) 版本: %VARIABLE_1% [%VARIABLE_2%]",
|
||||
"settingsErrorCreatePath": "ERROR - 无法创建文件夹!\n(%VARIABLE_0%)\n%VARIABLE_1%",
|
||||
"settingsErrorfpPS4NotFound": "ERROR - 无法找到 fpPS4 的可执行文件!\n在设置中选择可执行文件或将其放在 \"Emu\" 文件夹中,然后点击确定。",
|
||||
"settingsConfirmRemoveAllGameSettings": "WARNING - 即将删除游戏列表中所有的游戏设置。\n\n确定要继续吗?",
|
||||
"settingsConfirmRemoveGameSettings": "WARNING - 即将删除 %VARIABLE_0% 的游戏设置\n\n确定要继续吗?",
|
||||
"settingsRemovedGameSettings": "INFO - (%VARIABLE_0%) 的设置文件已被成功删除!",
|
||||
"settingsRemoveGameSettingsError": "ERROR - 无法删除 (%VARIABLE_0%) 的设置文件!\n原因: %VARIABLE_1%",
|
||||
"settingsRemoveGameSettings404": "WARNING - 无法找到 (%VARIABLE_0%) 的设置文件!",
|
||||
"infoProcessComplete": "INFO - 进程已完成!\n\n更多详情见日志",
|
||||
"infoSettingsUpdated": "INFO - 设置文件已成功更新!",
|
||||
"settingsLoadError": "ERROR - 无法加载设置!\n %VARIABLE_0%",
|
||||
"settingsSaveError": "ERROR - 无法保存设置!\n %VARIABLE_0%",
|
||||
"runEmuArgs": "INFO - fpPS4 启动选项: %VARIABLE_0%\n可执行文件路径: %VARIABLE_1%",
|
||||
"closeEmuStatus": "INFO - %VARIABLE_0% 被关闭,退出代码为 %VARIABLE_1%",
|
||||
"removedLibModules": "INFO - 以前所有导入的模块都已被删除,因为它们可能会有兼容性问题。",
|
||||
"removeLibModule": "INFO - (%VARIABLE_0%) 移除模块: %VARIABLE_1%",
|
||||
"removeModuleError": "ERROR - 无法删除该模块!\n原因: %VARIABLE_0%",
|
||||
"updateGameSettings": "INFO - (%VARIABLE_0%) 的设置文件已被成功更新!",
|
||||
"updateGameSettingsError": "ERROR - 无法在 %VARIABLE_1% 中更新 %VARIABLE_0% 的设置文件!\n原因: %VARIABLE_2%",
|
||||
"skipUpdateGameSettings": "INFO - (%VARIABLE_0%) 跳过更新设置文件,因为它没有任何变化!",
|
||||
"errorSaveFile": "ERROR - 无法保存文件!\n原因: %VARIABLE_0%",
|
||||
"saveSucessfullPath": "INFO - 保存成功!\n路径: %VARIABLE_0%",
|
||||
"createdSettingsFile": "INFO - 成功保存 (%VARIABLE_0%) 的设置文件",
|
||||
"errorCreateSettingsFile": "ERROR - 无法在 %VARIABLE_1% 中保存 %VARIABLE_0% 的设置文件!\n原因: %VARIABLE_2%",
|
||||
"patchLoadedSucessfully": "INFO - 成功加载补丁!\n标题: %VARIABLE_0%\n类型: %VARIABLE_1%",
|
||||
"patchLoadErrorMismatch": "ERROR - 这不是补丁 - 或者选择的补丁与当前游戏不匹配!\n补丁ID:%VARIABLE_0%\n当前应用/游戏ID:%VARIABLE_1%",
|
||||
"patchLoadErrorParamSfo404": "ERROR - 没有在这个补丁中找到 PARAM.SFO!",
|
||||
"gameListLoadWarnPlayGo": "WARNING - 在 %VARIABLE_0% 中无法找到 playgo-chunk.dat!\n如果这不是一个自制软件,请检查这个应用/游戏是否被正确地 Dump。",
|
||||
"gameListLoadWarnParamSfo": "WARNING - 在 %VARIABLE_0% 中无法找到 PARAM.SFO!\n如果这不是一个自制软件,请检查这个应用/游戏是否被正确地 Dump。",
|
||||
"gameListDoubleIdError": "WARNING - 无法添加 %VARIABLE_0% 到游戏列表中,因为存在相同游戏ID的应用/游戏!(%VARIABLE_1%)",
|
||||
"gameListNoGameFound": "INFO - 在当前文件夹中没有找到应用/游戏 (%VARIABLE_0%)",
|
||||
"gameListSearch404": "没有找到",
|
||||
"checkDumpPlayGoOnApp": "INFO - 在 (%VARIABLE_0%) 的 sce_sys/app 中发现了 playgo-chunk.dat - 它将被复制到 sce_sys",
|
||||
"gameListLoadSuccessful": "INFO - 游戏列表已成功加载!(%VARIABLE_0% 项已被发现)",
|
||||
"gameListVersion": "版本号",
|
||||
"selectGameLoadPatchErrorParamSfo": "ERROR - 无法从这个补丁中加载 PARAM.SFO!\n%VARIABLE_0%",
|
||||
"path": "路径",
|
||||
"gamelistGamePath404": "ERROR - 没有找到已选择的应用/游戏路径!\n%VARIABLE_0%",
|
||||
"updateEmuFetchActionsError": "ERROR - 无法获取 GitHub actions 数据!",
|
||||
"updateEmuIsLatestVersion": "INFO - fpPS4 已经是最新的版本!\nCommit ID (SHA): %VARIABLE_0%",
|
||||
"updateEmuShaAvailable": "INFO - 检测到新的更新!\n\n本地版本: %VARIABLE_0%\n新版本: %VARIABLE_1%\n\n你想要更新吗?",
|
||||
"updateEmuShaUnavailable": "INFO - 启动器检测到您尚未更新 fpPS4 (或者没有发现 fpPS4 可执行文件)\n\n你可以使用 fpPS4 更新程序进行修复。\n你想要执行更新程序吗?",
|
||||
"updateEmuDownloadFailed": "ERROR - 无法下载 fpPS4 更新!\nResponse status: %VARIABLE_0% - OK: %VARIABLE_1%",
|
||||
"updateEmuProcessComplete": "INFO - 更新成功!\n新的 fpPS4 版本 (commit id / sha): %VARIABLE_0%",
|
||||
"updateEmu-1-4": "正在下载 fpPS4 更新 (<label class=\"LABEL_monospace\">%VARIABLE_0%</label>)",
|
||||
"updateEmu-2-4": "提取更新",
|
||||
"updateEmu-3-4": "删除多余文件",
|
||||
"updateEmu-4-4": "更新成功!",
|
||||
"settingsLogEmuSha": "INFO - fpPS4 版本:(%VARIABLE_0%)",
|
||||
"dumpStatus_OK": "完成",
|
||||
"dumpStatus_WARN": "文件缺失",
|
||||
"dumpStatus_HB": "自制",
|
||||
"updateEmuWorkflow404": "",
|
||||
"updater_noWorkflowListAvailable": "Workflow 列表无法读取",
|
||||
"Sdl2NotFound": "模拟器文件夹中未发现 SDL2.dll , 请安装并使用 SDL2",
|
||||
"errorListUnableLocateGamePath": "",
|
||||
"updateEmuSettingsWorkflow404": "",
|
||||
"nonWindowsOsWarn": "",
|
||||
"cGameCompatStatus_BOOTS": "",
|
||||
"cGameCompatStatus_MENUS": "",
|
||||
"cGameCompatStatus_INGAME": "",
|
||||
"cGameCompatStatus_UNKNOWN": "",
|
||||
"cGameCompatStatus_NOTHING": "",
|
||||
"cGameCompatStatus_PLAYABLE": "",
|
||||
"warnUnableFindGameCompatDb": "",
|
||||
"warnUserOffline": ""
|
||||
},
|
||||
|
||||
"input_text": {
|
||||
"INPUT_gameListSearch": {"placeholder": "搜索: 游戏标题...","value": ""}
|
||||
},
|
||||
|
||||
"title": {
|
||||
"DIV_selectedGameStatus_dump": "绿色: 所有的文件都存在\n黄色: 缺失一些文件 - 更多细节请查看日志\n青色: 可执行文件是一个 .elf 文件",
|
||||
"DIV_selectedGameStatus_compat": ""
|
||||
},
|
||||
|
||||
"innerHTML": {
|
||||
|
||||
"DIV_SETTINGS_TITLE": "启动器设置",
|
||||
"DIV_SETTINGS_LANGUAGE": "语言",
|
||||
"LABEL_SETTINGS_CURRENT_LANGUAGE": "当前语言",
|
||||
"LABEL_SETTINGS_LANGUAGE_RESTART": "你需要重新启动启动器以生效",
|
||||
"DIV_SETTINGS_PATHS": "路径",
|
||||
"LABEL_SETTINGS_APP_GAMES_PATH": "应用/游戏路径",
|
||||
"LABEL_SETTINGS_FPPS4_PATH": "模拟器路径",
|
||||
"DIV_SETTINGS_GAME_LIST": "应用/游戏列表",
|
||||
"LABEL_SETTINGS_GRID_BORDER_RADIUS": "(网格) 图标圆角半径",
|
||||
"LABEL_SETTINGS_GAME_SEARCH_MODE": "搜索模式",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_BLUR": "背景模糊",
|
||||
"LABEL_SETTINGS_GAME_LIST_BACKGROUND_OPACITY": "背景不透明度",
|
||||
"LABEL_SETTINGS_GAME_LIST_SEARCH_CASE_SENSITIVE": "启用精确搜索 (区分大小写)",
|
||||
"LABEL_SETTINGS_GAME_LIST_NORMAL_SHOW_BG": "显示列表中每个游戏的背景",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GAME_ENTRY": "显示列表中每个游戏的元数据 (或可执行文件路径)",
|
||||
"DIV_SETTINGS_EMU_RUNNING": "模拟器运行中",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_BLUR": "背景模糊",
|
||||
"LABEL_SETTINGS_EMU_RUNNING_BACKGROUND_OPACITY": "背景不透明度",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_EMU_RUNNING": "在标题下方显示游戏的元数据 (或可执行文件路径)",
|
||||
"DIV_SETTINGS_LOG_OPTIONS": "日志选项",
|
||||
"LABEL_SETTINGS_LOG_START_WINDOW_STATE": "启动日志窗口",
|
||||
"LABEL_SETTINGS_PROMPT_KEY_FPPS4_CLOSES": "fpPS4 关闭后按任意键关闭",
|
||||
"DIV_SETTINGS_MISC": "其它",
|
||||
"LABEL_SETTINGS_ENABLE_PARAMSFO_SUPPORT": "启用 <code>PARAM.SFO</code> 文件支持 (点击 \"删除所有游戏设置\" 并重新启动启动器以生效)",
|
||||
"LABEL_SETTINGS_REMOVE_PROJECT_GP4_FILES": "在加载游戏列表时删除所有游戏的 <code>Project.gp4</code> 文件",
|
||||
"LABEL_FPPS4_OPTIONS": "<label class=\"LABEL_emuColor\">fp</label>PS4 选项",
|
||||
"LABEL_FPPS4_OPTIONS_DUMP_STATUS": "Dump 状态",
|
||||
"LABEL_FPPS4_OPTIONS_ENABLE_PATCHES": "启用游戏补丁",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": "选择控制器模式",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_VERSION": "版本号",
|
||||
"LABEL_FPPS4_OPTIONS_PATCH_TYPE": "类型",
|
||||
"LABEL_EMU_RUNNING_STATUS": "运行状态",
|
||||
"LABEL_FPPS4_OPTIONS_APP_VERSION": "版本号",
|
||||
"LABEL_FPPS4_OPTIONS_LAUNCHER_OPTIONS": "启动器选项",
|
||||
"LABEL_FPPS4_OPTIONS_HACKS": "Hacks",
|
||||
"LABEL_SETTINGS_SHOW_METADATA_GUI": "在界面上显示图标和标题",
|
||||
"LABEL_SETTINGS_EXPERIMENTAL_FPPS4_INTERNAL_LOG": "<label class=\"LABEL_settingsExperimental\">实验性功能</label> 在内部控制台显示 fpPS4 进程日志 (<code>stdout</code> 和 <code>stderr</code>) (按 F12 --> Console)",
|
||||
"DIV_SETTINGS_FPPS4_UPDATER": "fpPS4 更新程序",
|
||||
"LABEL_SETTINGS_ENABLE_LAUNCHER_FPPS4_UPDATES": "启用 fpPS4 更新程序",
|
||||
"LABEL_SETTINGS_FPPS4_UPDATE_BRANCH": "检测更新的分支",
|
||||
"LABEL_FPPS4_UPDATER_STATUS_LANG": "状态",
|
||||
"DIV_SETTINGS_GENERAL": "通用",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE": "界面缩放比例",
|
||||
"LABEL_SETTINGS_GUI_ZOOM_SCALE_INFO": "警告:如果你的屏幕分辨率低于 <code>1920x1080</code>,不建议更改这个设置。",
|
||||
"LABEL_SETTINGS_START_EMU_FULLSCREEN": "以全屏模式启动 fpPS4",
|
||||
"LABEL_SETTINGS_ENABLE_GAME_COMPAT_CHECK": "",
|
||||
"LABEL_SETTINGS_GAMEPAD_LED_COLOR": "",
|
||||
"LABEL_FPPS4_OPTIONS_SELECT_GAMEPAD_LED_COLOR": ""
|
||||
|
||||
},
|
||||
|
||||
"select": {
|
||||
|
||||
"SELECT_settingsSearchMode": {
|
||||
"appName": "标题",
|
||||
"titleId": "游戏ID"
|
||||
},
|
||||
"SELECT_settingsStartExternalWindow": {
|
||||
"normal": "常规窗口",
|
||||
"max": "最大化",
|
||||
"min": "最小化"
|
||||
},
|
||||
"FPPS4_OPTIONS_SELECT_GAMEPAD_MODE": {
|
||||
"xinput": "xinput",
|
||||
"sdl2": "sdl2",
|
||||
"keyboard": "Keyboard"
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"value": {
|
||||
|
||||
"BTN_SETTINGS_SELECT_APPS_GAMES_PATH": "选择路径",
|
||||
"BTN_SETTINGS_OPEN_APPS_GAMES_PATH": "打开路径",
|
||||
"BTN_SETTINGS_SELECT_FPPS4_PATH": "选择文件",
|
||||
"BTN_SETTINGS_DELETE_ALL_GAME_SETTINGS": "删除所有游戏设置",
|
||||
"BTN_SETTINGS_APPLY_CLOSE": "应用并关闭",
|
||||
"BTN_SETTINGS_CLOSE": "关闭",
|
||||
"BTN_REFRESH": "刷新列表",
|
||||
"BTN_SETTINGS": "设置",
|
||||
"BTN_CLEAR_LOG": "清除日志",
|
||||
"BTN_ABOUT": "关于",
|
||||
"BTN_KILL": "关闭 fpPS4",
|
||||
"BTN_FPPS4_OPTIONS_SELECT_PATCH_LOCATION": "选择补丁位置",
|
||||
"BTN_FPPS4_OPTIONS_OPEN_APP_LOCATION": "打开应用/游戏位置",
|
||||
"BTN_FPPS4_OPTIONS_RESET_SETTINGS": "重置设置",
|
||||
"BTN_launcherOptionsExportMetadata": "导出元数据",
|
||||
"BTN_RUN": "运行 fpPS4",
|
||||
"BTN_SETTINGS_RESTART_LAUNCHER": "重新启动启动器",
|
||||
"BTN_UPDATE_FPPS4": "更新 fpPS4",
|
||||
"BTN_SETTINGS_FORCE_FPPS4_UPDATE": "强制更新 fpPS4"
|
||||
|
||||
}
|
||||
}
|
0
Nwjs/.gitkeep
Normal file
82
README.md
|
@ -1,22 +1,76 @@
|
|||
# fpPS4 Temmie's Launcher
|
||||
A simple launcher for <a href="https://github.com/red-prig/fpPS4/">fpPS4 project</a> - created just for fun.
|
||||
<h1 align="center">
|
||||
<img src="App/img/logo.png" width="140" alt="fpPS4_TL_Logo"><br>
|
||||
fpPS4 Temmie's Launcher
|
||||
</h1>
|
||||
|
||||
Created by [TheMitoSan](https://github.com/themitosan) <sup>_(Previously known as **Temmie**Heartz)_</sup>, This is a simple launcher created for [fpPS4](https://github.com/red-prig/fpPS4) compatibility layer.
|
||||
|
||||
<p align="center">
|
||||
<img src="https://pbs.twimg.com/media/Fkt3QiDXgAAoPTy?format=jpg&name=large" width="800">
|
||||
</p>
|
||||
<img src="App/img/banner.jpg" width="750">
|
||||
</p><br>
|
||||
|
||||
## How to install
|
||||
- Download / Clone this repo
|
||||
- Download <a href="https://dl.nwjs.io/v0.70.1/nwjs-v0.70.1-win-x64.zip">nw.js</a> version <code>0.70.1</code>
|
||||
- Extract all files from nw where <code>package.json</code> is located
|
||||
- Run <code>nw.exe</code>
|
||||
- Insert <code>fpPS4.exe</code> inside <code>Emu</code> folder
|
||||
|
||||
### How to import games / apps
|
||||
If you dump your game using <a href="https://cdn.discordapp.com/attachments/1055964700602544169/1055965069986517032/How_to_Setup_fpPs4_emulator.pdf">addy</a> tutorial, it should display on game list just fine.
|
||||
### Windows
|
||||
|
||||
#### Stable Version
|
||||
|
||||
- Download latest release _(you can get it [here](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/releases))_
|
||||
- Extract all files on your desired location
|
||||
- Run `launcher.exe`
|
||||
|
||||
#### Latest Features (recommended)
|
||||
|
||||
- [Download / Clone this repo](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/archive/refs/heads/main.zip)
|
||||
- Download [nw.js](https://dl.nwjs.io/v0.70.1/nwjs-sdk-v0.70.1-win-x64.zip) version `0.70.1`
|
||||
- Extract all files from `nw` on `Nwjs` folder
|
||||
- Run `launcher.bat`
|
||||
|
||||
### Linux
|
||||
> [!WARNING]\
|
||||
> Running fpPS4 / Launcher on a Non-Windows OS <u>**isn't the best way / recommended to test / use this software!**</u> The main compatibility layer is being developed to <u>**run only on Windows**</u>. In order to run fpPS4, you will need [Wine](https://www.winehq.org) installed - <ins>but be aware that it may result in **less performance with bugs / glitches**</ins>.
|
||||
|
||||
[Click here to know how to install Wine](https://wiki.winehq.org/Download)
|
||||
|
||||
#### Release Version
|
||||
|
||||
- Download latest release _(you can get it [here](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/releases))_
|
||||
- Extract all files on your desired location
|
||||
- Run `chmod +x launcher.sh && ./launcher.sh`
|
||||
|
||||
#### Installer Method (recomended)
|
||||
|
||||
> [!IMPORTANT]\
|
||||
> Make sure to have `curl`, `tar` and `unzip` packages installed on your system!
|
||||
- [Download / Clone this repo](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/archive/refs/heads/main.zip)
|
||||
- To run installer script, run `chmod +x install.sh && ./install.sh`
|
||||
|
||||
### Manual Installation
|
||||
|
||||
- [Download / Clone this repo](https://github.com/themitosan/fpPS4-Temmie-s-Launcher/archive/refs/heads/main.zip)
|
||||
- Download latest [nw.js](https://nwjs.io/) version
|
||||
- Extract all files from `nw` on `Nwjs` folder
|
||||
- Open terminal on main project path and run `chmod +x ./launcher.sh`
|
||||
|
||||
In order to start, run `./launcher.sh`
|
||||
|
||||
## General Tips
|
||||
|
||||
- You can add `launcher.sh` as a *non-steam game* in your **Steam**!
|
||||
- You can hide a specific title to show on list by appending `!` before folder name _(Example: `!Apollo Save Tool`)_
|
||||
- If you want to update launcher and have `git` installed, run these commands below:
|
||||
|
||||
```
|
||||
git reset --hard
|
||||
git pull origin main
|
||||
```
|
||||
|
||||
### How to import your dumps
|
||||
You can see all required procedures on main [fpPS4 discord server](https://discord.gg/up9qatpX7M).
|
||||
|
||||
## External plugins used on this project
|
||||
- <a href="https://github.com/rob--/memoryjs">memoryjs</a> - created by <a href="https://github.com/rob--">Rob-- </a>
|
||||
- <a href="https://github.com/themitosan/TMS.js">TMS.js</a> by <a href="https://github.com/themitosan/">TemmieHeartz</a> <sup><i>(hi!)</i></sup>
|
||||
- [memoryjs](https://github.com/rob--/memoryjs) - created by [Rob--](https://github.com/rob--)
|
||||
- [node-stream-zip](https://github.com/antelle/node-stream-zip) - created by [antelle](https://github.com/antelle)
|
||||
- [TMS.js](https://github.com/themitosan/TMS.js) by [TheMitoSan](https://github.com/themitosan) <sup>*(Hi!)*</sup>
|
||||
|
||||
<u><i><b>IMPORTANT</b>: This software does not allow you to obtain free PS4 Games / Apps.</i></u>
|
||||
_**IMPORTANT**: This software does not allow you to obtain free PS4 Games / Apps._
|
||||
|
|
131
install.sh
Executable file
|
@ -0,0 +1,131 @@
|
|||
#########################################################################
|
||||
### === Variables ===
|
||||
#########################################################################
|
||||
|
||||
# NW.js Version
|
||||
NWJS_VER="0.92.0"
|
||||
|
||||
# SDL Version
|
||||
SDL_VER="2.30.7"
|
||||
|
||||
# Files / dirs to be removed
|
||||
REM_FILES_DIR_LIST=(
|
||||
"sdl2"
|
||||
"sdl2.zip"
|
||||
"nwjs.tar.gz"
|
||||
"nwjs-sdk-v$NWJS_VER-linux-x64"
|
||||
)
|
||||
|
||||
|
||||
#########################################################################
|
||||
### === Functions ===
|
||||
#########################################################################
|
||||
|
||||
# Remove files and dirs
|
||||
removeFilesDirs(){
|
||||
|
||||
# Process remove list
|
||||
for entry in "${REM_FILES_DIR_LIST[@]}"
|
||||
do
|
||||
|
||||
# Check if file / dir exists. If so, remove it.
|
||||
if [ -f $entry ]; then
|
||||
echo -e "Removing $entry"
|
||||
rm "$entry"
|
||||
fi
|
||||
if [ -d $entry ]; then
|
||||
echo -e "Removing $entry"
|
||||
rm -rf "$entry"
|
||||
fi
|
||||
|
||||
done
|
||||
|
||||
}
|
||||
|
||||
#########################################################################
|
||||
### === Main Script ===
|
||||
#########################################################################
|
||||
|
||||
clear
|
||||
echo
|
||||
echo " #=============================================================#"
|
||||
echo
|
||||
echo " fpPS4 Temmie's Launcher - Install Script"
|
||||
echo " Written by @themitosan"
|
||||
echo
|
||||
echo " IMPORTANT: This script requires internet connection and"
|
||||
echo " curl, tar and unzip packages installed to work!"
|
||||
echo
|
||||
echo " #=============================================================#"
|
||||
|
||||
echo
|
||||
echo "=== Removing possible leftover files / folders"
|
||||
removeFilesDirs
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Downloading nw.js (Ver. $NWJS_VER)"
|
||||
curl https://dl.nwjs.io/v$NWJS_VER/nwjs-sdk-v$NWJS_VER-linux-x64.tar.gz -o nwjs.tar.gz
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Downloading SDL2 (Ver. $SDL_VER)"
|
||||
curl -L https://github.com/libsdl-org/SDL/releases/download/release-$SDL_VER/SDL2-$SDL_VER-win32-x64.zip -o sdl2.zip
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Extracting nw.js"
|
||||
tar -xvzf nwjs.tar.gz
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Extracting SDL2"
|
||||
unzip -d sdl2 sdl2.zip
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Prepare nw.js folder"
|
||||
cd Nwjs
|
||||
rm -rf *
|
||||
echo "" > .gitkeep
|
||||
cd ..
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Checking if Emu folder exists"
|
||||
if ! [ -d Emu ]; then
|
||||
echo "Creating Emu dir..."
|
||||
mkdir Emu
|
||||
fi
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Moving files"
|
||||
mv -f nwjs-sdk-v$NWJS_VER-linux-x64/* Nwjs/
|
||||
mv -f sdl2/SDL2.dll Emu/
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Removing leftover files / folders"
|
||||
removeFilesDirs
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo "=== Updating permissions for running / updating launcher (chmod)"
|
||||
chmod +x launcher.sh
|
||||
chmod +x update.sh
|
||||
chmod +x Nwjs/nw
|
||||
echo Done!
|
||||
|
||||
echo
|
||||
echo -e "\033[1;32m==== Process Complete! ====\033[0m"
|
||||
echo '---> In order to start Launcher, run "./launcher.sh"'
|
||||
echo '---> To update, run "./update.sh"'
|
||||
echo
|
||||
echo 'TIP: You can add "launcher.sh" as a non-steam game on your Steam!'
|
||||
echo
|
||||
echo Also - You will need wine to run fpPS4 on non-windows systems!
|
||||
echo The installation process may change depending of which distro you are running.
|
||||
echo
|
||||
read -p "Press [ENTER] to exit"
|
||||
clear
|
5
launcher.bat
Normal file
|
@ -0,0 +1,5 @@
|
|||
@echo off
|
||||
color a
|
||||
title Running fpPS4 Temmie's Launcher - Please wait...
|
||||
echo Running fpPS4 Temmie's Launcher - Please wait...
|
||||
start /b Nwjs\nw .
|
6
launcher.sh
Executable file
|
@ -0,0 +1,6 @@
|
|||
stty -echo
|
||||
clear
|
||||
echo "Running fpPS4 Temmie's Launcher - Please Wait..."
|
||||
./Nwjs/nw .
|
||||
stty echo
|
||||
exit
|
22
package.json
|
@ -1,25 +1,29 @@
|
|||
{
|
||||
"version": "1.2.1",
|
||||
"version": "1.2.4",
|
||||
"license": "GPL-2",
|
||||
"author": "TheMitoSan",
|
||||
"main": "App/index.htm",
|
||||
"author": "TemmieHeartz",
|
||||
"name": "fpPS4 Temmie's Launcher",
|
||||
"chromium-args": "--disable-raf-throttling",
|
||||
"description": "A simple launcher for fpPS4 project",
|
||||
"repository": "https://github.com/themitosan/fpPS4-Temmie-s-Launcher",
|
||||
"window": {
|
||||
"frame": true,
|
||||
"width": 1186,
|
||||
"height": 710,
|
||||
"toolbar": true,
|
||||
"min_width": 1062,
|
||||
"min_height": 626,
|
||||
"min_width": 1102,
|
||||
"min_height": 680,
|
||||
"fullscreen": false,
|
||||
"position": "center",
|
||||
"theme-color": "#000",
|
||||
"theme-color": "#002",
|
||||
"icon": "App/img/logo.png",
|
||||
"title": "fpPS4 Temmie's Launcher"
|
||||
"title": "fpPS4 Temmie's Launcher - Please wait..."
|
||||
},
|
||||
"webkit": {
|
||||
"plugin": true
|
||||
"bugs": {
|
||||
"url": "https://github.com/themitosan/fpPS4-Temmie-s-Launcher/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/themitosan/fpPS4-Temmie-s-Launcher.git"
|
||||
}
|
||||
}
|
11
update.bat
Normal file
|
@ -0,0 +1,11 @@
|
|||
@echo off
|
||||
cls
|
||||
title Updating fpPS4 Temmie's Launcher - Please Wait...
|
||||
echo.
|
||||
echo Updating fpPS4 Temmie's Launcher - Please wait
|
||||
echo IMPORTANT: Make sure to have Git installed on your OS!
|
||||
echo.
|
||||
git reset --hard
|
||||
git pull
|
||||
pause
|
||||
exit
|
10
update.sh
Executable file
|
@ -0,0 +1,10 @@
|
|||
stty -echo
|
||||
clear
|
||||
echo
|
||||
echo "Updating fpPS4 Temmie's Launcher - Please Wait..."
|
||||
echo "IMPORTANT: Make sure to have git installed on your OS / Distro!"
|
||||
echo
|
||||
git reset --hard
|
||||
git pull
|
||||
stty echo
|
||||
exit
|