Compare commits

...

257 commits
1.2.1 ... main

Author SHA1 Message Date
TheMitoSan
cc971d1c4e
Merge pull request #63 from MrSn0wy/main
Added support for the new fpps4 database
2024-12-19 15:04:47 -03:00
MrSnowy
d46ecf6698
Grammer fixes and such 2024-12-19 14:52:41 +01:00
MrSnowy
0db5786ce2
Added support for the new fpps4.net database. Also fixed the double fetching of the fpps4.net database. 2024-12-19 14:37:33 +01:00
themitosan
9b40391806 Linux: update nw version 2024-09-27 00:46:24 -03:00
themitosan
485df7659d Project: update install.sh 2024-09-02 10:54:24 -03:00
themitosan
0d62a6a599 Readme: hotfix 2024-08-01 12:48:24 -03:00
themitosan
3f72a3e16f Update README.md 2024-07-31 13:29:47 -03:00
themitosan
2f8cf79c69 Linux: Update nwjs and sdl versions on installer + small / misc. changes 2024-07-31 13:22:38 -03:00
TheMitoSan
f3738d95d0
Update README.md 2024-07-27 09:56:19 -03:00
TheMitoSan
442fb2f923
Update README.md
Fix some stuff and make it more pretty 💜
2024-07-27 09:52:54 -03:00
TheMitoSan
61ce91350b
Merge pull request #61 from Mizmalik/patch-12
Update fr-fr.json
2024-06-08 05:49:01 -03:00
Mizmalik
feb4ac828d
Update fr-fr.json
little changement
2024-06-08 10:06:49 +02:00
TheMitoSan
920b8ac36d
Update linux installer info 2024-04-25 22:10:10 -03:00
themitosan
c283152667 Install: update data 2024-04-25 22:03:01 -03:00
TheMitoSan
9ddc684bac
Merge pull request #60 from Mizmalik/patch-11
Update fr-fr.json
2024-04-21 16:46:54 +00:00
Mizmalik
5c8864878a
Update fr-fr.json 2024-04-21 11:08:47 +02:00
TheMitoSan
47ae19ff6e
Include linux release on README.md 2024-04-12 22:35:14 -03:00
TheMitoSan
9320fdf6fc
Update README.md 2024-04-12 17:03:35 -03:00
themitosan
6344e02458 Readme: Reorganize some stuff, Linux: misc. changes on installer 2024-04-12 16:53:57 -03:00
themitosan
bd1903656f Linux: reset .gitkeep file 2024-04-12 16:39:37 -03:00
themitosan
1b35fbd15b Linux: small hotfix 2024-04-12 16:37:51 -03:00
themitosan
722a1a204a Linux: fix install.sh 2024-04-12 16:32:15 -03:00
themitosan
3b20d34062 Linux: Add install script 2024-04-12 15:33:13 -03:00
themitosan
0c92ad070a Updater: small hotfix 2024-04-05 19:39:13 -03:00
themitosan
c1497d31a5 Update: Include updater scripts for launcher (Requires git) 2024-04-05 19:36:09 -03:00
themitosan
a65f173a20 Lang: update pt-br SDL string 2024-04-02 17:42:14 -03:00
themitosan
f7c1f6e9e4 Project: restore nwjs folder 2024-03-11 16:42:30 -03:00
TheMitoSan
9e7edaec23
Merge pull request #59 from MrSn0wy/main
Dutch translation update + smoll English fixes
2024-03-11 16:02:49 -03:00
MrSn0wy
d5f4632133 Update nl-nl.json 2024-03-11 17:18:02 +01:00
MrSn0wy
a43655e29f uh oh, typo 2024-03-11 17:14:23 +01:00
MrSn0wy
380845114d Dutch translation update + smoll English fixes
Updated the translations for Dutch and edited some of the English lines.
2024-03-11 17:13:36 +01:00
themitosan
4e35897fb9 GUI: Small hotfix, Project: Remove old nw.exe 2024-03-08 21:39:24 -03:00
themitosan
6e1320f1ce Code: cleaning stuff 2024-03-06 21:49:04 -03:00
themitosan
917f74fece GUI: Hide display icon mode when fpPS4 is running 2024-03-06 21:42:57 -03:00
themitosan
7157844bad General: Implement option to change gamepad color (requires SDL2), GUI: Slight adjust on game options width 2024-03-06 20:05:49 -03:00
themitosan
e11debd9c3 Lang: Merge french lang updates from Mizmalik 2024-02-27 19:44:50 -03:00
themitosan
f2e6b36119 Linux: fix launcher not checking updates on first boot after displaying non-windows warning 2024-02-27 19:32:13 -03:00
TheMitoSan
8867ea2b2f
Merge pull request #58 from Mizmalik/patch-10
Update fr-fr.json
2024-02-27 17:22:34 -03:00
Mizmalik
194d332fc1
Update fr-fr.json 2024-02-27 20:08:36 +01:00
themitosan
fdaa980f57 Linux: update run args 2024-02-27 10:45:17 -03:00
themitosan
0ce6ca518b CSS: Small tweak, Exec: fix missing quotes 2024-02-27 10:09:02 -03:00
themitosan
a6fd46fbb7 Game list: exclude title from list with by appending ! before name 2024-02-26 22:25:45 -03:00
themitosan
91ee094e60 GUI: Implement fpPS4 title compat check [WIP] 2024-02-26 22:04:39 -03:00
themitosan
4dd86ac4eb CSS: Minify svg files 2024-02-26 02:47:08 -03:00
themitosan
2188e6bedf Lang: Update strings, Settings: add option to disable game compat status check, GUI: Update display game mode icons 2024-02-26 02:43:40 -03:00
themitosan
846908da2d Project: Update package.json 2024-02-25 23:27:31 -03:00
themitosan
9ac9d3ea40 Code: small fixes 2024-02-25 23:21:12 -03:00
themitosan
597eac1be3 GUI: Display current game background behind whole GUI, Hide current compat status if user is offline 2024-02-25 21:37:58 -03:00
themitosan
f276b7dd85 Game list: Implement basic fpPS4 compat check, Main: Disable fpPS4 updater if current user is offline 2024-02-25 21:19:52 -03:00
TheMitoSan
d90be16d52
Update README.md 2024-02-25 16:54:45 -03:00
TheMitoSan
0f040850ba
Update README.md 2024-02-25 16:52:58 -03:00
themitosan
64deb252fd Project: Update project banner and remove unused image 2024-02-25 16:51:54 -03:00
TheMitoSan
e3fbf1c438
Update icon size on readme 2024-02-25 16:46:11 -03:00
TheMitoSan
b26fa14f4a
Update README.md 2024-02-25 16:45:28 -03:00
themitosan
b75b544496 Updater: fix updater after being offline, CSS: small fix 2024-02-25 16:39:43 -03:00
themitosan
979dc2a1c1 Updater: add functions to handle error messages, Windows: fix run game function, linux: disable pause after closing fpPS4 2024-02-25 16:27:44 -03:00
themitosan
54ca9ae320 Resolve merge conflicts 2024-02-25 16:02:37 -03:00
themitosan
447f84b98d Project: update readme and some minor CSS tweaks 2024-02-25 15:47:10 -03:00
themitosan
ddba3b426b GUI: Fix BG size after running a title 2024-02-25 02:32:31 -03:00
themitosan
28fa04cea3 GUI: Make top bar translucid 2024-02-24 16:26:53 -03:00
themitosan
2093642ed8 Project: Update readme and fix more stuff on non-windows os 2024-02-24 15:27:18 -03:00
themitosan
140cb016f6 Project: Fix some stuff for non-windows os 2024-02-24 14:03:53 -03:00
themitosan
09ff11fb12 Project: add WIP code to run fpPS4 on linux 2024-02-23 22:57:38 -03:00
themitosan
84e23ca517 Settings / Lang: Include message for non-windows OS 2024-02-23 22:15:50 -03:00
themitosan
83536678b1 Project: Preparations to add linux support 2024-02-23 21:46:01 -03:00
themitosan
cd2464fa00 Project: bump version to 1.2.4, Updater: fix launcher not being able to check for updates on first boot, Settings: Update default value for fpPS4 workflow, GUI: Updated general animations 2024-02-15 15:20:06 -03:00
themitosan
180352a297 Project: update about-translations.md 2024-02-11 16:18:54 -03:00
TheMitoSan
757b0b652b
Merge pull request #57 from phyesix/main
feat(language): 🇹🇷 add Turkish language
2024-02-11 16:17:28 -03:00
Ibrahim Nergiz
92586714e2
feat(language): 🇹🇷 add Turkish language 2024-02-11 22:06:11 +03:00
themitosan
5e3bcbfa61 Misc: Update .gitignore 2024-02-08 13:56:49 -03:00
themitosan
389793ce0c Project: update translation contributor list 2024-01-17 03:05:27 -03:00
TheMitoSan
db40fcaed9
Merge pull request #56 from Shrvzr/main
Create arabic translation
2024-01-17 03:02:10 -03:00
Shrvzr
3389e20ebf
Add files via upload 2024-01-17 07:52:46 +02:00
themitosan
dec3dde534 Code: string cleanup (don't expect changes) 2024-01-03 21:58:21 -03:00
themitosan
f01fae0e31 Code: small cleanup 2024-01-02 13:09:02 -03:00
TheMitoSan
375f8530ce
Merge pull request #54 from Mizmalik/patch-9
Update fr-fr.json
2024-01-01 13:11:11 -03:00
Mizmalik
755da33df9
Update fr-fr.json 2024-01-01 17:08:57 +01:00
themitosan
b10f466bc5 Gamelist: fix path check 2023-12-29 12:37:43 -03:00
themitosan
024a044f92 Game list: check game location before updating settings file, code: misc. tweaks 2023-12-27 09:09:50 -03:00
themitosan
b4aa5a9384 hotfix: Fix display window mode button (forEach) 2023-12-20 05:12:56 -03:00
TheMitoSan
3cd9b9b8c2
Merge pull request #53 from ArtemVideoGames/Updates
Updates for ru-ru.json and uk-ua.json
2023-11-22 12:59:40 -03:00
Artem
890c5b2dc8
Update uk-ua.json 2023-11-22 10:26:32 +03:00
Artem
1c4356a33b
Update ru-ru.json 2023-11-22 10:24:26 +03:00
themitosan
ce9a93dec5 Lang: add option to translate gamepad mode 2023-11-21 16:35:55 -03:00
TheMitoSan
de4c5587a5
Merge pull request #52 from ArtemVideoGames/Updates
Updates for ru-ru.json and uk-ua.json
2023-11-21 07:20:30 -03:00
TheMitoSan
fb408cfc1a
Merge pull request #51 from Mizmalik/patch-8
Update fr-fr.json
2023-11-21 07:18:10 -03:00
Artem
320ec6fdc4
Update ru-ru.json 2023-11-20 17:05:22 +03:00
Artem
ce2d253b31
Update uk-ua.json 2023-11-20 17:04:59 +03:00
Artem
4e5696f6d3
Update uk-ua.json 2023-11-20 16:52:18 +03:00
Mizmalik
c5bf39ea99
Update fr-fr.json 2023-11-19 11:53:11 +01:00
TheMitoSan
8ac6ce8741
Merge pull request #50 from ArtemVideoGames/Updates
Update ru-ru.json
2023-11-17 17:12:29 -03:00
Artem
746aecb36e
Revert changes of 'Fix registry of pad modes' 2023-11-17 19:34:11 +03:00
Artem
ea05e7ddcf
Revert changes of 'Fix registry of dropdown options' 2023-11-17 19:31:36 +03:00
Artem
2fb26e407e
Fix registry of pad modes 2023-11-17 19:13:19 +03:00
Artem
99441b6dd7
Fix registry of dropdown options 2023-11-17 19:03:38 +03:00
TheMitoSan
00cedc78fa
Merge pull request #48 from nini22P/main
Update zh-s.json
2023-11-17 12:24:22 -03:00
Artem
cca5680533
Update ru-ru.json 2023-11-17 17:47:44 +03:00
Artem
aafbb7cd49
Update ru-ru.json 2023-11-17 17:08:16 +03:00
22
ea9c6c32cd Update zh-s.json 2023-11-17 20:08:35 +08:00
themitosan
961332abec Game settings: Add proper option to select gamepad mode on game settings menu 2023-11-17 05:48:25 -03:00
TheMitoSan
74ef891ae6
Merge pull request #47 from ArtemVideoGames/main
Fast edit for keyboard input
2023-11-17 04:58:23 -03:00
Artem
490bfb8813
Merge pull request #1 from ArtemVideoGames/Updates
Fast edit for keyboard input
2023-11-17 10:53:55 +03:00
Artem
6ac6fce9b4
Fast edit for keyboard input 2023-11-17 10:43:48 +03:00
themitosan
32822ab2bc Lang: add missing SDL strings on lang files, add pt-br strings for enable SDL 2023-11-09 10:56:13 -03:00
TheMitoSan
3194c5c10b
Merge pull request #46 from MrSn0wy/main
Option to enable SDL2
2023-11-09 10:49:07 -03:00
Mr. Snowy
e87ac27e84 language support for SDL2 option and Dutch translation updated 2023-11-09 14:44:55 +01:00
Mr. Snowy
d0d4dfa33b SDL2 option 2023-11-08 22:39:45 +01:00
TheMitoSan
bba1a1ab48
Update README.md 2023-11-08 06:04:51 -03:00
TheMitoSan
9a96ec728f
Merge pull request #45 from Mizmalik/patch-7
Update fr-fr.json
2023-10-26 18:38:20 -03:00
Mizmalik
b0f3656e1a
Update fr-fr.json 2023-10-26 13:21:37 +02:00
themitosan
5f2c9efc9b Revert previous changes. Things are about to get interesting... 2023-09-25 14:41:16 -03:00
themitosan
5cd1e638cd Hotfix: fix display 2023-09-02 16:48:20 -03:00
themitosan
9eb167b9ab The halt update 2023-08-31 14:03:18 -03:00
TheMitoSan
b27076dcd9 Project: Update TMS.js, Include nw.exe with custom icon, Update author name 2023-06-06 15:33:21 -03:00
TemmieHeartz
ccf32a9125
Update README.md 2023-04-12 01:38:14 -03:00
TemmieHeartz
95538a76a2
Merge pull request #40 from Mizmalik/patch-6
Update fr-fr.json
2023-04-10 04:44:45 -03:00
Mizmalik
05768061e6
Update fr-fr.json 2023-04-09 11:53:12 +02:00
TemmieHeartz
1f45e77145 Update TMS.js 2023-04-03 14:06:49 -03:00
TemmieHeartz
fab2d4c91f
Merge pull request #37 from B8nee/main
ci update it language
2023-04-01 05:11:31 -07:00
Dan Adrian Radut
be280435c7
ci update 2023-04-01 09:28:37 +02:00
temmieheartz
63d598bb20 Updater: Implement option to selected workflow list 2023-03-27 16:42:54 -03:00
TemmieHeartz
7e8d8e815a
Fix updater [WIP]
This commit (and previous) are a small hotfix for fpPS4 updater, since "Main CI" was renamed to "CI".
2023-03-27 16:05:53 -03:00
TemmieHeartz
3b68b7e97a
Fix updater [ 2023-03-27 16:03:35 -03:00
TemmieHeartz
04da687e6b
Init: restore silent flag 2023-03-13 11:12:07 -03:00
TemmieHeartz
4b6b23f93b
Updater Fix silent flag 2023-03-13 11:10:59 -03:00
TemmieHeartz
bf17eac0a5
Updater: Remove silent flag on main.js 2023-03-13 11:08:52 -03:00
temmieheartz
39a597237a Game list: Launcher will not remove any .gp4 files from your game dumps, Settings: Removed option to enable / disable removing .gp4 files, Project: Updated package.json 2023-03-07 19:23:51 -03:00
TemmieHeartz
bbe0c8f477
Merge pull request #36 from nini22P/main
Update zh-s.json
2023-03-07 05:00:38 -03:00
22
fc18c854a5
Update zh-s.json 2023-03-06 12:39:35 +08:00
TemmieHeartz
297d2072e6
Merge pull request #35 from B8nee/main
Update Italian Lang
`(Lang/it-it.json)`
2023-03-02 19:45:01 -03:00
Dan Adrian Radut
a599858ece
update it 2023-03-02 23:08:23 +01:00
TemmieHeartz
20d84cf0b4 Settings: Bring back branch options 2023-02-20 13:51:20 -03:00
TemmieHeartz
5d85da5edd Updater: fpPS4 updater now will only get Main CI builds, Settings: remove fpPS4 updater branch option 2023-02-20 12:59:28 -03:00
TemmieHeartz
c0098e308c
Remove outdated info from readme 2023-02-19 21:50:26 -03:00
TemmieHeartz
656b4005ca Updater: fpPS4 updater now will seek for action with same sha from latest branch commit instead if getting latest branch action, Launcher.bat: Add title for command prompt window 2023-02-19 21:47:50 -03:00
TemmieHeartz
23a6643dcf
Merge pull request #34 from nini22P/main
Move NW.js path
Now all nwjs files must be placed on `Nwjs` folder.
2023-02-19 18:56:49 -03:00
22
16f2400c66
Lower case 2023-02-18 23:17:29 +08:00
22
ce2ae362f6 No command window will be displayed when running Launcher.bat 2023-02-18 19:55:41 +08:00
TemmieHeartz
8f92486f23
Update about-translations.md 2023-02-16 22:15:18 -03:00
TemmieHeartz
c734ff53d2
Merge pull request #33 from MrSn0wy/main
Translation dutch (nl-nl)
2023-02-16 22:13:41 -03:00
22
191facb122 Move NW.js path 2023-02-17 08:55:03 +08:00
Mr. Snowy
53bfd071c8
Add files via upload 2023-02-16 23:17:16 +01:00
TemmieHeartz
065f4bad5c
Update about-translations.md 2023-01-29 19:26:54 -03:00
TemmieHeartz
101b783ae3
Merge pull request #31 from ArtemVideoGames/Translate
Translation fixes
2023-01-29 14:25:17 -08:00
Artem
56c4b1de9e
Fixed small stroke errors in ru-ru.json 2023-01-29 10:55:36 +02:00
Artem
1cef9ab604
Fixed errors in uk-ua.json
Fixed incorrect strokes from ThatSameGuy
2023-01-29 10:39:04 +02:00
TemmieHeartz
07be57302c
Update about-translations.md 2023-01-28 17:35:00 -03:00
TemmieHeartz
50cb768941
Merge pull request #30 from ArtemVideoGames/Translate
Ukrainian translate
2023-01-28 12:31:21 -08:00
Artem
bc2288cb83
Update uk-ua.json 2023-01-28 20:24:20 +02:00
Artem
b6acfe51b4
Create uk-ua.json 2023-01-28 15:40:49 +02:00
TemmieHeartz
e1c1cccf90 Updater: Fix update conditions, Hacks: Include SKIP_UNKNOW_TILING, CSS: Adjust log padding - fixes bottom left / right corner being cut on Windows 11, Adjust "Stop fpPS4" button padding to match all other buttons 2023-01-26 15:37:05 -08:00
TemmieHeartz
32aa5fea39 Init: Make modules initialization more secure, CSS: Adjust menu buttons height - this fixes label rendering on japanese translation, Lang: Update about links, fix main developer name on ja-ja.json 2023-01-25 18:57:22 -03:00
TemmieHeartz
08b84b0d61 CSS: Fix rendering dump status in non-english languages 2023-01-24 20:15:33 -03:00
TemmieHeartz
7b70a2617b
Update about-translations.md 2023-01-24 20:07:56 -03:00
TemmieHeartz
aecf908249
Merge pull request #28 from mktm235/patch-1
Create ja-ja.json
2023-01-24 20:04:37 -03:00
TemmieHeartz
4769567c96
Update ja-ja.json 2023-01-24 20:04:27 -03:00
mktm235
23baec66b7
Create ja-ja.json
added
2023-01-25 07:34:31 +09:00
TemmieHeartz
d553077da5 Merge branch 'main' of https://github.com/temmieheartz/fpPS4-Temmie-s-Launcher 2023-01-24 05:19:57 -03:00
TemmieHeartz
b957b0b736 Plugin: Revert memoryjs update to first version (before 0a23e82) 2023-01-24 05:19:28 -03:00
TemmieHeartz
1208d609b5 Plugin: Revert memoryjs update to first version (before 41b49a1) 2023-01-24 05:17:42 -03:00
TemmieHeartz
e2d8955076 Misc: Remove log messsages 2023-01-24 04:55:18 -03:00
TemmieHeartz
a7d0362a55 Plugin: Update memoryjs 2023-01-24 04:54:15 -03:00
TemmieHeartz
fa4eb58d8a
Merge pull request #27 from B8nee/main
update it
2023-01-23 13:39:28 -03:00
TemmieHeartz
2f6913fa66
Merge pull request #26 from nini22P/main
Update zh-s.json
2023-01-23 13:39:05 -03:00
Dan Adrian Radut
3b53f9b5d8
update 2023-01-23 16:58:49 +01:00
22
bb63fcd61f Update zh-s.json 2023-01-23 20:01:22 +08:00
TemmieHeartz
1954ec3d26
Merge pull request #25 from ArtemVideoGames/patch-2
Update ru-ru.json
2023-01-22 17:29:32 -03:00
Artem
1969b8764d
Update ru-ru.json 2023-01-22 22:19:36 +02:00
TemmieHeartz
927c8f4fa7
Update README.md 2023-01-22 17:14:21 -03:00
TemmieHeartz
274354138a
Update README.md
Remove most of HTML content to use Markdown instead and add Important tip
2023-01-22 17:12:42 -03:00
TemmieHeartz
96d5bdaaab Lang: Fix missing labels on ru-ru.json 2023-01-22 16:52:03 -03:00
TemmieHeartz
83339c7044
Update about-translations.md
Include ArtemVideoGames
2023-01-22 16:42:51 -03:00
TemmieHeartz
94e5860d5d
Merge pull request #20 from ArtemVideoGames/patch-1
Big update ru-ru.json
2023-01-22 15:53:32 -03:00
TemmieHeartz
1da1487915
Merge pull request #24 from Mizmalik/patch-5
Update fr-fr.json
2023-01-22 11:25:43 -03:00
Mizmalik
2cf2ccb71d
Update fr-fr.json 2023-01-22 09:39:17 +01:00
Artem
0ef5e53851
Added translate to fullscreen mode 2023-01-22 10:15:47 +02:00
TemmieHeartz
9a3529db69 Internal: Fix settings file not updating in case of new hack is available (Thanks ArbestRi) 2023-01-21 21:39:42 -03:00
TemmieHeartz
acaf2f7c85
Merge branch 'main' into patch-1 2023-01-21 20:47:34 -03:00
TemmieHeartz
bdafb05df9 Settings: Add option to start fpPS4 in fullscreen mode 2023-01-21 20:01:05 -03:00
TemmieHeartz
4c32d45d37 Hacks: Include DISABLE_FMV_HACK 2023-01-21 19:43:44 -03:00
TemmieHeartz
0936ecf53f
Merge pull request #22 from B8nee/main
update it
2023-01-21 19:41:42 -03:00
Dan Adrian Radut
c17e4c83fc
update it 2023-01-21 23:40:09 +01:00
TemmieHeartz
4538aa094e Settings: Include launcher version on settings file 2023-01-21 17:59:23 -03:00
TemmieHeartz
96ca112ebb
Merge pull request #19 from Mizmalik/patch-4
Update fr-fr.json
2023-01-21 15:35:54 -03:00
TemmieHeartz
88476a73c8
Merge pull request #18 from nini22P/main
Update zh-s.json
2023-01-21 15:35:30 -03:00
Artem
5fbc6a137b
Big update ru-ru.json
Translate of all that not translated
2023-01-21 16:44:49 +02:00
Mizmalik
d62b9081d7
Update fr-fr.json 2023-01-21 10:38:15 +01:00
22
1b364c80dd Update zh-s.json 2023-01-21 09:37:03 +08:00
TemmieHeartz
f33f788936 Settings: Add option to update GUI size, Lang: Fix a typo on pt-br.json, JS / HTML: Small fixes 2023-01-20 17:16:17 -03:00
TemmieHeartz
735762a3d1
Update README.md 2023-01-18 17:26:28 -03:00
TemmieHeartz
a83c5e82c5
Merge pull request #17 from Mizmalik/patch-3
Update fr-fr.json
2023-01-18 16:52:58 -03:00
TemmieHeartz
d8ccfb7443 fpPS4 Updater: Fix app asking to update twice on launcher first install 2023-01-18 16:49:04 -03:00
Mizmalik
abc67c87b8
Update fr-fr.json 2023-01-18 20:41:26 +01:00
TemmieHeartz
b41697e4ac
Merge pull request #16 from B8nee/main
it update
2023-01-18 16:13:37 -03:00
Dan Adrian Radut
8dc17461fb
it update 2023-01-18 20:08:18 +01:00
TemmieHeartz
6e94e6ded9 GUI: Enhance game dumps gui 2023-01-18 13:59:08 -03:00
TemmieHeartz
0a23e825e0 Lang: Include missing label (fpPS4 Updater: Status), MemoryJS: Update plugin, CSS: Minor changes 2023-01-18 13:21:05 -03:00
TemmieHeartz
41b49a1a78
Merge pull request #15 from Mizmalik/patch-2
Update fr-fr.json
2023-01-18 02:11:25 -03:00
Mizmalik
89bac12565
Update fr-fr.json 2023-01-17 22:05:49 +01:00
TemmieHeartz
b657554ace fpPS4 Updater: Fix extraction routine, fix not prompting to update on boot 2023-01-17 15:12:39 -03:00
TemmieHeartz
975c084f1e
Merge pull request #14 from B8nee/patch-1
Italian update
2023-01-17 15:01:56 -03:00
Dan Adrian Radut
d3293a22dd
italian update 2023-01-17 18:57:57 +01:00
TemmieHeartz
97ec61b463
Merge pull request #13 from nini22P/main
Lang: Update ch-s.json
2023-01-17 14:40:01 -03:00
22
f0c180fcc0 Lang: Update ch-s.json 2023-01-17 15:01:17 +08:00
TemmieHeartz
95cf06000f General: Implement fpPS4 updater [NEED TESTING], Css: Various fixes, Emu: Fixed not being able to close fpPS4 using stop fpPS4 button and more! 2023-01-16 21:19:29 -03:00
TemmieHeartz
26ca3f10c3
Include Italian translation 2023-01-14 04:44:23 -03:00
TemmieHeartz
054a03129a
Merge pull request #12 from B8nee/B8nee-italian-translation
Italian translation
2023-01-14 00:00:14 -03:00
Dan Adrian Radut
07b9569184
line correction 40 2023-01-14 02:12:51 +01:00
Dan Adrian Radut
d337d13996
Italian Version
This is my Italian translation for TemmieHeartz's launcher!
2023-01-14 02:05:23 +01:00
TemmieHeartz
a24e56ea71
Merge pull request #11 from ArbestRi/ArbestRi-patch-1
Fix more typos
2023-01-13 10:01:36 -03:00
ArbestRi
dc2f836207
Further fixes 2023-01-11 21:23:41 -08:00
ArbestRi
170e237f84
Fix more typos
I found more typos, so I fixed them.
2023-01-11 12:45:12 -08:00
TemmieHeartz
c77820391e Lang: Revert changes on about-translations.md 2023-01-11 10:58:58 -03:00
TemmieHeartz
2789c144c6 Lang: remove line break on emu running args message, JS: Only update closing message if emu isn't running 2023-01-11 10:56:25 -03:00
TemmieHeartz
b45ce02b7a Lang: Update local files before new changes, Game list: Add message if path does not exists, fix emu running close message displaying on main gui 2023-01-11 10:11:35 -03:00
TemmieHeartz
c958326c41 GIT: Revert last push 2023-01-11 10:07:47 -03:00
TemmieHeartz
6b52749712 Game list: Add message if path does not exists, fix emu running close message displaying on main gui 2023-01-11 10:04:10 -03:00
TemmieHeartz
da1e9ca93a
Update about-translations.md
Include gandalfthewhite revision
2023-01-10 12:29:08 -03:00
TemmieHeartz
8b87abdd9e
Merge pull request #10 from gandalfthewhite19890404/main
Update ru-ru.json
2023-01-10 08:17:54 -03:00
TemmieHeartz
078936675f
Merge pull request #9 from nini22P/main
Lang: Update ch-s.json
2023-01-10 08:14:49 -03:00
gandalfthewhite19890404
f467845cc8
Update ru-ru.json 2023-01-10 12:04:57 +03:00
22
a9b3d25d19 Lang: Update ch-s.json 2023-01-10 16:28:07 +08:00
TemmieHeartz
b24cc351e5 GUI: Update settings design 2023-01-09 22:38:01 -03:00
TemmieHeartz
cb20fc00ea Settings: EXPERIMENTAL - Add option to log fpPS4 process output on nwjs internal log (F12) 2023-01-09 18:36:08 -03:00
TemmieHeartz
1f10a51741 GUI: Attempt to avoid not displaying emu running GUI over game list 2023-01-09 17:14:37 -03:00
TemmieHeartz
8749c883fa JS: Add APP.processStdOutput (no launcher changes / behavior expected) 2023-01-09 14:36:04 -03:00
TemmieHeartz
5483e1267a GUI: Update main window title while fpPS4 is running, Lang: Enhanced changes detection, Settings: Add restart button, Add option to hide app / game icon / name GUI while fpPS4 is running 2023-01-09 13:49:42 -03:00
TemmieHeartz
29d16604f5 Lang: Fix error settings load, Settings: Small organization 2023-01-09 10:27:30 -03:00
TemmieHeartz
8dd8d2b3fb GUI: Avoid scrolling screen on toggle game patch 2023-01-09 10:04:31 -03:00
TemmieHeartz
09f613d295
Merge pull request #7 from nini22P/main
Lang: Update ch-s.json
2023-01-09 09:54:45 -03:00
TemmieHeartz
630f826578 GUI: Fix display mode buttons being available while fpPS4 is running (Thanks gandalfthewhite), Lang: Switch to english when a label string is unavailable in selected lang 2023-01-09 09:51:39 -03:00
22
1094582c88 Lang: Update ch-s.json 2023-01-09 18:12:06 +08:00
TemmieHeartz
2727147df6 GUI: Fix app / game version not being shown when enabling patch without selecting path 2023-01-08 22:09:48 -03:00
TemmieHeartz
5c0b58594c GUI: Make grid icon size being disabled in other display modes, Patches: Fix not being able to select specific patches (Thanks patryk) 2023-01-08 21:26:29 -03:00
TemmieHeartz
bf8c73a588 GUI: Move game list display mode to main screen 2023-01-08 20:18:34 -03:00
TemmieHeartz
ca84d82a77 GUI: Display patch version on emu running screen when it is enabled 2023-01-08 16:44:38 -03:00
TemmieHeartz
64759ded7b GUI: Expand fpPS4 Options height 2023-01-08 16:12:08 -03:00
TemmieHeartz
d64fdcc8b8
Create about-translations.md 2023-01-08 15:46:01 -03:00
TemmieHeartz
1d1d5f353c CSS: Fix small flicker on game list while loading using grid mode 2023-01-08 15:24:33 -03:00
TemmieHeartz
183936074f GUI: Update app version on game entry if patch is selected, updated patch selection process, Lang: Updated "patchLoadErrorMismatch" message [Must check translation] 2023-01-08 15:19:30 -03:00
TemmieHeartz
ffab664eaf Lang: Add hacks missing label 2023-01-08 13:34:11 -03:00
TemmieHeartz
359c80da4c JS: Fixed titles not being applied on english, GUI: Enhanced grid and compact display mode, Added version on fpPS4 options, Added missing labels to lang 2023-01-08 13:23:37 -03:00
TemmieHeartz
af6ed2ed43 Lang: Fix spacing on lang files 2023-01-08 11:32:23 -03:00
TemmieHeartz
1b913e708f
Merge pull request #5 from Mizmalik/patch-1
Lang: add french
2023-01-08 10:48:38 -03:00
TemmieHeartz
e6a5c3c88b
Merge pull request #4 from nini22P/main
Lang: Add Simplified Chinese
2023-01-08 10:39:47 -03:00
22
d4afc897bf Update zh-s.json 2023-01-08 21:07:30 +08:00
Mizmalik
f2e61b31a1
Lang: add french 2023-01-08 13:59:15 +01:00
TemmieHeartz
cbd5916374 Lang: Add fallback to english if selected variable is not found, Added Russian language by ThatSameGuy 2023-01-08 09:42:06 -03:00
22
df84455cbd Lang: Update zh-s.json 2023-01-08 18:44:50 +08:00
22
db9f99ff5c Lang: Add Simplified Chinese 2023-01-08 16:39:04 +08:00
TemmieHeartz
8420fff71d JS: check if lang file exists before loading 2023-01-08 01:28:27 -03:00
TemmieHeartz
4e9bae728c JS: Fix lang error on load settings, change window.confirm to window.alert on boot error 2023-01-08 01:06:58 -03:00
TemmieHeartz
109c26dba8 GUI: Remove unnecessary title from patch, fix display version 2023-01-08 00:29:33 -03:00
TemmieHeartz
e9604e3349 JS: Attempt to fix fpPS4 not recognizing patch path 2023-01-07 23:08:25 -03:00
TemmieHeartz
d359359874 Settings: Add support for language files [WIP], JS: Fix multiple logs with same data 2023-01-07 22:56:19 -03:00
TemmieHeartz
b069a8586c JS: Import win module, Game list: warn if another app / game exists with same TITLE_ID 2023-01-06 21:52:25 -03:00
TemmieHeartz
e8a3a86855 Settings: Add option to remove Project.gp4 from game / app root folder 2023-01-06 18:32:32 -03:00
46 changed files with 6684 additions and 1130 deletions

26
.gitignore vendored Normal file
View 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

View file

@ -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;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 3.8 MiB

BIN
App/img/banner.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 KiB

BIN
App/img/logo.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

1
App/img/svg/app-menu.svg Normal file
View 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

View 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

View 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

View file

@ -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>

View file

@ -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;

View file

@ -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;
}
}

View file

@ -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';
}
}

View file

@ -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;
}
}

View file

@ -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
View 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: {}
}

View file

@ -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.`);
}

View file

@ -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

View file

@ -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'));
}
}
}

View file

@ -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
View 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);
}
}

View file

@ -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"

View file

@ -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
View 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
View file

@ -0,0 +1,224 @@
# node-stream-zip ![CI Checks](https://github.com/antelle/node-stream-zip/workflows/CI%20Checks/badge.svg)
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
View 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

File diff suppressed because it is too large Load diff

47
App/node_modules/node-stream-zip/package.json generated vendored Normal file
View 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
View 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": "فرض التحديث"
}
}

View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View file

View file

@ -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
View 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
View 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
View file

@ -0,0 +1,6 @@
stty -echo
clear
echo "Running fpPS4 Temmie's Launcher - Please Wait..."
./Nwjs/nw .
stty echo
exit

View file

@ -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
View 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
View 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