Compare commits

..

178 Commits
v4.1.1 ... main

Author SHA1 Message Date
Ethan O'Brien
50cb990a87
Fix nightly folder 2026-02-02 12:15:37 -06:00
Ethan O'Brien
b440392a49
Update dependencies and fix minify script 2026-01-03 18:58:17 -06:00
Ethan O'Brien
ae9cd11583 Add intv 2026-01-03 18:44:29 -06:00
Zen P.
780ad31d3d
fix(deps): update @node-minify packages to v10.1.1 (#1150)
Fixes high severity vulnerability in glob (CVE via @node-minify/core).

Updates:
- @node-minify/core: ^9.0.2 -> ^10.1.1
- @node-minify/clean-css: ^9.0.1 -> ^10.1.1
- @node-minify/terser: ^9.0.1 -> ^10.1.1

The glob vulnerability (GHSA-5j98-mcp5-4vw2) allowed command injection
via -c/--cmd flag. @node-minify v10.x removes glob as a dependency,
eliminating this attack vector.

Co-authored-by: Zenpower <dev@zenpower.at>
2026-01-03 15:31:55 -06:00
Mikhail Vazhnov
5680535946
Fix Sega Genesis control scheme (#1124) (#1125) 2025-10-30 20:14:23 -05:00
298A-E9E3
cf8e15ba9b
Added automatic core detection for Sega Mega Drive games (#1123) 2025-10-30 20:13:57 -05:00
Joe Thundercheeks
dfe9498bcd
Fix Issue #1039 (Save state text is inconsistent) (#1116)
* fix psx control mapping showing defaults

* fix psx mappings being incorrect

* fix psx thingy

* Fix Issue #1039

* Add files via upload
2025-10-20 16:07:46 -05:00
Joe Thundercheeks
5fdaaff215
Fix Issue #1112 (PSX Control Labels Are Incorrect) (#1115)
* fix psx control mapping showing defaults

* fix psx mappings being incorrect

* fix psx thingy
2025-10-20 07:03:50 -05:00
Ethan O'Brien
8c750dde40
Add beta bootup batch file 2025-10-19 19:40:38 -05:00
Ethan O'Brien
18e3a4c3a1
Redo start name detection 2025-10-19 17:19:46 -05:00
Ethan O'Brien
91e8d6bb31
Add bsnes/genesisplusgxwide 2025-10-19 16:49:58 -05:00
duanyu5871
c0480f888d
beforeunload event listener update (#1107)
* beforeunload update

* Rename to EJS_disableAutoUnload

* Remove value from index.html since undefined is a falsy value

---------

Co-authored-by: Ethan O'Brien <ethan.a.obrien@gmail.com>
Co-authored-by: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com>
2025-10-15 20:50:09 -05:00
298A-E9E3
54d7dfbc1f
Improve ROM loading UX (#1105)
Make cores that require threads only available if threads are enabled
Make ROMs whose extensions are the name of a core use that core
2025-10-13 18:00:18 -05:00
ぱるん
8184ba800b
Change some of the contents of ja.json (#1102) 2025-10-06 19:58:39 -05:00
cryptonaus
8eab8f6936
Support a fixed save flushing interval (#1095)
Co-authored-by: cryptonaus <cryptonaus>
2025-09-18 08:09:07 -05:00
cryptonaus
ca6c0a9870
Add event for when a game save is updated (#1094)
* Add event for when a game save is updated

* Replace SHA-1 with Cyrb53

---------

Co-authored-by: cryptonaus <cryptonaus>
2025-09-18 08:08:45 -05:00
milktoastrat
21726dc5bc
Add/Update SVG logos (#1078)
* Add/Update SVG logos

* Rename emulatorjs-logo.svg to logo.svg

* Rename Logo.svg to old-Logo.svg

* Rename logo.svg to Logo.svg

* Update Logo.svg

* Update Logo.svg (slight color correction)

* Update emulatorjs-logo-and-type.svg (slight color correction)

* Update Logo.svg

* Update Logo.svg

* Add newline

---------

Co-authored-by: Ethan O'Brien <77750390+ethanaobrien@users.noreply.github.com>
2025-09-16 23:01:33 -05:00
lxyongit
5a6062355e
fix loadExternalFilesFixed a bug in the loadExternalFiles function by updating the writeFile call to wrap res.data in new Uint8Array. This ensures proper handling of binary or buffer data, resolving type-related errors during file writing. (#1097) 2025-09-16 23:00:02 -05:00
Michael Green
ad9586d266
Fix screenshot return in EJS_onSaveState (#1092)
* Fixed bug where a screenshot wasn't returned using EJS_onSaveState

* Refactor takeScreenshot method to return a promise with screenshot data and format; update input element in HTML for better accessibility.
2025-09-16 08:14:01 -05:00
Allan Niles
ce7472d264
test workflows 2025-08-30 18:57:36 -06:00
Allan Niles
ceeecf209a
Remove Matrix server invitation
Removed Matrix server invitation from README.
2025-08-28 21:34:34 -06:00
Ethan O'Brien
7197fc9c73 Network errors should be thrown 2025-08-27 11:47:12 -05:00
S-Coding
23337cf2db
Added netplay over WebRTC (#1053)
* Added netplay over WebRTC

* feat(netplay): Implement WebRTC and address PR feedback

* Prevent emulator loop from running on clients

* fixed formatting and changed IceServers to ICEServers

* refactor: Update loader.js

* Refactor: Overhaul netplay for better 4-player support and use config encapsulation

* Cleanup

* Cleanup

* Add newline

* Fixed message focus, added joined and left messages, hid unnecessary buttons

* Cleaned up functions bind.this, netplay button reorganization, number of players selector fix

* Added TURN server detection and warning

* cleanup

---------

Co-authored-by: S-Coding23 <>
Co-authored-by: Ethan O'Brien <ethan.a.obrien@gmail.com>
2025-08-23 21:58:00 -06:00
daguile
e4feb3c6ec
Improve multi-disc handling for dosbox-pure (#1064)
* do not extract zip file for dosbox

* Added DOSBOX as an option to index.html

* remove second initialization

* let the website decide if rom needs to be extracted

---------

Co-authored-by: Michael Green <84688932+michael-j-green@users.noreply.github.com>
2025-08-20 18:39:27 -05:00
daguile
a0f4db7610
fix silly error (#1063) 2025-08-18 08:09:06 -05:00
Georges-Antoine Assi
b5a719b846
Add jsdoc comments to compression.js (#1062)
* Add jsdoc to compression

* undo formatting
2025-08-17 15:22:23 -05:00
daguile
5bf17873d1
handle subfolders in path (#1059) 2025-08-16 12:40:23 -05:00
ぱる
55fbd5eeae
Update ja.json (#1058) 2025-08-15 20:49:10 -05:00
Ethan O'Brien
756990bdd1
Redo saves 2025-08-07 09:09:26 -05:00
Michael Green
0f9954a976
Fix for context menu (#1045)
* Fix for context menu

* Formatting fix

* Refined EJS_browserMode

* Moved browserMode from loader.js into emulator.js

* Revert loader.js to original

* Change single quotes to double quotes

* Removal of EJS_browserMode from emulator.js

* Show desktop mode messages only if debug is true.

* Block changes to all but the visible property of the contextMenu
2025-07-12 20:32:41 -06:00
uzucore
4c161abaf2
Update ko.json (#1044)
* Update ko.json

Bug fixes and translations added.

* 추가수정
2025-07-07 20:47:14 -05:00
Allan Niles
2052d68f84
Language Revamp (#1036)
* fix translations

* fix BCP 47 tags

* fix Credits

* auto lang

* missing logic

* clean up

* remove semicolon
2025-07-06 22:12:30 -06:00
Michael Green
e77610e890
Fix for broken custom buttons (#1042)
* Fix for broken custom buttons

* Removed non-standard formatting

* Removed non-standard formatting

* Removed non-standard formatting
2025-07-06 22:02:59 -05:00
t3chnob0y
8a7088a156
Update af-FR.json (#1043)
* Update af-FR.json

* Update af-FR.json
2025-07-06 19:43:50 -05:00
Allan Niles
820a9fa962
fix adding newlines after updating dependencies 2025-07-06 18:11:22 -06:00
Allan Niles
6161d7f140
Update Project Scripts 2025-07-06 17:41:13 -06:00
Ethan O'Brien
e150dc0491
4.2.3 2025-07-05 14:34:10 -05:00
Ethan O'Brien
f679b265e9
Add sizes to parent element 2025-07-05 00:19:05 -05:00
Ethan O'Brien
c7d6a49fdb
Playing with canvas sizes 2025-07-04 22:33:46 -05:00
incredibleIdea
505f11bc86
Style: replace some string concatenation with template literal (#1040) 2025-07-04 22:26:43 -05:00
Ethan O'Brien
b0601b6226
Remove canvas resize call as this is now handled by the backend 2025-07-02 22:47:04 -05:00
incredibleIdea
84a1fc13d7
Localization and logging fix (#1038)
* Fix logging issue when text's length is 0 && Modify console context

* Modify zh-CN localization

* add file .gitattributes
2025-07-02 22:05:39 -05:00
Allan Niles
cfe6ada74c
Fix Error Screen (#1005)
* fix error screen

* error messages

* center error text

* new line

* fix some error messages

* "Network Error"

* Remove "Check console"

* change css

* better shadow

* newline

* add text shadow

* use `ejs_error_text` class

* make text more readable

* fix border-radius
2025-06-24 21:34:45 -05:00
Michael Green
75ff025ad3
Resolve issue with invalid button names (#1035) 2025-06-24 21:33:47 -05:00
Allan Niles
88d4a05615
Capture Overhaul (#1011)
* screenshot

* newline

* nice screenshots

* screenShot function

* Screen Record

* takeScreenshot

* retroarch if 0

* change to this.capture

* normalize "

* no no

* no no again

* use `this.settings`

* newline and fix merge

* Quality to Upscale

* fix settings call

* add checkForEmptyMenu
2025-06-18 08:46:30 -06:00
Ethan O'Brien
a796c4a386
4.2.2 2025-06-14 15:47:31 -05:00
Ethan O'Brien
b811a84150
Add missing translation file 2025-06-14 15:42:02 -05:00
Ethan O'Brien
0131c16ab5
Rework access of this.settings, don't call simulateInput for keyboard if keyboard mode enabled 2025-06-10 21:36:40 -05:00
Ethan O'Brien
e3977bc7fe
Fix axis inputs for extra axis 2025-06-09 22:26:57 -05:00
Ethan O'Brien
48e8adb676
Fix const assignment error 2025-06-09 21:43:37 -05:00
Ethan O'Brien
977dd04a0a
Resolve #1018 2025-06-09 10:48:06 -05:00
Ethan O'Brien
60e6ab3277
Cleanup famicom controls 2025-06-09 10:32:16 -05:00
Ethan O'Brien
b5a05d1ee5
Check default options when getting core settings 2025-06-09 10:24:37 -05:00
t3chnob0y
7d4f80a273
Update af-FR.json (#1025) 2025-06-08 13:05:13 -05:00
Ethan O'Brien
02e6b271fd
Properly return an empty string 2025-06-07 10:51:24 -05:00
Ethan O'Brien
6389dfbfb9
Add option to disable alt key 2025-06-06 23:27:18 -05:00
Ethan O'Brien
9c8ae86d1e
Write settings to the core settings file before loading the core 2025-06-06 23:08:53 -05:00
Ethan O'Brien
4d447b86c1
Don't discard unknown axis indexes 2025-06-06 21:54:19 -05:00
Ethan O'Brien
3b835d5f25
Properly handle failed save states 2025-06-06 21:53:03 -05:00
Ethan O'Brien
43e9d26a29
Fix gamepad dropdown text not being centered 2025-06-05 12:26:53 -05:00
Ethan O'Brien
bd20ae9029
Cleanup consistency with about menu tabs 2025-06-05 12:14:38 -05:00
Ethan O'Brien
317b2542d4
Fix root settings in options menu 2025-06-05 11:44:33 -05:00
Ethan O'Brien
acaf5253a6
Fix other popup menus 2025-06-04 23:17:26 -05:00
Ethan O'Brien
c847c91edb
Add ability to enable/disable mouse lock 2025-06-04 10:12:50 -05:00
Ethan O'Brien
6b050e06da
Set ejs_parent_option_div max height to inherit 2025-06-04 00:15:35 -05:00
Ethan O'Brien
1d8e572f11
Check core opts for useKeyboard 2025-06-04 00:04:58 -05:00
Ethan O'Brien
8a306a7a63
Fix keyboardInput default option 2025-06-03 23:56:14 -05:00
Ethan O'Brien
ecd96f8238
Correct usage of defaultCoreOpts in setupSettingsMenu 2025-06-03 23:33:45 -05:00
Ethan O'Brien
0bd9707a4b
Update copyright date 2025-06-03 23:23:21 -05:00
Ethan O'Brien
db31a03224
Cleanup about menu css 2025-06-03 23:22:46 -05:00
Ethan O'Brien
c22e5ff14c
Redo settings menu scrolling 2025-06-03 23:10:53 -05:00
Ethan O'Brien
f8b09feb9f
Check for beta when fetching from cdn 2025-06-03 22:11:45 -05:00
Ethan O'Brien
af2e20cee6
Add ability to toggle direct keyboard input with settings option 2025-06-03 22:11:21 -05:00
Ethan O'Brien
e1920c92dc
Cleanup menubarBehavior option 2025-06-03 21:55:39 -05:00
Ethan O'Brien
10cc794698
Add dosbox 2025-06-03 21:49:40 -05:00
Ethan O'Brien
ae5841e063
Append beta to version number 2025-05-27 21:46:33 -05:00
Ethan O'Brien
4e97254263
pass parent element to module 2025-05-25 16:43:58 -05:00
Allan Niles
b4195d91f6
Mouse Fix & Controls CSS (#1009)
* mouse fix & controls css

* that newline

* add return

* add Mouse Options
2025-05-24 21:28:47 -06:00
Allan Niles
a1ee8160fc
Virtual Gamepad Fix (#1001)
* hasTouchScreen

* fix menu-bar-button logic

* requested changes

* set button size

* visible and hidden

* match setting with status

* newline
2025-05-24 21:09:24 -06:00
Ethan O'Brien
ce15c9b06e
Fix key 2025-05-16 11:29:50 -05:00
Ethan O'Brien
3081339c67
Add newline 2025-05-14 23:45:50 -05:00
SooHyuck
1207d0a803
Update ko-KO.json (#1015)
저는 한국인 입니다.

번역된 오역 및 다른 부분을 테스트 후 최종 확인 본을 올립니다.

en-US.json에 새로 추가된 부분까지 추가해서 번역했습니다.
2025-05-14 23:44:43 -05:00
Ethan O'Brien
f70e897bd1
Remove this.listeners property 2025-05-12 20:57:12 -05:00
Ethan O'Brien
a1efedfbea
Fix case where 2 gamepads are disconnected at once 2025-05-12 00:01:23 -05:00
Ethan O'Brien
908bccd63c
Cleanup gamepad dropdown 2025-05-11 23:53:56 -05:00
Ethan O'Brien
b8061eaeef
Add joystickInput for button inputs 2025-05-11 23:19:56 -05:00
Ethan O'Brien
d1408b42d5
Change retroarch.cfg path 2025-05-11 10:48:38 -05:00
Allan Niles
3794c089fa
Update docs & formating (#991)
* update docs & formating

* fix formatting

* spaces

* remove spaces

* CDN info

* functions
2025-05-07 15:50:24 -06:00
Allan Niles
6acede642b
Add demo autoload (#1004)
* add demo autoload

* use ===
2025-05-02 17:31:33 -06:00
Ethan O'Brien
ebed7baa95
Add newline workflow (#1002) 2025-04-30 11:04:01 -05:00
t3chnob0y
12ae664caa
Update af-FR.json (#1000) 2025-04-29 23:42:36 -05:00
Ethan O'Brien
19867d4535 Revert "Add context menu and fix virtualGamepad button"
This reverts commit 2dd1a3df5c.
2025-04-28 23:45:32 -05:00
Allan Niles
45cc488ebc
Add update script (#990)
* add update script

* fix formatting

* spacing

* typo

* spacing

* new line
2025-04-28 22:24:19 -06:00
Michael Green
1b655b9e4d
Enhance toolbar customisation options (#992)
* Proof of concept

* POC now implements custom buttons (up to three)

* Reversed formatting in loader.js

* Reversed formatting changes for emulator.js

* Revert formatting changes to index.html

* Revert whitespace formatting

* Migrated button defaults and setup code to emulator.js

* Some more refactoring

* Unlimited custom buttons

* Remove demo code from index.html
2025-04-28 22:39:16 -05:00
Allan Niles
2dd1a3df5c
Add context menu and fix virtualGamepad button 2025-04-28 12:50:23 -06:00
Allan Niles
e28e350235
Update localizations (#987)
* update localizations

* add localization docs

* move tool

* fix wording
2025-04-28 10:13:31 -06:00
Ethan O'Brien
443a6f81cd
Correct n64 virtual gamepad mapping
I hope
2025-04-27 22:45:49 -05:00
Allan Niles
bd26e754d9
Add build script (#989)
* make build script

* fix formating

* Add newline

* test action

* debug

* tag logic

* that would do it

* GITHUB_ENV

* NODE_AUTH_TOKEN

* update version

* change order

* setup cores

* it works now
2025-04-23 17:08:30 -06:00
Michael Green
8dbf1cff29
How to disable the formatter in VSCode (#994)
* How to disable the formatter in VSCode

* Fix incorrect markdown usage
2025-04-21 18:07:15 -06:00
Ethan O'Brien
501d7da435
Merge pull request #988 from allancoding/minify
Refactor minify script
2025-04-20 23:30:53 -05:00
Allan Niles
e664481175
refactor minify script 2025-04-16 10:48:59 -06:00
Ethan O'Brien
d48118b90b
Fix gamepadIndex in gamepadEvent function 2025-04-14 12:14:06 -05:00
Ethan O'Brien
02e2b1621e
Push by @jurcaalexandrucristian 2025-04-14 10:47:25 -05:00
Ethan O'Brien
03be36b165
Dropdown for gamepad selection 2025-04-14 10:40:20 -05:00
Ethan O'Brien
78a227e5f2
Update ja-JA.json (#982)
Edit the Japanese translation file
2025-04-10 08:23:20 -05:00
noel-forester
0b6c5f1e27
Update ja-JA.json
Edit the Japanese translation file
2025-04-06 17:50:20 +09:00
Ethan O'Brien
8b5d605a17
Correct placement of saveDatabaseLoaded invoke call 2025-04-05 22:09:55 -05:00
Ethan O'Brien
9aab1c54a9
Add ability to pull system language 2025-04-05 22:00:35 -05:00
Ethan O'Brien
8df1acf446
Fix up save state interval logic 2025-04-05 21:50:46 -05:00
Ethan O'Brien
0ee5cc9f06
Add ability to hide some, but not all settings 2025-04-05 21:48:12 -05:00
Ethan O'Brien
03cab1d115
Add save interval option 2025-04-05 20:58:42 -05:00
Ethan O'Brien
ec42fcee25
Add hook for save database loaded 2025-04-05 20:47:39 -05:00
Ethan O'Brien
b3c1be1c30
Fix reference error 2025-04-02 06:16:30 -05:00
Ethan O'Brien
c608c3a03e
Add events for save files being updated 2025-03-30 23:22:56 -05:00
Georges-Antoine Assi
40323a85a5
Need to unlink screenshot before saving (#976) 2025-03-28 07:05:17 -05:00
Allan Niles
ff9ea4cbd0
Fix Stable Workflow 2025-03-11 21:35:35 -06:00
Allan Niles
9f1fafade5
Add New Contributors & Update Workflows 2025-03-11 17:57:26 -06:00
pjft
4904649e0c
Merge pull request #954 from pjft/patch-1
Add support for Arcade BIOS files
2025-03-08 18:00:09 -06:00
Ethan O'Brien
a5990657cf
Save default options to this.settings array 2025-02-21 11:03:53 -06:00
Ethan O'Brien
06e597edf8
Merge pull request #949 from kellenmace/bugfix/background-image-parentheses
Fix a bug preventing the use of background image URLs that contain parentheses
2025-02-10 08:47:21 -06:00
Kellen Mace
f483acb70a Interpolate background image URL and wrap it in quotes to ensure proper CSS parsing 2025-02-09 23:11:56 -05:00
Ethan O'Brien
7d498640d0
Merge pull request #939 from allancoding/main
update docs
2025-01-12 13:20:58 -06:00
Allan Niles
e9d2681742
update docs 2025-01-12 11:33:36 -07:00
Allan Niles
67109a7113
update github workflows 2025-01-12 11:05:44 -07:00
Ethan O'Brien
bb51c13eab
Add missing 4.2.1 change 2025-01-08 09:39:39 -06:00
Ethan O'Brien
b3c55477de Prioritize gameName for local storage identifier 2025-01-08 09:36:39 -06:00
Ethan O'Brien
32c524f32f Update translate readme 2025-01-08 09:34:12 -06:00
Ethan O'Brien
13362ef078 4.2.1 2025-01-07 09:27:27 -06:00
Ethan O'Brien
6f73e632b7 Fix rar decompression 2025-01-07 07:47:29 -06:00
Ethan O'Brien
a8dc84b1eb Write bios/patch/parent files to the same folder as the start filename 2025-01-07 07:43:35 -06:00
Ethan O'Brien
3fbc803c36 Correct core organization 2025-01-07 07:42:57 -06:00
Ethan O'Brien
8650617bda Check for existance of the generic core before running includes 2025-01-07 07:34:23 -06:00
Ethan O'Brien
3d8c812bfa Hide save files buttons if not supported 2025-01-06 09:26:19 -06:00
Ethan O'Brien
fbd83f0a55
Merge pull request #935 from t3chnob0y/main
Update af-FR.json
2025-01-05 22:07:40 -06:00
t3chnob0y
69c826abf6
Update af-FR.json 2025-01-05 22:45:55 -05:00
Ethan O'Brien
b1d6694132 Move virtual gamepad to a sub-menu 2025-01-05 17:55:17 -06:00
Ethan O'Brien
fc521d20e0 Add a call to restart on the exit event 2025-01-05 16:13:59 -06:00
Ethan O'Brien
f0a79017e5 Fix syntax 2025-01-05 12:38:02 -06:00
Ethan O'Brien
23e0018566 Add Module.getSavExt function 2025-01-05 12:25:38 -06:00
Ethan O'Brien
f28ca948eb
Merge pull request #934 from allancoding/main
Fix video rotation & add Arcade Core
2025-01-05 11:56:39 -06:00
Allan Niles
07847743af
Fix video rotation & add Arcade Core 2025-01-05 09:41:26 -07:00
Ethan O'Brien
27374b52d6 Fix down input on gamepad 2025-01-03 21:24:34 -06:00
Ethan O'Brien
4ae4d5c3bf Get/save core settings based off of the game filename instead of the core 2024-12-29 14:21:48 -08:00
Ethan O'Brien
cf4b680490 Fix setting/getting core setting 2024-12-29 14:08:49 -08:00
Ethan O'Brien
be29680d57 Always pull from stable for update checks 2024-12-28 21:18:11 -08:00
Ethan O'Brien
3acb06a0f0 Combine game patch,parent,and bios download functions 2024-12-28 20:01:12 -08:00
Ethan O'Brien
6ee9f55938 Move warning for failsafe message 2024-12-28 19:36:41 -08:00
Ethan O'Brien
4798d3bcfd
Merge pull request #924 from gantoine/use-pinned-eja-version-fetch
Use pinned ejs_version when fetching cores/version
2024-12-28 19:32:49 -08:00
Ethan O'Brien
ea19b8d764
Emphasize in the console, that fetching the core from the CDN is meant to function as a failsafe 2024-12-24 17:03:08 -06:00
Allan Niles
6ab560d09f
remove legacy button (#927) 2024-12-23 20:32:03 -06:00
Georges-Antoine Assi
cac45c9381
Use pinned ejs_version when fetching cores/version 2024-12-21 18:06:38 -05:00
Ethan O'Brien
8d42d53d4f Version 4.2.0 changelog 2024-12-21 15:32:38 -06:00
Ethan O'Brien
a4e4aef907 Fix detection of method to use to fetch url in downloadFile function 2024-12-21 15:16:59 -06:00
Allan Niles
35639bb896
Fix SharedArrayBuffer check & video rotation without reload (#923)
* video_roation without reload

* fix SharedArrayBuffer check

* remove notCoreOption check
2024-12-21 12:39:08 -06:00
Ethan O'Brien
39c9ec9e6c Fix volume slider color in firefox 2024-12-21 11:30:55 -06:00
Ethan O'Brien
65a3aade74 psp control scheme 2024-12-21 11:11:30 -06:00
Ethan O'Brien
60680e74da Add ability to disable or enable threads if sharedarraybuffer is defined 2024-12-21 10:25:41 -06:00
Ethan O'Brien
6fc50e2488 Add ability to switch between cores in settings menu 2024-12-21 10:17:37 -06:00
Ethan O'Brien
cae8e2fb4b Check if core requires webgl2/threads. Refactor downloadFile function to use promise 2024-12-20 11:47:26 -06:00
Ethan O'Brien
97f5b4bd7e Redo getCore function 2024-12-20 10:51:33 -06:00
Ethan O'Brien
b3da3270b8 Fix error when loading ppsspp assets 2024-12-17 12:56:07 -06:00
Ethan O'Brien
e13522eacf
Add another check on response data 2024-12-15 08:57:59 -06:00
Ethan O'Brien
b4a06cef6c Use this.enableMouseLock 2024-12-14 15:08:46 -06:00
Ethan O'Brien
5d54014ce3 Read state from memory instead of saving to disk 2024-12-14 14:05:53 -06:00
Ethan O'Brien
627fba2f9c Add call to mount file systems before loading game assets 2024-12-13 10:32:47 -06:00
Ethan O'Brien
b2747487d1 Fix setting settings when game errored 2024-12-12 07:12:04 -06:00
Ethan O'Brien
ad530da5f5 Do not set this.settings[value] until after the initial load 2024-12-10 10:23:28 -06:00
Ethan O'Brien
d3fd718a93 Add ability to ship retroarch.cfg configurable values 2024-12-10 09:16:58 -06:00
Ethan O'Brien
b865862bdb Add beta to version number 2024-12-10 08:39:36 -06:00
Ethan O'Brien
0f9030c686 Fix emulatorjs exit event 2024-12-10 08:37:01 -06:00
Ethan O'Brien
c5645a7ef9 Organize settings menu 2024-12-10 08:36:43 -06:00
Ethan O'Brien
c0ae2e2caf Fix default webgl2 option 2024-12-10 07:37:36 -06:00
Ethan O'Brien
a8d0284e06
Catch undefined EJS_Runtime as a start error 2024-12-09 22:54:17 -06:00
Reza Mohammadi
3a3eee7d85
add persian language (#912) 2024-11-03 12:25:53 -06:00
Allan Niles
ea422b8c96
Update Docs & add EJS_videoRotation (#909)
* Update Docs

* Add Video Rotation

* Fix requested changes

* Fix Screen Recording
2024-11-01 22:54:45 -05:00
Alexey Nurgaliev
c8c37adb54
use Module.AL instead of window.AL (#903) 2024-09-20 19:28:07 -05:00
pastisme
0bf944370c
Let same_cdi core handle zipped bios file directly (#881) 2024-08-21 20:28:57 -05:00
Allan Niles
4951a28de0
Update package version to 4.1.1 2024-08-19 16:27:45 -06:00
67 changed files with 13381 additions and 9607 deletions

1
.gitattributes vendored Normal file
View File

@ -0,0 +1 @@
text=auto eol=lf

View File

@ -11,8 +11,32 @@ jobs:
runs-on: emulatorjs-server
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Run Script
uses: actions/checkout@v4
- name: Set Permissions
run: |
cd /mnt/HDD/public
./.latest.sh
chmod -R 775 .EmulatorJS/
- name: Update Latest
run: |
cd /mnt/HDD/public/.EmulatorJS/
git fetch --all
git reset --hard origin/main
git pull
- name: Minify Files
run: |
cd /mnt/HDD/public/.EmulatorJS/
npm i
npm run minify
- name: Zip Minified Files
run: |
cd /mnt/HDD/public/.EmulatorJS/data/
zip emulator.min.zip emulator.min.js emulator.min.css
- name: Copy to nightly folder
run: |
cd /mnt/HDD/public/
rsync -auv --exclude .EmulatorJS/data/cores/ .EmulatorJS/ nightly/
- name: Clean Up Minify
run: |
cd /mnt/HDD/public/.EmulatorJS/
rm -f "minify/package-lock.json"
rm -rf "minify/node_modules/" "./node_modules"

42
.github/workflows/newlines.yml vendored Normal file
View File

@ -0,0 +1,42 @@
name: Check for Newline at End of Files
on:
pull_request:
types:
- opened
- synchronize
- reopened
jobs:
check-newlines:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
- name: Check for missing newlines
run: |
files=$(git ls-files)
newline_error=0
for file in $files; do
if file --mime "$file" | grep -q "binary"; then
#echo "Skipping binary file: $file"
continue
fi
last_char=$(tail -c 1 "$file" | xxd -p)
if [[ "$last_char" != "0a" ]]; then
echo "File $file does not end with a newline!"
newline_error=1
fi
done
if [[ $newline_error -eq 1 ]]; then
echo "One or more files do not end with a newline."
exit 1
else
echo "All files end with a newline."
fi

View File

@ -9,12 +9,59 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v3
- uses: actions/setup-node@v4
with:
node-version: '20.x'
registry-url: 'https://registry.npmjs.org'
- name: Get latest release tag (if workflow_dispatch)
if: ${{ github.event_name == 'workflow_dispatch' }}
run: |
LATEST_TAG=$(curl -s https://api.github.com/repos/${{ github.repository }}/releases/latest | jq -r '.tag_name')
echo "LATEST_TAG=$LATEST_TAG" >> $GITHUB_ENV
- name: Download cores
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
TAG_NAME=${{ github.event.release.tag_name || env.LATEST_TAG }}
TRIMMED_TAG=${TAG_NAME#v}
echo "TRIMMED_TAG=$TRIMMED_TAG" >> $GITHUB_ENV
gh release download "$TAG_NAME" \
--repo ${{ github.repository }} \
--pattern "$TRIMMED_TAG.7z"
- name: Extract cores
run: |
7z x -y "$TRIMMED_TAG.7z" "data/cores/*" -o./
rm "$TRIMMED_TAG.7z"
- run: npm i
- run: npm ci
- run: npm publish --access public
- name: Make @emulatorjs/emulatorjs
run: |
node build.js --npm=emulatorjs
npm ci
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Get cores list
run: |
echo "CORES=$(node build.js --npm=get-cores | jq -r '. | join(" ")')" >> $GITHUB_ENV
- name: Setup cores
run: |
node build.js --npm=cores
- name: Publish each core
run: |
cd data/cores
for core in $CORES; do
echo "Processing core: $core"
cd $core
npm publish --access public
cd ..
done
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
- name: Make @emulatorjs/cores
run: |
cd data/cores
npm i
npm ci
npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -11,8 +11,59 @@ jobs:
runs-on: emulatorjs-server
steps:
- name: Checkout
uses: actions/checkout@v3
- name: Run Script
uses: actions/checkout@v4
- name: Set Variables
run: |
cd /mnt/HDD/public/
wget -q "https://api.github.com/repos/EmulatorJS/EmulatorJS/releases/latest" -O .tmp.json
version=$(jq -r '.tag_name' .tmp.json)
download_url=$(jq -r '.assets[0].browser_download_url' .tmp.json)
name=$(jq -r '.assets[0].name' .tmp.json)
old_version=$(jq -r '.github' versions.json)
v_version="$version"
if [[ $version == v* ]]; then
version="${version:1}"
fi
rm .tmp.json
echo "VERSION=$version" >> $GITHUB_ENV
echo "DOWNLOAD_URL=$download_url" >> $GITHUB_ENV
echo "NAME=$name" >> $GITHUB_ENV
echo "OLD_VERSION=$old_version" >> $GITHUB_ENV
echo "V_VERSION=$v_version" >> $GITHUB_ENV
- name: Download Stable
run: |
cd /mnt/HDD/public/
mkdir -p ".stable"
wget -q "$DOWNLOAD_URL" -O ".stable/$NAME"
- name: Extract Stable
run: |
cd /mnt/HDD/public/.stable/
7z x "$NAME"
- name: Move Versions
run: |
cd /mnt/HDD/public/
mv ".stable/$NAME" releases/
mv "$OLD_VERSION" "$VERSION"
mv stable "$OLD_VERSION"
mv .stable stable
jq --arg version "$VERSION" '.github = $version' versions.json | sponge versions.json
- name: Set Permissions
run: |
cd /mnt/HDD/public
./.stable.sh
chmod -R 775 stable/
- name: Update Stable Cores
run: |
rsync -a --delete /mnt/HDD/public/stable/data/cores/ /mnt/HDD/public/.EmulatorJS/data/cores/
- name: Zip Stable
run: |
cd /mnt/HDD/public/stable/data/
zip emulator.min.zip emulator.min.js emulator.min.css
- name: Update Version
run: |
cd /mnt/HDD/public/
jq --arg old_version "$OLD_VERSION" '.versions += {($old_version): ($old_version + "/")}' versions.json | sponge versions.json
- name: Clean Up
run: |
cd /mnt/HDD/public/
rm -f "$OLD_VERSION/data/emulator.min.zip"
rm -rf "$OLD_VERSION/node_modules/"

15
.gitignore vendored
View File

@ -1,11 +1,16 @@
**/node_modules/
*.db
data/minify/package-lock.json
node_modules/
package-lock.json
yarn.lock
roms/
data/emulator.min.js
data/emulator.min.css
data/cores
data/cores/*
!data/cores/README.md
!data/cores/core-README.md
!data/cores/package.json
!data/cores/.npmignore
.DS_Store
.vscode/*
.vscode/*
*.tgz
dist/
jsdoc/

16
.npmignore Normal file
View File

@ -0,0 +1,16 @@
.git
dist/
node_modules/
package-lock.json
.github/
*.tgz
update.js
build.js
data/localization/translate.html
data/cores/*
!data/cores/README.md
!data/cores/package.json
minify/
.npmignore
.gitignore
roms/

View File

@ -1,6 +1,99 @@
# Changes
# 4.1.1
# 4.2.3
Bug fix release
- Redo image capture features (Thanks to [@allancoding](https://github.com/allancoding))
- Fix issue with invalid button names (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Fix issues with canvas size
- Update zh-CN translations (Thanks to [@incredibleIdea](https://github.com/incredibleIdea))
# 4.2.2 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/a796c4a3866652d1b6cb74a2b90e9552955c2b13)
- Prioritize gameName over gameUrl for the local storage identifier
- Fix CSS parsing when setting a background image (Thanks to [@kellenmace](https://github.com/kellenmace))
- Add `EJS_dontExtractBIOS` option (Thanks to [@pjft](https://github.com/pjft))
- Delete old screenshot file before saving a new one (Thanks to [@gantoine](https://github.com/gantoine))
- Add `saveSaveFiles` event for when save files are updated
- Add `saveDatabaseLoaded` event, for when the `/data/saves` directory has been mounted
- Add ability to set a system save interval
- Add the ability to hide settings from the settings menu with the `EJS_hideSettings` option
- Attempt to auto-detect system language and attempt to load that file.
- Add `EJS_disableAutoLang` option to disable auto language detection in `loader.js`
- Update Japanese translation file (Thanks to [@noel-forester](https://github.com/noel-forester))
- Add dropdown selection for gamepads
- Correct N64 virtual gamepad inputs
- Change path to `retroarch.cfg`
- Add `joystickInput` property for virtual gamepad buttons
- Removed `this.listeners`
- Update Korean translation file (Thanks to [@SooHyuck](https://github.com/SooHyuck))
- Redo touchscreen detection (Thanks to [@allancoding](https://github.com/allancoding))
- Redo toolbar visibility method (Thanks to [@allancoding](https://github.com/allancoding))
- Add `dosbox_pure` core (requires threading)
- Add toggle for direct keyboard input
- Redo scrolling in settings menu
- Redo about menu CSS
- Add setting to enable/disable mouse lock
- Properly handle failed save states
- Fix unknown axis events being discarded
- Write core settings file before loading the core (Some core settings are required to be loaded from here on startup)
- Add option to disable `alt` key when using direct keyboard input
- Cleanup famicom controls
- Fix setting gamepad axis to input values 16 to 23
- Rework internal method of getting user settings, add `this.getSettingValue` function
- Add Romanian translation file (Thanks to [@jurcaalexandrucristian](https://github.com/jurcaalexandrucristian))
- Fix build stack size when building cores
- Fix CHD support
# 4.2.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/13362ef0786990e93462f06505de772031cfc4c2)
This was a bug-fix only release.
- Core-fetch failsafe now fetches a pinned version (Thanks to [@gantoine](https://github.com/n-at))
- Fixes video rotation on the arcade core (Thanks to [@allancoding](https://github.com/allancoding))
- Updated French `af-FR` translation (Thanks to [@t3chnob0y](https://github.com/t3chnob0y))
- Fixes switching between cores.
- Change: Localstorage settings are now stored by game instead of by system.
- Fixed gamepad input for c-down.
- Fixed RetroArch always assuming save is `.srm`.
- Fixed EJS exit event
- Hide the "save/load save files" buttons if unsupported.
- Corrects the order of the core list.
- Corrects behaviour of the placement of bios/parent/patch files.
- Fixed rar decompression.
- Fixed picodrive core (`sega32x`)
- Fixed libretro-uae core (`amiga`)
# 4.2.0 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/8d42d53d4fdf0166f71eaa07529cadf93350b76e)
In my opinion, this is the most stable release we've had in a while. Many features added in this release were just side affects of fixing up some bugs.
- Let same_cdi core handle zipped bios file directly (Thanks to [@pastisme](https://github.com/pastisme))
- Fix audio sliders/mute button (Thanks to [@n-at](https://github.com/n-at))
- Add ability to rotate video (Thanks to [@allancoding](https://github.com/allancoding))
- Added persian `fa-AF` language (Thanks to [@iits-reza](https://github.com/iits-reza))
- Added more catches for a start-game error
- Fixed default webgl2 option
- Organized settings menu, by dividing entries into sub-menus
- Fixed the EmulatorJS exit button
- Added the ability to internally add configurable retroarch.cfg variables
- Fixed default settings being saved to localstorage
- Fixed in browser SRM saves (finally)
- Read save state from WebAssembly Memory
- Fixed an issue when loading PPSSPP assets
- Refactored the internal downloadFile function to be promised based instead of callback based
- Added checks if core requires threads or webgl2
- Added ability to switch between cores in the settings menu
- Added the ability to enable/disable threads if SharedArrayBuffer is defined
- Added a PSP controller scheme for the control settings menu
- Fixed the volume slider background height in firefox
- Added handling for lightgun devices
- Refactored the EmulatorJS `build-emulatorjs.sh` build script
- Added `ppsspp` core
# 4.1.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/4951a28de05e072acbe939f46147645a91664a07)
- Fixed 2xScaleHQ and 2xScaleHQ shaders (Thanks to [@n-at](https://github.com/n-at))
- Added Vietnamese (`vi-VN`) (Thanks to [@TimKieu](https://github.com/TimKieu))
- Disable CUE generation for the PUAE core (Thanks to [@michael-j-green](https://github.com/michael-j-green))
@ -21,6 +114,7 @@
- Added support for `File` objects (Thanks to [@pastisme](https://github.com/pastisme)).
# 4.0.12 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/c3ba473d1afc278db136f8e1252d0456050d6047)
- Fix scroll bar css (Thanks to [@allancoding](https://github.com/allancoding))
- Flip the context menu instead of going off the page
- Add hooks for save files (Thanks to [@gantoine](https://github.com/gantoine))
@ -33,12 +127,14 @@
- Added advanced shader configuration support (Thanks to [@n-at](https://github.com/n-at))
# 4.0.11 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/cafd80d023afa9562c7054e89a4240f3381d64ff)
- Added the ability to disable localstorage using `EJS_disableLocalStorage`. (Thanks to [@n-at](https://github.com/n-at))
- Added the ability to trigger `EJS_emulator.displayMessage` with a duration. (Thanks to [@allancoding](https://github.com/allancoding))
- `EJS_emulator.gameManager.getState` now returns a Uint8Array instead of a promise.
- Fixed broken save states from the 4.0.10 release.
# 4.0.10 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/390605d2ab48db16c07c8fb4fc2815033af5c3a6)
- Fixed bug with duplicate control inputs.
- Fixed mobile settings menu positioning.
- Ability to load custom files into the wasm instance.
@ -53,6 +149,7 @@
- Fixed volume slider shadow. (Thanks to [@allancoding](https://github.com/allancoding))
# 4.0.9 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/ddb5c6092f12a63a46d74ea67e6469726665ebc2)
- Repository history rewrite - expect faster cloning times.
- Prevent Vice64 from creating cue files (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Chinese translation updated (Thanks to [@oyepriyansh](https://github.com/oyepriyansh))
@ -64,6 +161,7 @@
- Added legacy nintendo 64 cores for browsers that don't support webgl2.
# 4.0.8 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/f579eb4c080f612723fd6a119b02173cafb37503)
- Fixed typo in virtual gamepad dpad.
- Added updated desmume core.
- Fixed key mapping (Thanks to [@allancoding](https://github.com/allancoding))
@ -77,6 +175,7 @@
- Added c64 core.
# 4.0.7 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/f579eb4c080f612723fd6a119b02173cafb37503)
- Added rewind (Thanks to [@n-at](https://github.com/n-at))
- Added slowdown (Thanks to [@n-at](https://github.com/n-at))
- Fixed "zone" object in front of settings menu.
@ -94,6 +193,7 @@
- Use keycodes instead of labels (Thanks to [@allancoding](https://github.com/allancoding))
# 4.0.6 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5e338e7a888480cea331f6d4656bc8986a7d6b28)
- Fixed n64 on iOS safari
- virtual gamepads for atari2600, atari7800, lynx, jaguar, vb, 3do (Thanks to [@n-at](https://github.com/n-at))
- control buttons for gba, vb, 3do, atari2600, atari7800, lynx, jaguar (Thanks to [@n-at](https://github.com/n-at))
@ -101,6 +201,7 @@
- Added Fast Forward
# 4.0.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5307e6294ed9df5daabd6958b2b307bae01f59f1)
- Added `pcsx_rearmed` core
- Made `pcsx_rearmed` core the default `psx` core (better compatibility)
- Added `fbneo` core
@ -115,20 +216,25 @@
- Add ***highly beta*** psp core - see readme
# 4.0.4 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/41491a738cf92ef9cee7d53f323aa2ab9732c053)
- Fix cheats "x" button
- Optimize memory usage
- Added ability to set urls to blob/arraybuffer/uint8array if needed
# 4.0.3 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5219ab51227bc0fb60cbc7b60e476b0145c932c9)
- Remove RetroArch messages
- Center video at top
# 4.0.2 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/06fe386e780bb55ef6baa4fbc6addd486bee747a)
- Add link to RetroArch License on about page
- Fix gamepad support for legacy browsers
# 4.0.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/efbb9dd462ee0e4f2120a6947af312e02fcf657c)
Complete application re-write. Everything changed. Although some changes to note are:
- Optimization for smaller screens.
- No more dead code.
- Fix Gamepad for firefox.
@ -139,10 +245,12 @@ Complete application re-write. Everything changed. Although some changes to note
And much much more was changed...
# 3.1.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/f7fa5d41487a424233b40e903020455606d68fee)
- Fixed iOS bug for iPads
- Added netplay! (only working on old cores)
# 3.1.0 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/614f5cb55e2768199ba05b756b47d0ab7ab283fd)
- Added ability to drag and drop save states.
- Fixed some "update" and "cancel" and "close" button confustion
- Removed save state retroarch messages
@ -150,6 +258,7 @@ And much much more was changed...
- (Theoretically) fixed a bug that did not allow iOS devices to work
# 3.0.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/44c31371fb3c314cd8dea36ccbaad89fb3ab98e6)
- Fixed screen recording on devices that do not support getUserMedia api.
- Added C label buttons to nintendo 64 virtual gamepad.
- Fixed EJS_color bug.
@ -167,63 +276,79 @@ And much much more was changed...
- Added feature that will display the current downloaded size when the content length is not available.
# 2.3.9 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/088942083e44510f07133f2074a2d63a8af477cd)
- Fixed incorrect variable referencing when update bios download data callback.
- Fixed rom storage size limits.
- Fixed download percent not showing with some files.
# 2.3.8 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5f176b963e4b2055983b82396378d1e3837a69c4)
- Remove broken shader.
- Add download percent message.
- Fixed UI "saving state" message not going away.
# 2.3.7 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/8b9607becfe0aaad42b8b8486c7d379821b72125)
- Add more shaders.
- Add bold fontsize option to custom virtual gamepad settings.
- No longer set "normalOptions" from localization file.
# 2.3.6 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/b2919bc2c3d2d4c9fe3ab4f4486790a376b7acfe)
- Remove default control mappings for gamepads.
- Upgraded invalid character regex to catch more characters.
# 2.3.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/a5a9916aba041e75ee73815376ed4fd2e22701bd)
- Use regex to detect and replace invalid characters in filename/gamename settings.
# 2.3.4 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/45d982b6362cfd29cb2eda9721066e03893ba0d8)
- Add new arcade core.
- Fix patch file game id set bug.
# 2.3.4 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/45d982b6362cfd29cb2eda9721066e03893ba0d8)
- Add new arcade core.
# 2.3.3 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/11bddd5a4277aa04f80b941f05cc024b3de58bfc)
- Make version in loader.js reasonable.
- Created function to return the game id to prevent unnecessary data stored.
# 2.3.2 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/e9e017435f2c41c6c2b127024cc88ac51bdf04d9)
- Fix reference error.
- Fix bug in custom virtual gamepad processor where if value is set to 0 it will see that as the value being missing.
# 2.3.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/0fd6d58e2011fa1a39bd2e11ba3d2f17773f0961)
- Use let instead of var.
# 2.3.0 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/2fd0f545285151524262cc799efef6d996d7c6c1)
- Added ability to customize virtual gamepad UI.
- Fixed bug where shader is not set on start.
# 2.2.9 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/018c39d4065b866487f8f18ca88c9488eab69a6d)
- Added feature to save save files to indexeddb every 5 minutes.
# 2.2.8 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/9860d662d02b56417044cca11937448041d9cf43)
- Re-write gamepad handler.
# 2.2.7 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/c03d18990b6536c1503bba2c640dbc13db982bb3)
- Removed un-needed FS proxy functions.
# 2.2.6 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/fd71b5dfc2bd44d8e1f0e7c6c7b3ee1a1127a696)
- Added fps counter.
- Fixed gba core aspect.
# 2.2.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/4b444ec23918149a6052807d778af82f79883c01)
- Added ability to set custom control mappings.
- Added ability to set custom default volume value.
- Fixed gamepad axis as button, gamepad varaible compared to incorrect value.
@ -231,16 +356,19 @@ And much much more was changed...
- Added ability to set game url to other data types.
# 2.2.3 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/41eed05677b4927bd114613040bfe4572c92c4b4)
- Fixed rar unarchiving function reference.
- Updated rar header detection.
- Removed netplay.
# 2.2.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/19980deb12c3f0790176db6fc7b8b2de4069bf4e)
- Added core menu options for new cores.
- Added new mame2003 core.
- Added support for debug emscripten setting for new cores.
# 2.0.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/a72222c39a793c4ff470ebb2b71c04829fee4b5e)
- Control mapping for beta cores.
- Updated beta cores.
- Beta cores now the default option!
@ -248,25 +376,30 @@ And much much more was changed...
- Fixed save state for new n64 core.
# 1.2.2 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/8ab7bb3f49da373ed5d291c5f72039bbabf2fbc8)
- Moved virtual gamepad menu button to the top left as 3 lines.
- Added screen orientation lock.
- Added beta n64 core!
# 1.2.1 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/638658e6202fd39cb5c94bedcfa00ccdf8b25840)
- Updated beta core files.
# 1.1.6 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/fa153ba76791184d978f9fb8b69991b05b161bc8)
- Replaced axios module with custom script.
- Added pause/play for beta cores.
- Sepperated css into its own file.
- Renamed emu-min.js to emulator.min.js.
# 1.1.5 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/2767c635b8a6e05c57e054d2f9d01ae0c4ff6d47)
- Cleaned up fetch error function.
- Cleaned up virtual gamepad event listeners.
- Add code of conduct.
# 1.1.2 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/64731dd8219931155b4e698aa98dbf65c2120038)
- Fixed error where mame files were misnamed.
- Fixed bug where variable referenced was not defined in loader.js.
- Added .gitignore
@ -278,6 +411,7 @@ And much much more was changed...
- Update nodejs buffer module.
# 1.1.0 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/715ded4ae23c2135bc9a8b9b7599f12c905393b3)
- Added minify feature.
- Added emulatorjs logo.
- Added beta nds and gb core.
@ -285,6 +419,7 @@ And much much more was changed...
- Added volume setting and cheats to beta cores.
# 1.0 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/fde44b095bb89e299daaaa4c8d7deebc79019865)
- Official release of the beta cores.
- Ability to use beta cores in production.
- Ability to use the old emulatorjs netplay server.
@ -293,6 +428,7 @@ And much much more was changed...
- Fixed virtual gamepad bug where a function was referenced to as an array.
# 0.4.26 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/0709829a11266b6ab4bbbf3e61d6dd6d3c372133)
- Sepperated emulator.js file into 2 files.
- Added support for a custom netplay server.
- Fixed netplay room password input bug.
@ -307,6 +443,7 @@ And much much more was changed...
- Update webrtc adapter.
# 0.4.25 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/ef3200ef87bffe57241e05ae9646cc201142ec46)
- Moved load state on start from loader.js file to emulator.js file.
- Moved data path function from loader.js file to emulator.js file.
- Added ability to set custom path to data through `EJS_pathtodata` variable.
@ -322,6 +459,7 @@ And much much more was changed...
- Created official emulatorjs website.
# 0.4.24 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/73ff641616bcd10f088a004002183760832a1afc)
- Deobsfocuted emulator.js and loader.js files to the most of my extent.
- Added quick save/load hotkeys.
- Added ability to use gamepad axis as button.
@ -337,6 +475,7 @@ And much much more was changed...
- Updated n64 core.
# 0.4.23-07 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/83e148c82cbc8b4e835a808dcf84456975f82a7c)
- Removed not needed code.
- Added reset button to control settings.
- Added clear button to control settings.
@ -345,27 +484,33 @@ And much much more was changed...
- Fixed RAR unarchiving.
# 0.4.23-05 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/018c787ccf6daca58c863d38fff61910f33f98ec)
- No longer cache games with the protocols of `file:`, and `chrome-extension:`.
- Changed default keymappings.
- Added screen recording button.
# 0.4.23-04 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/6464bbedc1cd58c023cd66656540fc174aedde8b)
- Added mame2003, snes2002, snes2005, snes2010, and vbanext cores.
- Added asmjs for all supported cores.
# 0.4.23-03 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/c883f267e1e56ed6b6472b891f78704c6e4b4c17)
- Start loader.js deobsfocuting.
- Deobsfocute extractzip.js.
- Added `EJS_gameName`, the ability to change the file name of save states.
# 0.4.23-02 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5d97620b25a81e49c6ba313e586fb37a5ce66002)
- Start emulator.js deobsfocuting.
- Start emulator.js deobsfocuting.
# 0.4.23-01 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/42a7e129cfded266b72539e8d1b5978d5e4119d8)
- Added support for loading "blob:" urls.
- Added support for loading state on game start.
# 0.4.23 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/5f5cf5cbba29cfd772d525a4c73a4bc5ea26654c)
- Added update available message.
- Fixed a bug where the 'x' from the ad iframe was still visible on game start.
- Added a2600 and mame cores.
@ -373,9 +518,11 @@ And much much more was changed...
- Add rar extraction support.
# 0.4.19 [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/4fd22871663e5896bb5d0ce29a50ad508462387a)
- Added support for 32x, 3do, a7800, arcade, bluemsx, jaguar, lynx, ngp, pce, saturn, sega, segacd, and ws cores.
# Initial release [View Tree](https://github.com/EmulatorJS/EmulatorJS/tree/be2db16cba8bd85bf901cd89ca6de51414cea792)
- Support for unzipping zip files.
- Support for unzipping 7zip files.
- Support for vb, snes, psx, nes, nds, n64, gba, and gb systems. Only support for WASM.

View File

@ -2,10 +2,54 @@
There are several ways to contribute, be it directly to helping develop features for EmulatorJS, update the documentation, media assets or heading over to libretro and helping them develop the emulator cores that make the magic happen.
* EmulatorJS, take a look through the [issues](https://github.com/EmulatorJS/EmulatorJS/issues) on github and try to help out.
- EmulatorJS, take a look through the [issues](https://github.com/EmulatorJS/EmulatorJS/issues) on github and try to help out.
* Documentation [github page](https://github.com/EmulatorJS/emulatorjs.org).
- Documentation [github page](https://github.com/EmulatorJS/emulatorjs.org).
Just wanna donate? That'd help too!
[libretro](https://retroarch.com/index.php?page=donate)
[EmulatorJS](https://www.patreon.com/EmulatorJS)
Donate to: [EmulatorJS](https://www.patreon.com/EmulatorJS)
Donate to: [libretro](https://retroarch.com/index.php?page=donate)
## Project Scripts
The project has several scripts that can be used to help with updating and deploying the project.
### Build Script
Runs the build script, which will compresses the project in 7z and zip output in dist/ folder. Note: Make sure you have the compiled cores in the `data/cores` folder before running this script.
```bash
npm run build
```
### Update Script
Runs the update script, which updates dependencies and can change version number of project. It also will update the list of contributors.
```bash
npm run update # Just updates contributors list
npm run update -- --ejs_v=4.3.1 # Updates contributors list and sets version to 4.3.1
npm run update -- --deps=true # Updates contributors list and updates dependencies
npm run update -- --dev=true # Updates contributors list and enables dev mode
npm run update -- --dev=false # Updates contributors list and disables dev mode
```
## Attention Visual Studio Code Users
By default Visual Studio Code will apply formatting that is not consistent with the standard formatting used by this project.
Please disable the formatter *before* submitting a Pull Request.
The formatter can be disabled for this repo only (without affecting your own preferences) by creating a new file called `.vscode/settings.json` (if it doesn't already exist).
Add the following options to the settings.json file to disable the formatter while working on this repo:
```json
{
"diffEditor.ignoreTrimWhitespace": false,
"editor.formatOnPaste": false,
"editor.formatOnSave": false,
"editor.formatOnSaveMode": "modifications"
}
```

View File

@ -632,7 +632,7 @@ state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
EmulatorJS: RetroArch on the web
Copyright (C) 2023 Ethan O'Brien
Copyright (C) 2022-2024 Ethan O'Brien
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
EmulatorJS Copyright (C) 2023 Ethan O'Brien
EmulatorJS Copyright (C) 2023-2025 Ethan O'Brien
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

125
README.md
View File

@ -1,4 +1,3 @@
<div align = center>
<img width = 300 src = docs/Logo-light.png#gh-dark-mode-only>
@ -8,39 +7,30 @@
<br>
[![Badge License]][License]
Self-hosted **Javascript** emulation for various system.
Self-hosted **Javascript** emulation for various systems.
<br>
[![Button Website]][Website]
[![Button Website]][Website]
[![Button Usage]][Usage]<br>
[![Button Configurator]][Configurator]<br>
[![Button Demo]][Demo]
[![Button Legacy]][Legacy]
[![Button Contributors]][Contributors]
[![Button Demo]][Demo]<br>
[![Button Contributors]][Contributors]
Join our Discord server:
[![Join our Discord server!](https://invidget.switchblade.xyz/6akryGkETU)](https://discord.gg/6akryGkETU)
Or the Matrix server (#emulatorjs:matrix.emulatorjs.org):
<a href="https://matrix.to/#/#emulatorjs:matrix.emulatorjs.org" rel="noopener" target="_blank"><img src="https://matrix.to/img/matrix-badge.svg" alt="Chat on Matrix"></a>
</div>
<br>
> [!NOTE]
> **As of EmulatorJS version 4.0, this project is no longer a reverse-engineered version of the emulatorjs.com project. It is now a complete re-write.**
> **As of EmulatorJS version 4.0, this project is no longer a reverse-engineered version of the emulatorjs.com project. It is now a complete rewrite.**
> [!WARNING]
> As of version 4.0.9 cores and minified files are no longer included in the repository. You will need to get them separately. You can get the from [releases](https://github.com/EmulatorJS/EmulatorJS/releases) or the * new CDN (see [this](#CDN) for more info). There is also a new version system that we will be using. (read [here](#Versioning) for more info).
>
> The history of the project has been rewritten and force pushed. You will likely need to redo any active commits you have. Sorry for the inconvenience.
> As of version 4.0.9 cores and minified files are no longer included in the repository. You will need to get them separately. You can get it from [releases](https://github.com/EmulatorJS/EmulatorJS/releases) or the \* new CDN (see [this](#CDN) for more info). There is also a new version system that we will be using. (read [here](#Versioning) for more info).
> [!TIP]
> Cloning the repository is no longer recommended for production use. You should use [releases](https://github.com/EmulatorJS/EmulatorJS/releases) or the [CDN](https://cdn.emulatorjs.org/) instead.
@ -58,7 +48,6 @@ Or the Matrix server (#emulatorjs:matrix.emulatorjs.org):
<br>
### Issues
*If something doesn't work, please consider opening an* ***[Issue]*** <br>
@ -66,34 +55,74 @@ Or the Matrix server (#emulatorjs:matrix.emulatorjs.org):
<br>
### 3rd Party Projects
EmulatorJS itself is built to be a plugin, rather than an entire website. This is why there is no docker container of this project. However, there are several projects you can use that use EmulatorJS!
Looking for projects that integrate EmulatorJS? Check out https://emulatorjs.org/docs/3rd-party
<br>
### Versioning
There are 3 different version name that you need to be aware of:
There are three different version names that you need to be aware of:
1. **stable** - This will be the most stable version of the emulator both code and cores will be tested before release. It will be updated every time a new version is released on GitHub. This is the default version on the Demo.
2. **latest** - This will contain the latest code but use the stable cores. This will be updated every time the *main* branch is updated.
3. **nightly** - This will contain the latest code and the latest cores. The cores will be updated every day, so this is consiterd alpha.
3. **nightly** - This will contain the latest code and the latest cores. The cores will be updated every day, so this is considered alpha.
<br>
### CDN
There is a new CDN that you can use to get any version of the emulator. The cdn is `https://cdn.emulatorjs.org/`. You can use this to get the stable, latest, nightly and any other main version by setting your `EJS_pathtodata` to `https://cdn.emulatorjs.org/<version>/data/`.
### Extensions
**EmulatorJS provides a CDN** at `https://cdn.emulatorjs.org/`, allowing access to any version of the emulator.
**[GameLibrary]**
To use it, set `EJS_pathtodata` to `https://cdn.emulatorjs.org/<version>/data/`, replacing `<version>` with `stable`, `latest`, `nightly`, or another main release.
*A library overview for your **ROM** folder.*
Be sure to also update the `loader.js` path to:
`https://cdn.emulatorjs.org/<version>/data/loader.js`
<br>
### Development:
*Run a local server with:*
```
npm i
npm start
```
1. Open a terminal inthe root of the project.
2. Install the dependencies with:
```sh
npm i
```
3. Start the minification with:
```sh
node start
```
4. Open your browser and go to `http://localhost:8080/` to see the demo page.
<br>
**>>When reporting bugs, please specify that you are using the old version**
<br>
#### Minifying
Before pushing the script files onto your production server it is recommended to minify them to save on load times as well as bandwidth.
Read the [minifying](minify/README.md) documentation for more info.
<br>
#### Localization
If you want to help with localization, please check out the [localization](data/localization/README.md) documentation.
<br>
**>>When reporting bugs, please specify what version you are using**
<br>
<br>
@ -128,7 +157,7 @@ npm start
**[Saturn][Sega Saturn]**|
**[32X][Sega 32X]**|
**[CD][Sega CD]**
<br>
<br>
@ -157,36 +186,40 @@ npm start
<br>
### Other
**[PlayStation]**|
**[Arcade]**|
**[3DO]**
**[PlayStation]**|
**[PlayStation Portable]**|
**[Arcade]**
**[3DO]** |
**[MAME 2003]** |
**[ColecoVision]**
</div>
<br>
## Star History
<a href="https://star-history.com/#EmulatorJS/EmulatorJS&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date" />
</picture>
</a>
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[License]: LICENSE
[Issue]: https://github.com/ethanaobrien/emulatorjs/issues
[patreon]: https://patreon.com/EmulatorJS
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Extensions 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[GameLibrary]: https://github.com/Ramaerel/emulatorjs-GameLibrary
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Quicklinks 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[Configurator]: https://emulatorjs.org/editor
[Contributors]: docs/Contributors.md
[Contributors]: docs/contributors.md
[Website]: https://emulatorjs.org/
[Legacy]: https://coldcast.org/games/1/Super-Mario-Bros
[Usage]: https://emulatorjs.org/docs/
[Demo]: https://demo.emulatorjs.org/
@ -221,6 +254,7 @@ npm start
[Neo Geo Poket]: https://emulatorjs.org/systems/Neo%20Geo%20Pocket
--->
[PlayStation]: https://emulatorjs.org/docs/systems/playstation
[PlayStation Portable]: https://emulatorjs.org/docs/systems/psp
[Virtual Boy]: https://emulatorjs.org/docs/systems/virtual-boy
[Arcade]: https://emulatorjs.org/docs/systems/arcade
[3DO]: https://emulatorjs.org/docs/systems/3do
@ -239,10 +273,9 @@ npm start
[Badge License]: https://img.shields.io/badge/License-GPLv3-blue.svg?style=for-the-badge
[Button Configurator]: https://img.shields.io/badge/Configurator-992cb3?style=for-the-badge
[Button Configurator]: https://img.shields.io/badge/Code%20Generator-992cb3?style=for-the-badge
[Button Contributors]: https://img.shields.io/badge/Contributors-54b7dd?style=for-the-badge
[Button Website]: https://img.shields.io/badge/Website-736e9b?style=for-the-badge
[Button Legacy]: https://img.shields.io/badge/Legacy-ab910b?style=for-the-badge
[Button Usage]: https://img.shields.io/badge/Usage-2478b5?style=for-the-badge
[Button Demo]: https://img.shields.io/badge/Demo-528116?style=for-the-badge
[Button Beta]: https://img.shields.io/badge/Beta-bb044f?style=for-the-badge

183
build.js Normal file
View File

@ -0,0 +1,183 @@
import fs from 'fs';
import path from 'path';
import Seven from 'node-7z';
let version;
try {
const packageJsonPath = path.resolve('package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
version = packageJson.version;
} catch(error) {
console.error("Error reading version from package.json:", error.message);
process.exit(1);
}
const args = process.argv.slice(2);
const npmArg = args.find(arg => arg.startsWith('--npm='));
const build_type = npmArg ? npmArg.split('=')[1] : process.env.npm;
if (!build_type) {
const progressData = {
'7z': 0,
'zip': 0
};
const progressInterval = setInterval(() => {
process.stdout.clearLine();
process.stdout.cursorTo(0);
if (progressData['7z'] < 100 && progressData['zip'] < 100) {
process.stdout.write(`7z Progress: ${progressData['7z']}% | Zip Progress: ${progressData['zip']}%`);
} else if (progressData['7z'] === 100) {
console.log(`${version}.7z created successfully!`);
process.stdout.write(`Zip Progress: ${progressData['zip']}%`);
progressData['7z'] = 101;
} else if (progressData['zip'] === 100) {
console.log(`${version}.zip created successfully!`);
process.stdout.write(`7z Progress: ${progressData['7z']}%`);
progressData['zip'] = 101;
} else if (progressData['zip'] >= 100 && progressData['7z'] >= 100) {
process.stdout.write(`All archives for EmulatorJS version: ${version} created successfully!`);
clearInterval(progressInterval);
console.log('\nArchives are in the dist/ folder.');
} else if (progressData['7z'] >= 100) {
process.stdout.write(`Zip Progress: ${progressData['zip']}%`);
} else if (progressData['zip'] >= 100) {
process.stdout.write(`7z Progress: ${progressData['7z']}%`);
}
}, 100);
console.log(`Creating archives for EmulatorJS version: ${version}`);
const npmIgnorePath = path.resolve('.npmignore');
if (!fs.existsSync('dist')) {
fs.mkdirSync('dist');
}
const distNpmIgnorePath = path.resolve('dist', '.ignore');
fs.copyFileSync(npmIgnorePath, distNpmIgnorePath);
const npmIgnoreContent = fs.readFileSync(npmIgnorePath, 'utf8');
const updatedNpmIgnoreContent = npmIgnoreContent.replace('data/cores/*', 'data/cores/core-README.md\ndata/cores/package.json');
fs.writeFileSync(distNpmIgnorePath, updatedNpmIgnoreContent, 'utf8');
Seven.add(`dist/${version}.7z`, './', {
$raw: ['-xr@dist/.ignore'],
$progress: true
}).on('progress', function (progress) {
progressData['7z'] = progress.percent;
}).on('end', function() {
progressData['7z'] = 100;
});
Seven.add(`dist/${version}.zip`, './', {
$raw: ['-xr@dist/.ignore'],
$progress: true
}).on('progress', function (progress) {
progressData['zip'] = progress.percent;
}).on('end', function() {
progressData['zip'] = 100;
});
} else if (build_type !== "emulatorjs" && build_type !== "cores" && build_type !== "get-cores") {
console.log("Invalid argument. Use --npm=emulatorjs, --npm=cores or --npm=get-cores.");
process.exit(1);
} else {
const removeLogo = () => {
const readmePath = path.resolve('README.md');
const readmeContent = fs.readFileSync(readmePath, 'utf8');
const updatedContent = readmeContent
.split('\n')
.filter(line => !line.includes('docs/Logo-light.png#gh-dark-mode-only>'))
.join('\n');
fs.writeFileSync(readmePath, updatedContent, 'utf8');
};
const getCores = async () => {
const coresJsonPath = path.resolve('data', 'cores', 'cores.json');
if (!fs.existsSync(coresJsonPath)) {
console.error(`Cores JSON file not found at ${coresJsonPath}`);
return;
}
return JSON.parse(fs.readFileSync(coresJsonPath, 'utf8'));
};
if (build_type === "emulatorjs") {
console.log(`Current EmulatorJS Version: ${version}`);
removeLogo();
console.log("Ready to build EmulatorJS!");
} else if (build_type === "get-cores") {
const cores = await getCores();
console.log(JSON.stringify(cores.map(coreName => coreName.name)));
} else if (build_type === "cores") {
console.log(`Current EmulatorJS Version: ${version}`);
console.log("Building cores...");
const allCores = await getCores();
console.log("Building EmulatorJS cores:");
const coreNames = allCores.map(coreName => coreName.name);
console.log(coreNames.join(', '));
if (!coreNames) {
console.error("No cores found.");
process.exit(1);
}
const coresPath = path.resolve('data', 'cores');
const coresFiles = fs.readdirSync(coresPath);
const dataFiles = coresFiles.filter(file => file.endsWith('.data') || file.endsWith('.zip'));
const cores = {};
for (const core of coreNames) {
const coreFiles = dataFiles.filter(file => file.startsWith(core + '-'));
if (!cores[core]) {
cores[core] = [];
}
cores[core].push(...coreFiles);
}
const packagePath = path.resolve('data', 'cores', 'package.json');
const packageContent = fs.readFileSync(packagePath, 'utf8');
const packageJson = JSON.parse(packageContent);
packageJson.dependencies = {
"@emulatorjs/emulatorjs": "latest"
};
fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 4), 'utf8');
for (const core in cores) {
if (!fs.existsSync(path.resolve('data', 'cores', core))) {
fs.mkdirSync(path.resolve('data', 'cores', core));
}
for (const file of cores[core]) {
const sourcePath = path.resolve('data', 'cores', file);
const destPath = path.resolve('data', 'cores', core, file);
fs.copyFileSync(sourcePath, destPath);
const reportsPath = path.resolve('data', 'cores', core, 'reports');
if (!fs.existsSync(reportsPath)) {
fs.mkdirSync(reportsPath);
}
}
const coreReportPath = path.resolve('data', 'cores', 'reports', `${core}.json`);
const coreReportDestPath = path.resolve('data', 'cores', core, 'reports', `${core}.json`);
fs.copyFileSync(coreReportPath, coreReportDestPath);
const corePackagePath = path.resolve('data', 'cores', 'package.json');
const corePackageDestPath = path.resolve('data', 'cores', core, 'package.json');
const corePackageContent = fs.readFileSync(corePackagePath, 'utf8');
const corePackageJson = JSON.parse(corePackageContent);
corePackageJson.name = `@emulatorjs/core-${core}`;
corePackageJson.description = `EmulatorJS Core: ${core}`;
corePackageJson.license = allCores.find(c => c.name === core).license;
corePackageJson.repository.url = allCores.find(c => c.name === core).repo + '.git';
corePackageJson.bugs.url = allCores.find(c => c.name === core).repo + '/issues';
corePackageJson.dependencies = {
"@emulatorjs/emulatorjs": "latest"
};
fs.writeFileSync(corePackageDestPath, JSON.stringify(corePackageJson, null, 4), 'utf8');
const coreReadmePath = path.resolve('data', 'cores', 'core-README.md');
const coreReadmeDestPath = path.resolve('data', 'cores', core, 'README.md');
const coreReadmeContent = fs.readFileSync(coreReadmePath, 'utf8');
const updatedCoreReadmeContent = coreReadmeContent
.replace(/<!-- EJS_CORE_NAME -->/g, `${core}`)
.replace(/<!-- EJS_CORE_REPO -->/g, allCores.find(c => c.name === core).repo);
fs.writeFileSync(coreReadmeDestPath, updatedCoreReadmeContent, 'utf8');
packageJson.dependencies[`@emulatorjs/core-${core}`] = "latest";
fs.writeFileSync(packagePath, JSON.stringify(packageJson, null, 4), 'utf8');
}
console.log("EmulatorJS cores built successfully!");
console.log("Ready to build EmulatorJS!");
}
}

View File

@ -0,0 +1,11 @@
# Compression Libraries
<!-- ## Extract7z.js
## Extractzip.js -->
## Libunrar.js
Emscripten port of RARLab's open-source unrar library
Source: https://github.com/tnikolai2/libunrar-js

View File

@ -510,7 +510,7 @@ function ShowArcInfo(Flags) {
if (typeof process === 'object' && typeof require === 'function') { // NODE
module.exports = readRARContent
} else if (typeof define === 'function' && define.amd) { // AMD
define('readRARContent', [], function () { return readRARContent })
define('readRARContent', [], function() { return readRARContent })
} else if (typeof window === 'object') { // WEB
window['readRARContent'] = readRARContent
} else if (typeof importScripts === 'function') { // WORKER

3
data/cores/.npmignore Normal file
View File

@ -0,0 +1,3 @@
*
!README.md
!package.json

21
data/cores/README.md Normal file
View File

@ -0,0 +1,21 @@
# EmulatorJS Cores
This package contains the stable cores for EmulatorJS.
Lean more about EmulatorJS at https://emulatorjs.org
Cores are build using this repository:
https://github.com/EmulatorJS/build
## How to install
To install all cores, run the following command:
```bash
npm install @emulatorjs/cores
```
To install a specific core, run the following command:
```bash
npm install @emulatorjs/core-<core-name>
```

24
data/cores/core-README.md Normal file
View File

@ -0,0 +1,24 @@
# EmulatorJS Core: <!-- EJS_CORE_NAME -->
This package contains the stable EmulatorJS core: <!-- EJS_CORE_NAME -->
Lean more about EmulatorJS at https://emulatorjs.org
Core repository:
<!-- EJS_CORE_REPO -->
Core is build using this repository:
https://github.com/EmulatorJS/build
## How to install
To install core, run the following command:
```bash
npm install @emulatorjs/core-<!-- EJS_CORE_NAME -->
```
To install all cores, run the following command:
```bash
npm install @emulatorjs/cores
```

65
data/cores/package.json Normal file
View File

@ -0,0 +1,65 @@
{
"name": "@emulatorjs/cores",
"version": "4.2.3",
"type": "module",
"description": "EmulatorJS Cores",
"homepage": "https://emulatorjs.org",
"license": "GPL-3.0",
"repository": {
"type": "git",
"url": "https://github.com/EmulatorJS/EmulatorJS.git"
},
"bugs": {
"url": "https://github.com/EmulatorJS/EmulatorJS/issues"
},
"sideEffects": true,
"dependencies": {
"@emulatorjs/emulatorjs": "latest",
"@emulatorjs/core-81": "latest",
"@emulatorjs/core-mame2003": "latest",
"@emulatorjs/core-vice_x64": "latest",
"@emulatorjs/core-vice_x64sc": "latest",
"@emulatorjs/core-vice_x128": "latest",
"@emulatorjs/core-vice_xpet": "latest",
"@emulatorjs/core-vice_xplus4": "latest",
"@emulatorjs/core-vice_xvic": "latest",
"@emulatorjs/core-fceumm": "latest",
"@emulatorjs/core-nestopia": "latest",
"@emulatorjs/core-snes9x": "latest",
"@emulatorjs/core-gambatte": "latest",
"@emulatorjs/core-mgba": "latest",
"@emulatorjs/core-beetle_vb": "latest",
"@emulatorjs/core-mupen64plus_next": "latest",
"@emulatorjs/core-melonds": "latest",
"@emulatorjs/core-desmume2015": "latest",
"@emulatorjs/core-desmume": "latest",
"@emulatorjs/core-a5200": "latest",
"@emulatorjs/core-fbalpha2012_cps1": "latest",
"@emulatorjs/core-fbalpha2012_cps2": "latest",
"@emulatorjs/core-prosystem": "latest",
"@emulatorjs/core-stella2014": "latest",
"@emulatorjs/core-opera": "latest",
"@emulatorjs/core-genesis_plus_gx": "latest",
"@emulatorjs/core-yabause": "latest",
"@emulatorjs/core-handy": "latest",
"@emulatorjs/core-virtualjaguar": "latest",
"@emulatorjs/core-pcsx_rearmed": "latest",
"@emulatorjs/core-picodrive": "latest",
"@emulatorjs/core-fbneo": "latest",
"@emulatorjs/core-mednafen_psx_hw": "latest",
"@emulatorjs/core-mednafen_pce": "latest",
"@emulatorjs/core-mednafen_pcfx": "latest",
"@emulatorjs/core-mednafen_ngp": "latest",
"@emulatorjs/core-mednafen_wswan": "latest",
"@emulatorjs/core-gearcoleco": "latest",
"@emulatorjs/core-parallel_n64": "latest",
"@emulatorjs/core-mame2003_plus": "latest",
"@emulatorjs/core-puae": "latest",
"@emulatorjs/core-smsplus": "latest",
"@emulatorjs/core-fuse": "latest",
"@emulatorjs/core-cap32": "latest",
"@emulatorjs/core-crocods": "latest",
"@emulatorjs/core-prboom": "latest",
"@emulatorjs/core-ppsspp": "latest"
}
}

File diff suppressed because it is too large Load Diff

View File

@ -10,16 +10,15 @@
"compression.js"
];
const folderPath = (path) => path.substring(0, path.length - path.split('/').pop().length);
const folderPath = (path) => path.substring(0, path.length - path.split("/").pop().length);
let scriptPath = (typeof window.EJS_pathtodata === "string") ? window.EJS_pathtodata : folderPath((new URL(document.currentScript.src)).pathname);
if (!scriptPath.endsWith('/')) scriptPath+='/';
if (!scriptPath.endsWith("/")) scriptPath += "/";
//console.log(scriptPath);
function loadScript(file) {
return new Promise(function (resolve, reject) {
let script = document.createElement('script');
return new Promise(function(resolve) {
let script = document.createElement("script");
script.src = function() {
if ('undefined' != typeof EJS_paths && typeof EJS_paths[file] === 'string') {
if ("undefined" != typeof EJS_paths && typeof EJS_paths[file] === "string") {
return EJS_paths[file];
} else if (file.endsWith("emulator.min.js")) {
return scriptPath + file;
@ -34,15 +33,16 @@
document.head.appendChild(script);
})
}
function loadStyle(file) {
return new Promise(function(resolve, reject) {
let css = document.createElement('link');
css.rel = 'stylesheet';
return new Promise(function(resolve) {
let css = document.createElement("link");
css.rel = "stylesheet";
css.href = function() {
if ('undefined' != typeof EJS_paths && typeof EJS_paths[file] === 'string') {
if ("undefined" != typeof EJS_paths && typeof EJS_paths[file] === "string") {
return EJS_paths[file];
} else {
return scriptPath+file;
return scriptPath + file;
}
}();
css.onload = resolve;
@ -56,27 +56,27 @@
async function filesmissing(file) {
console.error("Failed to load " + file);
let minifiedFailed = file.includes(".min.") && !file.includes("socket");
console[minifiedFailed?"warn":"error"]("Failed to load " + file + " beacuse it's likly that the minified files are missing.\nTo fix this you have 3 options:\n1. You can download the zip from the latest release here: https://github.com/EmulatorJS/EmulatorJS/releases/latest - Stable\n2. You can download the zip from here: https://cdn.emulatorjs.org/latest/data/emulator.min.zip and extract it to the data/ folder. (easiest option) - Beta\n3. You can build the files by running `npm i && npm run build` in the data/minify folder. (hardest option) - Beta\nNote: you will probably need to do the same for the cores, extract them to the data/cores/ folder.");
console[minifiedFailed ? "warn" : "error"]("Failed to load " + file + " beacuse it's likly that the minified files are missing.\nTo fix this you have 3 options:\n1. You can download the zip from the latest release here: https://github.com/EmulatorJS/EmulatorJS/releases/latest - Stable\n2. You can download the zip from here: https://cdn.emulatorjs.org/latest/data/emulator.min.zip and extract it to the data/ folder. (easiest option) - Beta\n3. You can build the files by running `npm i && npm run build` in the data/minify folder. (hardest option) - Beta\nNote: you will probably need to do the same for the cores, extract them to the data/cores/ folder.");
if (minifiedFailed) {
console.log("Attempting to load non-minified files");
if (file === "emulator.min.js") {
for (let i=0; i<scripts.length; i++) {
for (let i = 0; i < scripts.length; i++) {
await loadScript(scripts[i]);
}
} else {
await loadStyle('emulator.css');
await loadStyle("emulator.css");
}
}
}
if (('undefined' != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX)) {
for (let i=0; i<scripts.length; i++) {
if (("undefined" != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX)) {
for (let i = 0; i < scripts.length; i++) {
await loadScript(scripts[i]);
}
await loadStyle('emulator.css');
await loadStyle("emulator.css");
} else {
await loadScript('emulator.min.js');
await loadStyle('emulator.min.css');
await loadScript("emulator.min.js");
await loadStyle("emulator.min.css");
}
const config = {};
config.gameUrl = window.EJS_gameUrl;
@ -104,6 +104,7 @@
config.gamePatchUrl = window.EJS_gamePatchUrl;
config.gameParentUrl = window.EJS_gameParentUrl;
config.netplayUrl = window.EJS_netplayServer;
config.netplayICEServers = window.EJS_netplayICEServers;
config.gameId = window.EJS_gameID;
config.backgroundImg = window.EJS_backgroundImage;
config.backgroundBlur = window.EJS_backgroundBlur;
@ -113,29 +114,77 @@
config.disableCue = window.EJS_disableCue;
config.startBtnName = window.EJS_startButtonName;
config.softLoad = window.EJS_softLoad;
config.screenRecording = window.EJS_screenRecording;
config.capture = window.EJS_screenCapture;
config.externalFiles = window.EJS_externalFiles;
config.dontExtractRom = window.EJS_dontExtractRom;
config.dontExtractBIOS = window.EJS_dontExtractBIOS;
config.disableDatabases = window.EJS_disableDatabases;
config.disableLocalStorage = window.EJS_disableLocalStorage;
config.forceLegacyCores = window.EJS_forceLegacyCores;
config.noAutoFocus = window.EJS_noAutoFocus;
config.videoRotation = window.EJS_videoRotation;
config.hideSettings = window.EJS_hideSettings;
config.browserMode = window.EJS_browserMode;
config.shaders = Object.assign({}, window.EJS_SHADERS, window.EJS_shaders ? window.EJS_shaders : {});
if (typeof window.EJS_language === "string" && window.EJS_language !== "en-US") {
config.fixedSaveInterval = window.EJS_fixedSaveInterval;
config.disableAutoUnload = window.EJS_disableAutoUnload;
config.disableBatchBootup = window.EJS_disableBatchBootup;
let systemLang;
try {
systemLang = Intl.DateTimeFormat().resolvedOptions().locale;
} catch(e) {} //Ignore
const defaultLangs = ["en", "en-US"];
const isDefaultLang = (lang) => defaultLangs.includes(lang);
if ((typeof window.EJS_language === "string" && !isDefaultLang(window.EJS_language)) || (systemLang && window.EJS_disableAutoLang !== false)) {
const language = window.EJS_language || systemLang;
const autoLang = !window.EJS_language && typeof systemLang === "string";
try {
let path;
if ('undefined' != typeof EJS_paths && typeof EJS_paths[window.EJS_language] === 'string') {
path = EJS_paths[window.EJS_language];
let languagePath;
let fallbackPath = false;
console.log("Loading language", language);
if ("undefined" != typeof EJS_paths && typeof EJS_paths[language] === "string") {
languagePath = EJS_paths[language];
} else {
path = scriptPath+"localization/"+window.EJS_language+".json";
languagePath = scriptPath + "localization/" + language + ".json";
if (language.includes("-") || language.includes("_")) {
fallbackPath = scriptPath + "localization/" + language.split(/[-_]/)[0] + ".json";
}
}
config.language = language;
let langJson = {};
let missingLang = false;
if (!isDefaultLang(language)) {
if (autoLang) {
try {
let languageJson = await fetch(languagePath);
if (!languageJson.ok) throw new Error(`Missing language file: ${languageJson.status}`);
langJson = JSON.parse(await languageJson.text());
if (fallbackPath) {
let fallbackJson = await fetch(fallbackPath);
missingLang = !fallbackJson.ok;
if (!fallbackJson.ok) throw new Error(`Missing language file: ${fallbackJson.status}`);
langJson = { ...JSON.parse(await fallbackJson.text()), ...langJson };
}
} catch(e) {
config.language = language.split(/[-_]/)[0];
console.warn("Failed to load language:", language + ",", "trying default language:", config.language);
if (!missingLang) {
langJson = JSON.parse(await (await fetch(fallbackPath)).text());
}
}
} else {
langJson = JSON.parse(await (await fetch(languagePath)).text());
}
config.langJson = langJson;
}
config.language = window.EJS_language;
config.langJson = JSON.parse(await (await fetch(path)).text());
} catch(e) {
config.langJson = {};
console.log("Missing language:", language, "!!");
delete config.language;
delete config.langJson;
}
}
window.EJS_emulator = new EmulatorJS(EJS_player, config);
window.EJS_adBlocked = (url, del) => window.EJS_emulator.adBlocked(url, del);
if (typeof window.EJS_ready === "function") {
@ -156,4 +205,8 @@
if (typeof window.EJS_onSaveSave === "function") {
window.EJS_emulator.on("saveSave", window.EJS_onSaveSave);
}
if (typeof window.EJS_onSaveUpdate === "function") {
window.EJS_emulator.on("saveUpdate", window.EJS_onSaveUpdate);
window.EJS_emulator.enableSaveUpdateEvent();
}
})();

View File

@ -0,0 +1,66 @@
# Localization
Supported languages
`en.json`: `en-US` - English (US)<br>
`pt.json`: `pt-BR` - Portuguese (Brazil)<br>
`es.json`: `es-419` - Spanish (Latin America)<br>
`el.json`: `el-GR` - Greek (Modern Greek)<br>
`ja.json`: `ja-JP` - Japanese (Japan)<br>
`zh.json`: `zh-CN` - Chinese (Simplified)<br>
`hi.json`: `hi-IN` - Hindi (India)<br>
`ar.json`: `ar-SA` - Arabic (Saudi Arabia)<br>
`jv.json`: `jv-ID` - Javanese (Indonesia)<br>
`bn.json`: `bn-BD` - Bengali (Bangladesh)<br>
`ru.json`: `ru-RU` - Russian (Russia)<br>
`de.json`: `de-DE` - German (Germany)<br>
`ko.json`: `ko-KR` - Korean (South Korea)<br>
`fr.json`: `fr-FR` - French (France)<br>
`it.json`: `it-IT` - Italian (Italy)<br>
`tr.json`: `tr-TR` - Turkish (Turkey)<br>
`fa.json`: `fa-AF` - Persian (Afghanistan)<br>
`ro.json`: `ro-RO` - Romanian (Romania)<br>
`vi.json`: `vi-VN` - Vietnamese (Vietnam)<br>
default: `en-US`
add the line to your code to use
```
EJS_language = ''; //language
```
If the language file is not found or there was an error fetching the file, the emulator will default to english.
## Credits
Translated for `es-419` originally by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) and updated by [@angelmarfil](https://github.com/angelmarfil) <br>
Translated for `el-GR` by [@imneckro](https://github.com/imneckro) <br>
Translated for `pt-BR` by [@zmarteline](https://github.com/zmarteline)<br>
Translated for `zh-CN` by [@eric183](https://github.com/eric183)<br>
Translated for `it-IT` by [@IvanMazzoli](https://github.com/IvanMazzoli) <br>
Translated for `tr-TR` by [@iGoodie](https://github.com/iGoodie) <br>
Translated for `fa-AF` by [@rezamohdev](https://github.com/rezamohdev) <br>
Translated for `fr-FR` by [@t3chnob0y](https://github.com/t3chnob0y) <br>
Translated for `ro-RO` by [@jurcaalexandrucristian](https://github.com/jurcaalexandrucristian) <br>
Translated for `ja-JP` by [@noel-forester](https://github.com/noel-forester) <br>
Translated for `vi-VN` by [@TimKieu](https://github.com/TimKieu) <br>
Translated for `hi-IN`, `ar-SA`, `jv-iD`, `bn-BD`, `ru-RU`, `de-DE`, `ko-KR` by [@allancoding](https://github.com/allancoding), using a translate application <br>
## Contributing
To contribute, please download the default `en-US.json` language file to use as a template, translate the strings and then submit the file with a Pull Request or Issue.
The EmulatorJS team will review and add your changes.
As of version `4.2.2` it will default to the system language.
The `retroarch.json` are all the setting names for the menu. You can set `EJS_settingsLanguage` to `true` to see the missing retroarch settings names for the current language. You can translate them and add the to the language file.
The control mapping translations for controllers are diffrent for each controller. They will need to be added to the language file if they are not in the default `en-US.json` file.
You can also use the [Translation Helper](https://emulatorjs.org/translate) tool to help you translate the file.
Please contribute!!
Enything that is incorrect or needs to be fix please perform a pull request!

View File

@ -1,529 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<title>EmulatorJS | Translate Languages</title>
<link
rel="icon"
type="image/png"
href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAb1BMVEVHcEwJNVMBkbwDi7cJNVMJNVMIN1UAlsIGZIcAlcEBs+kJNVMDn9EHVXYEc5kJNVMEgasFdZ0HUnMBk78EdZ0GfacFaIwHW3wINVMJNVMJNVMGYoUJNVMEeJ4JNVMDgakJNVMChwAAl8QCpNcCh7CQzQKfAAAAIXRSTlMAEvv+Py9y+L/2/Ev+q99H3s6R/u3+5r8hm82HYLpk+2GSUqJjAAAAgElEQVQY022PyQ6DMAxEHRM7KZCwdQG6ys3/f2MT1IMleLcZacZjgGOo6UjJpm/ruh3sJoy1XH03LmytgYAnBQbwItGfJVONg4gHP6U73FLWV3i8i5E+BuaXQ6Z1MbEYPAOxm8ZuXSiqCOZIKhGR/vkvjaU0oFPks7thu+mHz2l+F+sLcletMXIAAAAASUVORK5CYII="
/>
</head>
<body>
<div class="header">
<h1>Translate Languages</h1>
<img
style="width: 150px"
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAPkAAADjCAMAAABw3EJfAAAAQlBMVEUCFicBFSQHM1EAAAAINFIAAAAINFIAAAAINVMFYogCd54AAAAAkb4BhbAGTXAHQGAINVMAruQAufEAl8QJNVMAAABDiqgaAAAAEnRSTlMAEDtHZm2Ur9Hi5ent7/Ly8vMp07OrAAALHElEQVR42u2di5qjKgyAC1oLFAWr8/6vup+1KCggeAXczJ49O05p/SchShLi43GqAAAgzPPiK6j/X55DCAB4pCoAwLwoEGr1whEqcpgcfweNeOsgCBUwGfqOuvURngQ99KQe6IscRI3N2w2CIoVfq23V7qODB7nFoXGOGO6EdH9VFeLcZvYwAXVzhAmhtP50X4PUn09dU0JwxSNn185uzjChtcSrkbquS6LFR3mc3B31ArSMTzX04U/4OTevCHWlHvFLzObsMXHzyl3ZU3g6hecIhuvP1VNlmK7EFpqvWAy+DqrcfCN2L5RM2MOb7hNDZ7tw/xSvuvmwbuknhs7wTti/Ga/4el4EhA6K47g17OF4OkXhfHfunp2Fp3Ygz3CO6ecYqRVfF4LaFZfOaP05TGqsOPmQwDk5kPt7javCsfhcUsNhhm4weQTC8OmHK3yu9usmO5AsHdHPOVKT0aFyePkUP+ZSZlK7ZPH51eDkc6bU1aXocDQ6VH9OFjKiFxeC49PBPx86fvzJV7cR/CSfbpnsp6JfDq5M9uIScPq5Sg5AB3BBxrUZx/Q6KZkUpVqWxRBDgTjnLW9tf6Q7t0u/lBOx/uGcI5TDQ1NhIYspag+2ZT4jYdeE8SBq7yDz1W3O25uIurq9g6XrV7eKxjlLUAxal8AZJiVNT0olRznM9dG5MUybVIWSara4HYJKVdmkLBRPojlwAKdN4jJEMPtbfXQb8KYhstLFyovdALxpsKR0McvJHcAbEdLgYDD2e6h8sHcOH4DfSeVNI5b1hZjmvLwJeVMJ8vxexj74OCTIq7uADxNduPb/5P/J/5OHueoiGFddgXxJb0ReYqkmlDPsDR8p+bQUtjtzcgPyEmsDa35hhbXkhJSOfw5cXU+F4ePJKXONcO5vRNjyaR5RtPjIsf3jaLLkeLJ9t9vLzNegx0ZO5J1McNjyKsHjNMlLbtizKRVakyTJK2PN55gYc1xobyTnFjmAnNjKgYYMET6B3FZ3ecStEbPWQQmtu8WVoiInC+XNhY/SoyKvFip8RRS1pYmR08Wav9zDvcdELowdLhac48TIq+VNDL8PZWmSFw7bSmha5Hy5lt0jXxIT+eI0Hyc6SYpcuHZwO/Lytjp3snaeJLm7h2t38XC2onIXcu14n+ldElx1grn7Ve03wpaCWCbHFZt/Me5KznXD3ePD8+4iLncyUji2InQ1ua1iGHqchCyO5KTSDYauTS5ECoLGRl5W+sHLKxaX9EvA5IT7fqq5Nh/HRI5dS9MNfS6W4vDBklsTCoZolFcKIlRyNaFQFLmaUNChS7sShhHcjO5MjnKdWC4wUDvAkRzrmiHKffZm2+0lU5dGQOnXVa0k32cDIHAjJ6aGAqMP46ZMw6SZmOT1cPjkYx5jbtWFpnGWtF1SM2LcqUGDJ8e2nabyXptuPqv9gq0jqtDJKbNusc29nf6AXgZOLlSOvK8aPimIEMnZUkIB+V5khxE0aPJycTt53q69oSdBk+PFeJtB6Xw5BVEFTV7ZZ7l5pjss3HnI5MKz5459qtw6q8DZRA+PXGyzgG7NXFq3djpgFqAL0No9QqyusRpdODpAnXskFG5InrTOb2jtDr7d38OJESH7duqRJne/quURXNUOvZNhQd/DLZfDQEM8Ol90DDjyFYupAwqKfMUyFLdCT5Wb+96KETzw9flCqSNAbi1iNHFZHEs0CnknFBZG0NAjkNaS5kIJQObdQ9q4Hb3QFkGHGW+vzAkFpEkoPGDROqQgWPhR50bu8weUjn2mJMvIbhwxKZ5xzy4VOrHcO+TaAY7ZJaI8iQP8UkWFJaEgIQ6PJlNGTDPJoWYUSTvZo4SU9GAOrCkIPh8xS6GnlEW29rbD8VQOEL46oeBUNBFwtYipTGZFCoKRuCqEKGaeq1H96pXjMrqqsFLH7pBQUCviypX1cKTSiTM50w53LoKkpJo+Zs1n4c4q4zbwCOpeaVl2T1okhLknFEg/wtaCIcKKX4cURGJ7Gu5b337fPQ30/54G2zxPk9wjBZHYfrX77tTDt92d6Z6CSG1HLl28ffXp3Brjzvt2KaHAmtTIiX21NqzUzui2kJsffHJEh43KFpQZwstubVWO66pyRD8ZYolHjXH1M7qqnN5JBxsTClLbfZoiOWXzuv5e4YORsbJJkVxqHNUlFL45CABhwZPvmDVPQSCkNElzBo+wMx6xfjRuDidnjHGH/9j+3RBt6KQ5mrwpXaXZX4wpCFY2x5NfK1q1ez5EJtJOt3TGznC5ylXG192Ylnh4ihJjmHh3do66lzctCenyCWsaWv/vYv6f/D/5ncjz+zxuSiFHN34eC7zZ04fokI0H3HexE7eUYxy3WHHXH7FI9S75rZQuYjtI3gNGbjTL+6RF0d7G3qkauB9SFIzcBVzkqfKxaDDpq/q4thcJC6kBESOpmjwl4+N7xvyc3F+NVZikJ/LDmpRNXjd57LvIVLh11Usc/Ebo8/2MN3nsvXY3I0yfHZla+kH1UUaJmTlHtlaGAOYFWhLpEnil8Elq1SqF2P22ab/heOOD689lMqZ1EXycJEGgU+6yqWZ3dGl77EXo5BJwFZ1eAY7ba8AVg+fkdO66ugxcRT97skslK+h0cLWN9Lno0sbVK8DVLZHsvMleY7cWOsei8/MtXi7OKq4CVxZ4/BS1ywrnxeNCkde2J6hdLo7i+eNSUda2jNRnKfwq32ZqdcDxcSZfK1VRF05xQzTnKJOvlSpAnocAPo3mHGHyNa3asCxdH8Tbm72myh78UBSuDeIxUtcHcYekcKF2rja3oPU+fq1yC6RdqfYcTRp7bDb6etpkRN3JEazJf4uQ6/3U3XIUJrc2bs1Xwtc1mXYWmT51JHj2tkXY09/VdI4d5AR3yFfwClM3+lpO9kbFbc7VcIaJVfk1JZhxfWbkEYtM/byS6Pg2uqG1EEpLUuKKGTuaFvARleT7JOlQAR7RifyErLWZbviIVOAGeLRHIuxaza8wex49tpSf9aNOAXugh8Vich6hbpdxQtQjPoCwe8qh2pa061TaPf4Qpgmt/gIAgEC0pei+u5g40wkQx4H6ssXjJurhnbUHJz/VHTS+WPtB8yGa177+5vLOxPFMfZn5OOgHGtQI3uKdgebg+LlAc7w/+Jyd5EurR+lHmf3FwIf8vZ384U3+B6YYu5K/VAEC6fm1ZJhlG3QOsuz5/nu/Xq/udzcaHug/6086gX7WvKXz6d68G9JjvMXh7iXSnJuTdx86vF7/4gnJfBZk47/X6bzX4RuIfxh+qnw73L+Kn2aq6p4GTQ4vmyv/pde5G/nfYeR/j9PJl3X+BHCLzgdTB1/zVg3+JJ33Nu+tc1n8yadgJj93pM4N4kO+QueT48BwbTtU54brze/UwSjB6xw8n68lctD7fzDjsuk221Xn7/11/jRfpU3Xc7Nvn+DtqPO//XW+D/nv1N+SQPn412j6v7fo/Clko86/79FdIJ6v5+uZWcmBfG/2PYfMw7f3qNn6+/b5LeoWndtvXc2Xbu1xH/LVvl17f75C53uSO+j89d6s8/frZ+yvbTp/D15dmC5QF6Gjb/9+XLZJ5w+wZa22u2+fuLcJkul6vkrn29bnu/v23cjH1egkJmNanz/FErGX13dFOZA/p2ETb51/3398n34BK5FnYmH76levw1pAnM779Xo+pDXCV57i+MrIhP4mJzN7Mv97OFNMxnI9Nzk/t+u5e0zGl9zzvt0ek9mTvLOuuYCvVX/NWCwRpG8nQ7LZbcMgw3GgxmEUozMckU9GrDSf8qpz9q18cP4+v+P/AIaTnnYxBPRwAAAAAElFTkSuQmCC"
/>
</div>
<br />
<div class="boxes">
<div class="box">
<button class="copyBtn" id="copyBtn1" onclick="copy('box1')">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
width="18px"
height="18px"
>
<path
d="M6 4V8H18V4H20.0066C20.5552 4 21 4.44495 21 4.9934V21.0066C21 21.5552 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5551 3 21.0066V4.9934C3 4.44476 3.44495 4 3.9934 4H6ZM8 2H16V6H8V2Z"
></path>
</svg>
</button>
<textarea id="box1" rows="39.5" cols="30" spellcheck="false"></textarea>
</div>
<div class="box">
<textarea
id="box2"
placeholder="Copy what is on the left into google translate or any other translation service, then translate it into the language you whant and paste the translation here."
rows="39.5"
cols="50"
spellcheck="false"
oninput="handleBox2Input()"
></textarea>
<button class="nextBtn" onclick="startc()">Next</button>
</div>
<div class="box">
<button class="copyBtn" id="copyBtn3" onclick="copy('box3')">
<svg
xmlns="http://www.w3.org/2000/svg"
viewBox="0 0 24 24"
fill="currentColor"
width="18px"
height="18px"
>
<path
d="M6 4V8H18V4H20.0066C20.5552 4 21 4.44495 21 4.9934V21.0066C21 21.5552 20.5551 22 20.0066 22H3.9934C3.44476 22 3 21.5551 3 21.0066V4.9934C3 4.44476 3.44495 4 3.9934 4H6ZM8 2H16V6H8V2Z"
></path>
</svg>
</button>
<textarea
id="box3"
placeholder="Then click next and you are done copy this box in to a .json file"
rows="39.5"
cols="50"
spellcheck="false"
></textarea>
</div>
</div>
</body>
<script type="text/javascript">
var data = {
"0": "-0",
"1": "-1",
"2": "-2",
"3": "-3",
"4": "-4",
"5": "-5",
"6": "-6",
"7": "-7",
"8": "-8",
"9": "-9",
"Restart": "-Restart",
"Pause": "-Pause",
"Play": "-Play",
"Save State": "-Save State",
"Load State": "-Load State",
"Control Settings": "-Control Settings",
"Cheats": "-Cheats",
"Cache Manager": "-Cache Manager",
"Export Save File": "-Export Save File",
"Import Save File": "-Import Save File",
"Netplay": "-Netplay",
"Mute": "-Mute",
"Unmute": "-Unmute",
"Settings": "-Settings",
"Enter Fullscreen": "-Enter Fullscreen",
"Exit Fullscreen": "-Exit Fullscreen",
"Context Menu": "-Context Menu",
"Reset": "-Reset",
"Clear": "-Clear",
"Close": "-Close",
"QUICK SAVE STATE": "-QUICK SAVE STATE",
"QUICK LOAD STATE": "-QUICK LOAD STATE",
"CHANGE STATE SLOT": "-CHANGE STATE SLOT",
"FAST FORWARD": "-FAST FORWARD",
"Player": "-Player",
"Connected Gamepad": "-Connected Gamepad",
"Gamepad": "-Gamepad",
"Keyboard": "-Keyboard",
"Set": "-Set",
"Add Cheat": "-Add Cheat",
"Note that some cheats require a restart to disable": "-Note that some cheats require a restart to disable",
"Create a Room": "-Create a Room",
"Rooms": "-Rooms",
"Start Game": "-Start Game",
"Click to resume Emulator": "-Click to resume Emulator",
"Drop save state here to load": "-Drop save state here to load",
"Loading...": "-Loading...",
"Download Game Core": "-Download Game Core",
"Outdated graphics driver": "-Outdated graphics driver",
"Decompress Game Core": "-Decompress Game Core",
"Download Game Data": "-Download Game Data",
"Decompress Game Data": "-Decompress Game Data",
"Shaders": "-Shaders",
"Disabled": "-Disabled",
"2xScaleHQ": "-2xScaleHQ",
"4xScaleHQ": "-4xScaleHQ",
"CRT easymode": "-CRT easymode",
"CRT aperture": "-CRT aperture",
"CRT geom": "-CRT geom",
"CRT mattias": "-CRT mattias",
"FPS": "-FPS",
"show": "-show",
"hide": "-hide",
"Fast Forward Ratio": "-Fast Forward Ratio",
"Fast Forward": "-Fast Forward",
"Enabled": "-Enabled",
"Save State Slot": "-Save State Slot",
"Save State Location": "-Save State Location",
"Download": "-Download",
"Keep in Browser": "-Keep in Browser",
"Auto": "-Auto",
"NTSC": "-NTSC",
"PAL": "-PAL",
"Dendy": "-Dendy",
"8:7 PAR": "-8:7 PAR",
"4:3": "-4:3",
"Low": "-Low",
"High": "-High",
"Very High": "-Very High",
"None": "-None",
"Player 1": "-Player 1",
"Player 2": "-Player 2",
"Both": "-Both",
"SAVED STATE TO SLOT": "-SAVED STATE TO SLOT",
"LOADED STATE FROM SLOT": "-LOADED STATE FROM SLOT",
"SET SAVE STATE SLOT TO": "-SET SAVE STATE SLOT TO",
"Network Error": "-Network Error",
"Submit": "-Submit",
"Description": "-Description",
"Code": "-Code",
"Add Cheat Code": "-Add Cheat Code",
"Leave Room": "-Leave Room",
"Password": "-Password",
"Password (optional)": "-Password (optional)",
"Max Players": "-Max Players",
"Room Name": "-Room Name",
"Join": "-Join",
"Player Name": "-Player Name",
"Set Player Name": "-Set Player Name",
"Left Handed Mode": "-Left Handed Mode",
"Virtual Gamepad": "-Virtual Gamepad",
"Disk": "-Disk",
"Press Keyboard": "-Press Keyboard",
"INSERT COIN": "-INSERT COIN",
"Remove": "-Remove",
"SAVE LOADED FROM BROWSER": "-SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "-SAVE SAVED TO BROWSER",
"Join the discord": "-Join the discord",
"View on GitHub": "-View on GitHub",
"Failed to start game": "-Failed to start game",
"Download Game BIOS": "-Download Game BIOS",
"Decompress Game BIOS": "-Decompress Game BIOS",
"Download Game Parent": "-Download Game Parent",
"Decompress Game Parent": "-Decompress Game Parent",
"Download Game Patch": "-Download Game Patch",
"Decompress Game Patch": "-Decompress Game Patch",
"Download Game State": "-Download Game State",
"Check console": "-Check console",
"Error for site owner": "-Error for site owner",
"EmulatorJS": "-EmulatorJS",
"Clear All": "-Clear All",
"Take Screenshot": "-Take Screenshot",
"Start screen recording": "-Start screen recording",
"Stop screen recording": "-Stop screen recording",
"Quick Save": "-Quick Save",
"Quick Load": "-Quick Load",
"REWIND": "-REWIND",
"Rewind Enabled (requires restart)": "-Rewind Enabled (requires restart)",
"Rewind Granularity": "-Rewind Granularity",
"Slow Motion Ratio": "-Slow Motion Ratio",
"Slow Motion": "-Slow Motion",
"Home": "-Home",
"EmulatorJS License": "-EmulatorJS License",
"RetroArch License": "-RetroArch License",
"This project is powered by": "-This project is powered by",
"View the RetroArch license here": "-View the RetroArch license here",
"SLOW MOTION": "-SLOW MOTION",
"A": "-A",
"B": "-B",
"SELECT": "-SELECT",
"START": "-START",
"UP": "-UP",
"DOWN": "-DOWN",
"LEFT": "-LEFT",
"RIGHT": "-RIGHT",
"X": "-X",
"Y": "-Y",
"L": "-L",
"R": "-R",
"Z": "-Z",
"STICK UP": "-STICK UP",
"STICK DOWN": "-STICK DOWN",
"STICK LEFT": "-STICK LEFT",
"STICK RIGHT": "-STICK RIGHT",
"C-PAD UP": "-C-PAD UP",
"C-PAD DOWN": "-C-PAD DOWN",
"C-PAD LEFT": "-C-PAD LEFT",
"C-PAD RIGHT": "-C-PAD RIGHT",
"MICROPHONE": "-MICROPHONE",
"BUTTON 1 / START": "-BUTTON 1 / START",
"BUTTON 2": "-BUTTON 2",
"BUTTON": "-BUTTON",
"LEFT D-PAD UP": "-LEFT D-PAD UP",
"LEFT D-PAD DOWN": "-LEFT D-PAD DOWN",
"LEFT D-PAD LEFT": "-LEFT D-PAD LEFT",
"LEFT D-PAD RIGHT": "-LEFT D-PAD RIGHT",
"RIGHT D-PAD UP": "-RIGHT D-PAD UP",
"RIGHT D-PAD DOWN": "-RIGHT D-PAD DOWN",
"RIGHT D-PAD LEFT": "-RIGHT D-PAD LEFT",
"RIGHT D-PAD RIGHT": "-RIGHT D-PAD RIGHT",
"C": "-C",
"MODE": "-MODE",
"FIRE": "-FIRE",
"RESET": "-RESET",
"LEFT DIFFICULTY A": "-LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "-LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "-RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "-RIGHT DIFFICULTY B",
"COLOR": "-COLOR",
"B/W": "-B/W",
"PAUSE": "-PAUSE",
"OPTION": "-OPTION",
"OPTION 1": "-OPTION 1",
"OPTION 2": "-OPTION 2",
"L2": "-L2",
"R2": "-R2",
"L3": "-L3",
"R3": "-R3",
"L STICK UP": "-L STICK UP",
"L STICK DOWN": "-L STICK DOWN",
"L STICK LEFT": "-L STICK LEFT",
"L STICK RIGHT": "-L STICK RIGHT",
"R STICK UP": "-R STICK UP",
"R STICK DOWN": "-R STICK DOWN",
"R STICK LEFT": "-R STICK LEFT",
"R STICK RIGHT": "-R STICK RIGHT",
"Start": "-Start",
"Select": "-Select",
"Fast": "-Fast",
"Slow": "-Slow",
"a": "-a",
"b": "-b",
"c": "-c",
"d": "-d",
"e": "-e",
"f": "-f",
"g": "-g",
"h": "-h",
"i": "-i",
"j": "-j",
"k": "-k",
"l": "-l",
"m": "-m",
"n": "-n",
"o": "-o",
"p": "-p",
"q": "-q",
"r": "-r",
"s": "-s",
"t": "-t",
"u": "-u",
"v": "-v",
"w": "-w",
"x": "-x",
"y": "-y",
"z": "-z",
"enter": "-enter",
"escape": "-escape",
"space": "-space",
"tab": "-tab",
"backspace": "-backspace",
"delete": "-delete",
"arrowup": "-arrowup",
"arrowdown": "-arrowdown",
"arrowleft": "-arrowleft",
"arrowright": "-arrowright",
"f1": "-f1",
"f2": "-f2",
"f3": "-f3",
"f4": "-f4",
"f5": "-f5",
"f6": "-f6",
"f7": "-f7",
"f8": "-f8",
"f9": "-f9",
"f10": "-f10",
"f11": "-f11",
"f12": "-f12",
"shift": "-shift",
"control": "-control",
"alt": "-alt",
"meta": "-meta",
"capslock": "-capslock",
"insert": "-insert",
"home": "-home",
"end": "-end",
"pageup": "-pageup",
"pagedown": "-pagedown",
"!": "-!",
"@": "-@",
"#": "-#",
"$": "-$",
"%": "-%",
"^": "-^",
"&": "-&",
"*": "-*",
"(": "-(",
")": "-)",
"-": "--",
"_": "-_",
"+": "-+",
"=": "-=",
"[": "-[",
"]": "-]",
"{": "-{",
"}": "-}",
";": "-;",
":": "-:",
"'": "-'",
"\"": "-\"",
",": "-,",
".": "-.",
"<": "-<",
">": "->",
"/": "-/",
"?": "-?",
"LEFT_STICK_X": "-LEFT_STICK_X",
"LEFT_STICK_Y": "-LEFT_STICK_Y",
"RIGHT_STICK_X": "-RIGHT_STICK_X",
"RIGHT_STICK_Y": "-RIGHT_STICK_Y",
"LEFT_TRIGGER": "-LEFT_TRIGGER",
"RIGHT_TRIGGER": "-RIGHT_TRIGGER",
"A_BUTTON": "-A_BUTTON",
"B_BUTTON": "-B_BUTTON",
"X_BUTTON": "-X_BUTTON",
"Y_BUTTON": "-Y_BUTTON",
"START_BUTTON": "-START_BUTTON",
"SELECT_BUTTON": "-SELECT_BUTTON",
"L1_BUTTON": "-L1_BUTTON",
"R1_BUTTON": "-R1_BUTTON",
"L2_BUTTON": "-L2_BUTTON",
"R2_BUTTON": "-R2_BUTTON",
"LEFT_THUMB_BUTTON": "-LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "-RIGHT_THUMB_BUTTON",
"DPAD_UP": "-DPAD_UP",
"DPAD_DOWN": "-DPAD_DOWN",
"DPAD_LEFT": "-DPAD_LEFT",
"DPAD_RIGHT": "-DPAD_RIGHT"
}
let data1 = '';
for (let i = 0; i < Object.keys(data).length; i++) {
data1 = data1+Object.keys(data)[i]+'\n';
}
data1 = data1.slice(0, -1);
document.getElementById('box1').value = data1;
function startc(){
var data2 = document.getElementById('box1').value;
var data3 = document.getElementById('box2').value;
var data4 = data2.split('\n').map(function(line){ return line.split(/\n/g);});
var data5 = data3.split('\n').map(function(line){ return line.split(/\n/g);});
var data6 = new Map();
for (var i = 0; i < data4.length; i++) {
data6.set(data4[i], data5[i]);
}
var data7 = {};
data6.forEach(function(value, key) {
data7[key] = value[0];
});
data7 = JSON.stringify(data7,null,4);
document.getElementById('box3').value = data7;
toggleCopyButton('box3','copyBtn3');
navigator.clipboard.writeText(document.getElementById('box3').value);
console.log(data7);
}
function toggleCopyButton(textareaId,buttonId) {
var textarea = document.getElementById(textareaId);
var button = document.getElementById(buttonId);
if (textarea.value.trim() !== '') {
button.style.display = 'block';
} else {
button.style.display = 'none';
}
}
function copy(textareaId) {
var textarea = document.getElementById(textareaId);
textarea.select();
document.execCommand('copy');
}
document.addEventListener('DOMContentLoaded',function() {
toggleCopyButton('box1','copyBtn1');
toggleCopyButton('box3','copyBtn3');
})
function handleBox2Input() {
var box2 = document.getElementById('box2');
var box3 = document.getElementById('box3');
var copyBtn3 = document.getElementById('copyBtn3');
if (!box2.value.trim()) {
box3.value = ''
copyBtn3.style.display = 'none'
}
}
</script>
<style>
:root {
--bg: #f6f5f2;
--color-primary: #09a0c1;
--color-secondary: #1ad6ff;
--success: #01b12d;
}
body {
background-color: var(--bg);
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue",
sans-serif;
}
.header {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
margin-bottom: 3rem;
}
.boxes {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
gap: 1rem;
}
textarea {
padding: 12px 20px;
border: 2px solid #ccc;
border-radius: 4px;
background-color: #f8f8f8;
height: 50vh;
font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI",
Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue",
sans-serif;
}
#box3:not(:placeholder-shown) {
color: var(--success);
}
textarea::placeholder {
font-size: 1rem;
}
textarea:focus-visible {
outline: 2px solid var(--color-primary);
}
.box {
position: relative;
}
button {
appearance: none;
background-color: var(--color-primary);
border: none;
border-radius: 0.5rem;
padding: 0.625rem 1.25rem;
color: #fff;
position: absolute;
cursor: pointer;
}
button:hover {
background-color: var(--color-secondary);
}
.nextBtn {
bottom: 1rem;
right: 1rem;
}
.copyBtn {
display: none;
top: 1rem;
right: 1rem;
}
</style>
</html>

View File

@ -1,301 +0,0 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Redémarrage",
"Pause": "Pause",
"Play": "Jouer",
"Save State": "Enregistrer l'état",
"Load State": "État de chargement",
"Control Settings": "Paramètres de contrôle",
"Cheats": "Astuces",
"Cache Manager": "Gestionnaire de cache",
"Export Save File": "Exporter le fichier de sauvegarde",
"Import Save File": "Importer le fichier de sauvegarde",
"Netplay": "Jeu en réseau",
"Mute": "Muet",
"Unmute": "Rétablir le son",
"Settings": "Paramètres",
"Enter Fullscreen": "Passer en mode plein écran",
"Exit Fullscreen": "Quitter le mode plein écran",
"Reset": "Réinitialiser",
"Clear": "Clair",
"Close": "Fermer",
"QUICK SAVE STATE": "ÉTAT DE SAUVEGARDE RAPIDE",
"QUICK LOAD STATE": "ÉTAT DE CHARGEMENT RAPIDE",
"CHANGE STATE SLOT": "CHANGER L'EMPLACEMENT D'ÉTAT",
"FAST FORWARD": "AVANCE RAPIDE",
"Player": "Joueur",
"Connected Gamepad": "Manette connectée",
"Gamepad": "Manette de jeu",
"Keyboard": "Clavier",
"Set": "Ensemble",
"Add Cheat": "Ajouter une triche",
"Create a Room": "Créer une pièce",
"Rooms": "Pièces",
"Start Game": "Démarrer jeu",
"Loading...": "Chargement...",
"Download Game Core": "Télécharger le noyau du jeu",
"Decompress Game Core": "Décompresser le noyau du jeu",
"Download Game Data": "Télécharger les données du jeu",
"Decompress Game Data": "Décompresser les données de jeu",
"Shaders": "Shaders",
"Disabled": "Désactivé",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "Mode facile CRT",
"CRT aperture": "Ouverture CRT",
"CRT geom": "géomètre CRT",
"CRT mattias": "Mattias CRT",
"FPS": "FPS",
"show": "montrer",
"hide": "cacher",
"Fast Forward Ratio": "Rapport d'avance rapide",
"Fast Forward": "Avance rapide",
"Enabled": "Activé",
"Save State Slot": "Enregistrer l'emplacement d'état",
"Save State Location": "Enregistrer l'emplacement de l'état",
"Download": "Télécharger",
"Keep in Browser": "Conserver dans le navigateur",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "COPAIN",
"Dendy": "Dendy",
"8:7 PAR": "PAR 8:7",
"4:3": "4:3",
"Low": "Faible",
"High": "Haut",
"Very High": "Très haut",
"None": "Aucun",
"Player 1": "Joueur 1",
"Player 2": "Joueur 2",
"Both": "Les deux",
"SAVED STATE TO SLOT": "ÉTAT SAUVEGARDÉ DANS L'EMPLACEMENT",
"LOADED STATE FROM SLOT": "ÉTAT CHARGÉ À PARTIR DE L'EMPLACEMENT",
"SET SAVE STATE SLOT TO": "SET SAVE STATE SLOT TO",
"Network Error": "Erreur réseau",
"Submit": "Soumettre",
"Description": "Description",
"Code": "Code",
"Add Cheat Code": "Ajouter un code de triche",
"Leave Room": "Quitter la pièce",
"Password": "Mot de passe",
"Password (optional)": "Mot de passe (facultatif)",
"Max Players": "Le maximum de joueurs",
"Room Name": "Nom de la salle",
"Join": "Rejoindre",
"Player Name": "Nom de joueur",
"Set Player Name": "Définir le nom du joueur",
"Left Handed Mode": "Mode gaucher",
"Virtual Gamepad": "Manette de jeu virtuelle",
"Disk": "Disque",
"Press Keyboard": "Appuyez sur le clavier",
"INSERT COIN": "INSÉRER UNE PIÈCE",
"Remove": "Retirer",
"SAVE LOADED FROM BROWSER": "ENREGISTRER CHARGÉ À PARTIR DU NAVIGATEUR",
"SAVE SAVED TO BROWSER": "ENREGISTRER ENREGISTRÉ DANS LE NAVIGATEUR",
"Join the discord": "Rejoignez la discorde",
"View on GitHub": "Afficher sur GitHub",
"Failed to start game": "Impossible de démarrer le jeu",
"Download Game BIOS": "Télécharger le BIOS du jeu",
"Decompress Game BIOS": "Décompresser le BIOS du jeu",
"Download Game Parent": "Télécharger le jeu Parent",
"Decompress Game Parent": "Décompresser le jeu parent",
"Download Game Patch": "Télécharger le patch du jeu",
"Decompress Game Patch": "Décompresser le patch du jeu",
"Download Game State": "Télécharger l'état du jeu",
"Check console": "Vérifier la console",
"Error for site owner": "Erreur pour le propriétaire du site",
"EmulatorJS": "EmulatorJS",
"Clear All": "Tout effacer",
"Take Screenshot": "Prendre une capture d'écran",
"Quick Save": "Sauvegarde rapide",
"Quick Load": "Chargement rapide",
"REWIND": "REMBOBINER",
"Rewind Enabled (requires restart)": "Rewind activé (nécessite un redémarrage)",
"Rewind Granularity": "Rembobiner la granularité",
"Slow Motion Ratio": "Rapport de ralenti",
"Slow Motion": "Ralenti",
"Home": "Maison",
"EmulatorJS License": "Licence EmulatorJS",
"RetroArch License": "Licence RetroArch",
"SLOW MOTION": "RALENTI",
"A": "UN",
"B": "B",
"SELECT": "SÉLECTIONNER",
"START": "COMMENCER",
"UP": "EN HAUT",
"DOWN": "VERS LE BAS",
"LEFT": "GAUCHE",
"RIGHT": "DROITE",
"X": "X",
"Y": "Oui",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "BÂTON VERS LE HAUT",
"STICK DOWN": "COLLER",
"STICK LEFT": "BÂTON GAUCHE",
"STICK RIGHT": "COLLEZ À DROITE",
"C-PAD UP": "C-PAD VERS LE HAUT",
"C-PAD DOWN": "C-PAD EN BAS",
"C-PAD LEFT": "C-PAD GAUCHE",
"C-PAD RIGHT": "C-PAD DROIT",
"MICROPHONE": "MICROPHONE",
"BUTTON 1 / START": "BOUTON 1 / DÉMARRER",
"BUTTON 2": "BOUTON 2",
"BUTTON": "BOUTON",
"LEFT D-PAD UP": "D-PAD GAUCHE HAUT",
"LEFT D-PAD DOWN": "D-PAD GAUCHE BAS",
"LEFT D-PAD LEFT": "D-PAD GAUCHE GAUCHE",
"LEFT D-PAD RIGHT": "D-PAD GAUCHE DROITE",
"RIGHT D-PAD UP": "D-PAD DROIT VERS LE HAUT",
"RIGHT D-PAD DOWN": "D-PAD DROIT BAS",
"RIGHT D-PAD LEFT": "D-PAD DROIT GAUCHE",
"RIGHT D-PAD RIGHT": "DROITE D-PAD DROITE",
"C": "C",
"MODE": "MODE",
"FIRE": "FEU",
"RESET": "RÉINITIALISER",
"LEFT DIFFICULTY A": "GAUCHE DIFFICULTÉ A",
"LEFT DIFFICULTY B": "GAUCHE DIFFICULTÉ B",
"RIGHT DIFFICULTY A": "BONNE DIFFICULTÉ A",
"RIGHT DIFFICULTY B": "DROITE DIFFICULTE B",
"COLOR": "COULEUR",
"B/W": "N/B",
"PAUSE": "PAUSE",
"OPTION": "OPTION",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L BÂTON VERS LE HAUT",
"L STICK DOWN": "L BÂTON VERS LE BAS",
"L STICK LEFT": "BÂTON L GAUCHE",
"L STICK RIGHT": "L BÂTON DROIT",
"R STICK UP": "R STICK UP",
"R STICK DOWN": "BÂTON R ENFONCÉ",
"R STICK LEFT": "R STICK GAUCHE",
"R STICK RIGHT": "BÂTON R DROIT",
"Start": "Commencer",
"Select": "Sélectionner",
"Fast": "Rapide",
"Slow": "Lent",
"a": "un",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "F",
"g": "g",
"h": "h",
"i": "je",
"j": "j",
"k": "k",
"l": "je",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "tu",
"v": "v",
"w": "w",
"x": "X",
"y": "y",
"z": "z",
"enter": "entrer",
"escape": "s'échapper",
"space": "espace",
"tab": "languette",
"backspace": "retour arrière",
"delete": "supprimer",
"arrowup": "flèche vers le haut",
"arrowdown": "flèche vers le bas",
"arrowleft": "flèche gauche",
"arrowright": "flèche droite",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "changement",
"control": "contrôle",
"alt": "autre",
"meta": "méta",
"capslock": "verrouillage des majuscules",
"insert": "insérer",
"home": "maison",
"end": "fin",
"pageup": "pageup",
"pagedown": "bas de page",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "LEFT_STICK_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "GÂCHETTE GAUCHE",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "UN BOUTON",
"B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "BOUTON START",
"SELECT_BUTTON": "SELECT_BUTTON",
"L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "اضغط على لوحة المفاتيح",
"INSERT COIN": "إدراج عملة",
"Remove": "يزيل",
"SAVE LOADED FROM BROWSER": "وفر محملًا من المتصفح",
"SAVE SAVED TO BROWSER": "تم الحفظ في المتصفح",
"LOADED STATE FROM BROWSER": "حالة تحميل من المتصفح",
"SAVED STATE TO BROWSER": "الحالة المحفوظة في المتصفح",
"Join the discord": "انضم إلى الفتنة",
"View on GitHub": "عرض على جيثب",
"Failed to start game": "فشل بدء اللعبة",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "কীবোর্ড টিপুন",
"INSERT COIN": "মুদ্রা প্রবেশ করান",
"Remove": "অপসারণ",
"SAVE LOADED FROM BROWSER": "ব্রাউজার থেকে লোড সংরক্ষণ করুন",
"SAVE SAVED TO BROWSER": "ব্রাউজারে সংরক্ষণ করুন",
"LOADED STATE FROM BROWSER": "ব্রাউজার থেকে লোড করা অবস্থা",
"SAVED STATE TO BROWSER": "রাষ্ট্র ব্রাউজারে সংরক্ষিত হয়",
"Join the discord": "বিরোধে যোগ দিন",
"View on GitHub": "GitHub এ দেখুন",
"Failed to start game": "খেলা শুরু করতে ব্যর্থ",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Taste drücken",
"INSERT COIN": "MÜNZE EINWERFEN",
"Remove": "Entfernen",
"SAVE LOADED FROM BROWSER": "SPEICHERSTAND VOM BROWSER GELADEN",
"SAVE SAVED TO BROWSER": "SPEICHERSTAND IM BROWSER GESPEICHERT",
"LOADED STATE FROM BROWSER": "GELADENER STATUS VOM BROWSER",
"SAVED STATE TO BROWSER": "STATUS IM BROWSER GESPEICHERT",
"Join the discord": "Treten Sie dem Discord bei",
"View on GitHub": "Auf GitHub ansehen",
"Failed to start game": "Das Spiel konnte nicht gestartet werden",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Πατήστε Πληκτρολόγιο",
"INSERT COIN": "ΕΙΣΑΓΕΤΕ ΝΟΜΙΣΜΑ",
"Remove": "Αφαιρώ",
"SAVE LOADED FROM BROWSER": "ΑΠΟΘΗΚΕΥΣΗ ΦΟΡΤΩΜΕΝΟΥ ΑΠΟ ΤΟ BROWSER",
"SAVE SAVED TO BROWSER": "ΑΠΟΘΗΚΕΥΣΗ ΑΠΟΘΗΚΕΥΤΗΚΕ ΣΤΟ BROWSER",
"LOADED STATE FROM BROWSER": "ΦΟΡΤΩΘΗΚΕ ΚΑΤΑΣΤΑΣΗ ΑΠΟ ΤΟ BROWSER",
"SAVED STATE TO BROWSER": "ΑΠΟΘΗΚΕΥΤΗΚΕ ΚΑΤΑΣΤΑΣΗ ΣΤΟ BROWSER",
"Join the discord": "Συμμετάσχετε στη διχόνοια",
"View on GitHub": "Προβολή στο GitHub",
"Failed to start game": "Απέτυχε η έναρξη του παιχνιδιού",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}
}

View File

@ -1,310 +1,339 @@
{
"0": "-0",
"1": "-1",
"2": "-2",
"3": "-3",
"4": "-4",
"5": "-5",
"6": "-6",
"7": "-7",
"8": "-8",
"9": "-9",
"Restart": "-Restart",
"Pause": "-Pause",
"Play": "-Play",
"Save State": "-Save State",
"Load State": "-Load State",
"Control Settings": "-Control Settings",
"Cheats": "-Cheats",
"Cache Manager": "-Cache Manager",
"Export Save File": "-Export Save File",
"Import Save File": "-Import Save File",
"Netplay": "-Netplay",
"Mute": "-Mute",
"Unmute": "-Unmute",
"Settings": "-Settings",
"Enter Fullscreen": "-Enter Fullscreen",
"Exit Fullscreen": "-Exit Fullscreen",
"Context Menu": "-Context Menu",
"Reset": "-Reset",
"Clear": "-Clear",
"Close": "-Close",
"QUICK SAVE STATE": "-QUICK SAVE STATE",
"QUICK LOAD STATE": "-QUICK LOAD STATE",
"CHANGE STATE SLOT": "-CHANGE STATE SLOT",
"FAST FORWARD": "-FAST FORWARD",
"Player": "-Player",
"Connected Gamepad": "-Connected Gamepad",
"Gamepad": "-Gamepad",
"Keyboard": "-Keyboard",
"Set": "-Set",
"Add Cheat": "-Add Cheat",
"Note that some cheats require a restart to disable": "-Note that some cheats require a restart to disable",
"Create a Room": "-Create a Room",
"Rooms": "-Rooms",
"Start Game": "-Start Game",
"Click to resume Emulator": "-Click to resume Emulator",
"Drop save state here to load": "-Drop save state here to load",
"Loading...": "-Loading...",
"Download Game Core": "-Download Game Core",
"Outdated graphics driver": "-Outdated graphics driver",
"Decompress Game Core": "-Decompress Game Core",
"Download Game Data": "-Download Game Data",
"Decompress Game Data": "-Decompress Game Data",
"Shaders": "-Shaders",
"Disabled": "-Disabled",
"2xScaleHQ": "-2xScaleHQ",
"4xScaleHQ": "-4xScaleHQ",
"CRT easymode": "-CRT easymode",
"CRT aperture": "-CRT aperture",
"CRT geom": "-CRT geom",
"CRT mattias": "-CRT mattias",
"FPS": "-FPS",
"show": "-show",
"hide": "-hide",
"Fast Forward Ratio": "-Fast Forward Ratio",
"Fast Forward": "-Fast Forward",
"Enabled": "-Enabled",
"Save State Slot": "-Save State Slot",
"Save State Location": "-Save State Location",
"Download": "-Download",
"Keep in Browser": "-Keep in Browser",
"Auto": "-Auto",
"NTSC": "-NTSC",
"PAL": "-PAL",
"Dendy": "-Dendy",
"8:7 PAR": "-8:7 PAR",
"4:3": "-4:3",
"Low": "-Low",
"High": "-High",
"Very High": "-Very High",
"None": "-None",
"Player 1": "-Player 1",
"Player 2": "-Player 2",
"Both": "-Both",
"SAVED STATE TO SLOT": "-SAVED STATE TO SLOT",
"LOADED STATE FROM SLOT": "-LOADED STATE FROM SLOT",
"SET SAVE STATE SLOT TO": "-SET SAVE STATE SLOT TO",
"Network Error": "-Network Error",
"Submit": "-Submit",
"Description": "-Description",
"Code": "-Code",
"Add Cheat Code": "-Add Cheat Code",
"Leave Room": "-Leave Room",
"Password": "-Password",
"Password (optional)": "-Password (optional)",
"Max Players": "-Max Players",
"Room Name": "-Room Name",
"Join": "-Join",
"Player Name": "-Player Name",
"Set Player Name": "-Set Player Name",
"Left Handed Mode": "-Left Handed Mode",
"Virtual Gamepad": "-Virtual Gamepad",
"Disk": "-Disk",
"Press Keyboard": "-Press Keyboard",
"INSERT COIN": "-INSERT COIN",
"Remove": "-Remove",
"SAVE LOADED FROM BROWSER": "-SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "-SAVE SAVED TO BROWSER",
"Join the discord": "-Join the discord",
"View on GitHub": "-View on GitHub",
"Failed to start game": "-Failed to start game",
"Download Game BIOS": "-Download Game BIOS",
"Decompress Game BIOS": "-Decompress Game BIOS",
"Download Game Parent": "-Download Game Parent",
"Decompress Game Parent": "-Decompress Game Parent",
"Download Game Patch": "-Download Game Patch",
"Decompress Game Patch": "-Decompress Game Patch",
"Download Game State": "-Download Game State",
"Check console": "-Check console",
"Error for site owner": "-Error for site owner",
"EmulatorJS": "-EmulatorJS",
"Clear All": "-Clear All",
"Take Screenshot": "-Take Screenshot",
"Start screen recording": "-Start screen recording",
"Stop screen recording": "-Stop screen recording",
"Quick Save": "-Quick Save",
"Quick Load": "-Quick Load",
"REWIND": "-REWIND",
"Rewind Enabled (requires restart)": "-Rewind Enabled (requires restart)",
"Rewind Granularity": "-Rewind Granularity",
"Slow Motion Ratio": "-Slow Motion Ratio",
"Slow Motion": "-Slow Motion",
"Home": "-Home",
"EmulatorJS License": "-EmulatorJS License",
"RetroArch License": "-RetroArch License",
"This project is powered by": "-This project is powered by",
"View the RetroArch license here": "-View the RetroArch license here",
"SLOW MOTION": "-SLOW MOTION",
"A": "-A",
"B": "-B",
"SELECT": "-SELECT",
"START": "-START",
"UP": "-UP",
"DOWN": "-DOWN",
"LEFT": "-LEFT",
"RIGHT": "-RIGHT",
"X": "-X",
"Y": "-Y",
"L": "-L",
"R": "-R",
"Z": "-Z",
"STICK UP": "-STICK UP",
"STICK DOWN": "-STICK DOWN",
"STICK LEFT": "-STICK LEFT",
"STICK RIGHT": "-STICK RIGHT",
"C-PAD UP": "-C-PAD UP",
"C-PAD DOWN": "-C-PAD DOWN",
"C-PAD LEFT": "-C-PAD LEFT",
"C-PAD RIGHT": "-C-PAD RIGHT",
"MICROPHONE": "-MICROPHONE",
"BUTTON 1 / START": "-BUTTON 1 / START",
"BUTTON 2": "-BUTTON 2",
"BUTTON": "-BUTTON",
"LEFT D-PAD UP": "-LEFT D-PAD UP",
"LEFT D-PAD DOWN": "-LEFT D-PAD DOWN",
"LEFT D-PAD LEFT": "-LEFT D-PAD LEFT",
"LEFT D-PAD RIGHT": "-LEFT D-PAD RIGHT",
"RIGHT D-PAD UP": "-RIGHT D-PAD UP",
"RIGHT D-PAD DOWN": "-RIGHT D-PAD DOWN",
"RIGHT D-PAD LEFT": "-RIGHT D-PAD LEFT",
"RIGHT D-PAD RIGHT": "-RIGHT D-PAD RIGHT",
"C": "-C",
"MODE": "-MODE",
"FIRE": "-FIRE",
"RESET": "-RESET",
"LEFT DIFFICULTY A": "-LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "-LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "-RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "-RIGHT DIFFICULTY B",
"COLOR": "-COLOR",
"B/W": "-B/W",
"PAUSE": "-PAUSE",
"OPTION": "-OPTION",
"OPTION 1": "-OPTION 1",
"OPTION 2": "-OPTION 2",
"L2": "-L2",
"R2": "-R2",
"L3": "-L3",
"R3": "-R3",
"L STICK UP": "-L STICK UP",
"L STICK DOWN": "-L STICK DOWN",
"L STICK LEFT": "-L STICK LEFT",
"L STICK RIGHT": "-L STICK RIGHT",
"R STICK UP": "-R STICK UP",
"R STICK DOWN": "-R STICK DOWN",
"R STICK LEFT": "-R STICK LEFT",
"R STICK RIGHT": "-R STICK RIGHT",
"Start": "-Start",
"Select": "-Select",
"Fast": "-Fast",
"Slow": "-Slow",
"a": "-a",
"b": "-b",
"c": "-c",
"d": "-d",
"e": "-e",
"f": "-f",
"g": "-g",
"h": "-h",
"i": "-i",
"j": "-j",
"k": "-k",
"l": "-l",
"m": "-m",
"n": "-n",
"o": "-o",
"p": "-p",
"q": "-q",
"r": "-r",
"s": "-s",
"t": "-t",
"u": "-u",
"v": "-v",
"w": "-w",
"x": "-x",
"y": "-y",
"z": "-z",
"enter": "-enter",
"escape": "-escape",
"space": "-space",
"tab": "-tab",
"backspace": "-backspace",
"delete": "-delete",
"arrowup": "-arrowup",
"arrowdown": "-arrowdown",
"arrowleft": "-arrowleft",
"arrowright": "-arrowright",
"f1": "-f1",
"f2": "-f2",
"f3": "-f3",
"f4": "-f4",
"f5": "-f5",
"f6": "-f6",
"f7": "-f7",
"f8": "-f8",
"f9": "-f9",
"f10": "-f10",
"f11": "-f11",
"f12": "-f12",
"shift": "-shift",
"control": "-control",
"alt": "-alt",
"meta": "-meta",
"capslock": "-capslock",
"insert": "-insert",
"home": "-home",
"end": "-end",
"pageup": "-pageup",
"pagedown": "-pagedown",
"!": "-!",
"@": "-@",
"#": "-#",
"$": "-$",
"%": "-%",
"^": "-^",
"&": "-&",
"*": "-*",
"(": "-(",
")": "-)",
"-": "--",
"_": "-_",
"+": "-+",
"=": "-=",
"[": "-[",
"]": "-]",
"{": "-{",
"}": "-}",
";": "-;",
":": "-:",
"'": "-'",
"\"": "-\"",
",": "-,",
".": "-.",
"<": "-<",
">": "->",
"/": "-/",
"?": "-?",
"LEFT_STICK_X": "-LEFT_STICK_X",
"LEFT_STICK_Y": "-LEFT_STICK_Y",
"RIGHT_STICK_X": "-RIGHT_STICK_X",
"RIGHT_STICK_Y": "-RIGHT_STICK_Y",
"LEFT_TRIGGER": "-LEFT_TRIGGER",
"RIGHT_TRIGGER": "-RIGHT_TRIGGER",
"A_BUTTON": "-A_BUTTON",
"B_BUTTON": "-B_BUTTON",
"X_BUTTON": "-X_BUTTON",
"Y_BUTTON": "-Y_BUTTON",
"START_BUTTON": "-START_BUTTON",
"SELECT_BUTTON": "-SELECT_BUTTON",
"L1_BUTTON": "-L1_BUTTON",
"R1_BUTTON": "-R1_BUTTON",
"L2_BUTTON": "-L2_BUTTON",
"R2_BUTTON": "-R2_BUTTON",
"LEFT_THUMB_BUTTON": "-LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "-RIGHT_THUMB_BUTTON",
"DPAD_UP": "-DPAD_UP",
"DPAD_DOWN": "-DPAD_DOWN",
"DPAD_LEFT": "-DPAD_LEFT",
"DPAD_RIGHT": "-DPAD_RIGHT"
}
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Restart",
"Pause": "Pause",
"Play": "Play",
"Save State": "Save State",
"Load State": "Load State",
"Control Settings": "Control Settings",
"Cheats": "Cheats",
"Cache Manager": "Cache Manager",
"Export Save File": "Export Save File",
"Import Save File": "Import Save File",
"Netplay": "Netplay",
"Mute": "Mute",
"Unmute": "Unmute",
"Settings": "Settings",
"Enter Fullscreen": "Enter Fullscreen",
"Exit Fullscreen": "Exit Fullscreen",
"Context Menu": "Context Menu",
"Reset": "Reset",
"Clear": "Clear",
"Close": "Close",
"QUICK SAVE STATE": "QUICK SAVE STATE",
"QUICK LOAD STATE": "QUICK LOAD STATE",
"CHANGE STATE SLOT": "CHANGE STATE SLOT",
"FAST FORWARD": "FAST FORWARD",
"Player": "Player",
"Connected Gamepad": "Connected Gamepad",
"Gamepad": "Gamepad",
"Keyboard": "Keyboard",
"Set": "Set",
"Add Cheat": "Add Cheat",
"Note that some cheats require a restart to disable": "Note that some cheats require a restart to disable",
"Create a Room": "Create a Room",
"Rooms": "Rooms",
"Start Game": "Start Game",
"Click to resume Emulator": "Click to resume Emulator",
"Drop save state here to load": "Drop save state here to load",
"Loading...": "Loading...",
"Download Game Core": "Download Game Core",
"Outdated graphics driver": "Outdated graphics driver",
"Decompress Game Core": "Decompress Game Core",
"Download Game Data": "Download Game Data",
"Decompress Game Data": "Decompress Game Data",
"Shaders": "Shaders",
"Disabled": "Disabled",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "show",
"hide": "hide",
"Fast Forward Ratio": "Fast Forward Ratio",
"Fast Forward": "Fast Forward",
"Enabled": "Enabled",
"Save State Slot": "Save State Slot",
"Save State Location": "Save State Location",
"Download": "Download",
"Keep in Browser": "Keep in Browser",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Low",
"High": "High",
"Very High": "Very High",
"None": "None",
"Player 1": "Player 1",
"Player 2": "Player 2",
"Both": "Both",
"SAVED STATE TO SLOT": "SAVED STATE TO SLOT",
"LOADED STATE FROM SLOT": "LOADED STATE FROM SLOT",
"SET SAVE STATE SLOT TO": "SET SAVE STATE SLOT TO",
"Network Error": "Network Error",
"Submit": "Submit",
"Description": "Description",
"Code": "Code",
"Add Cheat Code": "Add Cheat Code",
"Leave Room": "Leave Room",
"Password": "Password",
"Password (optional)": "Password (optional)",
"Max Players": "Max Players",
"Room Name": "Room Name",
"Join": "Join",
"Player Name": "Player Name",
"Set Player Name": "Set Player Name",
"Left Handed Mode": "Left Handed Mode",
"Virtual Gamepad": "Virtual Gamepad",
"Disk": "Disk",
"Press Keyboard": "Press Keyboard",
"INSERT COIN": "INSERT COIN",
"Remove": "Remove",
"LOADED STATE FROM BROWSER": "LOADED STATE FROM BROWSER",
"SAVED STATE TO BROWSER": "SAVED STATE TO BROWSER",
"Join the discord": "Join the discord",
"View on GitHub": "View on GitHub",
"Failed to start game": "Failed to start game",
"Download Game BIOS": "Download Game BIOS",
"Decompress Game BIOS": "Decompress Game BIOS",
"Download Game Parent": "Download Game Parent",
"Decompress Game Parent": "Decompress Game Parent",
"Download Game Patch": "Download Game Patch",
"Decompress Game Patch": "Decompress Game Patch",
"Download Game State": "Download Game State",
"Check console": "Check console",
"Error for site owner": "Error for site owner",
"EmulatorJS": "EmulatorJS",
"Clear All": "Clear All",
"Take Screenshot": "Take Screenshot",
"Start Screen Recording": "Start Screen Recording",
"Stop Screen Recording": "Stop Screen Recording",
"Quick Save": "Quick Save",
"Quick Load": "Quick Load",
"REWIND": "REWIND",
"Rewind Enabled (requires restart)": "Rewind Enabled (requires restart)",
"Rewind Granularity": "Rewind Granularity",
"Slow Motion Ratio": "Slow Motion Ratio",
"Slow Motion": "Slow Motion",
"Home": "Home",
"EmulatorJS License": "EmulatorJS License",
"RetroArch License": "RetroArch License",
"This project is powered by": "This project is powered by",
"View the RetroArch license here": "View the RetroArch license here",
"SLOW MOTION": "SLOW MOTION",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "UP",
"DOWN": "DOWN",
"LEFT": "LEFT",
"RIGHT": "RIGHT",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "STICK UP",
"STICK DOWN": "STICK DOWN",
"STICK LEFT": "STICK LEFT",
"STICK RIGHT": "STICK RIGHT",
"C-PAD UP": "C-PAD UP",
"C-PAD DOWN": "C-PAD DOWN",
"C-PAD LEFT": "C-PAD LEFT",
"C-PAD RIGHT": "C-PAD RIGHT",
"MICROPHONE": "MICROPHONE",
"BUTTON 1 / START": "BUTTON 1 / START",
"BUTTON 2": "BUTTON 2",
"BUTTON": "BUTTON",
"LEFT D-PAD UP": "LEFT D-PAD UP",
"LEFT D-PAD DOWN": "LEFT D-PAD DOWN",
"LEFT D-PAD LEFT": "LEFT D-PAD LEFT",
"LEFT D-PAD RIGHT": "LEFT D-PAD RIGHT",
"RIGHT D-PAD UP": "RIGHT D-PAD UP",
"RIGHT D-PAD DOWN": "RIGHT D-PAD DOWN",
"RIGHT D-PAD LEFT": "RIGHT D-PAD LEFT",
"RIGHT D-PAD RIGHT": "RIGHT D-PAD RIGHT",
"C": "C",
"MODE": "MODE",
"FIRE": "FIRE",
"RESET": "RESET",
"LEFT DIFFICULTY A": "LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "RIGHT DIFFICULTY B",
"COLOR": "COLOR",
"B/W": "B/W",
"PAUSE": "PAUSE",
"OPTION": "OPTION",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK UP",
"L STICK DOWN": "L STICK DOWN",
"L STICK LEFT": "L STICK LEFT",
"L STICK RIGHT": "L STICK RIGHT",
"R STICK UP": "R STICK UP",
"R STICK DOWN": "R STICK DOWN",
"R STICK LEFT": "R STICK LEFT",
"R STICK RIGHT": "R STICK RIGHT",
"Start": "Start",
"Select": "Select",
"Fast": "Fast",
"Slow": "Slow",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "enter",
"escape": "escape",
"space": "space",
"tab": "tab",
"backspace": "backspace",
"delete": "delete",
"arrowup": "arrowup",
"arrowdown": "arrowdown",
"arrowleft": "arrowleft",
"arrowright": "arrowright",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "shift",
"control": "control",
"alt": "alt",
"meta": "meta",
"capslock": "capslock",
"insert": "insert",
"home": "home",
"end": "end",
"pageup": "pageup",
"pagedown": "pagedown",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "LEFT_STICK_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "LEFT_TRIGGER",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "A_BUTTON",
"B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "START_BUTTON",
"SELECT_BUTTON": "SELECT_BUTTON",
"L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT",
"Disks": "Disks",
"Exit EmulatorJS": "Exit EmulatorJS",
"BUTTON_1": "BUTTON_1",
"BUTTON_2": "BUTTON_2",
"BUTTON_3": "BUTTON_3",
"BUTTON_4": "BUTTON_4",
"up arrow": "up arrow",
"down arrow": "down arrow",
"left arrow": "left arrow",
"right arrow": "right arrow",
"LEFT_TOP_SHOULDER": "LEFT_TOP_SHOULDER",
"RIGHT_TOP_SHOULDER": "RIGHT_TOP_SHOULDER",
"CRT beam": "CRT beam",
"CRT caligari": "CRT caligari",
"CRT lottes": "CRT lottes",
"CRT yeetron": "CRT yeetron",
"CRT zfast": "CRT zfast",
"SABR": "SABR",
"Bicubic": "Bicubic",
"Mix frames": "Mix frames",
"WebGL2": "WebGL2",
"Requires restart": "Requires restart",
"VSync": "VSync",
"Video Rotation": "Video Rotation",
"Rewind Enabled (Requires restart)": "Rewind Enabled (Requires restart)",
"System Save interval": "System Save interval",
"Menu Bar Button": "Menu Bar Button",
"visible": "visible",
"hidden": "hidden"
}

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Presionar Teclado",
"INSERT COIN": "INSERTE MONEDA",
"Remove": "Eliminar",
"SAVE LOADED FROM BROWSER": "GUARDAR CARGADO DESDE EL NAVEGADOR",
"SAVE SAVED TO BROWSER": "GUARDAR GUARDADO EN EL NAVEGADOR",
"LOADED STATE FROM BROWSER": "ESTADO CARGADO DESDE EL NAVEGADOR",
"SAVED STATE TO BROWSER": "ESTADO GUARDADO EN EL NAVEGADOR",
"Join the discord": "Únete al Discord",
"View on GitHub": "Ver en GitHub",
"Failed to start game": "Error al iniciar el juego",
@ -121,8 +121,8 @@
"EmulatorJS": "EmulatorJS",
"Clear All": "Limpiar todo",
"Take Screenshot": "Tomar Captura de Pantalla",
"Start screen recording": "Iniciar grabación de pantalla",
"Stop screen recording": "Detener grabación de pantalla",
"Start Screen Recording": "Iniciar grabación de pantalla",
"Stop Screen Recording": "Detener grabación de pantalla",
"Quick Save": "Guardado Rápido",
"Quick Load": "Carga Rápida",
"REWIND": "REBOBINAR",
@ -307,4 +307,4 @@
"DPAD_DOWN": "DPAD_ABAJO",
"DPAD_LEFT": "DPAD_IZQUIERDA",
"DPAD_RIGHT": "DPAD_DERECHO"
}
}

310
data/localization/fa.json Normal file
View File

@ -0,0 +1,310 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "راه اندازی مجدد",
"Pause": "مکث",
"Play": "بازی کردن",
"Save State": "ذخیره حالت",
"Load State": "بارگذاری حالت",
"Control Settings": "تنظیمات کنترل",
"Cheats": "تقلب ها",
"Cache Manager": "مدیریت کش",
"Export Save File": "صادر کردن یا ذخیره فایل",
"Import Save File": " وارد کردن فایل ذخیره شده",
"Netplay": "نت پلی",
"Mute": "بی صدا",
"Unmute": "باصدا کردن",
"Settings": "تنظیمات",
"Enter Fullscreen": "حالت تمام ضفحه",
"Exit Fullscreen": "خارج شدن از حالت تمام صفحه",
"Context Menu": "منوی زمینه",
"Reset": "بازنشانی کردن",
"Clear": "پاک کردن",
"Close": "بستن",
"QUICK SAVE STATE": "ذخیره سریع حالت",
"QUICK LOAD STATE": "بارگذاری سریع حالت",
"CHANGE STATE SLOT": "تغییر وضعیت اسلات",
"FAST FORWARD": "سریع به جلو",
"Player": "بازیکن",
"Connected Gamepad": "گیم پد وصل شده",
"Gamepad": "گیم پد",
"Keyboard": "صفحه کلید",
"Set": "تنظیم کنید",
"Add Cheat": "تقلب را اضافه کنید",
"Note that some cheats require a restart to disable": "توجه داشته باشید که برخی از تقلب ها برای غیرفعال کردن نیاز به راه اندازی مجدد دارند",
"Create a Room": "یک اتاق ایجاد کنید",
"Rooms": "اتاق ها",
"Start Game": "شروع بازی",
"Click to resume Emulator": "برای از سرگیری شبیه ساز کلیک کنید",
"Drop save state here to load": "حالت ذخیره را برای بارگیری اینجا رها کنید",
"Loading...": "در حال بارگیری...",
"Download Game Core": "دانلود بازی هسته",
"Outdated graphics driver": "درایور گرافیک قدیمی",
"Decompress Game Core": "هسته بازی را از حالت فشرده خارج کنید",
"Download Game Data": "دانلود دیتای بازی",
"Decompress Game Data": "دیتا های بازی را از حالت فشرده خارج کنید",
"Shaders": "سایه بان ها",
"Disabled": "از کار افتاده است",
"2xScaleHQ": "مقیاس دوبرابر کیفیت بالا",
"4xScaleHQ": "مقیاس ۴ برابر کیفیت بالا",
"CRT easymode": "CRT حالت آسان",
"CRT aperture": "دیافراگم CRT",
"CRT geom": "ژئوم CRT",
"CRT mattias": "CRT ماتیاس",
"FPS": "FPS",
"show": "نشان دادن",
"hide": "پنهان کردن",
"Fast Forward Ratio": "نسبت سریع به جلو",
"Fast Forward": "سریع به جلو",
"Enabled": "فعال شد",
"Save State Slot": "ذخیره حالت اسلات ",
"Save State Location": "ذخیره موقعیت حالت",
"Download": "دانلود کردن",
"Keep in Browser": "نگه داشتن در مرورگر",
"Auto": "خودکار",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "کم",
"High": "بالا",
"Very High": "بسیار بالا",
"None": "هیچ کدام",
"Player 1": "بازیکن 1",
"Player 2": "بازیکن 2",
"Both": "هر دو",
"SAVED STATE TO SLOT": "حالت ذخیره شده در اسلات",
"LOADED STATE FROM SLOT": "حالت لود شده از اسلات",
"SET SAVE STATE SLOT TO": "تنظیم کردن اسلات حالت ذخیره به",
"Network Error": "خطای شبکه",
"Submit": "ارسال کردن",
"Description": "توضیحات",
"Code": "کد",
"Add Cheat Code": "کد تقلب را اضافه کنید",
"Leave Room": "ترک کردن اتاق",
"Password": "رمز عبور",
"Password (optional)": "رمز عبور (اختیاری)",
"Max Players": "حداکثر بازیکنان",
"Room Name": "نام اتاق",
"Join": "پیوستن",
"Player Name": "نام بازیکن",
"Set Player Name": "نام بازیکن را تنظیم کنید",
"Left Handed Mode": "حالت چپ دست",
"Virtual Gamepad": "گیم پد مجازی",
"Disk": "دیسک",
"Press Keyboard": "صفحه کلید را فشار دهید",
"INSERT COIN": "سکه درج کنید",
"Remove": "حذف کردن",
"LOADED STATE FROM BROWSER": "وضعیت بارگیری شده از مرورگر",
"SAVED STATE TO BROWSER": "وضعیت در مرورگر ذخیره شد",
"Join the discord": "به دیسکورد discord بپیوندید",
"View on GitHub": "در GitHub مشاهده کنید",
"Failed to start game": "شروع بازی ناموفق بود",
"Download Game BIOS": "دانلود بایوس بازی",
"Decompress Game BIOS": "بایوس بازی را از حالت فشرده خارج کنید",
"Download Game Parent": "دانلود بازی پدر و مادر",
"Decompress Game Parent": "والد بازی را از حالت فشرده خارج کنید",
"Download Game Patch": "پچ بازی را دانلود کنید",
"Decompress Game Patch": "پچ بازی را از حالت فشرده خارج کنید",
"Download Game State": "وضعیت بازی را دانلود کنید",
"Check console": "کنسول را چک کنید",
"Error for site owner": "خطا برای صاحب سایت",
"EmulatorJS": "EmulatorJS",
"Clear All": "پاک کردن همه",
"Take Screenshot": "اسکرین شات بگیرید",
"Start Screen Recording": "شروع ضبط صفحه",
"Stop Screen Recording": "ضبط صفحه را متوقف کنید",
"Quick Save": "ذخیره سریع",
"Quick Load": "بارگذاری سریع",
"REWIND": "عقب",
"Rewind Enabled (requires restart)": "Rewind فعال شد (نیاز به راه اندازی مجدد)",
"Rewind Granularity": "دانه بندی به عقب",
"Slow Motion Ratio": "نسبت حرکت آهسته",
"Slow Motion": "حرکت آهسته",
"Home": "صفحه اصلی",
"EmulatorJS License": "مجوز EmulatorJS",
"RetroArch License": "مجوز RetroArch",
"This project is powered by": "این پروژه توسط",
"View the RetroArch license here": "مجوز RetroArch را اینجا ببینید",
"SLOW MOTION": "حرکت آهسته",
"A": "A",
"B": "B",
"SELECT": "انتخاب کردن",
"START": "شروع کردن",
"UP": "بالا",
"DOWN": "پایین",
"LEFT": "چپ",
"RIGHT": "راست",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "به بالا بچسب",
"STICK DOWN": "به پایین بچسب",
"STICK LEFT": "به سمت چپ بچسبید",
"STICK RIGHT": "به راست بچسب",
"C-PAD UP": "C-PAD بالا",
"C-PAD DOWN": "C-PAD پایین",
"C-PAD LEFT": "C-PAD سمت چپ",
"C-PAD RIGHT": "C-PAD راست",
"MICROPHONE": "میکروفون",
"BUTTON 1 / START": "دکمه 1 / شروع",
"BUTTON 2": "دکمه 2",
"BUTTON": "دکمه",
"LEFT D-PAD UP": "دی پد سمت چپ به بالا",
"LEFT D-PAD DOWN": "دی پد سمت چپ به پایین",
"LEFT D-PAD LEFT": "دی پد سمت چپ به چپ",
"LEFT D-PAD RIGHT": "دی پد سمت چپ به راست",
"RIGHT D-PAD UP": "دی پد سمت راست به بالا",
"RIGHT D-PAD DOWN": "دی پد سمت راست به پایین",
"RIGHT D-PAD LEFT": "دی پد سمت راست به چپ",
"RIGHT D-PAD RIGHT": "دی پد سمت راست به راست",
"C": "C",
"MODE": "حالت",
"FIRE": "آتش",
"RESET": "تنظیم مجدد",
"LEFT DIFFICULTY A": "سختی چپ A",
"LEFT DIFFICULTY B": "سختی چپ B",
"RIGHT DIFFICULTY A": "سختی راست A",
"RIGHT DIFFICULTY B": "سختی راست B",
"COLOR": "رنگ",
"B/W": "سیاه سفید",
"PAUSE": "مکث",
"OPTION": "گزینه",
"OPTION 1": "گزینه 1",
"OPTION 2": "گزینه 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L استیک بالا",
"L STICK DOWN": "L استیک پایین",
"L STICK LEFT": "L استیک چپ",
"L STICK RIGHT": "L استیک راست",
"R STICK UP": "R استیک بالا",
"R STICK DOWN": "R استیک پایین",
"R STICK LEFT": "R استیک چپ",
"R STICK RIGHT": "R استیک راست",
"Start": "شروع کنید",
"Select": "انتخاب کنید",
"Fast": "سریع",
"Slow": "آهسته",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "وارد شدن",
"escape": "Escape",
"space": "فاصله",
"tab": "tab",
"backspace": "بک اسپیس",
"delete": "حذف کنید",
"arrowup": "فلش رو به بالا",
"arrowdown": "فلش رو به پایین",
"arrowleft": "فلش به چپ",
"arrowright": "فلش به راست",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "shift شیفت",
"control": "کنترل ctrl",
"alt": "alt",
"meta": "meta",
"capslock": "کپس لاک",
"insert": "اینزرت insert",
"home": "home",
"end": "end",
"pageup": "Page up",
"pagedown": "Page down",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": "،",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "استیک چپ X",
"LEFT_STICK_Y": "استیک چپ Y",
"RIGHT_STICK_X": "استیک راست X",
"RIGHT_STICK_Y": "استیک راست Y",
"LEFT_TRIGGER": "تریگر سمت چپ",
"RIGHT_TRIGGER": "تریگر سمت راست",
"A_BUTTON": "A دکمه",
"B_BUTTON": "دکمه B",
"X_BUTTON": "X دکمه ",
"Y_BUTTON": "دکمه Y",
"START_BUTTON": "دکمه شروع",
"SELECT_BUTTON": "دکمه انتخاب",
"L1_BUTTON": "L1 دکمه",
"R1_BUTTON": "R1دکمه ",
"L2_BUTTON": "L2دکمه",
"R2_BUTTON": "R2 دکمه",
"LEFT_THUMB_BUTTON": "دکمه شصت جپ",
"RIGHT_THUMB_BUTTON": "دکمه شصت راست",
"DPAD_UP": "دی پد بالا",
"DPAD_DOWN": "دی پد پایین",
"DPAD_LEFT": "دی پد چپ",
"DPAD_RIGHT": "دی پد راست"
}

339
data/localization/fr.json Normal file
View File

@ -0,0 +1,339 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Redémarrer",
"Pause": "Mettre en pause",
"Play": "Jouer",
"Save State": "Enregistrer l'état",
"Load State": "Ouvrir un état",
"Control Settings": "Paramètres des contrôles",
"Cheats": "Triches",
"Cache Manager": "Gestionnaire du cache",
"Export Save File": "Exporter vers une sauvegarde",
"Import Save File": "Importer une sauvegarde",
"Netplay": "Jouer en ligne",
"Mute": "Désactiver le son",
"Unmute": "Réactiver le son",
"Settings": "Paramètres",
"Enter Fullscreen": "Passer en mode plein écran",
"Exit Fullscreen": "Quitter le mode plein écran",
"Context Menu": "Menu contextuel",
"Reset": "Réinitialiser",
"Clear": "Effacer",
"Close": "Fermer",
"QUICK SAVE STATE": "ENREGISTREMENT RAPIDE DE L'ÉTAT",
"QUICK LOAD STATE": "CHARGEMENT RAPIDE DE L'ÉTAT",
"CHANGE STATE SLOT": "CHANGER L'EMPLACEMENT DE L'ÉTAT",
"FAST FORWARD": "AVANCE RAPIDE",
"Player": "Joueur",
"Connected Gamepad": "Manette de jeu connectée",
"Gamepad": "Manette de jeu",
"Keyboard": "Clavier",
"Set": "Définir",
"Add Cheat": "Ajouter une triche",
"Note that some cheats require a restart to disable": "Notez que certaines triches nécessitent un redémarrage pour être désactivées",
"Create a Room": "Créer un salon",
"Rooms": "Salons",
"Start Game": "Démarrer le jeu",
"Click to resume Emulator": "Cliquez pour reprendre avec l'émulateur",
"Drop save state here to load": "Déposez un état enregistré ici pour le charger",
"Loading...": "Chargement...",
"Download Game Core": "Téléchargement du noyau pour le jeu...",
"Outdated graphics driver": "Pilote graphique obsolète",
"Decompress Game Core": "Décompression du noyau pour le jeu...",
"Download Game Data": "Téléchargement des données du jeu...",
"Decompress Game Data": "Décompression des données du jeu...",
"Shaders": "Shaders",
"Disabled": "Désactivé",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "Afficher",
"hide": "Masquer",
"Fast Forward Ratio": "Vitesse de l'avance rapide",
"Fast Forward": "Avance rapide",
"Enabled": "Activé",
"Save State Slot": "Emplacement de l'état",
"Save State Location": "Stockage des états",
"Download": "Télécharger",
"Keep in Browser": "Dans le navigateur",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Basse",
"High": "Élevée",
"Very High": "Très élevée",
"None": "Aucun",
"Player 1": "Joueur 1",
"Player 2": "Joueur 2",
"Both": "Les deux",
"SAVED STATE TO SLOT": "ÉTAT ENREGISTRÉ VERS L'EMPLACEMENT",
"LOADED STATE FROM SLOT": "ÉTAT CHARGÉ À PARTIR DE L'EMPLACEMENT",
"SET SAVE STATE SLOT TO": "DÉFINIR L'EMPLACEMENT DE L'ÉTAT ENREGISTRÉ À",
"Network Error": "Erreur réseau",
"Submit": "Soumettre",
"Description": "Description",
"Code": "Code",
"Add Cheat Code": "Ajouter un code de triche",
"Leave Room": "Sortir du salon",
"Password": "Mot de passe",
"Password (optional)": "Mot de passe (facultatif)",
"Max Players": "Nombre maximal de joueurs",
"Room Name": "Nom du salon",
"Join": "Rejoindre",
"Player Name": "Nom du joueur",
"Set Player Name": "Définir le nom du joueur",
"Left Handed Mode": "Mode gaucher",
"Virtual Gamepad": "Manette de jeu virtuelle",
"Disk": "Disque",
"Press Keyboard": "Appuyez sur le clavier",
"INSERT COIN": "INSÉRER UNE PIÈCE",
"Remove": "Retirer",
"LOADED STATE FROM BROWSER": "ÉTAT CHARGÉ À PARTIR DU NAVIGATEUR",
"SAVED STATE TO BROWSER": "ÉTAT ENREGISTRÉ DANS LE NAVIGATEUR",
"Join the discord": "Rejoindre le serveur Discord",
"View on GitHub": "Afficher sur GitHub",
"Failed to start game": "Échec au démarrage du jeu",
"Download Game BIOS": "Téléchargement du BIOS du jeu...",
"Decompress Game BIOS": "Décompression du BIOS du jeu...",
"Download Game Parent": "Téléchargement du jeu parent...",
"Decompress Game Parent": "Décompression du jeu parent...",
"Download Game Patch": "Téléchargement du correctif du jeu...",
"Decompress Game Patch": "Décompression du correctif du jeu...",
"Download Game State": "Téléchargement de l'état enregistré...",
"Check console": "Vérifier la console",
"Error for site owner": "Erreur pour le propriétaire du site",
"EmulatorJS": "EmulatorJS",
"Clear All": "Effacer tout",
"Take Screenshot": "Prendre une capture d'écran",
"Start Screen Recording": "Démarrer l'enregistrement de l'écran",
"Stop Screen Recording": "Arrêter l'enregistrement de l'écran",
"Quick Save": "Enregistrement rapide",
"Quick Load": "Chargement rapide",
"REWIND": "REMBOBINER",
"Rewind Enabled (requires restart)": "Rembobinage activé (nécessite un redémarrage)",
"Rewind Granularity": "Granularité du rembobinage",
"Slow Motion Ratio": "Vitesse du ralenti",
"Slow Motion": "Au ralenti",
"Home": "Accueil",
"EmulatorJS License": "Licence EmulatorJS",
"RetroArch License": "Licence RetroArch",
"This project is powered by": "Ce projet est propulsé par",
"View the RetroArch license here": "Consulter la licence de RetroArch",
"SLOW MOTION": "AU RALENTI",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "HAUT",
"DOWN": "BAS",
"LEFT": "GAUCHE",
"RIGHT": "DROITE",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "MANCHE HAUT",
"STICK DOWN": "MANCHE BAS",
"STICK LEFT": "MANCHE GAUCHE",
"STICK RIGHT": "MANCHE DROITE",
"C-PAD UP": "CROIX HAUT",
"C-PAD DOWN": "CROIX BAS",
"C-PAD LEFT": "CROIX GAUCHE",
"C-PAD RIGHT": "CROIX DROITE",
"MICROPHONE": "MICROPHONE",
"BUTTON 1 / START": "BOUTON 1 / START",
"BUTTON 2": "BOUTON 2",
"BUTTON": "BOUTON",
"LEFT D-PAD UP": "CROIX G HAUT",
"LEFT D-PAD DOWN": "CROIX G BAS",
"LEFT D-PAD LEFT": "CROIX G GAUCHE",
"LEFT D-PAD RIGHT": "CROIX G DROITE",
"RIGHT D-PAD UP": "CROIX D HAUT",
"RIGHT D-PAD DOWN": "CROIX D BAS",
"RIGHT D-PAD LEFT": "CROIX D GAUCHE",
"RIGHT D-PAD RIGHT": "CROIX D DROITE",
"C": "C",
"MODE": "MODE",
"FIRE": "FIRE",
"RESET": "RESET",
"LEFT DIFFICULTY A": "LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "RIGHT DIFFICULTY A",
"COLOR": "COLOR",
"B/W": "B/W",
"PAUSE": "PAUSE",
"OPTION": "OPTION",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "MANCHE G HAUT",
"L STICK DOWN": "MANCHE G BAS",
"L STICK LEFT": "MANCHE G GAUCHE",
"L STICK RIGHT": "MANCHE G DROITE",
"R STICK UP": "MANCHE D HAUT",
"R STICK DOWN": "MANCHE D BAS",
"R STICK LEFT": "MANCHE D GAUCHE",
"R STICK RIGHT": "MANCHE D DROITE",
"Start": "START",
"Select": "SELECT",
"Fast": "FAST",
"Slow": "SLOW",
"a": "A",
"b": "B",
"c": "C",
"d": "D",
"e": "E",
"f": "F",
"g": "G",
"h": "H",
"i": "I",
"j": "J",
"k": "K",
"l": "L",
"m": "M",
"n": "N",
"o": "O",
"p": "P",
"q": "Q",
"r": "R",
"s": "S",
"t": "T",
"u": "U",
"v": "V",
"w": "W",
"x": "X",
"y": "Y",
"z": "Z",
"enter": "Entrée",
"escape": "Échap",
"space": "Espace",
"tab": "Tab.",
"backspace": "Retour arrière",
"delete": "Suppr.",
"arrowup": "Flèche vers le haut",
"arrowdown": "Flèche vers le bas",
"arrowleft": "Flèche vers la gauche",
"arrowright": "Flèche vers la droite",
"f1": "F1",
"f2": "F2",
"f3": "F3",
"f4": "F4",
"f5": "F5",
"f6": "F6",
"f7": "F7",
"f8": "F8",
"f9": "F9",
"f10": "F10",
"f11": "F11",
"f12": "F12",
"shift": "Maj",
"control": "Ctrl",
"alt": "Alt",
"meta": "Méta",
"capslock": "Verr. maj",
"insert": "Insér.",
"home": "Début",
"end": "Fin",
"pageup": "Pg préc",
"pagedown": "Pg suiv",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "MANCHE_GAUCHE_X",
"LEFT_STICK_Y": "MANCHE_GAUCHE_Y",
"RIGHT_STICK_X": "MANCHE_DROIT_X",
"RIGHT_STICK_Y": "MANCHE_DROIT_Y",
"LEFT_TRIGGER": "GACHETTE_GAUCHE",
"RIGHT_TRIGGER": "GACHETTE_DROITE",
"A_BUTTON": "BOUTON_A",
"B_BUTTON": "BOUTON_B",
"X_BUTTON": "BOUTON_X",
"Y_BUTTON": "BOUTON_Y",
"START_BUTTON": "BOUTON_START",
"SELECT_BUTTON": "BOUTON_SELECT",
"L1_BUTTON": "BOUTON_L1",
"R1_BUTTON": "BOUTON_R1",
"L2_BUTTON": "BOUTON_L2",
"R2_BUTTON": "BOUTON_R2",
"LEFT_THUMB_BUTTON": "BOUTON_MANCHE_GAUCHE",
"RIGHT_THUMB_BUTTON": "BOUTON_MANCHE_DROIT",
"DPAD_UP": "CROIX_HAUT",
"DPAD_DOWN": "CROIX_BAS",
"DPAD_LEFT": "CROIX_GAUCHE",
"DPAD_RIGHT": "CROIX_DROITE",
"Disks": "Disques",
"Exit EmulatorJS": "Quitter EmulatorJS",
"BUTTON_1": "BOUTON_1",
"BUTTON_2": "BOUTON_2",
"BUTTON_3": "BOUTON_3",
"BUTTON_4": "BOUTON_4",
"up arrow": "Flèche haut",
"down arrow": "Flèche bas",
"left arrow": "Flèche gauche",
"right arrow": "Flèche droite",
"LEFT_TOP_SHOULDER": "BOUTON_EPAULE_GAUCHE",
"RIGHT_TOP_SHOULDER": "BOUTON_EPAULE_DROITE",
"CRT beam": "CRT beam",
"CRT caligari": "CRT caligari",
"CRT lottes": "CRT lottes",
"CRT yeetron": "CRT yeetron",
"CRT zfast": "CRT zfast",
"SABR": "SABR",
"Bicubic": "Bicubique",
"Mix frames": "Mix frames",
"WebGL2": "WebGL2",
"Requires restart": "Redémarrage requis",
"VSync": "VSync",
"Video Rotation": "Rotation vidéo",
"Rewind Enabled (Requires restart)": "Rembobinage activé (Redémarrage requis)",
"System Save interval": "Intervalle de sauvegarde du système",
"Menu Bar Button": "Bouton de la barre de menu",
"visible": "visible",
"hidden": "masqué"
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "कीबोर्ड दबाएँ",
"INSERT COIN": "सिक्का डालें",
"Remove": "निकालना",
"SAVE LOADED FROM BROWSER": "ब्राउज़र से लोड किया गया सेव करें",
"SAVE SAVED TO BROWSER": "ब्राउज़र में सहेजा गया सहेजें",
"LOADED STATE FROM BROWSER": "ब्राउज़र से लोड किया गया राज्य",
"SAVED STATE TO BROWSER": "राज्य को ब्राउज़र में सहेजा गया",
"Join the discord": "कलह में शामिल हों",
"View on GitHub": "GitHub पर देखें",
"Failed to start game": "गेम प्रारंभ करने में विफल",
@ -298,4 +298,4 @@
"DPAD_DOWN": "डीपीएडी_डाउन",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "डीपीएडी_दाएँ"
}
}

View File

@ -100,8 +100,8 @@
"Press Keyboard": "Premi Tastiera",
"INSERT COIN": "INSERISCI GETTONE",
"Remove": "Rimuovi",
"SAVE LOADED FROM BROWSER": "SALVATAGGIO CARICATO DA BROWSER",
"SAVE SAVED TO BROWSER": "SALVATAGGIO SALVATO SU BROWSER",
"LOADED STATE FROM BROWSER": "STATO CARICATO DAL BROWSER",
"SAVED STATE TO BROWSER": "STATO SALVATO NEL BROWSER",
"Join the discord": "Entra nel Discord",
"View on GitHub": "Vedi su Github",
"Failed to start game": "Avvio del gioco fallito",

View File

@ -1,301 +0,0 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "再起動",
"Pause": "一時停止",
"Play": "遊ぶ",
"Save State": "状態を保存",
"Load State": "ロード状態",
"Control Settings": "コントロール設定",
"Cheats": "チート",
"Cache Manager": "キャッシュマネージャー",
"Export Save File": "保存ファイルのエクスポート",
"Import Save File": "保存ファイルのインポート",
"Netplay": "ネットプレイ",
"Mute": "ミュート",
"Unmute": "ミュートを解除する",
"Settings": "設定",
"Enter Fullscreen": "全画面表示に入る",
"Exit Fullscreen": "全画面表示を終了する",
"Reset": "リセット",
"Clear": "クリア",
"Close": "近い",
"QUICK SAVE STATE": "状態のクイック保存",
"QUICK LOAD STATE": "クイックロード状態",
"CHANGE STATE SLOT": "状態スロットの変更",
"FAST FORWARD": "早送り",
"Player": "プレーヤー",
"Connected Gamepad": "接続されたゲームパッド",
"Gamepad": "ゲームパッド",
"Keyboard": "キーボード",
"Set": "セット",
"Add Cheat": "チートの追加",
"Create a Room": "ルームを作成する",
"Rooms": "部屋",
"Start Game": "ゲームをスタート",
"Loading...": "読み込み中...",
"Download Game Core": "ゲームコアをダウンロード",
"Decompress Game Core": "ゲームコアを解凍する",
"Download Game Data": "ゲームデータのダウンロード",
"Decompress Game Data": "ゲームデータを解凍する",
"Shaders": "シェーダ",
"Disabled": "無効",
"2xScaleHQ": "2xスケール本社",
"4xScaleHQ": "4xスケール本社",
"CRT easymode": "CRTイージーモード",
"CRT aperture": "CRTの絞り",
"CRT geom": "CRT ジオム",
"CRT mattias": "CRT マティアス",
"FPS": "FPS",
"show": "見せる",
"hide": "隠れる",
"Fast Forward Ratio": "早送り率",
"Fast Forward": "早送り",
"Enabled": "有効",
"Save State Slot": "状態保存スロット",
"Save State Location": "状態の保存場所",
"Download": "ダウンロード",
"Keep in Browser": "ブラウザ内に保持",
"Auto": "自動",
"NTSC": "NTSC",
"PAL": "パル",
"Dendy": "デンディ",
"8:7 PAR": "8:7 パー",
"4:3": "4:3",
"Low": "低い",
"High": "高い",
"Very High": "すごく高い",
"None": "なし",
"Player 1": "プレイヤー 1",
"Player 2": "プレイヤー2",
"Both": "両方",
"SAVED STATE TO SLOT": "状態をスロットに保存しました",
"LOADED STATE FROM SLOT": "スロットからロードされた状態",
"SET SAVE STATE SLOT TO": "状態保存スロットを次のように設定します",
"Network Error": "ネットワークエラー",
"Submit": "提出する",
"Description": "説明",
"Code": "コード",
"Add Cheat Code": "チートコードを追加する",
"Leave Room": "部屋を出る",
"Password": "パスワード",
"Password (optional)": "パスワード (オプション)",
"Max Players": "最大プレイヤー数",
"Room Name": "部屋の名前",
"Join": "参加する",
"Player Name": "プレーヤの名前",
"Set Player Name": "プレイヤー名の設定",
"Left Handed Mode": "左利きモード",
"Virtual Gamepad": "仮想ゲームパッド",
"Disk": "ディスク",
"Press Keyboard": "キーボードを押す",
"INSERT COIN": "コインを入れる",
"Remove": "取り除く",
"SAVE LOADED FROM BROWSER": "ブラウザからロードして保存",
"SAVE SAVED TO BROWSER": "保存 ブラウザに保存",
"Join the discord": "ディスコードに参加する",
"View on GitHub": "GitHub で見る",
"Failed to start game": "ゲームの開始に失敗しました",
"Download Game BIOS": "ゲーム BIOS をダウンロードする",
"Decompress Game BIOS": "ゲーム BIOS を解凍する",
"Download Game Parent": "ゲームの親をダウンロード",
"Decompress Game Parent": "ゲームの親を解凍する",
"Download Game Patch": "ゲームパッチをダウンロード",
"Decompress Game Patch": "ゲームパッチを解凍する",
"Download Game State": "ゲームステートのダウンロード",
"Check console": "コンソールを確認してください",
"Error for site owner": "サイト所有者のエラー",
"EmulatorJS": "エミュレータJS",
"Clear All": "すべてクリア",
"Take Screenshot": "スクリーンショットを撮ります",
"Quick Save": "クイックセーブ",
"Quick Load": "クイックロード",
"REWIND": "巻き戻し",
"Rewind Enabled (requires restart)": "巻き戻しが有効 (再起動が必要)",
"Rewind Granularity": "巻き戻し粒度",
"Slow Motion Ratio": "スローモーション比率",
"Slow Motion": "スローモーション",
"Home": "家",
"EmulatorJS License": "エミュレータJSライセンス",
"RetroArch License": "RetroArch ライセンス",
"SLOW MOTION": "スローモーション",
"A": "あ",
"B": "B",
"SELECT": "選択する",
"START": "始める",
"UP": "上",
"DOWN": "下",
"LEFT": "左",
"RIGHT": "右",
"X": "バツ",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "上に突き出る",
"STICK DOWN": "スティックダウン",
"STICK LEFT": "左スティック",
"STICK RIGHT": "右スティック",
"C-PAD UP": "Cパッドアップ",
"C-PAD DOWN": "C-パッドを下へ",
"C-PAD LEFT": "C-パッド左",
"C-PAD RIGHT": "Cパッド右",
"MICROPHONE": "マイクロフォン",
"BUTTON 1 / START": "ボタン 1 / スタート",
"BUTTON 2": "ボタン2",
"BUTTON": "ボタン",
"LEFT D-PAD UP": "左方向パッドを上に",
"LEFT D-PAD DOWN": "左方向パッド下",
"LEFT D-PAD LEFT": "左十字キー左",
"LEFT D-PAD RIGHT": "左十字キー右",
"RIGHT D-PAD UP": "右方向パッド上",
"RIGHT D-PAD DOWN": "右方向パッド下",
"RIGHT D-PAD LEFT": "右十字キー左",
"RIGHT D-PAD RIGHT": "右十字キー右",
"C": "C",
"MODE": "モード",
"FIRE": "火",
"RESET": "リセット",
"LEFT DIFFICULTY A": "左の難易度A",
"LEFT DIFFICULTY B": "左の難易度B",
"RIGHT DIFFICULTY A": "右の難易度A",
"RIGHT DIFFICULTY B": "右の難易度B",
"COLOR": "色",
"B/W": "白黒",
"PAUSE": "一時停止",
"OPTION": "オプション",
"OPTION 1": "オプション1",
"OPTION 2": "オプション 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "Lスティックアップ",
"L STICK DOWN": "Lスティックダウン",
"L STICK LEFT": "Lスティック左",
"L STICK RIGHT": "Lスティック右",
"R STICK UP": "Rスティックアップ",
"R STICK DOWN": "Rスティックダウン",
"R STICK LEFT": "Rスティック左",
"R STICK RIGHT": "R右スティック",
"Start": "始める",
"Select": "選択する",
"Fast": "速い",
"Slow": "遅い",
"a": "ある",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "私",
"j": "j",
"k": "k",
"l": "私",
"m": "メートル",
"n": "n",
"o": "ああ",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "あなた",
"v": "v",
"w": "w",
"x": "バツ",
"y": "y",
"z": "z",
"enter": "入力",
"escape": "逃げる",
"space": "空間",
"tab": "タブ",
"backspace": "バックスペース",
"delete": "消去",
"arrowup": "アローアップ",
"arrowdown": "矢印",
"arrowleft": "矢印左",
"arrowright": "右矢印",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "シフト",
"control": "コントロール",
"alt": "代替",
"meta": "メタ",
"capslock": "キャップスロック",
"insert": "入れる",
"home": "家",
"end": "終わり",
"pageup": "ページアップ",
"pagedown": "ページダウン",
"!": "",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "】",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "」",
",": "、",
".": "。",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "左スティック_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "右スティック_Y",
"LEFT_TRIGGER": "LEFT_TRIGGER",
"RIGHT_TRIGGER": "右トリガー",
"A_BUTTON": "ボタン",
"B_BUTTON": "B_ボタン",
"X_BUTTON": "X_ボタン",
"Y_BUTTON": "Y_ボタン",
"START_BUTTON": "スタートボタン",
"SELECT_BUTTON": "SELECT_BUTTON",
"L1_BUTTON": "L1_ボタン",
"R1_BUTTON": "R1_ボタン",
"L2_BUTTON": "L2_ボタン",
"R2_BUTTON": "R2_ボタン",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}

301
data/localization/ja.json Normal file
View File

@ -0,0 +1,301 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "リセット",
"Pause": "一時停止",
"Play": "再開",
"Save State": "セーブステート",
"Load State": "ロードステート",
"Control Settings": "キー設定",
"Cheats": "チート",
"Cache Manager": "キャッシュマネージャー",
"Export Save File": "セーブデータをエクスポート",
"Import Save File": "セーブデータをインポート",
"Netplay": "ネットプレイ",
"Mute": "ミュート",
"Unmute": "ミュート解除",
"Settings": "設定",
"Enter Fullscreen": "全画面表示",
"Exit Fullscreen": "全画面表示を終了",
"Reset": "リセット",
"Clear": "クリア",
"Close": "閉じる",
"QUICK SAVE STATE": "クイックセーブ",
"QUICK LOAD STATE": "クイックロード",
"CHANGE STATE SLOT": "セーブスロットの変更",
"FAST FORWARD": "早送り",
"Player": "プレイヤー",
"Connected Gamepad": "接続されたゲームパッド",
"Gamepad": "ゲームパッド",
"Keyboard": "キーボード",
"Set": "セット",
"Add Cheat": "チートを追加",
"Create a Room": "部屋を作成",
"Rooms": "部屋",
"Start Game": "ゲームスタート",
"Loading...": "読み込み中...",
"Download Game Core": "ゲームコアをダウンロード中",
"Decompress Game Core": "ゲームコアを解凍中",
"Download Game Data": "ゲームデータのダウンロード中",
"Decompress Game Data": "ゲームデータを解凍中",
"Shaders": "シェーダー",
"Disabled": "無効",
"2xScaleHQ": "2xスケール",
"4xScaleHQ": "4xスケール",
"CRT easymode": "CRT (イージーモード)",
"CRT aperture": "CRT (アパーチャ)",
"CRT geom": "CRT (ジオメ)",
"CRT mattias": "CRT (Mattias)",
"FPS": "FPS",
"show": "表示",
"hide": "非表示",
"Fast Forward Ratio": "早送りの速度",
"Fast Forward": "早送り",
"Enabled": "有効",
"Save State Slot": "セーブステートのスロット",
"Save State Location": "セーブステートの保存場所",
"Download": "ダウンロード",
"Keep in Browser": "ブラウザ内に保持",
"Auto": "自動",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "低",
"High": "高",
"Very High": "最高",
"None": "なし",
"Player 1": "プレイヤー1",
"Player 2": "プレイヤー2",
"Both": "両方",
"SAVED STATE TO SLOT": "データをセーブしました(スロット:",
"LOADED STATE FROM SLOT": "データをロードしました(スロット:",
"SET SAVE STATE SLOT TO": "保存スロットを次に設定します(スロット:",
"Network Error": "ネットワークエラー",
"Submit": "適用",
"Description": "説明",
"Code": "コード",
"Add Cheat Code": "チートコードを追加する",
"Leave Room": "部屋を退出する",
"Password": "パスワード",
"Password (optional)": "パスワード (オプション)",
"Max Players": "最大プレイヤー数",
"Room Name": "部屋の名前",
"Join": "参加する",
"Player Name": "プレイヤー名",
"Set Player Name": "プレイヤー名の設定",
"Left Handed Mode": "左利きモード",
"Virtual Gamepad": "仮想ゲームパッド",
"Disk": "ディスク",
"Press Keyboard": "キーボードを押す",
"INSERT COIN": "コインを入れる",
"Remove": "削除",
"LOADED STATE FROM BROWSER": "ブラウザからのロード状態",
"SAVED STATE TO BROWSER": "状態をブラウザに保存",
"Join the discord": "Discordに参加",
"View on GitHub": "GitHub で見る",
"Failed to start game": "ゲームの開始に失敗しました",
"Download Game BIOS": "ゲームのBIOSをダウンロード中",
"Decompress Game BIOS": "ゲームのBIOSを解凍中",
"Download Game Parent": "ゲームの親をダウンロード中",
"Decompress Game Parent": "ゲームの親を解凍中",
"Download Game Patch": "ゲームパッチをダウンロード中",
"Decompress Game Patch": "ゲームパッチを解凍中",
"Download Game State": "ゲームステートのダウンロード中",
"Check console": "コンソールを確認してください",
"Error for site owner": "サイト所有者のエラー",
"EmulatorJS": "エミュレータJS",
"Clear All": "すべてクリア",
"Take Screenshot": "スクリーンショットを撮影",
"Quick Save": "クイックセーブ",
"Quick Load": "クイックロード",
"REWIND": "巻き戻し",
"Rewind Enabled (requires restart)": "巻き戻しが有効 (再起動が必要です)",
"Rewind Granularity": "巻き戻し粒度",
"Slow Motion Ratio": "スローモーション比率",
"Slow Motion": "スローモーション",
"Home": "ホーム",
"EmulatorJS License": "エミュレータJSのライセンス",
"RetroArch License": "RetroArch ライセンス",
"SLOW MOTION": "スローモーション",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "上",
"DOWN": "下",
"LEFT": "左",
"RIGHT": "右",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "スティック上",
"STICK DOWN": "スティック下",
"STICK LEFT": "スティック左",
"STICK RIGHT": "スティック右",
"C-PAD UP": "Cボタン上",
"C-PAD DOWN": "Cボタン下",
"C-PAD LEFT": "Cボタン左",
"C-PAD RIGHT": "Cボタン右",
"MICROPHONE": "マイク",
"BUTTON 1 / START": "ボタン1 / スタート",
"BUTTON 2": "ボタン2",
"BUTTON": "ボタン",
"LEFT D-PAD UP": "十字キー上",
"LEFT D-PAD DOWN": "十字キー下",
"LEFT D-PAD LEFT": "十字キー左",
"LEFT D-PAD RIGHT": "十字キー右",
"RIGHT D-PAD UP": "右十字キー上",
"RIGHT D-PAD DOWN": "右十字キー下",
"RIGHT D-PAD LEFT": "右十字キー左",
"RIGHT D-PAD RIGHT": "右十字キー右",
"C": "C",
"MODE": "モード",
"FIRE": "発射",
"RESET": "リセット",
"LEFT DIFFICULTY A": "左難易度A",
"LEFT DIFFICULTY B": "左難易度B",
"RIGHT DIFFICULTY A": "右難易度A",
"RIGHT DIFFICULTY B": "右難易度B",
"COLOR": "カラー",
"B/W": "白黒",
"PAUSE": "一時停止",
"OPTION": "オプション",
"OPTION 1": "オプション1",
"OPTION 2": "オプション2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "左スティック上",
"L STICK DOWN": "左スティック下",
"L STICK LEFT": "左スティック左",
"L STICK RIGHT": "左スティック右",
"R STICK UP": "右スティック上",
"R STICK DOWN": "右スティック下",
"R STICK LEFT": "右スティック左",
"R STICK RIGHT": "右スティック右",
"Start": "Start",
"Select": "Select",
"Fast": "Fast",
"Slow": "Slow",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "enter",
"escape": "escape",
"space": "space",
"tab": "tab",
"backspace": "backspace",
"delete": "delete",
"arrowup": "上矢印",
"arrowdown": "下矢印",
"arrowleft": "左矢印",
"arrowright": "右矢印",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "shift",
"control": "control",
"alt": "alt",
"meta": "meta",
"capslock": "capslock",
"insert": "insert",
"home": "home",
"end": "end",
"pageup": "pageup",
"pagedown": "pagedown",
"!": "",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "左スティック(横)",
"LEFT_STICK_Y": "左スティック(縦)",
"RIGHT_STICK_X": "右スティック(横)",
"RIGHT_STICK_Y": "右スティック(縦)",
"LEFT_TRIGGER": "左トリガー",
"RIGHT_TRIGGER": "右トリガー",
"A_BUTTON": "Aボタン",
"B_BUTTON": "Bボタン",
"X_BUTTON": "Xボタン",
"Y_BUTTON": "Yボタン",
"START_BUTTON": "スタートボタン",
"SELECT_BUTTON": "セレクトボタン",
"L1_BUTTON": "L1_ボタン",
"R1_BUTTON": "R1_ボタン",
"L2_BUTTON": "L2_ボタン",
"R2_BUTTON": "R2_ボタン",
"LEFT_THUMB_BUTTON": "左スティック押し込み",
"RIGHT_THUMB_BUTTON": "右スティック押し込み",
"DPAD_UP": "十字キー上",
"DPAD_DOWN": "十字キー下",
"DPAD_LEFT": "十字キー左",
"DPAD_RIGHT": "十字キー右"
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Pencet Keyboard",
"INSERT COIN": "INSERT COIN",
"Remove": "Mbusak",
"SAVE LOADED FROM BROWSER": "Simpen dimuat saka BROWSER",
"SAVE SAVED TO BROWSER": "SAVE disimpen menyang BROWSER",
"LOADED STATE FROM BROWSER": "NEGARA YANG DIMUAT DARI BROWSER",
"SAVED STATE TO BROWSER": "NEGARA TERSIMPAN KE BROWSER",
"Join the discord": "Melu discord",
"View on GitHub": "Deleng ing GitHub",
"Failed to start game": "Gagal miwiti game",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}
}

View File

@ -1,301 +0,0 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "삼",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "재시작",
"Pause": "정지시키다",
"Play": "놀다",
"Save State": "상태 저장",
"Load State": "로드 상태",
"Control Settings": "제어 설정",
"Cheats": "치트",
"Cache Manager": "캐시 관리자",
"Export Save File": "저장 파일 내보내기",
"Import Save File": "저장 파일 가져오기",
"Netplay": "넷플레이",
"Mute": "무음",
"Unmute": "음소거 해제",
"Settings": "설정",
"Enter Fullscreen": "전체 화면 시작",
"Exit Fullscreen": "전체화면 종료",
"Reset": "초기화",
"Clear": "분명한",
"Close": "닫다",
"QUICK SAVE STATE": "빠른 저장 상태",
"QUICK LOAD STATE": "빠른 로드 상태",
"CHANGE STATE SLOT": "상태 슬롯 변경",
"FAST FORWARD": "빨리 감기",
"Player": "플레이어",
"Connected Gamepad": "연결된 게임패드",
"Gamepad": "게임패드",
"Keyboard": "건반",
"Set": "세트",
"Add Cheat": "치트 추가",
"Create a Room": "방 만들기",
"Rooms": "객실",
"Start Game": "게임을 시작하다",
"Loading...": "로드 중...",
"Download Game Core": "게임 코어 다운로드",
"Decompress Game Core": "게임 코어 압축 해제",
"Download Game Data": "게임 데이터 다운로드",
"Decompress Game Data": "게임 데이터 압축 해제",
"Shaders": "셰이더",
"Disabled": "장애가 있는",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "브라운관 이지모드",
"CRT aperture": "CRT 조리개",
"CRT geom": "브라운관 검",
"CRT mattias": "CRT 마티아스",
"FPS": "FPS",
"show": "보여주다",
"hide": "숨다",
"Fast Forward Ratio": "빨리 감기 비율",
"Fast Forward": "빨리 감기",
"Enabled": "사용",
"Save State Slot": "상태 슬롯 저장",
"Save State Location": "상태 위치 저장",
"Download": "다운로드",
"Keep in Browser": "브라우저에 보관",
"Auto": "자동",
"NTSC": "NTSC",
"PAL": "단짝",
"Dendy": "덴디",
"8:7 PAR": "8:7 동점",
"4:3": "4:3",
"Low": "낮은",
"High": "높은",
"Very High": "매우 높음",
"None": "없음",
"Player 1": "플레이어 1",
"Player 2": "플레이어 2",
"Both": "둘 다",
"SAVED STATE TO SLOT": "슬롯에 저장된 상태",
"LOADED STATE FROM SLOT": "슬롯에서 로드된 상태",
"SET SAVE STATE SLOT TO": "저장 상태 슬롯을 다음으로 설정",
"Network Error": "네트워크 오류",
"Submit": "제출하다",
"Description": "설명",
"Code": "암호",
"Add Cheat Code": "치트 코드 추가",
"Leave Room": "방 나가기",
"Password": "비밀번호",
"Password (optional)": "비밀번호(선택 사항)",
"Max Players": "최대 플레이어",
"Room Name": "방 이름",
"Join": "가입하다",
"Player Name": "선수 이름",
"Set Player Name": "플레이어 이름 설정",
"Left Handed Mode": "왼손잡이 모드",
"Virtual Gamepad": "가상 게임패드",
"Disk": "디스크",
"Press Keyboard": "키보드 누르기",
"INSERT COIN": "동전을 넣으세요",
"Remove": "제거하다",
"SAVE LOADED FROM BROWSER": "브라우저에서 불러온 저장",
"SAVE SAVED TO BROWSER": "저장 브라우저에 저장됨",
"Join the discord": "불화에 동참하십시오",
"View on GitHub": "GitHub에서 보기",
"Failed to start game": "게임을 시작하지 못했습니다.",
"Download Game BIOS": "게임 BIOS 다운로드",
"Decompress Game BIOS": "게임 BIOS 압축 해제",
"Download Game Parent": "게임 부모 다운로드",
"Decompress Game Parent": "게임 부모 압축 해제",
"Download Game Patch": "게임 패치 다운로드",
"Decompress Game Patch": "게임 패치 압축 해제",
"Download Game State": "게임 상태 다운로드",
"Check console": "콘솔 확인",
"Error for site owner": "사이트 소유자 오류",
"EmulatorJS": "EmulatorJS",
"Clear All": "모두 지우기",
"Take Screenshot": "스크린 샷을 찍다",
"Quick Save": "빠른 저장",
"Quick Load": "빠른 로드",
"REWIND": "되감기",
"Rewind Enabled (requires restart)": "되감기 활성화됨(다시 시작해야 함)",
"Rewind Granularity": "되감기 세분성",
"Slow Motion Ratio": "슬로우 모션 비율",
"Slow Motion": "느린",
"Home": "집",
"EmulatorJS License": "EmulatorJS 라이선스",
"RetroArch License": "레트로아크 라이선스",
"SLOW MOTION": "느린",
"A": "ㅏ",
"B": "비",
"SELECT": "선택하다",
"START": "시작",
"UP": "위로",
"DOWN": "아래에",
"LEFT": "왼쪽",
"RIGHT": "오른쪽",
"X": "엑스",
"Y": "와이",
"L": "엘",
"R": "아르 자형",
"Z": "지",
"STICK UP": "스틱 업",
"STICK DOWN": "스틱 다운",
"STICK LEFT": "스틱 왼쪽",
"STICK RIGHT": "스틱 오른쪽",
"C-PAD UP": "C 패드 위로",
"C-PAD DOWN": "C패드 다운",
"C-PAD LEFT": "C 패드 왼쪽",
"C-PAD RIGHT": "C 패드 오른쪽",
"MICROPHONE": "마이크로폰",
"BUTTON 1 / START": "버튼 1 / 시작",
"BUTTON 2": "버튼 2",
"BUTTON": "단추",
"LEFT D-PAD UP": "왼쪽 방향 패드 위로",
"LEFT D-PAD DOWN": "왼쪽 방향 패드 아래로",
"LEFT D-PAD LEFT": "왼쪽 방향 패드 왼쪽",
"LEFT D-PAD RIGHT": "왼쪽 방향 패드 오른쪽",
"RIGHT D-PAD UP": "오른쪽 방향 패드 위로",
"RIGHT D-PAD DOWN": "오른쪽 방향 패드 아래로",
"RIGHT D-PAD LEFT": "오른쪽 방향 패드 왼쪽",
"RIGHT D-PAD RIGHT": "오른쪽 방향 패드 오른쪽",
"C": "씨",
"MODE": "방법",
"FIRE": "불",
"RESET": "초기화",
"LEFT DIFFICULTY A": "왼쪽 난이도 A",
"LEFT DIFFICULTY B": "왼쪽 난이도 B",
"RIGHT DIFFICULTY A": "오른쪽 난이도 A",
"RIGHT DIFFICULTY B": "오른쪽 난이도 B",
"COLOR": "색상",
"B/W": "흑백",
"PAUSE": "정지시키다",
"OPTION": "옵션",
"OPTION 1": "옵션 1",
"OPTION 2": "옵션 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L 스틱 업",
"L STICK DOWN": "L 스틱 다운",
"L STICK LEFT": "왼쪽 스틱",
"L STICK RIGHT": "L 오른쪽 스틱",
"R STICK UP": "R 스틱 업",
"R STICK DOWN": "R 스틱 다운",
"R STICK LEFT": "R 스틱 왼쪽",
"R STICK RIGHT": "R 오른쪽 스틱",
"Start": "시작",
"Select": "선택하다",
"Fast": "빠른",
"Slow": "느린",
"a": "ㅏ",
"b": "비",
"c": "씨",
"d": "디",
"e": "이자형",
"f": "에프",
"g": "g",
"h": "시간",
"i": "나",
"j": "제이",
"k": "케이",
"l": "엘",
"m": "중",
"n": "N",
"o": "영형",
"p": "피",
"q": "큐",
"r": "아르 자형",
"s": "에스",
"t": "티",
"u": "유",
"v": "V",
"w": "승",
"x": "엑스",
"y": "와이",
"z": "지",
"enter": "입력하다",
"escape": "탈출하다",
"space": "공간",
"tab": "탭",
"backspace": "역행 키이",
"delete": "삭제",
"arrowup": "화살촉",
"arrowdown": "화살표 방향",
"arrowleft": "왼쪽 화살표",
"arrowright": "오른쪽 화살표",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "옮기다",
"control": "제어",
"alt": "대안",
"meta": "메타",
"capslock": "캡스락",
"insert": "끼워 넣다",
"home": "집",
"end": "끝",
"pageup": "페이지 위로",
"pagedown": "페이지 다운",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "왼쪽_스틱_X",
"LEFT_STICK_Y": "왼쪽_스틱_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "오른쪽_스틱_Y",
"LEFT_TRIGGER": "왼쪽_트리거",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "단추",
"B_BUTTON": "B_버튼",
"X_BUTTON": "X_버튼",
"Y_BUTTON": "Y_버튼",
"START_BUTTON": "시작 버튼",
"SELECT_BUTTON": "선택_버튼",
"L1_BUTTON": "L1_버튼",
"R1_BUTTON": "R1_버튼",
"L2_BUTTON": "L2_버튼",
"R2_BUTTON": "R2_버튼",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}

372
data/localization/ko.json Normal file
View File

@ -0,0 +1,372 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "재시작",
"Pause": "일시정지",
"Play": "플레이",
"Save State": "상태 저장하기",
"Load State": "상태 불러오기",
"Control Settings": "컨트롤 설정",
"Cheats": "치트",
"Cache Manager": "캐시 관리자",
"Export Save File": "세이브 파일 내보내기",
"Import Save File": "세이브 파일 가져오기",
"Netplay": "넷플레이",
"Mute": "무음",
"Unmute": "음소거 해제",
"Settings": "설정",
"Enter Fullscreen": "전체화면 전환",
"Exit Fullscreen": "전체화면 종료",
"Context Menu": "컨텍스트 메뉴",
"Reset": "초기화",
"Clear": "지우기",
"Close": "닫기",
"QUICK SAVE STATE": "빠른 상태 저장하기",
"QUICK LOAD STATE": "빠른 상태 불러오기",
"CHANGE STATE SLOT": "상태 슬롯 변경하기",
"FAST FORWARD": "빨리 감기",
"Player": "플레이어",
"Connected Gamepad": "연결된 게임패드",
"Gamepad": "게임패드",
"Keyboard": "키보드",
"Set": "세트",
"Add Cheat": "치트 추가하기",
"Note that some cheats require a restart to disable": "일부 치트는 다시 시작해야 비활성화할 수 있습니다.",
"Create a Room": "방 만들기",
"Rooms": "방",
"Start Game": "게임 시작하기",
"Click to resume Emulator": "에뮬레이터를 다시 시작하려면 클릭하세요.",
"Drop save state here to load": "저장 상태를 여기에 놓으면 로드됩니다.",
"Loading...": "로딩 중...",
"Download Game Core": "게임 코어 다운로드",
"Outdated graphics driver": "오래된 그래픽 드라이버",
"Decompress Game Core": "게임 코어 압축 해제",
"Download Game Data": "게임 데이터 다운로드",
"Decompress Game Data": "게임 데이터 압축 해제",
"Shaders": "셰이더",
"Disabled": "비활성화됨",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT 이지모드",
"CRT aperture": "CRT 조리개",
"CRT geom": "CRT 검",
"CRT mattias": "CRT 마티아스",
"FPS": "FPS",
"show": "보기",
"hide": "숨기기",
"Fast Forward Ratio": "빨리 감기 비율",
"Fast Forward": "빨리 감기",
"Enabled": "활성화됨",
"Save State Slot": "상태 저장 슬롯",
"Save State Location": "상태 저장 위치",
"Download": "다운로드",
"Keep in Browser": "브라우저에 보관하기",
"Auto": "자동",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "덴디",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "낮음",
"High": "높음",
"Very High": "매우 높음",
"None": "없음",
"Player 1": "플레이어 1",
"Player 2": "플레이어 2",
"Both": "둘 다",
"SAVED STATE TO SLOT": "슬롯에 상태가 저장되었습니다.",
"LOADED STATE FROM SLOT": "슬롯에서 상태를 불러왔습니다.",
"SET SAVE STATE SLOT TO": "저장 상태 슬롯을 다음으로 설정",
"Network Error": "네트워크 오류",
"Submit": "전송",
"Description": "설명",
"Code": "코드",
"Add Cheat Code": "치트 코드 추가",
"Leave Room": "방 나가기",
"Password": "비밀번호",
"Password (optional)": "비밀번호 (선택사항)",
"Max Players": "최대 플레이어 수",
"Room Name": "방 이름",
"Join": "들어가기",
"Player Name": "플레이어 이름",
"Set Player Name": "플레이어 이름 설정",
"Left Handed Mode": "왼손 모드",
"Virtual Gamepad": "가상 게임패드",
"Disk": "디스크",
"Press Keyboard": "키보드를 누르세요.",
"INSERT COIN": "동전을 넣으세요.",
"Remove": "제거",
"LOADED STATE FROM BROWSER": "브라우저에서 로드된 상태",
"SAVED STATE TO BROWSER": "브라우저에 저장된 상태",
"Join the discord": "디스코드에 참가하기",
"View on GitHub": "GitHub에서 보기",
"Failed to start game": "게임을 시작하지 못했습니다.",
"Download Game BIOS": "게임 BIOS 다운로드",
"Decompress Game BIOS": "게임 BIOS 압축 해제",
"Download Game Parent": "게임 부모 다운로드",
"Decompress Game Parent": "게임 부모 압축 해제",
"Download Game Patch": "게임 패치 다운로드",
"Decompress Game Patch": "게임 패치 압축 해제",
"Download Game State": "게임 상태 다운로드",
"Check console": "콘솔 확인",
"Error for site owner": "사이트 소유자 오류",
"EmulatorJS": "EmulatorJS",
"Clear All": "모두 지우기",
"Take Screenshot": "스크린 샷 찍기",
"Start screen recording": "화면 녹화 시작",
"Stop screen recording": "화면 녹화 정지",
"Quick Save": "빠른 저장하기",
"Quick Load": "빠른 불러오기",
"REWIND": "되감기",
"Rewind Enabled (requires restart)": "되감기 활성화됨 (재시작 필요함)",
"Rewind Granularity": "되감기 세분화",
"Slow Motion Ratio": "슬로우 모션 비율",
"Slow Motion": "슬로우 모션",
"Home": "홈",
"EmulatorJS License": "EmulatorJS 라이센스",
"RetroArch License": "RetroArch 라이센스",
"This project is powered by": "이 프로젝트는 다음의 지원으로 운영됩니다.",
"View the RetroArch license here": "RetroArch 라이센스 보기",
"SLOW MOTION": "슬로우 모션",
"A": "A",
"B": "B",
"SELECT": "선택",
"START": "시작",
"UP": "위",
"DOWN": "아래",
"LEFT": "왼쪽",
"RIGHT": "오른쪽",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "스틱 위",
"STICK DOWN": "스틱 아래",
"STICK LEFT": "스틱 왼쪽",
"STICK RIGHT": "스틱 오른쪽",
"C-PAD UP": "C 패드 위",
"C-PAD DOWN": "C-패드 아래",
"C-PAD LEFT": "C-패드 왼쪽",
"C-PAD RIGHT": "C-패드 오른쪽",
"MICROPHONE": "마이크",
"BUTTON 1 / START": "버튼 1 / 시작",
"BUTTON 2": "버튼 2",
"BUTTON": "단추",
"LEFT D-PAD UP": "왼쪽 방향 패드 위",
"LEFT D-PAD DOWN": "왼쪽 방향 패드 아래",
"LEFT D-PAD LEFT": "왼쪽 방향 패드 왼쪽",
"LEFT D-PAD RIGHT": "왼쪽 방향 패드 오른쪽",
"RIGHT D-PAD UP": "오른쪽 방향 패드 위",
"RIGHT D-PAD DOWN": "오른쪽 방향 패드 아래",
"RIGHT D-PAD LEFT": "오른쪽 방향 패드 왼쪽",
"RIGHT D-PAD RIGHT": "오른쪽 방향 패드 오른쪽",
"C": "C",
"MODE": "모드",
"FIRE": "발사",
"RESET": "초기화",
"LEFT DIFFICULTY A": "왼쪽 난이도 A",
"LEFT DIFFICULTY B": "왼쪽 난이도 B",
"RIGHT DIFFICULTY A": "오른쪽 난이도 A",
"RIGHT DIFFICULTY B": "오른쪽 난이도 B",
"COLOR": "색상",
"B/W": "흑백",
"PAUSE": "일시정지",
"OPTION": "옵션",
"OPTION 1": "옵션 1",
"OPTION 2": "옵션 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L 스틱 위",
"L STICK DOWN": "L 스틱 아래",
"L STICK LEFT": "왼쪽 스틱",
"L STICK RIGHT": "L 스틱 오른쪽",
"R STICK UP": "R 스틱 위",
"R STICK DOWN": "R 스틱 아래",
"R STICK LEFT": "R 스틱 왼쪽",
"R STICK RIGHT": "R 스틱 오른쪽",
"Start": "시작",
"Select": "선택",
"Fast": "빠름",
"Slow": "느림",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "엔터",
"escape": "ESC",
"space": "스페이스 바",
"tab": "탭",
"backspace": "백 스페이스",
"delete": "DEL",
"arrowup": "화살표 위",
"arrowdown": "화살표 아래",
"arrowleft": "화살표 왼쪽",
"arrowright": "화살표 오른쪽",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "쉬프트",
"control": "컨트롤",
"alt": "알트",
"meta": "메타",
"capslock": "캡스락",
"insert": "Insert",
"home": "HOME",
"end": "END",
"pageup": "페이지 업",
"pagedown": "페이지 다운",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "왼쪽_스틱_X",
"LEFT_STICK_Y": "왼쪽_스틱_Y",
"RIGHT_STICK_X": "오른쪽_스틱_X",
"RIGHT_STICK_Y": "오른쪽_스틱_Y",
"LEFT_TRIGGER": "왼쪽_트리거",
"RIGHT_TRIGGER": "오른쪽_트리거",
"A_BUTTON": "A_버튼",
"B_BUTTON": "B_버튼",
"X_BUTTON": "X_버튼",
"Y_BUTTON": "Y_버튼",
"START_BUTTON": "시작_버튼",
"SELECT_BUTTON": "선택_버튼",
"L1_BUTTON": "L1_버튼",
"R1_BUTTON": "R1_버튼",
"L2_BUTTON": "L2_버튼",
"R2_BUTTON": "R2_버튼",
"LEFT_THUMB_BUTTON": "왼쪽_엄지_버튼",
"RIGHT_THUMB_BUTTON": "오른쪽_엄지_버튼",
"DPAD_UP": "DPAD_위",
"DPAD_DOWN": "DPAD_아래",
"DPAD_LEFT": "DPAD_왼쪽",
"DPAD_RIGHT": "DPAD_오른쪽",
"Disks": "디스크",
"Exit EmulatorJS": "EmulatorJS 끝내기",
"BUTTON_1": "버튼_1",
"BUTTON_2": "버튼_2",
"BUTTON_3": "버튼_3",
"BUTTON_4": "버튼_4",
"up arrow": "화살표 키 위",
"down arrow": "화살표 키 아래",
"left arrow": "화살표 키 왼쪽",
"right arrow": "화살표 키 오른쪽",
"LEFT_TOP_SHOULDER": "왼쪽 상단 숄더",
"RIGHT_TOP_SHOULDER": "오른쪽 상단 숄더",
"CRT beam": "CRT 빔",
"CRT caligari": "CRT 칼리가리",
"CRT lottes": "CRT 로테스",
"CRT yeetron": "CRT 이트론",
"CRT zfast": "CRT 지패스트",
"SABR": "SABR",
"Bicubic": "쌍입방(Bicubic)",
"Mix frames": "프레임 혼합",
"WebGL2": "WebGL2",
"Requires restart": "재시작 필요함",
"VSync": "수직동기화",
"Video Rotation": "화면 회전",
"System Save interval": "시스템 세이브 간격",
"Menu Bar Button": "메뉴바 버튼",
"visible": "보이기",
"hidden": "숨기기",
"Exit Emulation": "에뮬레이터 종료",
"LEFT_BOTTOM_SHOULDER": "왼쪽 하단 숄더",
"RIGHT_BOTTOM_SHOULDER": "오른쪽 하단 숄더",
"LEFT_STICK": "왼쪽 스틱",
"RIGHT_STICK": "오른쪽 스틱",
"-1": "-1",
"+1": "+1",
"Mode": "모드",
"": "",
"Core (재시작 필요함)": "코어 (재시작 필요함)",
"Rewind Enabled (재시작 필요함)": "되감기 활성화 (재시작 필요함)",
"Menubar Mouse Trigger": "메뉴바 마우스 활성화",
"Downward Movement": "아래쪽 이동",
"Movement Anywhere": "전체 영역 이동",
"Direct Keyboard Input": "키보드 직접 입력",
"Forward Alt key": "Alt 키 전달",
"Lock Mouse": "마우스 잠금",
"Are you sure you want to exit?": "정말로 종료하시겠습니까?",
"Exit": "종료",
"Cancel": "취소",
"EmulatorJS has exited": "에뮬레이터가 종료되었습니다.",
"Start Screen Recording": "화면 녹화 시작",
"Stop Screen Recording": "화면 녹화 중지",
"Screenshot Source": "스크린샷 소스",
"Screenshot Format": "스크린샷 형식",
"Screenshot Upscale": "스크린샷 업스케일",
"Screen Recording FPS": "화면 녹화 프레임율",
"Screen Recording Format": "화면 녹화 형식",
"Screen Recording Upscale": "화면 녹화 업스케일",
"Screen Recording Video Bitrate": "화면 녹화 비디오 비트레이트",
"Screen Recording Audio Bitrate": "화면 녹화 오디오 비트레이트",
"customDownload": "상태 파일 다운로드",
"customUpload": "상태 파일 업로드",
"customScreenshot": "스크린 샷 찍기"
}

View File

@ -105,8 +105,8 @@
"Press Keyboard": "Pressione uma tecla",
"INSERT COIN": "Insira uma ficha",
"Remove": "Remover",
"SAVE LOADED FROM BROWSER": "SAVE STATE CARREGADO DO BROWSER",
"SAVE SAVED TO BROWSER": "SAVE STATE ARMAZENADO NO BROWSER",
"LOADED STATE FROM BROWSER": "ESTADO CARREGADO DO NAVEGADOR",
"SAVED STATE TO BROWSER": "ESTADO SALVO NO NAVEGADOR",
"Join the discord": "Participar do discord",
"View on GitHub": "Ver no GitHub",
"Failed to start game": "Falha ao iniciar o jogo",

View File

@ -1,57 +0,0 @@
# Localization
Supported languages
`en-US` - English US<br>
`pt-BR` - Portuguese<br>
`es-ES` - Spanish<br>
`el-GR` - Greek<br>
`ja-JA` - Japanese<br>
`zh-CN` - Chinese<br>
`hi-HI` - Hindi<br>
`ar-AR` - Arabic<br>
`jv-JV` - Javanese<br>
`ben-BEN` - Bengali<br>
`ru-RU` - Russian<br>
`de-GER` - German<br>
`ko-KO` - Korean<br>
`af-FR` - French<br>
`it-IT` - Italian<br>
`tr-Tr` - Turkish<br>
default: `en-US`
add the line to your code to use
```
EJS_language = ''; //language
```
If the language file is not found or there was an error fetching the file, the emulator will default to english.
## Credits
Translated for `es-ES` originally by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) and updated by [@angelmarfil](https://github.com/angelmarfil) <br>
Translated for `el-GR` by [@imneckro](https://github.com/imneckro) <br>
Translated for `ja-JA`, `hi-HI`, `ar-AR`, `jv-JV`, `ben-BEN`, `ru-RU`, `de-GER`, `ko-KO`, `af-FR` by [@allancoding](https://github.com/allancoding) <br>
Translated for `pt-BR` originally by [@allancoding](https://github.com/allancoding) and updated by [@zmarteline](https://github.com/zmarteline)<br>
Translated for `zh-CN` originally by [@allancoding](https://github.com/allancoding) and updated by [@eric183](https://github.com/eric183)<br>
Translated for `pt-BR` originally by [@allancoding](https://github.com/allancoding) and updated by [@zmarteline](https://github.com/zmarteline) <br>
Translated for `it-IT` by [@IvanMazzoli](https://github.com/IvanMazzoli) <br>
Translated for `tr-Tr` by [@iGoodie](https://github.com/iGoodie) <br>
## Contributing
Download the default `en.json` file and simply translate all the words that start with the `-` (remove the dash afterwards) then perform a pull request or open an issue with the file uploaded and I will add your work.
The `retroarch.json` are all the setting names for the menu. They will default to english if not found. You can set `EJS_settingsLanguage` to `true` to see the missing retroarch settings names for the current language. You can translate them and add the to the language file.
The control maping traslations for controllers are diffrent for each controller. They will need to be added to the language file if they are not in the default `en.json` file.
You can also use the [Translation Helper](Translate.html) tool to help you translate the file.
Please contribute!!
Enything that is incorrect or needs to be fix please perform a pull request!

File diff suppressed because it is too large Load Diff

310
data/localization/ro.json Normal file
View File

@ -0,0 +1,310 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Repornire",
"Pause": "Pauză",
"Play": "Pornire",
"Save State": "Salvare Status",
"Load State": "Încărcare Status",
"Control Settings": "Setări Controale",
"Cheats": "Cheats",
"Cache Manager": "Manager Cache",
"Export Save File": "Exportează Fișierul Salvat",
"Import Save File": "Importează Fișierul Salvat",
"Netplay": "Netplay",
"Mute": "Mute",
"Unmute": "Unmute",
"Settings": "Setări",
"Enter Fullscreen": "Intrați în modul ecran complet",
"Exit Fullscreen": "Ieșire din modul ecran complet",
"Context Menu": "Meniu Context",
"Reset": "Resetare",
"Clear": "Ștergere",
"Close": "Ieșire",
"QUICK SAVE STATE": "QUICK SAVE STATE",
"QUICK LOAD STATE": "QUICK LOAD STATE",
"CHANGE STATE SLOT": "CHANGE STATE SLOT",
"FAST FORWARD": "FAST FORWARD",
"Player": "Player",
"Connected Gamepad": "Gamepad Conectat",
"Gamepad": "Gamepad",
"Keyboard": "Tastatură",
"Set": "Setare",
"Add Cheat": "Adaugă Cheat",
"Note that some cheats require a restart to disable": "Rețineți că unele cheat-uri necesită o repornire pentru a fi dezactivate",
"Create a Room": "Creați o cameră",
"Rooms": "Camere",
"Start Game": "Pornire Joc",
"Click to resume Emulator": "Click pentru a relua Emulatorul",
"Drop save state here to load": "Aruncați starea de salvare aici pentru a încărca",
"Loading...": "Încărcare...",
"Download Game Core": "Descărcați nucleul jocului",
"Outdated graphics driver": "Placă grafică învechită",
"Decompress Game Core": "Decompresați nucleul jocului",
"Download Game Data": "Descărcați datele jocului",
"Decompress Game Data": "Decompresați datele jocului",
"Shaders": "Shaders",
"Disabled": "Dezactivat",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS (cadre pe secundă)",
"show": "Afișare",
"hide": "Ascundere",
"Fast Forward Ratio": "Rată de Avans Rapid",
"Fast Forward": "Avansare Rapidă",
"Enabled": "Activat",
"Save State Slot": "Salvare Slotul pentru Stare",
"Save State Location": "Salvare Locație pentru Stare",
"Download": "Descărcați",
"Keep in Browser": "Păstrați în Browser",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Scăzut",
"High": "Ridicat",
"Very High": "Foarte Ridicat",
"None": "Deloc",
"Player 1": "Player 1",
"Player 2": "Player 2",
"Both": "Ambele",
"SAVED STATE TO SLOT": "SAVED STATE TO SLOT",
"LOADED STATE FROM SLOT": "LOADED STATE FROM SLOT",
"SET SAVE STATE SLOT TO": "SET SAVE STATE SLOT TO",
"Network Error": "Eroare de Conectare",
"Submit": "Trimite",
"Description": "Descriere",
"Code": "Cod",
"Add Cheat Code": "Adaugă Cod Cheat",
"Leave Room": "Părăsește Camera",
"Password": "Parolă",
"Password (optional)": "Parolă (opțional)",
"Max Players": "Maximum Jucători",
"Room Name": "Numele Camerei",
"Join": "Alătură-te",
"Player Name": "Nume Jucător",
"Set Player Name": "Setează Numele Jucătorului",
"Left Handed Mode": "Modul Mâna Stângă",
"Virtual Gamepad": "Gamepad Virtual",
"Disk": "Disc",
"Press Keyboard": "Apasă Tastatură",
"INSERT COIN": "INSERT COIN",
"Remove": "Înlăturare",
"LOADED STATE FROM BROWSER": "STARE ÎNCĂRCATĂ DIN BROWSER",
"SAVED STATE TO BROWSER": "STARE SALVATĂ ÎN BROWSER",
"Join the discord": "Alăturăte pe Discord",
"View on GitHub": "Vezi în GitHub",
"Failed to start game": "Pornirea jocului a eșuat",
"Download Game BIOS": "Descărcați BIOS-ul Jocului",
"Decompress Game BIOS": "Decompresați BIOS-ul Jocului",
"Download Game Parent": "Descărcați Jocul părinte",
"Decompress Game Parent": "Decompresați Jocul părinte",
"Download Game Patch": "Descărcați Patch-ul pentru joc",
"Decompress Game Patch": "Decompresați Patch-ul jocului",
"Download Game State": "-Download Game State",
"Check console": "Verifcare consolă",
"Error for site owner": "Eroare pentru deținătorul site-ului",
"EmulatorJS": "EmulatorJS",
"Clear All": "Șterge tot",
"Take Screenshot": "Fă o captură de ecran",
"Start screen recording": "Pornește înregistrarea ecranului",
"Stop screen recording": "Oprește înregistrarea ecranului",
"Quick Save": "Salvare Rapidă",
"Quick Load": "Încărcare Rapidă",
"REWIND": "REWIND",
"Rewind Enabled (requires restart)": "Delurare Activată (necesită repornire)",
"Rewind Granularity": "Granularitatea de Derulare",
"Slow Motion Ratio": "Raport de Latență",
"Slow Motion": "Latență",
"Home": "Acasă",
"EmulatorJS License": "Licența EmulatorJS",
"RetroArch License": "Licența RetroArch",
"This project is powered by": "Proiectul este dezvoltat de către",
"View the RetroArch license here": "Vezi licența RetroArch aici",
"SLOW MOTION": "SLOW MOTION",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "UP",
"DOWN": "DOWN",
"LEFT": "LEFT",
"RIGHT": "RIGHT",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "STICK UP",
"STICK DOWN": "STICK DOWN",
"STICK LEFT": "STICK LEFT",
"STICK RIGHT": "STICK RIGHT",
"C-PAD UP": "C-PAD UP",
"C-PAD DOWN": "C-PAD DOWN",
"C-PAD LEFT": "C-PAD LEFT",
"C-PAD RIGHT": "C-PAD RIGHT",
"MICROPHONE": "MICROPHONE",
"BUTTON 1 / START": "BUTTON 1 / START",
"BUTTON 2": "BUTTON 2",
"BUTTON": "BUTTON",
"LEFT D-PAD UP": "LEFT D-PAD UP",
"LEFT D-PAD DOWN": "LEFT D-PAD DOWN",
"LEFT D-PAD LEFT": "LEFT D-PAD LEFT",
"LEFT D-PAD RIGHT": "LEFT D-PAD RIGHT",
"RIGHT D-PAD UP": "RIGHT D-PAD UP",
"RIGHT D-PAD DOWN": "RIGHT D-PAD DOWN",
"RIGHT D-PAD LEFT": "RIGHT D-PAD LEFT",
"RIGHT D-PAD RIGHT": "RIGHT D-PAD RIGHT",
"C": "C",
"MODE": "MODE",
"FIRE": "FIRE",
"RESET": "RESET",
"LEFT DIFFICULTY A": "LEFT DIFFICULTY A",
"LEFT DIFFICULTY B": "LEFT DIFFICULTY B",
"RIGHT DIFFICULTY A": "RIGHT DIFFICULTY A",
"RIGHT DIFFICULTY B": "RIGHT DIFFICULTY B",
"COLOR": "COLOR",
"B/W": "B/W",
"PAUSE": "PAUSE",
"OPTION": "OPTION",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK UP",
"L STICK DOWN": "L STICK DOWN",
"L STICK LEFT": "L STICK LEFT",
"L STICK RIGHT": "L STICK RIGHT",
"R STICK UP": "R STICK UP",
"R STICK DOWN": "R STICK DOWN",
"R STICK LEFT": "R STICK LEFT",
"R STICK RIGHT": "R STICK RIGHT",
"Start": "Pornire",
"Select": "Selectare",
"Fast": "Rapid",
"Slow": "Lent",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "f",
"g": "g",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "l",
"m": "m",
"n": "n",
"o": "o",
"p": "p",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "u",
"v": "v",
"w": "w",
"x": "x",
"y": "y",
"z": "z",
"enter": "enter",
"escape": "escape",
"space": "space",
"tab": "tab",
"backspace": "backspace",
"delete": "delete",
"arrowup": "arrowup",
"arrowdown": "arrowdown",
"arrowleft": "arrowleft",
"arrowright": "arrowright",
"f1": "f1",
"f2": "f2",
"f3": "f3",
"f4": "f4",
"f5": "f5",
"f6": "f6",
"f7": "f7",
"f8": "f8",
"f9": "f9",
"f10": "f10",
"f11": "f11",
"f12": "f12",
"shift": "shift",
"control": "control",
"alt": "alt",
"meta": "meta",
"capslock": "capslock",
"insert": "insert",
"home": "home",
"end": "end",
"pageup": "pageup",
"pagedown": "pagedown",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "LEFT_STICK_Y",
"RIGHT_STICK_X": "RIGHT_STICK_X",
"RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "LEFT_TRIGGER",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "A_BUTTON",
"B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "START_BUTTON",
"SELECT_BUTTON": "SELECT_BUTTON",
"L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
"DPAD_UP": "DPAD_UP",
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}

View File

@ -99,8 +99,8 @@
"Press Keyboard": "Нажмите кнопку на клавиатуре",
"INSERT COIN": "ВСТАВЬТЕ МОНЕТУ",
"Remove": "Удалить",
"SAVE LOADED FROM BROWSER": "ЗАГРУЖЕНО ИЗ БРАУЗЕРА",
"SAVE SAVED TO BROWSER": "СОХРАНЕНО В БРАУЗЕРЕ",
"LOADED STATE FROM BROWSER": "ЗАГРУЖЕННОЕ СОСТОЯНИЕ ИЗ БРАУЗЕРА",
"SAVED STATE TO BROWSER": "СОХРАНЕННОЕ СОСТОЯНИЕ В БРАУЗЕРЕ",
"Join the discord": "Присоединяйтесь к discord",
"View on GitHub": "Посмотреть на GitHub",
"Failed to start game": "Не удалось запустить игру",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_ВНИЗ",
"DPAD_LEFT": "DPAD_ВЛЕВО",
"DPAD_RIGHT": "DPAD_СПРАВО"
}
}

View File

@ -104,8 +104,8 @@
"Press Keyboard": "Klavyeye Basın",
"INSERT COIN": "JETON ATINIZ",
"Remove": "Kaldır",
"SAVE LOADED FROM BROWSER": "KAYIT TARAYICIDAN YÜKLENDİ",
"SAVE SAVED TO BROWSER": "KAYIT TARAYICIYA KAYDEDİLDİ",
"LOADED STATE FROM BROWSER": "TARAYICIDAN YÜKLENEN DURUM",
"SAVED STATE TO BROWSER": "TARAYICILARA KAYDEDİLDİ DURUM",
"Join the discord": "Discord'a katıl",
"View on GitHub": "Github'da görüntüler",
"Failed to start game": "Oyun başlatılamadı",
@ -121,8 +121,8 @@
"EmulatorJS": "EmulatorJS",
"Clear All": "Hepsini Temizle",
"Take Screenshot": "Ekran Görüntüsü Al",
"Start screen recording": "Ekran kaydı başlat",
"Stop screen recording": "Ekran kaydını durdur",
"Start Screen Recording": "Ekran kaydı başlat",
"Stop Screen Recording": "Ekran kaydını durdur",
"Quick Save": "Hızlı Kaydet",
"Quick Load": "Hızlı Yükle",
"REWIND": "GERİ SAR",

View File

@ -100,8 +100,8 @@
"Press Keyboard": "Bàn phím",
"INSERT COIN": "THÊM XU",
"Remove": "Loại bỏ",
"SAVE LOADED FROM BROWSER": "SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "SAVE SAVED TO BROWSER",
"LOADED STATE FROM BROWSER": "TRẠNG THÁI ĐÃ TẢI TỪ TRÌNH DUYỆT",
"SAVED STATE TO BROWSER": "TRẠNG THÁI ĐÃ LƯU VÀO TRÌNH DUYỆT",
"Join the discord": "Tham gia thảo luận",
"View on GitHub": "Xem trên GitHub",
"Failed to start game": "Thất bại khởi động game",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "按键盘",
"INSERT COIN": "投币",
"Remove": "消除",
"SAVE LOADED FROM BROWSER": "已从浏览器加载状态",
"SAVE SAVED TO BROWSER": "已将状态保存到浏览器",
"LOADED STATE FROM BROWSER": "浏览器加载状态",
"SAVED STATE TO BROWSER": "已将状态保存至浏览器",
"Join the discord": "加入discord",
"View on GitHub": "在GitHub上查看",
"Failed to start game": "无法开始游戏",
@ -297,5 +297,55 @@
"DPAD_UP": "十字键向上",
"DPAD_DOWN": "十字键向下",
"DPAD_LEFT": "十字键向左",
"DPAD_RIGHT": "十字键向右"
}
"DPAD_RIGHT": "十字键向右",
"BUTTON_1": "按钮1",
"BUTTON_2": "按钮2",
"up arrow": "方向上",
"down arrow": "方向下",
"left arrow": "方向左",
"right arrow": "方向右",
"Start Screen Recording": "开始屏幕录制",
"Stop Screen Recording": "停止屏幕录制",
"Context Menu": "菜单",
"Exit Emulation": "退出模拟器",
"System Save interval": "系统保存间隔",
"Are you sure you want to exit?": "您确定要退出吗?",
"Exit": "退出",
"Cancel": "取消",
"Note that some cheats require a restart to disable": "请注意,某些作弊码需要重新启动才能禁用",
"Drop save state here to load": "将状态保存文件拖放到此处以加载",
"Disks": "Disks",
"SWAP DISKS": "SWAP DISKS",
"EJECT/INSERT DISK": "EJECT/INSERT DISK",
"LEFT_TOP_SHOULDER": "LEFT_TOP_SHOULDER",
"RIGHT_TOP_SHOULDER": "RIGHT_TOP_SHOULDER",
"Requires restart": "Requires restart",
"Core (Requires restart)": "Core (Requires restart)",
"CRT beam": "CRT beam",
"CRT caligari": "CRT caligari",
"CRT lottes": "CRT lottes",
"CRT yeetron": "CRT yeetron",
"CRT zfast": "CRT zfast",
"SABR": "SABR",
"Bicubic": "Bicubic",
"Mix frames": "Mix frames",
"WebGL2": "WebGL2",
"VSync": "VSync",
"Video Rotation": "Video Rotation",
"Screenshot Source": "Screenshot Source",
"Screenshot Format": "Screenshot Format",
"Screenshot Upscale": "Screenshot Upscale",
"Screen Recording FPS": "Screen Recording FPS",
"Screen Recording Format": "Screen Recording Format",
"Screen Recording Upscale": "Screen Recording Upscale",
"Screen Recording Video Bitrate": "Screen Recording Video Bitrate",
"Screen Recording Audio Bitrate": "Screen Recording Audio Bitrate",
"Rewind Enabled (Requires restart)": "Rewind Enabled (Requires restart)",
"Menubar Mouse Trigger": "Menubar Mouse Trigger",
"Downward Movement": "Downward Movement",
"Movement Anywhere": "Movement Anywhere",
"Direct Keyboard Input": "Direct Keyboard Input",
"Forward Alt key": "Forward Alt key",
"Lock Mouse": "Lock Mouse"
}

View File

@ -1,28 +0,0 @@
const UglifyJS = require("uglify-js");
const fs = require('fs');
const uglifycss = require('uglifycss');
const scripts = [
"emulator.js",
"nipplejs.js",
"shaders.js",
"storage.js",
"gamepad.js",
"GameManager.js",
"socket.io.min.js",
"compression.js"
];
let code = "(function() {\n";
for (let i=0; i<scripts.length; i++) {
code += fs.readFileSync('../src/'+scripts[i], 'utf8') + "\n";
}
code += "\n})();"
function minify(source){
const ast = UglifyJS.parse(source);
return UglifyJS.minify(ast).code;
}
console.log('minifying');
fs.writeFileSync('../emulator.min.css', uglifycss.processString(fs.readFileSync('../emulator.css', 'utf8')));
fs.writeFileSync('../emulator.min.js', minify(code));
console.log('done!');

View File

@ -1,22 +0,0 @@
{
"name": "emulatorjs-minify",
"version": "1.0.1",
"description": "Minify the EmulatorJS javascript files",
"main": "index.js",
"scripts": {
"build": "node index.js"
},
"repository": {
"type": "git",
"url": "git+https://github.com/EmulatorJS/EmulatorJS.git"
},
"author": "Ethan O'Brien",
"bugs": {
"url": "https://github.com/EmulatorJS/EmulatorJS/issues"
},
"homepage": "https://github.com/EmulatorJS/EmulatorJS#readme",
"dependencies": {
"uglify-js": "^3.17.4",
"uglifycss": "0.0.29"
}
}

View File

@ -4,69 +4,91 @@ class EJS_GameManager {
this.Module = Module;
this.FS = this.Module.FS;
this.functions = {
restart: this.Module.cwrap('system_restart', '', []),
saveStateInfo: this.Module.cwrap('save_state_info', 'null', []),
loadState: this.Module.cwrap('load_state', 'number', ['string', 'number']),
screenshot: this.Module.cwrap('cmd_take_screenshot', '', []),
simulateInput: this.Module.cwrap('simulate_input', 'null', ['number', 'number', 'number']),
toggleMainLoop: this.Module.cwrap('toggleMainLoop', 'null', ['number']),
getCoreOptions: this.Module.cwrap('get_core_options', 'string', []),
setVariable: this.Module.cwrap('ejs_set_variable', 'null', ['string', 'string']),
setCheat: this.Module.cwrap('set_cheat', 'null', ['number', 'number', 'string']),
resetCheat: this.Module.cwrap('reset_cheat', 'null', []),
toggleShader: this.Module.cwrap('shader_enable', 'null', ['number']),
getDiskCount: this.Module.cwrap('get_disk_count', 'number', []),
getCurrentDisk: this.Module.cwrap('get_current_disk', 'number', []),
setCurrentDisk: this.Module.cwrap('set_current_disk', 'null', ['number']),
getSaveFilePath: this.Module.cwrap('save_file_path', 'string', []),
saveSaveFiles: this.Module.cwrap('cmd_savefiles', '', []),
supportsStates: this.Module.cwrap('supports_states', 'number', []),
loadSaveFiles: this.Module.cwrap('refresh_save_files', 'null', []),
toggleFastForward: this.Module.cwrap('toggle_fastforward', 'null', ['number']),
setFastForwardRatio: this.Module.cwrap('set_ff_ratio', 'null', ['number']),
toggleRewind: this.Module.cwrap('toggle_rewind', 'null', ['number']),
setRewindGranularity: this.Module.cwrap('set_rewind_granularity', 'null', ['number']),
toggleSlowMotion: this.Module.cwrap('toggle_slow_motion', 'null', ['number']),
setSlowMotionRatio: this.Module.cwrap('set_sm_ratio', 'null', ['number']),
getFrameNum: this.Module.cwrap('get_current_frame_count', 'number', ['']),
setVSync: this.Module.cwrap('set_vsync', 'null', ['number'])
restart: this.Module.cwrap("system_restart", "", []),
//saveStateInfo: this.Module.cwrap("save_state_info", "string", []),
loadState: this.Module.cwrap("load_state", "number", ["string", "number"]),
screenshot: this.Module.cwrap("cmd_take_screenshot", "", []),
simulateInput: this.Module.cwrap("simulate_input", "null", ["number", "number", "number"]),
toggleMainLoop: this.Module.cwrap("toggleMainLoop", "null", ["number"]),
getCoreOptions: this.Module.cwrap("get_core_options", "string", []),
setVariable: this.Module.cwrap("ejs_set_variable", "null", ["string", "string"]),
setCheat: this.Module.cwrap("set_cheat", "null", ["number", "number", "string"]),
resetCheat: this.Module.cwrap("reset_cheat", "null", []),
toggleShader: this.Module.cwrap("shader_enable", "null", ["number"]),
getDiskCount: this.Module.cwrap("get_disk_count", "number", []),
getCurrentDisk: this.Module.cwrap("get_current_disk", "number", []),
setCurrentDisk: this.Module.cwrap("set_current_disk", "null", ["number"]),
getSaveFilePath: this.Module.cwrap("save_file_path", "string", []),
saveSaveFiles: this.Module.cwrap("cmd_savefiles", "", []),
supportsStates: this.Module.cwrap("supports_states", "number", []),
loadSaveFiles: this.Module.cwrap("refresh_save_files", "null", []),
toggleFastForward: this.Module.cwrap("toggle_fastforward", "null", ["number"]),
setFastForwardRatio: this.Module.cwrap("set_ff_ratio", "null", ["number"]),
toggleRewind: this.Module.cwrap("toggle_rewind", "null", ["number"]),
setRewindGranularity: this.Module.cwrap("set_rewind_granularity", "null", ["number"]),
toggleSlowMotion: this.Module.cwrap("toggle_slow_motion", "null", ["number"]),
setSlowMotionRatio: this.Module.cwrap("set_sm_ratio", "null", ["number"]),
getFrameNum: this.Module.cwrap("get_current_frame_count", "number", [""]),
setVSync: this.Module.cwrap("set_vsync", "null", ["number"]),
setVideoRoation: this.Module.cwrap("set_video_rotation", "null", ["number"]),
getVideoDimensions: this.Module.cwrap("get_video_dimensions", "number", ["string"]),
setKeyboardEnabled: this.Module.cwrap("ejs_set_keyboard_enabled", "null", ["number"])
}
this.mkdir("/data");
this.mkdir("/data/saves");
this.writeFile("/home/web_user/retroarch/userdata/retroarch.cfg", this.getRetroArchCfg());
this.FS.mount(this.FS.filesystems.IDBFS, {autoPersist: true}, '/data/saves');
//this.FS.syncfs(true, () => {});
this.writeFile("/home/web_user/.config/retroarch/retroarch.cfg", this.getRetroArchCfg());
this.writeConfigFile();
this.initShaders();
this.setupPreLoadSettings();
this.EJS.on("exit", () => {
if (!this.EJS.failedToStart) {
this.saveSaveFiles();
this.functions.restart();
this.saveSaveFiles();
}
this.toggleMainLoop(0);
this.functions.saveSaveFiles();
this.FS.unmount("/data/saves");
setTimeout(() => {
try {window.abort()} catch(e){};
try {
this.Module.abort();
} catch(e) {
console.warn(e);
};
}, 1000);
})
}
setupPreLoadSettings() {
this.Module.callbacks.setupCoreSettingFile = (filePath) => {
if (this.EJS.debug) console.log("Setting up core settings with path:", filePath);
this.writeFile(filePath, this.EJS.getCoreSettings());
}
}
mountFileSystems() {
return new Promise(async resolve => {
this.mkdir("/data");
this.mkdir("/data/saves");
this.FS.mount(this.FS.filesystems.IDBFS, { autoPersist: true }, "/data/saves");
this.FS.syncfs(true, resolve);
});
}
writeConfigFile() {
if (!this.EJS.defaultCoreOpts.file || !this.EJS.defaultCoreOpts.settings) {
return;
}
let output = "";
for (const k in this.EJS.defaultCoreOpts.settings) {
output += k + ' = "' + this.EJS.defaultCoreOpts.settings[k] +'"\n';
output += k + ' = "' + this.EJS.defaultCoreOpts.settings[k] + '"\n';
}
this.writeFile("/home/web_user/retroarch/userdata/config/" + this.EJS.defaultCoreOpts.file, output);
}
loadExternalFiles() {
return new Promise(async (resolve, reject) => {
if (this.EJS.config.externalFiles && this.EJS.config.externalFiles.constructor.name === 'Object') {
if (this.EJS.config.externalFiles && this.EJS.config.externalFiles.constructor.name === "Object") {
for (const key in this.EJS.config.externalFiles) {
await new Promise(done => {
this.EJS.downloadFile(this.EJS.config.externalFiles[key], async (res) => {
this.EJS.downloadFile(this.EJS.config.externalFiles[key], null, true, { responseType: "arraybuffer", method: "GET" }).then(async (res) => {
if (res === -1) {
if (this.EJS.debug) console.warn("Failed to fetch file from '" + this.EJS.config.externalFiles[key] + "'. Make sure the file exists.");
return done();
@ -81,18 +103,18 @@ class EJS_GameManager {
path += name;
} else {
for (const k in files) {
this.writeFile(path+k, files[k]);
this.writeFile(path + k, files[k]);
}
return done();
}
}
try {
this.writeFile(path, res.data);
this.writeFile(path, new Uint8Array(res.data));
} catch(e) {
if (this.EJS.debug) console.warn("Failed to write file to '" + path + "'. Make sure there are no conflicting files.");
}
done();
}, null, true, {responseType: "arraybuffer", method: "GET"});
});
})
}
}
@ -102,7 +124,7 @@ class EJS_GameManager {
writeFile(path, data) {
const parts = path.split("/");
let current = "/";
for (let i=0; i<parts.length-1; i++) {
for (let i = 0; i < parts.length - 1; i++) {
if (!parts[i].trim()) continue;
current += parts[i] + "/";
this.mkdir(current);
@ -115,26 +137,55 @@ class EJS_GameManager {
} catch(e) {}
}
getRetroArchCfg() {
return "autosave_interval = 60\n" +
"screenshot_directory = \"/\"\n" +
"block_sram_overwrite = false\n" +
"video_gpu_screenshot = false\n" +
"audio_latency = 64\n" +
"video_top_portrait_viewport = true\n" +
"video_vsync = true\n" +
"video_smooth = false\n" +
"fastforward_ratio = 3.0\n" +
"slowmotion_ratio = 3.0\n" +
(this.EJS.rewindEnabled ? "rewind_enable = true\n" : "") +
(this.EJS.rewindEnabled ? "rewind_granularity = 6\n" : "") +
"savefile_directory = \"/data/saves\"\n";
let cfg = "autosave_interval = 60\n" +
"screenshot_directory = \"/\"\n" +
"block_sram_overwrite = false\n" +
"video_gpu_screenshot = false\n" +
"audio_latency = 64\n" +
"video_top_portrait_viewport = true\n" +
"video_vsync = true\n" +
"video_smooth = false\n" +
"fastforward_ratio = 3.0\n" +
"slowmotion_ratio = 3.0\n" +
(this.EJS.rewindEnabled ? "rewind_enable = true\n" : "") +
(this.EJS.rewindEnabled ? "rewind_granularity = 6\n" : "") +
"savefile_directory = \"/data/saves\"\n";
if (this.EJS.retroarchOpts && Array.isArray(this.EJS.retroarchOpts)) {
this.EJS.retroarchOpts.forEach(option => {
let selected = this.EJS.preGetSetting(option.name);
console.log(selected);
if (!selected) {
selected = option.default;
}
const value = option.isString === false ? selected : '"' + selected + '"';
cfg += option.name + " = " + value + "\n"
})
}
return cfg;
}
writeBootupBatchFile() {
const data = `
SET BLASTER=A220 I7 D1 H5 T6
@ECHO OFF
mount A / -t floppy
SET PATH=Z:\\;A:\\
mount c /emulator/c
c:
COMMAND.COM
IF EXIST AUTORUN.BAT AUTORUN.BAT
`;
const filename = "BOOTUP.BAT";
this.FS.writeFile("/" + filename, data);
return filename;
}
initShaders() {
if (!this.EJS.config.shaders) return;
this.mkdir("/shader");
for (const shaderFileName in this.EJS.config.shaders) {
const shader = this.EJS.config.shaders[shaderFileName];
if (typeof shader === 'string') {
if (typeof shader === "string") {
this.FS.writeFile(`/shader/${shaderFileName}`, shader);
}
}
@ -150,23 +201,25 @@ class EJS_GameManager {
this.functions.restart();
}
getState() {
this.functions.saveStateInfo();
return this.FS.readFile("/current.state");
return this.Module.EmulatorJSGetState();
}
loadState(state) {
try {
this.FS.unlink('game.state');
} catch(e){}
this.FS.writeFile('/game.state', state);
this.FS.unlink("game.state");
} catch(e) {}
this.FS.writeFile("/game.state", state);
this.clearEJSResetTimer();
this.functions.loadState("game.state", 0);
setTimeout(() => {
try {
this.FS.unlink('game.state');
} catch(e){}
this.FS.unlink("game.state");
} catch(e) {}
}, 5000)
}
screenshot() {
try {
this.FS.unlink("/screenshot.png");
} catch(e) {}
this.functions.screenshot();
return new Promise(async resolve => {
while (1) {
@ -174,26 +227,28 @@ class EJS_GameManager {
this.FS.stat("/screenshot.png");
return resolve(this.FS.readFile("/screenshot.png"));
} catch(e) {}
await new Promise(res => setTimeout(res, 50));
}
})
}
quickSave(slot) {
if (!slot) slot = 1;
(async () => {
let name = slot + '-quick.state';
try {
this.FS.unlink(name);
} catch (e) {}
let data = await this.getState();
this.FS.writeFile('/'+name, data);
})();
let name = slot + "-quick.state";
try {
this.FS.unlink(name);
} catch(e) {}
try {
let data = this.getState();
this.FS.writeFile("/" + name, data);
} catch(e) {
return false;
}
return true;
}
quickLoad(slot) {
if (!slot) slot = 1;
(async () => {
let name = slot + '-quick.state';
let name = slot + "-quick.state";
this.clearEJSResetTimer();
this.functions.loadState(name, 0);
})();
@ -205,25 +260,28 @@ class EJS_GameManager {
}
if ([24, 25, 26, 27, 28, 29].includes(index)) {
if (index === 24 && value === 1) {
const slot = this.EJS.settings['save-state-slot'] ? this.EJS.settings['save-state-slot'] : "1";
this.quickSave(slot);
this.EJS.displayMessage(this.EJS.localization("SAVED STATE TO SLOT")+" "+slot);
const slot = this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1";
if (this.quickSave(slot)) {
this.EJS.displayMessage(this.EJS.localization("SAVED STATE TO SLOT") + " " + slot);
} else {
this.EJS.displayMessage(this.EJS.localization("FAILED TO SAVE STATE"));
}
}
if (index === 25 && value === 1) {
const slot = this.EJS.settings['save-state-slot'] ? this.EJS.settings['save-state-slot'] : "1";
const slot = this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1";
this.quickLoad(slot);
this.EJS.displayMessage(this.EJS.localization("LOADED STATE FROM SLOT")+" "+slot);
this.EJS.displayMessage(this.EJS.localization("LOADED STATE FROM SLOT") + " " + slot);
}
if (index === 26 && value === 1) {
let newSlot;
try {
newSlot = parseFloat(this.EJS.settings['save-state-slot'] ? this.EJS.settings['save-state-slot'] : "1") + 1;
newSlot = parseFloat(this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1") + 1;
} catch(e) {
newSlot = 1;
}
if (newSlot > 9) newSlot = 1;
this.EJS.displayMessage(this.EJS.localization("SET SAVE STATE SLOT TO")+" "+newSlot);
this.EJS.changeSettingOption('save-state-slot', newSlot.toString());
this.EJS.displayMessage(this.EJS.localization("SET SAVE STATE SLOT TO") + " " + newSlot);
this.EJS.changeSettingOption("save-state-slot", newSlot.toString());
}
if (index === 27) {
this.functions.toggleFastForward(this.EJS.isFastForward ? !value : value);
@ -264,7 +322,7 @@ class EJS_GameManager {
return null;
}
}
for (let i=0; i<fileNames.length; i++) {
for (let i = 0; i < fileNames.length; i++) {
if (fileNames[i].split(".").pop().toLowerCase() === "ccd") {
console.warn("Did not auto-create cue file(s). Found a ccd.");
return null;
@ -278,47 +336,49 @@ class EJS_GameManager {
if (baseFileName.includes(".")) {
baseFileName = baseFileName.substring(0, baseFileName.length - baseFileName.split(".").pop().length - 1);
}
for (let i=0; i<fileNames.length; i++) {
const contents = " FILE \""+fileNames[i]+"\" BINARY\n TRACK 01 MODE1/2352\n INDEX 01 00:00:00";
this.FS.writeFile("/"+baseFileName+"-"+i+".cue", contents);
for (let i = 0; i < fileNames.length; i++) {
const contents = " FILE \"" + fileNames[i] + "\" BINARY\n TRACK 01 MODE1/2352\n INDEX 01 00:00:00";
this.FS.writeFile("/" + baseFileName + "-" + i + ".cue", contents);
}
if (fileNames.length > 1) {
let contents = "";
for (let i=0; i<fileNames.length; i++) {
contents += "/"+baseFileName+"-"+i+".cue\n";
for (let i = 0; i < fileNames.length; i++) {
contents += "/" + baseFileName + "-" + i + ".cue\n";
}
this.FS.writeFile("/"+baseFileName+".m3u", contents);
this.FS.writeFile("/" + baseFileName + ".m3u", contents);
}
return (fileNames.length === 1) ? baseFileName+"-0.cue" : baseFileName+".m3u";
return (fileNames.length === 1) ? baseFileName + "-0.cue" : baseFileName + ".m3u";
}
loadPpssppAssets() {
return new Promise(resolve => {
this.EJS.downloadFile('cores/ppsspp-assets.zip', (res) => {
this.EJS.downloadFile("cores/ppsspp-assets.zip", null, false, { responseType: "arraybuffer", method: "GET" }).then((res) => {
this.EJS.checkCompression(new Uint8Array(res.data), this.EJS.localization("Decompress Game Data")).then((pspassets) => {
if (pspassets === -1) {
this.EJS.textElem.innerText = this.localization('Network Error');
this.EJS.textElem.innerText = this.localization("Network Error");
this.EJS.textElem.style.color = "red";
return;
}
this.mkdir("/PPSSPP");
for (const file in pspassets) {
const data = pspassets[file];
const path = "/PPSSPP/"+file;
const path = "/PPSSPP/" + file;
const paths = path.split("/");
let cp = "";
for (let i=0; i<paths.length-1; i++) {
for (let i = 0; i < paths.length - 1; i++) {
if (paths[i] === "") continue;
cp += "/"+paths[i];
if (!FS.analyzePath(cp).exists) {
cp += "/" + paths[i];
if (!this.FS.analyzePath(cp).exists) {
this.FS.mkdir(cp);
}
}
this.FS.writeFile(path, data);
if (!path.endsWith("/")) {
this.FS.writeFile(path, data);
}
}
resolve();
})
}, null, false, {responseType: "arraybuffer", method: "GET"});
});
})
}
setVSync(enabled) {
@ -356,13 +416,16 @@ class EJS_GameManager {
}
saveSaveFiles() {
this.functions.saveSaveFiles();
this.EJS.callEvent("saveSaveFiles", this.getSaveFile(false));
//this.FS.syncfs(false, () => {});
}
supportsStates() {
return !!this.functions.supportsStates();
}
getSaveFile() {
this.saveSaveFiles();
getSaveFile(save) {
if (save !== false) {
this.saveSaveFiles();
}
const exists = this.FS.analyzePath(this.getSaveFilePath()).exists;
return (exists ? this.FS.readFile(this.getSaveFilePath()) : null);
}
@ -388,6 +451,22 @@ class EJS_GameManager {
getFrameNum() {
return this.functions.getFrameNum();
}
setVideoRotation(rotation) {
this.functions.setVideoRoation(rotation);
}
getVideoDimensions(type) {
try {
return this.functions.getVideoDimensions(type);
} catch(e) {
console.warn(e);
}
}
setKeyboardEnabled(enabled) {
this.functions.setKeyboardEnabled(enabled === true ? 1 : 0);
}
setAltKeyEnabled(enabled) {
this.functions.setKeyboardEnabled(enabled === true ? 3 : 2);
}
}
window.EJS_GameManager = EJS_GameManager;

View File

@ -1,30 +1,81 @@
class EJS_COMPRESSION {
/**
* Handles compression and decompression of various archive formats (ZIP, 7Z, RAR)
* for the EmulatorJS system.
*
* This class provides functionality to detect compressed file formats and extract
* their contents using web workers for better performance.
*/
class EJSCompression {
/**
* Creates a new compression handler instance.
*
* @param {Object} EJS - The main EmulatorJS instance
*/
constructor(EJS) {
this.EJS = EJS;
}
isCompressed(data) { //https://www.garykessler.net/library/file_sigs.html
//todo. Use hex instead of numbers
if ((data[0] === 80 && data[1] === 75) && ((data[2] === 3 && data[3] === 4) || (data[2] === 5 && data[3] === 6) || (data[2] === 7 && data[3] === 8))) {
return 'zip';
} else if (data[0] === 55 && data[1] === 122 && data[2] === 188 && data[3] === 175 && data[4] === 39 && data[5] === 28) {
return '7z';
} else if ((data[0] === 82 && data[1] === 97 && data[2] === 114 && data[3] === 33 && data[4] === 26 && data[5] === 7) && ((data[6] === 0) || (data[6] === 1 && data[7] == 0))) {
return 'rar';
/**
* Detects if the given data represents a compressed archive format.
*
* @param {Uint8Array|ArrayBuffer} data - The binary data to analyze
* @returns {string|null} The detected compression format ('zip', '7z', 'rar') or null if not compressed
*
* @description
* Checks the file signature (magic bytes) at the beginning of the data to identify
* the compression format. Supports ZIP, 7Z, and RAR formats.
*
* @see {@link https://www.garykessler.net/library/file_sigs.html|File Signature Database}
*/
isCompressed(data) {
if ((data[0] === 0x50 && data[1] === 0x4B) && ((data[2] === 0x03 && data[3] === 0x04) || (data[2] === 0x05 && data[3] === 0x06) || (data[2] === 0x07 && data[3] === 0x08))) {
return "zip";
} else if (data[0] === 0x37 && data[1] === 0x7A && data[2] === 0xBC && data[3] === 0xAF && data[4] === 0x27 && data[5] === 0x1C) {
return "7z";
} else if ((data[0] === 0x52 && data[1] === 0x61 && data[2] === 0x72 && data[3] === 0x21 && data[4] === 0x1A && data[5] === 0x07) && ((data[6] === 0x00) || (data[6] === 0x01 && data[7] === 0x00))) {
return "rar";
}
return null;
}
return null;
}
/**
* Decompresses the given data and extracts all files.
*
* @param {Uint8Array|ArrayBuffer} data - The compressed data to extract
* @param {Function} updateMsg - Callback function for progress updates (message, isProgress)
* @param {Function} fileCbFunc - Callback function called for each extracted file (filename, fileData)
* @returns {Promise<Object>} Promise that resolves to an object mapping filenames to file data
*
* @description
* Automatically detects the compression format and delegates to the appropriate
* decompression method. If the data is not compressed, returns it as-is.
*/
decompress(data, updateMsg, fileCbFunc) {
const compressed = this.isCompressed(data.slice(0, 10));
if (compressed === null) {
if (typeof fileCbFunc === "function") {
fileCbFunc("!!notCompressedData", data);
}
return new Promise(resolve => resolve({"!!notCompressedData": data}));
return new Promise(resolve => resolve({ "!!notCompressedData": data }));
}
return this.decompressFile(compressed, data, updateMsg, fileCbFunc);
}
/**
* Retrieves the appropriate worker script for the specified compression method.
*
* @param {string} method - The compression method ('7z', 'zip', or 'rar')
* @returns {Promise<Blob>} Promise that resolves to a Blob containing the worker script
*
* @description
* Downloads the necessary worker script and WASM files for the specified compression
* method. For RAR files, also downloads the libunrar.wasm file and creates a custom
* worker script with the WASM binary embedded.
*
* @throws {Error} When network errors occur during file downloads
*/
getWorkerFile(method) {
return new Promise((resolve, reject) => {
return new Promise(async (resolve, reject) => {
let path, obj;
if (method === "7z") {
path = "compression/extract7z.js";
@ -36,33 +87,97 @@ class EJS_COMPRESSION {
path = "compression/libunrar.js";
obj = "rar";
}
this.EJS.downloadFile(path, (res) => {
if (res === -1) {
this.EJS.startGameError(this.EJS.localization('Network Error'));
const res = await this.EJS.downloadFile(path, null, false, { responseType: "text", method: "GET" });
if (res === -1) {
this.EJS.startGameError(this.EJS.localization("Network Error"));
return;
}
if (method === "rar") {
const res2 = await this.EJS.downloadFile("compression/libunrar.wasm", null, false, { responseType: "arraybuffer", method: "GET" });
if (res2 === -1) {
this.EJS.startGameError(this.EJS.localization("Network Error"));
return;
}
if (method === "rar") {
this.EJS.downloadFile("compression/libunrar.wasm", (res2) => {
if (res2 === -1) {
this.EJS.startGameError(this.EJS.localization('Network Error'));
return;
const path = URL.createObjectURL(new Blob([res2.data], { type: "application/wasm" }));
let script = `
let dataToPass = [];
Module = {
monitorRunDependencies: function(left) {
if (left == 0) {
setTimeout(function() {
unrar(dataToPass, null);
}, 100);
}
},
onRuntimeInitialized: function() {},
locateFile: function(file) {
console.log("locateFile");
return "` + path + `";
}
const path = URL.createObjectURL(new Blob([res2.data], {type: "application/wasm"}));
let data = '\nlet dataToPass = [];\nModule = {\n monitorRunDependencies: function(left) {\n if (left == 0) {\n setTimeout(function() {\n unrar(dataToPass, null);\n }, 100);\n }\n },\n onRuntimeInitialized: function() {\n },\n locateFile: function(file) {\n return \''+path+'\';\n }\n};\n'+res.data+'\nlet unrar = function(data, password) {\n let cb = function(fileName, fileSize, progress) {\n postMessage({"t":4,"current":progress,"total":fileSize, "name": fileName});\n };\n\n let rarContent = readRARContent(data.map(function(d) {\n return {\n name: d.name,\n content: new Uint8Array(d.content)\n }\n }), password, cb)\n let rec = function(entry) {\n if (!entry) return;\n if (entry.type === \'file\') {\n postMessage({"t":2,"file":entry.fullFileName,"size":entry.fileSize,"data":entry.fileContent});\n } else if (entry.type === \'dir\') {\n Object.keys(entry.ls).forEach(function(k) {\n rec(entry.ls[k]);\n })\n } else {\n throw "Unknown type";\n }\n }\n rec(rarContent);\n postMessage({"t":1});\n return rarContent;\n};\nonmessage = function(data) {\n dataToPass.push({name: \'test.rar\', content: data.data});\n};\n ';
const blob = new Blob([data], {
type: 'application/javascript'
})
resolve(blob);
}, null, false, {responseType: "arraybuffer", method: "GET"});
} else {
const blob = new Blob([res.data], {
type: 'application/javascript'
})
resolve(blob);
}
}, null, false, {responseType: "arraybuffer", method: "GET"});
};
` + res.data + `
let unrar = function(data, password) {
let cb = function(fileName, fileSize, progress) {
postMessage({ "t": 4, "current": progress, "total": fileSize, "name": fileName });
};
let rarContent = readRARContent(data.map(function(d) {
return {
name: d.name,
content: new Uint8Array(d.content)
}
}), password, cb)
let rec = function(entry) {
if (!entry) return;
if (entry.type === "file") {
postMessage({ "t": 2, "file": entry.fullFileName, "size": entry.fileSize, "data": entry.fileContent });
} else if (entry.type === "dir") {
Object.keys(entry.ls).forEach(function(k) {
rec(entry.ls[k]);
});
} else {
throw "Unknown type";
}
}
rec(rarContent);
postMessage({ "t": 1 });
return rarContent;
};
onmessage = function(data) {
dataToPass.push({ name: "test.rar", content: data.data });
};
`;
const blob = new Blob([script], {
type: "application/javascript"
})
resolve(blob);
} else {
const blob = new Blob([res.data], {
type: "application/javascript"
})
resolve(blob);
}
})
}
/**
* Decompresses a file using the specified compression method.
*
* @param {string} method - The compression method ('7z', 'zip', or 'rar')
* @param {Uint8Array|ArrayBuffer} data - The compressed data to extract
* @param {Function} updateMsg - Callback function for progress updates (message, isProgress)
* @param {Function} fileCbFunc - Callback function called for each extracted file (filename, fileData)
* @returns {Promise<Object>} Promise that resolves to an object mapping filenames to file data
*
* @description
* Creates a web worker to handle the decompression process asynchronously.
* The worker communicates progress updates and extracted files back to the main thread.
*
* @example
* // Message types from worker:
* // t: 4 - Progress update (current, total, name)
* // t: 2 - File extracted (file, size, data)
* // t: 1 - Extraction complete
*/
decompressFile(method, data, updateMsg, fileCbFunc) {
return new Promise(async callback => {
const file = await this.getWorkerFile(method);
@ -75,7 +190,7 @@ class EJS_COMPRESSION {
const pg = data.data;
const num = Math.floor(pg.current / pg.total * 100);
if (isNaN(num)) return;
const progress = ' '+num.toString()+'%';
const progress = " " + num.toString() + "%";
updateMsg(progress, true);
}
if (data.data.t === 2) {
@ -95,4 +210,4 @@ class EJS_COMPRESSION {
}
}
window.EJS_COMPRESSION = EJS_COMPRESSION;
window.EJS_COMPRESSION = EJSCompression;

File diff suppressed because one or more lines are too long

View File

@ -1,4 +1,7 @@
class GamepadHandler {
gamepads;
timeout;
listeners;
constructor() {
this.buttonLabels = {
0: 'BUTTON_1',
@ -34,7 +37,16 @@ class GamepadHandler {
this.timeout = setTimeout(this.loop.bind(this), 10);
}
updateGamepadState() {
const gamepads = Array.from(this.getGamepads());
let gamepads = Array.from(this.getGamepads());
if (!gamepads) return;
if (!Array.isArray(gamepads) && gamepads.length) {
let gp = [];
for (let i=0; i<gamepads.length; i++) {
gp.push(gamepads[i]);
}
gamepads = gp;
} else if (!Array.isArray(gamepads)) return;
gamepads.forEach((gamepad, index) => {
if (!gamepad) return;
let hasGamepad = false;
@ -47,13 +59,15 @@ class GamepadHandler {
id: oldGamepad.id
}
hasGamepad = true;
oldGamepad.axes.forEach((axis, axisIndex) => {
const val = (axis < 0.01 && axis > -0.01) ? 0 : axis;
const newVal = (gamepad.axes[axisIndex] < 0.01 && gamepad.axes[axisIndex] > -0.01) ? 0 : gamepad.axes[axisIndex];
if (newVal !== val) {
const axis = ['LEFT_STICK_X', 'LEFT_STICK_Y', 'RIGHT_STICK_X', 'RIGHT_STICK_Y'][axisIndex];
if (!axis) return;
let axis = ['LEFT_STICK_X', 'LEFT_STICK_Y', 'RIGHT_STICK_X', 'RIGHT_STICK_Y'][axisIndex];
if (!axis) {
axis = "EXTRA_STICK_" + axisIndex;
}
this.dispatchEvent('axischanged', {
axis: axis,
value: newVal,
@ -64,7 +78,7 @@ class GamepadHandler {
}
gamepadToSave.axes[axisIndex] = newVal;
})
gamepad.buttons.forEach((button, buttonIndex) => {
let pressed = oldGamepad.buttons[buttonIndex] === 1.0;
if (typeof oldGamepad.buttons[buttonIndex] === "object") {
@ -82,16 +96,22 @@ class GamepadHandler {
this.dispatchEvent('buttonup', {index: buttonIndex, label:this.getButtonLabel(buttonIndex), gamepadIndex: gamepad.index});
}
}
})
this.gamepads[oldIndex] = gamepadToSave;
})
if (!hasGamepad) {
this.gamepads.push(gamepads[index]);
this.gamepads.sort((a, b) => {
if (a == null && b == null) return 0;
if (a == null) return 1;
if (b == null) return -1;
return a.index - b.index;
});
this.dispatchEvent('connected', {gamepadIndex: gamepad.index});
}
});
for (let j=0; j<this.gamepads.length; j++) {
if (!this.gamepads[j]) continue;
let has = false;

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -34,7 +34,7 @@ class EJS_STORAGE {
};
openRequest.onupgradeneeded = () => {
let db = openRequest.result;
if (! db.objectStoreNames.contains(this.storeName)) {
if (!db.objectStoreNames.contains(this.storeName)) {
db.createObjectStore(this.storeName);
};
};
@ -58,7 +58,7 @@ class EJS_STORAGE {
};
openRequest.onupgradeneeded = () => {
let db = openRequest.result;
if (! db.objectStoreNames.contains(this.storeName)) {
if (!db.objectStoreNames.contains(this.storeName)) {
db.createObjectStore(this.storeName);
};
};
@ -80,7 +80,7 @@ class EJS_STORAGE {
};
openRequest.onupgradeneeded = () => {
let db = openRequest.result;
if (! db.objectStoreNames.contains(this.storeName)) {
if (!db.objectStoreNames.contains(this.storeName)) {
db.createObjectStore(this.storeName);
};
};
@ -92,7 +92,7 @@ class EJS_STORAGE {
const keys = await this.get("?EJS_KEYS!");
if (!keys) return resolve({});
let rv = {};
for (let i=0; i<keys.length; i++) {
for (let i = 0; i < keys.length; i++) {
const result = await this.get(keys[i]);
if (!result || !result.data || typeof result.data.byteLength !== "number") continue;
rv[keys[i]] = result.data.byteLength;

View File

@ -1 +1,5 @@
{ "read_me": "CURRENT_VERSION IS NO LONGER UPDATED. USE VERION", "current_version": 999999, "version": "4.1.1" }
{
"read_me": "CURRENT_VERSION IS NO LONGER UPDATED. USE VERSION",
"current_version": 999999,
"version": "4.2.3"
}

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 170 KiB

After

Width:  |  Height:  |  Size: 7.7 KiB

46
docs/contributors.json Normal file
View File

@ -0,0 +1,46 @@
{
"ignore": [
"ethanaobrien",
"allancoding",
"michael-j-green",
"ElectronicsArchiver"
],
"missing": [
{
"login": "jurcaalexandrucristian",
"contributions": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/74395896?v=4",
"html_url": "https://github.com/jurcaalexandrucristian"
},
{
"login": "Grey41",
"contributions": 2,
"avatar_url": "https://avatars.githubusercontent.com/u/85015029?v=4",
"html_url": "https://github.com/Grey41"
},
{
"login": "eric183",
"contributions": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/10773980?v=4",
"html_url": "https://github.com/eric183"
},
{
"login": "Protektor-Desura",
"contributions": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/1195496?v=4",
"html_url": "https://github.com/Protektor-Desura"
},
{
"login": "cheesykyle",
"contributions": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/17484761?v=4",
"html_url": "https://github.com/cheesykyle"
},
{
"login": "imneckro",
"contributions": 1,
"avatar_url": "https://avatars.githubusercontent.com/u/42493772?v=4",
"html_url": "https://github.com/imneckro"
}
]
}

View File

@ -27,7 +27,7 @@
<a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a>
<a href="https://allancoding.is-a.dev/" target="_blank">**![Badge Allan Website]**</a>
<a href="https://allancoding.dev/" target="_blank">**![Badge Allan Website]**</a>
<br>
<br>
@ -68,66 +68,36 @@
<br>
<br>
<a href="https://github.com/n-at" target="_blank" title="n-at - Alexey Nurgaliev">![Avatar Alexey]</a>&nbsp;
<a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea">![Avatar incredibleIdea]</a>&nbsp;
<a href="https://github.com/angelmarfil" target="_blank" title="angelmarfil - Angel Marfil">![Avatar angelmarfil]</a>&nbsp;
<a href="https://github.com/gantoine" target="_blank" title="gantoine - Georges-Antoine Assi">![Avatar gantoine]</a>&nbsp;
<a href="https://github.com/E-Sh4rk" target="_blank" title="E-Sh4rk - Mickaël Laurent" width="95px"><img src="https://github.com/E-Sh4rk.png?size=95" width="95px"></a>&nbsp;
<a href="https://github.com/Grey41" target="_blank" title="Grey41 - Grey Hope">![Avatar Grey]</a>&nbsp;
<a href="https://github.com/imneckro" target="_blank" title="ImNekro - ck-oneman">![Avatar Nekro]</a>&nbsp;
<a href="https://github.com/cheesykyle" target="_blank" title="CheesyKyle - Kyle Steffel">![Avatar Kyle]</a>&nbsp;
<a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Protektor">![Avatar Protektor]</a>&nbsp;
<a href="https://github.com/eric183" target="_blank" title="eric183 - ericKuang">![Avatar ericKuang]</a>&nbsp;
<a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01">![Avatar debuggerx01]</a>&nbsp;
<a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Priyansh Prajapat">![Avatar Priyansh]</a>&nbsp;
<a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita">![Avatar andrigamerita]</a>&nbsp;
<a href="https://github.com/MattiaPell" target="_blank" title="MattiaPell">![Avatar MattiaPell]</a>&nbsp;
<a href="https://github.com/TimKieu" target="_blank" title="TimKieu"><img src="https://github.com/TimKieu.png?size=95" width="95px"></a>&nbsp;
<a href="https://github.com/jonas0b1011001" target="_blank" title="jonas0b1011001">![Avatar jonas0b1011001]</a>&nbsp;
<a href="https://github.com/IvanMazzoli" target="_blank" title="IvanMazzoli">![Avatar IvanMazzoli]</a>&nbsp;
<a href="https://github.com/iGoodie" target="_blank" title="iGoodie - Anılcan Metinyurt">![Avatar iGoodie]</a>&nbsp;
<a href="https://github.com/ZhaoTonggang" target="_blank" title="ZhaoTonggang - 赵彤刚">![Avatar ZhaoTonggang]</a>&nbsp;
</div>
<!------------------------------------------------------------------------------>
[Avatar Nekro]: https://github.com/imneckro.png?size=95
[Avatar Grey]: https://github.com/Grey41.png?size=95
[Avatar Kyle]: https://github.com/cheesykyle.png?size=95
[Avatar Protektor]: https://github.com/Protektor-Desura.png?size=95
[Avatar ericKuang]: https://github.com/eric183.png?size=95
[Avatar incredibleIdea]: https://github.com/incredibleIdea.png?size=95
[Avatar Alexey]: https://github.com/n-at.png?size=95
[Avatar Mickaël]: https://github.com/E-Sh4rk.png?size=95
[Avatar andrigamerita]: https://github.com/andrigamerita.png?size=95
[Avatar Priyansh]: https://github.com/oyepriyansh.png?size=95
[Avatar debuggerx01]: https://github.com/debuggerx01.png?size=95
[Avatar gantoine]: https://github.com/gantoine.png?size=95
[Avatar angelmarfil]: https://github.com/angelmarfil.png?size=95
[Avatar MattiaPell]: https://github.com/MattiaPell.png?size=95
[Avatar jonas0b1011001]: https://github.com/jonas0b1011001.png?size=95
[Avatar IvanMazzoli]: https://github.com/IvanMazzoli.png?size=95
[Avatar iGoodie]: https://github.com/iGoodie.png?size=95
[Avatar ZhaoTonggang]: https://github.com/ZhaoTonggang.png?size=95
<!-- Others -->
<a href="https://github.com/n-at" target="_blank" title="n-at - Contributions: 40" alt="n-at"><img src="https://avatars.githubusercontent.com/u/2185280?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/gantoine" target="_blank" title="gantoine - Contributions: 4" alt="gantoine"><img src="https://avatars.githubusercontent.com/u/3247106?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea - Contributions: 4" alt="incredibleIdea"><img src="https://avatars.githubusercontent.com/u/23035551?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/angelmarfil" target="_blank" title="angelmarfil - Contributions: 3" alt="angelmarfil"><img src="https://avatars.githubusercontent.com/u/59626670?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/t3chnob0y" target="_blank" title="t3chnob0y - Contributions: 3" alt="t3chnob0y"><img src="https://avatars.githubusercontent.com/u/18381004?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/pastisme" target="_blank" title="pastisme - Contributions: 2" alt="pastisme"><img src="https://avatars.githubusercontent.com/u/166672781?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/E-Sh4rk" target="_blank" title="E-Sh4rk - Contributions: 2" alt="E-Sh4rk"><img src="https://avatars.githubusercontent.com/u/13153243?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/Grey41" target="_blank" title="Grey41 - Contributions: 2" alt="Grey41"><img src="https://avatars.githubusercontent.com/u/85015029?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/ZhaoTonggang" target="_blank" title="ZhaoTonggang - Contributions: 1" alt="ZhaoTonggang"><img src="https://avatars.githubusercontent.com/u/81669862?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/pjft" target="_blank" title="pjft - Contributions: 1" alt="pjft"><img src="https://avatars.githubusercontent.com/u/22025709?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/noel-forester" target="_blank" title="noel-forester - Contributions: 1" alt="noel-forester"><img src="https://avatars.githubusercontent.com/u/62397558?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/jonas0b1011001" target="_blank" title="jonas0b1011001 - Contributions: 1" alt="jonas0b1011001"><img src="https://avatars.githubusercontent.com/u/43352574?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01 - Contributions: 1" alt="debuggerx01"><img src="https://avatars.githubusercontent.com/u/19624835?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita - Contributions: 1" alt="andrigamerita"><img src="https://avatars.githubusercontent.com/u/37557992?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/TimKieu" target="_blank" title="TimKieu - Contributions: 1" alt="TimKieu"><img src="https://avatars.githubusercontent.com/u/90356683?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/SooHyuck" target="_blank" title="SooHyuck - Contributions: 1" alt="SooHyuck"><img src="https://avatars.githubusercontent.com/u/104526248?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/iits-reza" target="_blank" title="iits-reza - Contributions: 1" alt="iits-reza"><img src="https://avatars.githubusercontent.com/u/56708670?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Contributions: 1" alt="oyepriyansh"><img src="https://avatars.githubusercontent.com/u/83062406?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/MattiaPell" target="_blank" title="MattiaPell - Contributions: 1" alt="MattiaPell"><img src="https://avatars.githubusercontent.com/u/47603639?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/kellenmace" target="_blank" title="kellenmace - Contributions: 1" alt="kellenmace"><img src="https://avatars.githubusercontent.com/u/5306336?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/IvanMazzoli" target="_blank" title="IvanMazzoli - Contributions: 1" alt="IvanMazzoli"><img src="https://avatars.githubusercontent.com/u/7896815?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/iGoodie" target="_blank" title="iGoodie - Contributions: 1" alt="iGoodie"><img src="https://avatars.githubusercontent.com/u/8591785?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/jurcaalexandrucristian" target="_blank" title="jurcaalexandrucristian - Contributions: 1" alt="jurcaalexandrucristian"><img src="https://avatars.githubusercontent.com/u/74395896?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/eric183" target="_blank" title="eric183 - Contributions: 1" alt="eric183"><img src="https://avatars.githubusercontent.com/u/10773980?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Contributions: 1" alt="Protektor-Desura"><img src="https://avatars.githubusercontent.com/u/1195496?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/cheesykyle" target="_blank" title="cheesykyle - Contributions: 1" alt="cheesykyle"><img src="https://avatars.githubusercontent.com/u/17484761?v=4&size=95" width="95px"></a>&nbsp;
<a href="https://github.com/imneckro" target="_blank" title="imneckro - Contributions: 1" alt="imneckro"><img src="https://avatars.githubusercontent.com/u/42493772?v=4&size=95" width="95px"></a>&nbsp;
<!-- Others End -->
<!----------------------------------{ Ethan }----------------------------------->
[Badge Ethan GitHub]: https://img.shields.io/badge/Ethan_O'_Brien-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
@ -141,7 +111,7 @@
<!----------------------------------{ Allan }---------------------------------->
[Badge Allan GitHub]: https://img.shields.io/badge/allancoding-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Allan Website]: https://img.shields.io/badge/allancoding.isa.dev-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAATCAYAAACKsM07AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALJSURBVEhLtZVNSFRRGIbfc2emctLUimmV4KIWBbNpUf4lZAYRBBH0syioTZA/1cKKcVGkbqQkCKJNGRlRVLpwMSiWlakhakaaWv7kIFqZVKhDznjv13vGASWTGdCel4d75zuHc+6ZOeeODdGjaAF101ZdiIZoJ9CDn6M+6qDbaDuNiBG+RiKPjg4C1Z1ABe/1g53QDZGIZoIc+pODV1lKVTmVul8P3GZtNT2mOyyFU/QkB181oFT1gGGItl+pB5zEzrZ8ekR3XAz93XqU0pcFbKBptHI7kJmh1J5QNUydSHUH8Ia3egIv/aXr8xERqKKiIsnP1w+y/HBsoLS0lBP9Hzwej9iys7MvB1MDaJJGeMWLFJWKErMYKUYqcs3TSFCJeCQP0SFv4UQMcq0cDDPXrTIEGI95EVvUVtyVO6ixatAoDaiQexhkpur9s7uo1qpFuVWOdmlDkOlHH3ziwxPrMSqtpygzr2JIhjAogzikDiOByVK78VyewWTOmnnolm7csm7iPaPHWMFoQiv4kTIOUQKdFmlBl3TiA7qwSW3Gd4whQ2XCpVxYyejV+Jg+fIKL6WWu2IoxKl/gVm5uLTt6pAfjzLr69VD6Nygo0G+AOV6+8CMYFPj9FpKSHPD5gtwRbKDpO5143eAPtcXFGpgOCPsCu7KccLn0zp2jsLAQ9kAggImJiXBplslJP9rbfmNkJIi0dCeGPgcxPDyD+HgDlsTgXcc0vn2dgV2/NIhp8gXlTkRMTLgQRo+tHA7HNRouzcFN4LIsy22z2eoyLSs1WWRHuClEr2G8alaq1TTNvYZhNPEsLTgHQb20CJynB/j+ie0zjIZ5J9nLmv4Vj1N92hfln0f4Lzy06yNQbzcML5c2pUT2JwMHWV9Lb+hOS6WQ7hsD4vhH4OT9UXpGN0QimhVodL9LtJmuoRtpGV1W9CQl9ELoU1QAfwCDI3HISCyhigAAAABJRU5ErkJggg==
[Badge Allan Website]: https://img.shields.io/badge/allancoding.dev-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAATCAYAAACKsM07AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALJSURBVEhLtZVNSFRRGIbfc2emctLUimmV4KIWBbNpUf4lZAYRBBH0syioTZA/1cKKcVGkbqQkCKJNGRlRVLpwMSiWlakhakaaWv7kIFqZVKhDznjv13vGASWTGdCel4d75zuHc+6ZOeeODdGjaAF101ZdiIZoJ9CDn6M+6qDbaDuNiBG+RiKPjg4C1Z1ABe/1g53QDZGIZoIc+pODV1lKVTmVul8P3GZtNT2mOyyFU/QkB181oFT1gGGItl+pB5zEzrZ8ekR3XAz93XqU0pcFbKBptHI7kJmh1J5QNUydSHUH8Ia3egIv/aXr8xERqKKiIsnP1w+y/HBsoLS0lBP9Hzwej9iys7MvB1MDaJJGeMWLFJWKErMYKUYqcs3TSFCJeCQP0SFv4UQMcq0cDDPXrTIEGI95EVvUVtyVO6ixatAoDaiQexhkpur9s7uo1qpFuVWOdmlDkOlHH3ziwxPrMSqtpygzr2JIhjAogzikDiOByVK78VyewWTOmnnolm7csm7iPaPHWMFoQiv4kTIOUQKdFmlBl3TiA7qwSW3Gd4whQ2XCpVxYyejV+Jg+fIKL6WWu2IoxKl/gVm5uLTt6pAfjzLr69VD6Nygo0G+AOV6+8CMYFPj9FpKSHPD5gtwRbKDpO5143eAPtcXFGpgOCPsCu7KccLn0zp2jsLAQ9kAggImJiXBplslJP9rbfmNkJIi0dCeGPgcxPDyD+HgDlsTgXcc0vn2dgV2/NIhp8gXlTkRMTLgQRo+tHA7HNRouzcFN4LIsy22z2eoyLSs1WWRHuClEr2G8alaq1TTNvYZhNPEsLTgHQb20CJynB/j+ie0zjIZ5J9nLmv4Vj1N92hfln0f4Lzy06yNQbzcML5c2pUT2JwMHWV9Lb+hOS6WQ7hsD4vhH4OT9UXpGN0QimhVodL9LtJmuoRtpGV1W9CQl9ELoU1QAfwCDI3HISCyhigAAAABJRU5ErkJggg==
[Allan Avatar]: https://avatars.githubusercontent.com/u/74841470?s=90 'Allancoding - Allan Niles'
<!----------------------------------{ BinBashBanana }---------------------------------->

View File

@ -0,0 +1,48 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
<defs>
<style>
.cls-1 {
fill: #0098c5;
}
.cls-2 {
fill: #0b3351;
}
.cls-3 {
fill: #28b9ec;
}
</style>
</defs>
<g>
<g>
<path class="cls-3" d="M752.22,513.65c-7.42,0-14.41-1.87-20.52-5.16-7.64-4.12-13.91-10.47-17.93-18.19-3.11-5.98-4.86-12.76-4.86-19.97,0-7.91,2.12-15.32,5.81-21.7,3.8-6.54,9.25-11.99,15.8-15.78,6.39-3.7,13.8-5.82,21.71-5.82,7.33,0,14.25,1.82,20.29,5.04-1.11-7.95-2.56-15.78-4.34-23.5-10.62-46.38-32.79-88.34-63.32-122.72-6.37-7.17-13.11-14-20.16-20.48-49.72-45.61-116-73.44-188.77-73.44s-139.05,27.83-188.75,73.44c-7.07,6.48-13.79,13.31-20.16,20.48-30.76,34.65-53.04,76.99-63.57,123.81-4.47,19.81-6.82,40.42-6.82,61.58s2.14,39.78,6.18,58.72c10.21,47.77,32.65,91.01,63.87,126.29,6.34,7.17,13.04,14,20.08,20.48,49.74,45.84,116.19,73.82,189.16,73.82s139.42-27.98,189.18-73.82c7.04-6.48,13.73-13.31,20.08-20.48,30.77-34.78,53.02-77.29,63.43-124.25,1.72-7.72,3.11-15.57,4.16-23.53-6.11,3.3-13.11,5.18-20.54,5.18ZM716.66,523.27c3.12,5.98,4.88,12.76,4.88,19.97,0,23.92-19.38,43.32-43.3,43.32s-43.32-19.39-43.32-43.32c0-7.54,1.93-14.63,5.31-20.8,3.8-6.92,9.43-12.69,16.24-16.65,6.39-3.71,13.82-5.85,21.76-5.85,7.42,0,14.41,1.87,20.52,5.16,7.64,4.12,13.9,10.47,17.91,18.18ZM640.37,447.65c4.07,6.59,6.41,14.36,6.41,22.68,0,7.55-1.93,14.64-5.32,20.83-3.8,6.93-9.43,12.69-16.24,16.65-6.39,3.71-13.81,5.84-21.74,5.84-23.92,0-43.32-19.39-43.32-43.32s19.39-43.3,43.32-43.3c8.47,0,16.38,2.43,23.05,6.64,5.62,3.53,10.36,8.32,13.84,13.98ZM715.7,418.07c-3.79,6.54-9.24,11.99-15.78,15.78-6.37,3.7-13.77,5.81-21.68,5.81-8.47,0-16.38-2.43-23.05-6.63-5.62-3.55-10.37-8.35-13.86-14.02-4.06-6.59-6.4-14.36-6.4-22.67,0-23.91,19.39-43.3,43.32-43.3s43.3,19.39,43.3,43.3c0,7.91-2.12,15.33-5.84,21.72ZM228.54,509.48v-79.34h63.14v-63.13h79.34v63.13h63.14v79.34h-63.14v63.14h-79.34v-63.14h-63.14Z"/>
<path class="cls-2" d="M792.62,421c-3.84-22.93-10.36-45.29-19.48-66.87-10.39-24.58-23.86-47.43-40.22-68.28-5.53-7.07-11.41-13.89-17.6-20.48-2.18-2.32-4.39-4.61-6.66-6.87-27.62-27.62-59.79-49.31-95.62-64.46-37.11-15.69-76.51-23.66-117.12-23.66s-80,7.96-117.11,23.66c-35.83,15.16-68.01,36.84-95.63,64.46-2.27,2.27-4.48,4.56-6.66,6.87-6.2,6.59-12.07,13.41-17.6,20.48-16.35,20.85-29.81,43.7-40.21,68.28-15.69,37.11-23.66,76.51-23.66,117.11s7.96,80.02,23.66,117.12c10.33,24.42,23.69,47.14,39.91,67.88,5.52,7.07,11.35,13.89,17.52,20.48,2.3,2.46,4.65,4.88,7.03,7.26,27.62,27.62,59.8,49.32,95.63,64.48,37.11,15.69,76.51,23.64,117.11,23.64s80.02-7.95,117.12-23.64c35.83-15.16,68-36.85,95.62-64.48,2.38-2.38,4.72-4.8,7.03-7.26,6.17-6.59,12.01-13.41,17.52-20.48,16.22-20.74,29.59-43.46,39.92-67.88,9.41-22.25,16.04-45.31,19.83-68.98,2.55-15.81,3.81-31.89,3.81-48.14s-1.38-33.75-4.16-50.24ZM772.76,508.46c-1.05,7.96-2.44,15.81-4.16,23.53-10.41,46.96-32.65,89.47-63.43,124.25-6.35,7.17-13.04,14-20.08,20.48-49.76,45.84-116.2,73.82-189.18,73.82s-139.42-27.98-189.16-73.82c-7.04-6.48-13.75-13.31-20.08-20.48-31.22-35.28-53.66-78.52-63.87-126.29-4.04-18.93-6.18-38.57-6.18-58.72,0-21.16,2.36-41.77,6.82-61.58,10.52-46.81,32.81-89.15,63.57-123.81,6.37-7.17,13.09-14,20.16-20.48,49.7-45.61,115.98-73.44,188.75-73.44s139.05,27.83,188.77,73.44c7.05,6.48,13.79,13.31,20.16,20.48,30.53,34.38,52.7,76.34,63.32,122.72,1.78,7.72,3.23,15.55,4.34,23.5,13.7,7.27,23.02,21.67,23.02,38.26s-9.2,30.81-22.76,38.13Z"/>
</g>
<g>
<path class="cls-1" d="M809.16,285.85H190.85c-20.77,0-37.62,16.85-37.62,37.62v295.15c0,20.77,16.85,37.62,37.62,37.62h618.31c20.78,0,37.62-16.85,37.62-37.62v-295.15c0-20.77-16.85-37.62-37.62-37.62ZM772.76,508.46c-6.11,3.3-13.11,5.18-20.54,5.18s-14.41-1.87-20.52-5.16c-7.64-4.12-13.91-10.47-17.93-18.19-3.11-5.98-4.86-12.76-4.86-19.97,0-7.91,2.12-15.32,5.81-21.7,3.8-6.54,9.25-11.99,15.8-15.78,6.39-3.7,13.8-5.82,21.71-5.82,7.33,0,14.25,1.82,20.29,5.04,13.7,7.27,23.02,21.67,23.02,38.26s-9.2,30.81-22.76,38.13ZM603.48,513.65c-23.92,0-43.32-19.39-43.32-43.32s19.39-43.3,43.32-43.3c8.47,0,16.38,2.43,23.05,6.64,5.62,3.53,10.36,8.32,13.84,13.98,4.07,6.59,6.41,14.36,6.41,22.68,0,7.55-1.93,14.64-5.32,20.83-3.8,6.93-9.43,12.69-16.24,16.65-6.39,3.71-13.81,5.84-21.74,5.84ZM721.54,396.35c0,7.91-2.12,15.33-5.84,21.72-3.79,6.54-9.24,11.99-15.78,15.78-6.37,3.7-13.77,5.81-21.68,5.81-8.47,0-16.38-2.43-23.05-6.63-5.62-3.55-10.37-8.35-13.86-14.02-4.06-6.59-6.4-14.36-6.4-22.67,0-23.91,19.39-43.3,43.32-43.3s43.3,19.39,43.3,43.3ZM634.92,543.24c0-7.54,1.93-14.63,5.31-20.8,3.8-6.92,9.43-12.69,16.24-16.65,6.39-3.71,13.82-5.85,21.76-5.85,7.42,0,14.41,1.87,20.52,5.16,7.64,4.12,13.9,10.47,17.91,18.18,3.12,5.98,4.88,12.76,4.88,19.97,0,23.92-19.38,43.32-43.3,43.32s-43.32-19.39-43.32-43.32ZM434.17,509.48h-63.14v63.14h-79.34v-63.14h-63.14v-79.34h63.14v-63.13h79.34v63.13h63.14v79.34Z"/>
<path class="cls-2" d="M809.16,265.37H190.85c-32.04,0-58.1,26.06-58.1,58.1v295.15c0,32.04,26.06,58.1,58.1,58.1h618.31c32.04,0,58.1-26.06,58.1-58.1v-295.15c0-32.04-26.06-58.1-58.1-58.1ZM846.78,618.62c0,20.77-16.85,37.62-37.62,37.62H190.85c-20.77,0-37.62-16.85-37.62-37.62v-295.15c0-20.77,16.85-37.62,37.62-37.62h618.31c20.78,0,37.62,16.85,37.62,37.62v295.15Z"/>
</g>
<path class="cls-2" d="M391.51,409.66v-63.13h-120.3v63.13h-63.14v120.3h63.14v63.14h120.3v-63.14h63.14v-120.3h-63.14ZM434.17,509.48h-63.14v63.14h-79.34v-63.14h-63.14v-79.34h63.14v-63.13h79.34v63.13h63.14v79.34Z"/>
<path class="cls-2" d="M792.62,421c-7.05-5.77-15.36-10.09-24.45-12.43-5.09-1.32-10.45-2.02-15.95-2.02-3.81,0-7.55.33-11.19.99.65-3.64.99-7.37.99-11.19,0-35.18-28.61-63.78-63.78-63.78s-63.8,28.61-63.8,63.78c0,3.87.35,7.65,1.01,11.33-3.88-.74-7.87-1.13-11.97-1.13-35.18,0-63.8,28.61-63.8,63.78s28.62,63.8,63.8,63.8c4.02,0,7.96-.37,11.78-1.09-.54,3.33-.82,6.73-.82,10.2,0,35.18,28.62,63.8,63.8,63.8s63.78-28.62,63.78-63.8c0-3.43-.27-6.8-.81-10.07,3.57.64,7.26.96,11.01.96,5.66,0,11.15-.74,16.38-2.14,9.08-2.41,17.34-6.77,24.36-12.61,14.07-11.71,23.04-29.35,23.04-49.05s-9.11-37.62-23.39-49.33ZM678.23,353.04c23.92,0,43.3,19.39,43.3,43.3,0,7.91-2.12,15.33-5.84,21.72-3.79,6.54-9.24,11.99-15.78,15.78-6.37,3.7-13.77,5.81-21.68,5.81-8.47,0-16.38-2.43-23.05-6.63-5.62-3.55-10.37-8.35-13.86-14.02-4.06-6.59-6.4-14.36-6.4-22.67,0-23.91,19.39-43.3,43.32-43.3ZM625.21,507.81c-6.39,3.71-13.81,5.84-21.74,5.84-23.92,0-43.32-19.39-43.32-43.32s19.39-43.3,43.32-43.3c8.47,0,16.38,2.43,23.05,6.64,5.62,3.53,10.36,8.32,13.84,13.98,4.07,6.59,6.41,14.36,6.41,22.68,0,7.55-1.93,14.64-5.32,20.83-3.8,6.93-9.43,12.69-16.24,16.65ZM678.23,586.56c-23.92,0-43.32-19.39-43.32-43.32,0-7.54,1.93-14.63,5.31-20.8,3.8-6.92,9.43-12.69,16.24-16.65,6.39-3.71,13.82-5.85,21.76-5.85,7.42,0,14.41,1.87,20.52,5.16,7.64,4.12,13.9,10.47,17.91,18.18,3.12,5.98,4.88,12.76,4.88,19.97,0,23.92-19.38,43.32-43.3,43.32ZM772.76,508.46c-6.11,3.3-13.11,5.18-20.54,5.18s-14.41-1.87-20.52-5.16c-7.64-4.12-13.91-10.47-17.93-18.19-3.11-5.98-4.86-12.76-4.86-19.97,0-7.91,2.12-15.32,5.81-21.7,3.8-6.54,9.25-11.99,15.8-15.78,6.39-3.7,13.8-5.82,21.71-5.82,7.33,0,14.25,1.82,20.29,5.04,13.7,7.27,23.02,21.67,23.02,38.26s-9.2,30.81-22.76,38.13Z"/>
</g>
<g>
<polygon points="946.58 812.72 946.58 824.18 958.38 824.18 958.38 835.98 934.77 835.98 934.77 824.53 900.4 824.53 900.4 847.44 946.58 847.44 946.58 858.9 958.38 858.9 958.38 882.51 946.58 882.51 946.58 893.96 888.6 893.96 888.6 882.51 877.14 882.51 877.14 870.7 900.4 870.7 900.4 882.16 934.77 882.16 934.77 859.24 888.6 859.24 888.6 847.79 877.14 847.79 877.14 824.18 888.6 824.18 888.6 812.72 946.58 812.72"/>
<g>
<path d="M666.56,812.72v11.46h11.8v58.33h-11.8v11.46h-57.98v-11.46h-11.46v-58.33h11.46v-11.46h57.98ZM654.75,824.53h-34.37v57.63h34.37v-57.63Z"/>
<path d="M481.5,835.98v-11.8h-11.45v-11.46h-35.07v11.46h-11.46v11.8h-11.8v57.98h23.61v-23.26h34.37v23.26h23.26v-57.98h-11.46ZM469.7,858.89h-34.37v-22.91h11.45v-11.46h11.46v11.46h11.46v22.91Z"/>
<g>
<polygon points="249.93 812.72 249.93 882.16 284.65 882.16 284.65 812.72 307.91 812.72 307.91 882.51 296.46 882.51 296.46 893.96 238.13 893.96 238.13 882.51 226.67 882.51 226.67 812.72 249.93 812.72"/>
<g>
<polygon points="157.58 812.72 157.58 824.18 169.04 824.18 169.04 835.98 180.49 835.98 180.49 824.18 191.95 824.18 191.95 812.72 215.21 812.72 215.21 893.96 191.95 893.96 191.95 847.79 180.49 847.79 180.49 870.7 168.69 870.7 168.69 847.79 157.58 847.79 157.58 893.96 133.97 893.96 133.97 812.72 157.58 812.72"/>
<polygon points="122.86 812.72 122.86 824.53 64.88 824.53 64.88 847.44 111.06 847.44 111.06 859.24 64.88 859.24 64.88 882.16 122.86 882.16 122.86 893.96 41.62 893.96 41.62 812.72 122.86 812.72"/>
</g>
</g>
<polygon points="863.41 812.72 863.41 882.51 851.95 882.51 851.95 893.96 793.63 893.96 793.63 882.51 782.17 882.51 782.17 870.7 805.43 870.7 805.43 882.16 840.15 882.16 840.15 812.72 863.41 812.72"/>
<polygon points="354.09 812.72 354.09 882.16 400.61 882.16 400.61 893.96 330.83 893.96 330.83 812.72 354.09 812.72"/>
<polygon points="585.66 812.72 585.66 824.53 562.4 824.53 562.4 893.96 539.14 893.96 539.14 824.53 515.88 824.53 515.88 812.72 585.66 812.72"/>
<path d="M770.71,859.24v-35.06h-11.46v-11.46h-69.78v81.24h23.61v-23.26h11.11v11.8h11.8v11.46h34.72v-11.8h-11.46v-11.46h-11.45v-11.46h22.91ZM747.45,847.44h-11.46v11.45h-22.91v-34.37h34.37v22.92Z"/>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.2 KiB

26
docs/emulatorjs-type.svg Normal file
View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 1000">
<defs>
<style>
.cls-1 {
fill: #fff;
}
</style>
</defs>
<polygon class="cls-1" points="966 457.61 966 469.57 978.31 469.57 978.31 481.89 953.68 481.89 953.68 469.93 917.81 469.93 917.81 493.84 966 493.84 966 505.8 978.31 505.8 978.31 530.43 966 530.43 966 542.39 905.49 542.39 905.49 530.43 893.54 530.43 893.54 518.11 917.81 518.11 917.81 530.07 953.68 530.07 953.68 506.16 905.49 506.16 905.49 494.2 893.54 494.2 893.54 469.57 905.49 469.57 905.49 457.61 966 457.61"/>
<g>
<path class="cls-1" d="M673.8,457.61v11.96h12.32v60.86h-12.32v11.96h-60.5v-11.96h-11.96v-60.86h11.96v-11.96h60.5ZM661.48,469.93h-35.87v60.14h35.87v-60.14Z"/>
<path class="cls-1" d="M480.7,481.89v-12.31h-11.95v-11.96h-36.59v11.96h-11.96v12.31h-12.31v60.5h24.64v-24.27h35.86v24.27h24.27v-60.5h-11.96ZM468.38,505.79h-35.86v-23.91h11.95v-11.96h11.96v11.96h11.96v23.91Z"/>
<g>
<polygon class="cls-1" points="239.06 457.61 239.06 530.07 275.29 530.07 275.29 457.61 299.56 457.61 299.56 530.43 287.6 530.43 287.6 542.39 226.74 542.39 226.74 530.43 214.78 530.43 214.78 457.61 239.06 457.61"/>
<g>
<polygon class="cls-1" points="142.69 457.61 142.69 469.57 154.64 469.57 154.64 481.89 166.6 481.89 166.6 469.57 178.56 469.57 178.56 457.61 202.83 457.61 202.83 542.39 178.56 542.39 178.56 494.2 166.6 494.2 166.6 518.11 154.28 518.11 154.28 494.2 142.69 494.2 142.69 542.39 118.05 542.39 118.05 457.61 142.69 457.61"/>
<polygon class="cls-1" points="106.46 457.61 106.46 469.93 45.96 469.93 45.96 493.84 94.14 493.84 94.14 506.16 45.96 506.16 45.96 530.07 106.46 530.07 106.46 542.39 21.69 542.39 21.69 457.61 106.46 457.61"/>
</g>
</g>
<polygon class="cls-1" points="879.21 457.61 879.21 530.43 867.26 530.43 867.26 542.39 806.39 542.39 806.39 530.43 794.44 530.43 794.44 518.11 818.71 518.11 818.71 530.07 854.94 530.07 854.94 457.61 879.21 457.61"/>
<polygon class="cls-1" points="347.74 457.61 347.74 530.07 396.29 530.07 396.29 542.39 323.47 542.39 323.47 457.61 347.74 457.61"/>
<polygon class="cls-1" points="589.39 457.61 589.39 469.93 565.11 469.93 565.11 542.39 540.84 542.39 540.84 469.93 516.57 469.93 516.57 457.61 589.39 457.61"/>
<path class="cls-1" d="M782.48,506.16v-36.58h-11.96v-11.96h-72.81v84.77h24.64v-24.27h11.59v12.31h12.31v11.96h36.23v-12.31h-11.96v-11.96h-11.95v-11.96h23.91ZM758.21,493.84h-11.96v11.95h-23.91v-35.86h35.86v23.92Z"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

4487
docs/old-Logo.svg Normal file

File diff suppressed because it is too large Load Diff

After

Width:  |  Height:  |  Size: 170 KiB

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>EmulatorJS Demo</title>
<title>EmulatorJS</title>
<link rel = icon href = docs/favicon.ico sizes = "16x16 32x32 48x48 64x64" type = image/vnd.microsoft.icon>
<meta name = viewport content = "width = device-width, initial-scale = 1">
<style>
@ -40,10 +40,12 @@
font-weight: bold;
font-size: 20px;
margin: 5px;
text-align: center;
padding: 10px;
}
#box:hover, #box[drag] {
border-color: #38f;
border-color: #1AAFFF;
color: #ddd
}
@ -54,7 +56,7 @@
top: 0;
width: 100%;
height: 100%;
opacity: 0
opacity: 0;
}
#display {
@ -86,7 +88,7 @@
.logo {
width: 130px;
height: 130px;
filter: drop-shadow(0 0 10px white);
filter: drop-shadow(0 0 8px white);
}
#top {
@ -99,25 +101,27 @@
<div id="top">
<h1>EmulatorJS Demo</h1>
<img src="docs/Logo-light.png" alt="Logo" class="logo">
<br>
</div>
<div id = box>
<input type = file id = input>
<div id="box">
<input type="file" id ="input" title="Upload" />
Drag ROM file or click here
</div>
<script>
let enableDebug = false;
let enableThreads = false;
let browserMode;
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
if (urlParams.get('debug') == 1) {
if (parseInt(urlParams.get("debug")) === 1 || urlParams.get("debug") === "true") {
enableDebug = true;
console.log("Debug is enabled");
} else {
console.log("Debug is disabled");
}
if (urlParams.get('threads') == 1) {
if (parseInt(urlParams.get("threads")) === 1 || urlParams.get("threads") === "true") {
if (window.SharedArrayBuffer) {
enableThreads = true;
console.log("Threads are enabled");
@ -128,10 +132,19 @@
} else {
console.log("Threads are disabled");
}
input.onchange = async () => {
const url = input.files[0]
const parts = input.files[0].name.split(".")
if (urlParams.get("browserMode")) {
browserMode = urlParams.get("browserMode");
}
if (urlParams.get("rom")) {
console.log(`Loading ROM from URL: roms/${urlParams.get("rom")}`);
run(false, urlParams.get("rom"));
}
async function run(upload, file) {
const url = upload ? input.files[0] : `roms/${file}`;
const parts = upload ? input.files[0].name.split(".") : file.split(".");
const core = await (async (ext) => {
if (["fds", "nes", "unif", "unf"].includes(ext))
@ -157,6 +170,9 @@
if (["d64"].includes(ext))
return "vice_x64sc"
if (["md", "sg", "smd", "gen"].includes(ext))
return "segaMD"
if (["nds", "gba", "gb", "z64", "n64"].includes(ext))
return ext
@ -181,6 +197,7 @@
"Sega Saturn": "segaSaturn",
"Atari 7800": "atari7800",
"Atari 2600": "atari2600",
"Arcade": "arcade",
"NEC TurboGrafx-16/SuperGrafx/PC Engine": "pce",
"NEC PC-FX": "pcfx",
"SNK NeoGeo Pocket (Color)": "ngp",
@ -190,9 +207,20 @@
"Commodore 128": "vice_x128",
"Commodore VIC20": "vice_xvic",
"Commodore Plus/4": "vice_xplus4",
"Commodore PET": "vice_xpet"
"Commodore PET": "vice_xpet",
}
if (enableThreads) {
coreValues["DOSBOX-PURE"] = "dosbox_pure";
coreValues["PlayStation Portable"] = "ppsspp";
}
for (let core in coreValues) {
if (core.toLowerCase() === ext) {
resolve(core)
}
}
const cores = Object.keys(coreValues).sort().reduce(
(obj, key) => {
obj[key] = coreValues[key];
@ -244,10 +272,18 @@
window.EJS_DEBUG_XX = enableDebug;
window.EJS_disableDatabases = true;
window.EJS_threads = enableThreads;
if (browserMode) {
window.EJS_browserMode = browserMode;
}
script.src = "data/loader.js";
document.body.appendChild(script);
}
input.onchange = async () => {
run(true);
}
box.ondragover = () => box.setAttribute("drag", true);
box.ondragleave = () => box.removeAttribute("drag");
</script>

View File

@ -1,9 +1,6 @@
# Minifying
Before pushing the script files onto your production <br>
server it is recommended to minify them to save on <br>
load times as well as bandwidth.
Before pushing the script files onto your production server it is recommended to minify them to save on load times as well as bandwidth.
<br>
@ -15,20 +12,19 @@ load times as well as bandwidth.
## Steps
1. Open a terminal in`/data/minify`.
1. Open a terminal inthe root of the project.
2. Install the dependencies with:
```sh
npm install
```
```sh
npm i
```
3. Start the minification with:
```sh
node index.js
```
```sh
node run minify
```
<!----------------------------------------------------------------------------->

38
minify/minify.js Normal file
View File

@ -0,0 +1,38 @@
import path from "path";
import { fileURLToPath } from "url";
import { minify } from "@node-minify/core";
import { terser } from "@node-minify/terser";
import { cleanCss } from '@node-minify/clean-css';
const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const rootPath = path.resolve(__dirname, "../");
async function doMinify() {
await minify({
compressor: terser,
input: path.join(rootPath, "data/src/*.js"),
output: path.join(rootPath, "data/emulator.min.js"),
})
.catch(function (err) {
console.error(err);
})
.then(function() {
console.log("Minified JS");
});
await minify({
compressor: cleanCss,
input: path.join(rootPath, "data/emulator.css"),
output: path.join(rootPath, "data/emulator.min.css"),
})
.catch(function (err) {
console.error(err);
})
.then(function() {
console.log("Minified CSS");
});
}
console.log("Minifying");
await doMinify();
console.log("Minifying Done!");

View File

@ -1,16 +1,39 @@
{
"name": "@emulatorjs/emulatorjs",
"version": "4.0.12",
"repository": {
"type": "git",
"url": "https://github.com/EmulatorJS/EmulatorJS.git"
},
"license": "GPL-3.0",
"description": "EmulatorJS is a frontend for RetroArch in the web browser.",
"scripts": {
"start": "http-server"
},
"dependencies": {
"http-server": "^14.1.1"
}
"name": "@emulatorjs/emulatorjs",
"version": "4.2.4",
"type": "module",
"description": "EmulatorJS is a frontend for RetroArch in the web browser.",
"homepage": "https://emulatorjs.org",
"license": "GPL-3.0",
"sideEffects": true,
"repository": {
"type": "git",
"url": "https://github.com/EmulatorJS/EmulatorJS.git"
},
"bugs": {
"url": "https://github.com/EmulatorJS/EmulatorJS/issues"
},
"scripts": {
"start": "http-server",
"minify": "node minify/minify.js",
"build": "node build.js",
"update": "node update.js",
"docs": "jsdoc data/src/*.js -d jsdoc"
},
"dependencies": {
"@node-minify/clean-css": "^10.2.0",
"@node-minify/core": "^10.2.0",
"@node-minify/terser": "^10.2.0",
"http-server": "^14.1.1",
"node-7z": "^3.0.0"
},
"optionalDependencies": {
"@emulatorjs/cores": "latest"
},
"devDependencies": {
"jsdoc": "^4.0.4",
"nipplejs": "^0.10.2",
"node-fetch": "^3.3.2",
"socket.io": "^4.8.1"
}
}

135
update.js Normal file
View File

@ -0,0 +1,135 @@
import fs from 'fs';
import path from 'path';
import fetch from 'node-fetch';
const args = process.argv.slice(2);
const versionArg = args.find(arg => arg.startsWith('--ejs_v='));
const devArg = args.find(arg => arg.startsWith('--dev='));
const depsArg = args.find(arg => arg.startsWith('--deps='));
const update_version = versionArg ? versionArg.split('=')[1] : process.env.ejs_v;
const dev = devArg ? devArg.split('=')[1] : null;
let version;
try {
const packageJsonPath = path.resolve('package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
version = packageJson.version;
} catch(error) {
console.error("Error reading version from package.json:", error.message);
process.exit(1);
}
const updateDependencies = async () => {
const socket_io = path.resolve('node_modules', 'socket.io', 'client-dist', 'socket.io.min.js');
const ejs_socket_io = path.resolve('data', 'src', 'socket.io.min.js');
const nipplejs = path.resolve('node_modules', 'nipplejs', 'dist', 'nipplejs.js');
const ejs_nipplejs = path.resolve('data', 'src', 'nipplejs.js');
try {
fs.copyFileSync(socket_io, ejs_socket_io);
if (!fs.readFileSync(ejs_socket_io, 'utf8').endsWith('\n')) {
fs.appendFileSync(ejs_socket_io, '\n');
}
} catch(error) {
console.error("Error updating socket.io:", error.message);
}
try {
fs.copyFileSync(nipplejs, ejs_nipplejs);
if (!fs.readFileSync(ejs_nipplejs, 'utf8').endsWith('\n')) {
fs.appendFileSync(ejs_nipplejs, '\n');
}
} catch(error) {
console.error("Error updating nipplejs:", error.message);
}
console.log("Updated socket.io and nipplejs.");
};
const updateVersion = async (newVersion) => {
const packageJsonPath = path.resolve('package.json');
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'));
packageJson.version = newVersion;
fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 4) + '\n');
console.log(`Updated version to ${newVersion} in package.json.`);
const versionJsonPath = path.resolve('data', 'version.json');
const versionJson = JSON.parse(fs.readFileSync(versionJsonPath, 'utf8'));
versionJson.version = newVersion;
fs.writeFileSync(versionJsonPath, JSON.stringify(versionJson, null, 4) + '\n');
console.log(`Updated version to ${newVersion} in data/version.json.`);
const coresJsonPath = path.resolve('data', 'cores', 'package.json');
const coresJson = JSON.parse(fs.readFileSync(coresJsonPath, 'utf8'));
coresJson.version = newVersion;
fs.writeFileSync(coresJsonPath, JSON.stringify(coresJson, null, 4) + '\n');
console.log(`Updated version to ${newVersion} in data/cores/package.json.`);
const emulatorJsPath = path.resolve('data', 'src', 'emulator.js');
const emulatorJs = fs.readFileSync(emulatorJsPath, 'utf8');
let updatedEmulatorJs = "";
if (dev === "true") {
updatedEmulatorJs = emulatorJs.replace(/this\.ejs_version\s*=\s*".*?";/, `this.ejs_version = "${newVersion}-dev";`);
} else {
updatedEmulatorJs = emulatorJs.replace(/this\.ejs_version\s*=\s*".*?";/, `this.ejs_version = "${newVersion}";`);
}
fs.writeFileSync(emulatorJsPath, updatedEmulatorJs);
console.log(`Updated version to ${newVersion} in data/src/emulator.js.`);
};
const fetchContributors = async () => {
const url = 'https://api.github.com/repos/EmulatorJS/EmulatorJS/contributors';
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`Failed to fetch contributors: ${response.statusText}`);
}
return await response.json();
} catch(error) {
console.error("Error fetching contributors:", error.message);
}
};
const updateContributors = async () => {
const contributors = await fetchContributors();
const ignoredContributors = JSON.parse(fs.readFileSync(path.resolve('docs', 'contributors.json'), 'utf8')).ignore;
const missingContributors = JSON.parse(fs.readFileSync(path.resolve('docs', 'contributors.json'), 'utf8')).missing;
if (!contributors) return;
const sortedContributors = contributors
.concat(missingContributors)
.sort((a, b) => b.contributions - a.contributions)
.filter(contributor => !ignoredContributors.includes(contributor.login));
const uniqueContributors = Array.from(new Set(sortedContributors.map(contributor => contributor.login)))
.map(login => sortedContributors.find(contributor => contributor.login === login));
const finalContributors = uniqueContributors.sort((a, b) => b.contributions - a.contributions);
let contributorReadme = ""
finalContributors
.forEach(contributor => {
contributorReadme += `<a href="${contributor.html_url}" target="_blank" title="${contributor.login} - Contributions: ${contributor.contributions}" alt="${contributor.login}"><img src="${contributor.avatar_url}&size=95" width="95px"></a>&nbsp;\n`;
});
const contributorsPath = path.resolve('docs', 'contributors.md');
const contributorsReadme = fs.readFileSync(contributorsPath, 'utf8');
const startLine = contributorsReadme.split('\n').findIndex(line => line.startsWith("<!-- Others -->")) + 1;
const endLine = contributorsReadme.split('\n').findIndex(line => line.startsWith("<!-- Others End -->")) - 1;
const updatedContributorsReadme = contributorsReadme.split('\n').filter((line, index) => index < startLine || index > endLine).join('\n');
const newContributorsReadme = updatedContributorsReadme.replace("<!-- Others -->", `<!-- Others -->\n${contributorReadme}`);
fs.writeFileSync(contributorsPath, newContributorsReadme);
console.log("Updated Contributors.md with new contributors.");
}
console.log(`Current EmulatorJS Version: ${version}`);
if (!update_version) {
console.warn("Warning: Version number not provided.");
} else {
console.log(`Updating EmulatorJS Version number to: ${update_version}`);
}
console.log("Updating EmulatorJS dependencies...");
if (depsArg) {
await updateDependencies();
}
if (update_version || dev === "false" || dev === "true") {
console.log("Updating EmulatorJS version...");
await updateVersion(update_version || version);
}
await updateContributors();
console.log("Updating EmulatorJS completed.");