Compare commits

...

246 Commits

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
Ethan O'Brien
a7b59f19a3 Add missing change 2024-08-19 11:53:17 -05:00
Ethan O'Brien
eda3043e68 Version 4.1.1 2024-08-19 11:47:13 -05:00
Ethan O'Brien
d9e1e69d9c iOS 12 support 2024-08-18 21:31:34 -05:00
pastisme
83768b6804 Support File objects (#873) 2024-08-11 23:10:03 -05:00
Ethan O'Brien
469b9fcc4e Fix core path 2024-08-08 10:27:36 -05:00
Ethan O'Brien
b30c5f42a8 Get core config from core json 2024-08-08 10:26:13 -05:00
Ethan O'Brien
61620e2c77 Get mouse options from core options json 2024-08-08 10:07:46 -05:00
Ethan O'Brien
4bc5a8e871 Uncomment version checking code
While not yet released, this issue has been fixed in a previous commit
2024-08-08 09:52:49 -05:00
Ethan O'Brien
e486e70181 Maintain backwards compatibility with version.json 2024-08-08 09:51:14 -05:00
Allan Niles
2630f81899
Fix Broken links and add new systems in README (#872) 2024-08-07 10:18:23 -05:00
Ethan O'Brien
685f3ebfef Remove compression cache feature 2024-08-06 07:35:08 -05:00
Ethan O'Brien
588a5e2beb Minor fixes with exit menu 2024-08-05 23:06:37 -05:00
Ethan O'Brien
735c20b3be Append -beta to the version number, define compression on window 2024-08-03 22:12:43 -05:00
Ethan O'Brien
e8c9d0d28b Move compression related functions to another file 2024-08-03 22:00:00 -05:00
Ethan O'Brien
41c7850dfa Modularize EmulatorJS 2024-08-03 20:54:05 -05:00
Ethan O'Brien
10e5320261 Add Emulatorjs exit button 2024-08-03 20:19:48 -05:00
Ethan O'Brien
8ab41f9448 Fix default webgl2 option 2024-07-31 23:05:06 -05:00
Ethan O'Brien
97ea470ea0 Hide webgl2 option on unsupported devices 2024-07-30 12:27:17 -05:00
Ethan O'Brien
7763e2040e Fix mobile styling 2024-07-30 12:24:01 -05:00
Ethan O'Brien
5abea1917c Ability to change settings if game crashes 2024-07-30 12:15:28 -05:00
Allan Niles
900eb3b5a9 update script path 2024-07-30 08:35:03 -06:00
Ethan O'Brien
f7fa56757b Remove usage of replaceAll 2024-07-28 21:40:49 -05:00
Ethan O'Brien
605a271299 Pull core report file to get time last built 2024-07-27 15:23:40 -05:00
Ethan O'Brien
38a496a271 Pull webgl2 default enabled from core.json 2024-07-27 15:08:24 -05:00
Ethan O'Brien
4d2a1d0d40 Fix location of socket.io.min.js 2024-07-27 15:05:54 -05:00
Ethan O'Brien
cb3017d533 Re-organize javascript files 2024-07-27 15:00:29 -05:00
Ethan O'Brien
ce59daeb24
Remove PSP unsupported note
It has been removed from this source repo anyway. No need to keep it here
2024-07-23 22:46:32 -05:00
Ethan O'Brien
3c877cdf8f Add core license to context menu 2024-07-23 22:41:39 -05:00
Ethan O'Brien
0b7a711507 Fix spacing 2024-07-23 21:29:22 -05:00
Ethan O'Brien
4fd97d615e Pull extensions from core file 2024-07-23 21:24:23 -05:00
Ethan O'Brien
ba1f40bea1 Check EmulatorJS core compatibility 2024-07-23 21:15:03 -05:00
Ethan O'Brien
cfa011fa78 Correct initial webgl2 option setting option behaviour 2024-07-23 20:58:12 -05:00
Ethan O'Brien
904a0ba5ed
Update emulator.js 2024-07-23 12:56:28 -05:00
Ethan O'Brien
cd2c0d89c6 Resolve #823 2024-07-23 11:32:28 -05:00
Allan Niles
033f51e18f
Update Docs and Contributors (#859) 2024-07-21 17:32:22 -05:00
赵彤刚
611a8c26d6
Update gamepad.js (#855)
The objects traversed by the “foreach” method should be arrays, and the “Array.from()” method should be used to convert the traversal objects to arrays, ensuring that they run in some more restrictive browsers.
2024-07-14 00:13:11 -05:00
Angel Marfil
e8c774c748
Update Translate Helper and es-ES.json (#835) 2024-05-20 19:27:35 -05:00
Ethan O'Brien
b1bd622815
Add new contribution (#841) 2024-05-20 19:26:33 -05:00
Anılcan Metinyurt
3ef6f851a3
Create tr-TR.json (#840)
* Create tr-TR.json

* Update tr-TR.json

* Update tr-TR.json
2024-05-20 19:24:32 -05:00
Angel Marfil
4b7026b07f
Add untracked text for translation (#833) 2024-05-08 13:09:15 -05:00
Angel Marfil
23f368963b
Update es-ES.json (#832) 2024-05-06 18:34:30 -05:00
Ivan Mazzoli
ae0b00ba11
Added Italian translation (#831)
* Created Italian (it_IT) translation

* Update readme.md

* Create it-IT.json

* Delete data/localization/it_IT
2024-04-30 11:23:00 -05:00
jonas0b1011001
426ce2391a
Update de-GER.json (#828) 2024-04-28 21:22:08 -05:00
Michael Green
a75cd8719a
Disable CUE generation for the PUAE core (#827) 2024-04-26 20:26:15 -05:00
Tim Kieu
cc69305dea
Create vi-VN.json (#819) 2024-04-16 08:53:14 -05:00
MattiaPell
c13d8df901
Fix typo in Translate.html (#820) 2024-04-16 08:53:00 -05:00
Alexey Nurgaliev
31d57343a8
restore original 2xScaleHQ and 2xScaleHQ shaders (#811) 2024-04-05 16:52:45 -05:00
Allan Niles
1879b39f31
Update Contributors.md (#807) 2024-03-31 10:30:34 -05:00
Ethan O'Brien
c3ba473d1a
Update package.json 2024-03-26 18:41:47 -05:00
Ethan O'Brien
62c0424e68 Version 4.0.12 2024-03-26 18:18:12 -05:00
Alexey Nurgaliev
cafd80d023
Extended shader configuration format and custom shaders (#802)
* extended shaders configuration

* EJS_shaders configuration

* additional shaders
2024-03-26 17:51:18 -05:00
Ethan O'Brien
7c61b16945 Enable vsync by default 2024-03-07 13:59:29 -06:00
Ethan O'Brien
bccb86158b Add vsync option 2024-03-07 13:58:52 -06:00
Michael Green
8fbba189cb
[Request] Display the file name of the ROM/disk when using M3U lists (#787) 2024-03-03 19:56:10 -06:00
Michael Green
ae0ea3cc99
Added supported Amiga file extensions - closes [Request] Add M3U support for the Amiga (and probably other platforms too) #713 (#786) 2024-02-29 09:41:59 -06:00
Ethan O'Brien
065e37342a Add EJS_noAutoFocus 2024-02-28 12:32:27 -06:00
Ethan O'Brien
0d892cc39e Add EJS_forceLegacyCores 2024-02-18 12:13:19 -06:00
Allan Niles
43d151b8d1
Fix build error in npm.yml (#776) 2024-02-13 09:44:19 -06:00
Allan Niles
2cce5430ae
add emulatorjs to npm (#775)
Create NPM release #755
2024-02-12 21:58:10 -06:00
Ethan O'Brien
507fdcd51d
Fix logical error 2024-02-12 13:19:28 -06:00
Alexey Nurgaliev
42d0fabcea
add specific class for each virtual gamepad button (#772) 2024-02-11 21:31:39 -06:00
Michael Green
0dd28d6d57
Add support for the SMSPlus-GX core (#774)
* Add support for the SMSPlus-GX core

* Added settings.json file to tell the live preview VS Code plugin to set the correct headers for threads

* Updated using the @ethanaobrien's suggestions
2024-02-11 21:31:03 -06:00
Georges-Antoine Assi
2b22ec14c3
Add hooks for savign and loading save files (#771) 2024-02-11 00:44:13 -06:00
Allan Niles
838d01d838 Fix doc paths 2024-02-10 11:37:50 -06:00
Ethan O'Brien
2df38e1dda Flip the context menu instead of overflowing 2024-02-08 11:15:37 -06:00
Ethan O'Brien
a48f4b0afc Ability to disable the right click menu
Resolve #767
2024-02-08 10:55:33 -06:00
Allan Niles
f4e3f803cd
fix scroll bar (#766) 2024-02-06 19:28:40 -06:00
Ethan O'Brien
7ba77bd4cd
4.0.11!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 2024-02-06 18:17:04 -06:00
76 changed files with 18895 additions and 13218 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 /public
./.latest.sh
cd /mnt/HDD/public
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

67
.github/workflows/npm.yml vendored Normal file
View File

@ -0,0 +1,67 @@
name: Publish Package to npmjs
on:
release:
types: [published]
workflow_dispatch:
jobs:
build:
if: github.repository == 'EmulatorJS/EmulatorJS'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- 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
- 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 /public
./.stable.sh
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
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/"

16
.gitignore vendored
View File

@ -1,10 +1,16 @@
**/node_modules/
*.db
.vscode/settings.json
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/*
*.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,12 +1,140 @@
# Changes
# 4.0.11
# 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))
- Updated German translation (Thanks to [@jonas0b1011001](https://github.com/jonas0b1011001))
- Add missing calls to translate (Thanks to [@angelmarfil](https://github.com/angelmarfil))
- Added Turkish (`tr-TR`) (Thanks to [@iGoodie](https://github.com/iGoodie))
- Fixed Gamepad support for some older browsers (Thanks to [@ZhaoTonggang](https://github.com/ZhaoTonggang))
- Default to webgl1 on lower end cores.
- Added ability to switch between webgl1 and webgl2.
- Check core compatibility with EmulatorJS.
- Added core license to right-click menu.
- Removed usage of `replaceAll`.
- Added the ability to change settings on game start crash.
- Added `exit` button, to properly shutdown and save files.
- Fixed mouse on mobile devices.
- Modularized EmulatorJS.
- Fixed WHLoader hdf roms.
- 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))
- Add class for each virtual gamepad button
- Add `EJS_forceLegacyCores` option
- Add `EJS_noAutoFocus` (this is only for advanced developers, not likely an option you will use)
- Added supported Amiga file extensions (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Display the file name of the ROM/disk when using M3U lists (Thanks to [@michael-j-green](https://github.com/michael-j-green))
- Added vsync option
- 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.
@ -21,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))
@ -32,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))
@ -45,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.
@ -62,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))
@ -69,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
@ -83,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.
@ -107,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
@ -118,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.
@ -135,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.
@ -199,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!
@ -216,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
@ -246,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.
@ -253,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.
@ -261,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.
@ -275,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.
@ -290,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.
@ -305,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.
@ -313,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.
@ -341,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.

198
README.md
View File

@ -1,4 +1,3 @@
<div align = center>
<img width = 300 src = docs/Logo-light.png#gh-dark-mode-only>
@ -8,20 +7,17 @@
<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)
@ -31,12 +27,10 @@ Join our Discord server:
<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.
@ -54,7 +48,6 @@ Join our Discord server:
<br>
### Issues
*If something doesn't work, please consider opening an* ***[Issue]*** <br>
@ -62,34 +55,74 @@ Join our Discord server:
<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>
@ -124,7 +157,7 @@ npm start
**[Saturn][Sega Saturn]**|
**[32X][Sega 32X]**|
**[CD][Sega CD]**
<br>
<br>
@ -136,23 +169,45 @@ npm start
**[Lynx][Atari Lynx]**|
**[Jaguar][Atari Jaguar]**
<br>
<br>
### Commodore
**[Commodore 64]** |
**[Commodore 128]** |
**[Commodore Amiga]**
**[Commodore PET]** |
**[Commodore Plus/4]** |
**[Commodore VIC-20]**
<br>
<br>
### Other
**[PlayStation]**|
**[Arcade]**|
**[3DO]**|
**[MAME 2003]**
**[PlayStation Portable]**|
**[Arcade]**
**[3DO]** |
**[MAME 2003]** |
**[ColecoVision]**
</div>
<br>
***PSP is not yet supported***. Some of y'all may have seen that I pushed a "beta" ppsspp core, but this core is not ready for daily use. It still crashes randomly and any games that use 3d (so like, all of them) will just have a white screen (and might just crash). Do not open issues related to the "psp" core.
## 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>
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
@ -160,64 +215,67 @@ npm start
[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.html
[Contributors]: docs/Contributors.md
[Configurator]: https://emulatorjs.org/editor
[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/
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Systems 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 -->
[Nintendo Game Boy Advance]: docs/Systems/Nintendo%20Game%20Boy%20Advance.md
[Nintendo Game Boy]: docs/Systems/Nintendo%20Game%20Boy.md
[Nintendo 64]: docs/Systems/Nintendo%2064.md
[Nintendo DS]: docs/Systems/Nintendo%20DS.md
[Nintendo Game Boy Advance]: https://emulatorjs.org/docs/systems/nintendo-game-boy-advance
[Nintendo Game Boy]: https://emulatorjs.org/docs/systems/nintendo-game-boy
[Nintendo 64]: https://emulatorjs.org/docs/systems/nintendo-64
[Nintendo DS]: https://emulatorjs.org/docs/systems/nintendo-ds
[Sega Master System]: docs/Systems/Sega%20Master%20System.md
[Sega Mega Drive]: docs/Systems/Sega%20Mega%20Drive.md
[Sega Game Gear]: docs/Systems/Sega%20Game%20Gear.md
[Sega Saturn]: docs/Systems/Sega%20Saturn.md
[Sega 32X]: docs/Systems/Sega%2032X.md
[Sega CD]: docs/Systems/Sega%20CD.md
[Sega Master System]: https://emulatorjs.org/docs/systems/sega-master-system
[Sega Mega Drive]: https://emulatorjs.org/docs/systems/sega-mega-drive
[Sega Game Gear]: https://emulatorjs.org/docs/systems/sega-game-gear
[Sega Saturn]: https://emulatorjs.org/docs/systems/sega-saturn
[Sega 32X]: https://emulatorjs.org/docs/systems/sega-32x
[Sega CD]: https://emulatorjs.org/docs/systems/sega-cd
[Atari Jaguar]: docs/Systems/Atari%20Jaguar.md
[Atari Lynx]: docs/Systems/Atari%20Lynx.md
[Atari 7800]: docs/Systems/Atari%207800.md
[Atari 2600]: docs/Systems/Atari%202600.md
[Atari 5200]: docs/Systems/Atari%205200.md
[Atari Jaguar]: https://emulatorjs.org/docs/systems/atari-jaguar
[Atari Lynx]: https://emulatorjs.org/docs/systems/atari-lynx
[Atari 7800]: https://emulatorjs.org/docs/systems/atari-7800
[Atari 2600]: https://emulatorjs.org/docs/systems/atari-2600
[Atari 5200]: https://emulatorjs.org/docs/systems/atari-5200
[NES / Famicom]: docs/Systems/NES-Famicom.md
[SNES]: docs/Systems/SNES.md
[NES / Famicom]: https://emulatorjs.org/docs/systems/nes-famicom
[SNES]: https://emulatorjs.org/docs/systems/snes
[TurboGrafs-16 / PC Engine]: docs/Systems/TurboGrafs%2016-PC%20Engine.md
[WanderSwan / Color]: docs/Systems/WanderSwan-Color.md
[Neo Geo Poket]: docs/Systems/Neo%20Geo%20Poket.md
[PlayStation]: docs/Systems/PlayStation.md
[Virtual Boy]: docs/Systems/Virtual%20Boy.md
[Arcade]: docs/Systems/Arcade.md
[MSX]: docs/Systems/MSX.md
[3DO]: docs/Systems/3DO.md
[MAME 2003]: docs/Systems/MAME%202003.md
<!--
[TurboGrafs-16 / PC Engine]: https://emulatorjs.org/systems/TurboGrafx-16
[MSX]: https://emulatorjs.org/systems/MSX
[WanderSwan / Color]: https://emulatorjs.org/systems/WonderSwan
[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
[MAME 2003]: https://emulatorjs.org/docs/systems/mame-2003
[ColecoVision]: https://emulatorjs.org/docs/systems/colecovision
[Commodore 64]: https://emulatorjs.org/docs/systems/commodore-64
[Commodore 128]: https://emulatorjs.org/docs/systems/commodore-128
[Commodore Amiga]: https://emulatorjs.org/docs/systems/commodore-amiga
[Commodore PET]: https://emulatorjs.org/docs/systems/commodore-pet
[Commodore Plus/4]: https://emulatorjs.org/docs/systems/commodore-plus4
[Commodore VIC-20]: https://emulatorjs.org/docs/systems/commodore-vic20
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Badges 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[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

@ -1,374 +0,0 @@
class EJS_GameManager {
constructor(Module, EJS) {
this.EJS = EJS;
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', [''])
}
this.writeFile("/home/web_user/retroarch/userdata/config/Beetle PSX HW/Beetle PSX HW.opt", 'beetle_psx_hw_renderer = "software"\n');
this.writeFile("/home/web_user/retroarch/userdata/config/MAME 2003 (0.78)/MAME 2003 (0.78).opt", 'mame2003_skip_disclaimer = "enabled"\nmame2003_skip_warnings = "enabled"\n');
this.mkdir("/data");
this.mkdir("/data/saves");
this.writeFile("/home/web_user/retroarch/userdata/retroarch.cfg", this.getRetroArchCfg());
this.FS.mount(IDBFS, {}, '/data/saves');
this.FS.syncfs(true, () => {});
this.initShaders();
this.EJS.addEventListener(window, "beforeunload", () => {
this.saveSaveFiles();
this.FS.syncfs(() => {});
})
}
loadExternalFiles() {
return new Promise(async (resolve, reject) => {
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) => {
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();
}
let path = key;
if (key.trim().endsWith("/")) {
const invalidCharacters = /[#<$+%>!`&*'|{}/\\?"=@:^\r\n]/ig;
let name = this.EJS.config.externalFiles[key].split("/").pop().split("#")[0].split("?")[0].replace(invalidCharacters, "").trim();
if (!name) return done();
const files = await this.EJS.checkCompression(new Uint8Array(res.data), this.EJS.localization("Decompress Game Assets"));
if (files["!!notCompressedData"]) {
path += name;
} else {
for (const k in files) {
this.writeFile(path+k, files[k]);
}
return done();
}
}
try {
this.writeFile(path, 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"});
})
}
}
resolve();
});
}
writeFile(path, data) {
const parts = path.split("/");
let current = "/";
for (let i=0; i<parts.length-1; i++) {
if (!parts[i].trim()) continue;
current += parts[i] + "/";
this.mkdir(current);
}
this.FS.writeFile(path, data);
}
mkdir(path) {
try {
this.FS.mkdir(path);
} 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";
}
initShaders() {
if (!window.EJS_SHADERS) return;
this.mkdir("/shader");
for (const shader in window.EJS_SHADERS) {
this.FS.writeFile('/shader/'+shader, window.EJS_SHADERS[shader]);
}
}
clearEJSResetTimer() {
if (this.EJS.resetTimeout) {
clearTimeout(this.EJS.resetTimeout);
delete this.EJS.resetTimeout;
}
}
restart() {
this.clearEJSResetTimer();
this.functions.restart();
}
getState() {
this.functions.saveStateInfo();
return this.FS.readFile("/current.state");
}
loadState(state) {
try {
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){}
}, 5000)
}
screenshot() {
this.functions.screenshot();
return new Promise(async resolve => {
while (1) {
try {
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);
})();
}
quickLoad(slot) {
if (!slot) slot = 1;
(async () => {
let name = slot + '-quick.state';
this.clearEJSResetTimer();
this.functions.loadState(name, 0);
})();
}
simulateInput(player, index, value) {
if (this.EJS.isNetplay) {
this.EJS.netplay.simulateInput(player, index, value);
return;
}
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);
}
if (index === 25 && value === 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);
}
if (index === 26 && value === 1) {
let newSlot;
try {
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());
}
if (index === 27) {
this.functions.toggleFastForward(this.EJS.isFastForward ? !value : value);
}
if (index === 29) {
this.functions.toggleSlowMotion(this.EJS.isSlowMotion ? !value : value);
}
if (index === 28) {
if (this.EJS.rewindEnabled) {
this.functions.toggleRewind(value);
}
}
return;
}
this.functions.simulateInput(player, index, value);
}
getFileNames() {
if (this.EJS.getCore() === "picodrive") {
return ["bin", "gen", "smd", "md", "32x", "cue", "iso", "sms", "68k", "chd"];
} else {
return ["toc", "ccd", "exe", "pbp", "chd", "img", "bin", "iso"];
}
}
createCueFile(fileNames) {
try {
if (fileNames.length > 1) {
fileNames = fileNames.filter((item) => {
return this.getFileNames().includes(item.split(".").pop().toLowerCase());
})
fileNames = fileNames.sort((a, b) => {
if (isNaN(a.charAt()) || isNaN(b.charAt())) throw new Error("Incorrect file name format");
return (parseInt(a.charAt()) > parseInt(b.charAt())) ? 1 : -1;
})
}
} catch(e) {
if (fileNames.length > 1) {
console.warn("Could not auto-create cue file(s).");
return null;
}
}
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;
}
}
if (fileNames.length === 0) {
console.warn("Could not auto-create cue file(s).");
return null;
}
let baseFileName = fileNames[0].split("/").pop();
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";
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";
}
FS.writeFile("/"+baseFileName+".m3u", contents);
}
return (fileNames.length === 1) ? baseFileName+"-0.cue" : baseFileName+".m3u";
}
loadPpssppAssets() {
return new Promise(resolve => {
this.EJS.downloadFile('cores/ppsspp-assets.zip', (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.style.color = "red";
return;
}
this.mkdir("/PPSSPP");
for (const file in pspassets) {
const data = pspassets[file];
const path = "/PPSSPP/"+file;
const paths = path.split("/");
let cp = "";
for (let i=0; i<paths.length-1; i++) {
if (paths[i] === "") continue;
cp += "/"+paths[i];
if (!FS.analyzePath(cp).exists) {
FS.mkdir(cp);
}
}
this.FS.writeFile(path, data);
}
resolve();
})
}, null, false, {responseType: "arraybuffer", method: "GET"});
})
}
toggleMainLoop(playing) {
this.functions.toggleMainLoop(playing);
}
getCoreOptions() {
return this.functions.getCoreOptions();
}
setVariable(option, value) {
this.functions.setVariable(option, value);
}
setCheat(index, enabled, code) {
this.functions.setCheat(index, enabled, code);
}
resetCheat() {
this.functions.resetCheat();
}
toggleShader(active) {
this.functions.toggleShader(active);
}
getDiskCount() {
return this.functions.getDiskCount();
}
getCurrentDisk() {
return this.functions.getCurrentDisk();
}
setCurrentDisk(disk) {
this.functions.setCurrentDisk(disk);
}
getSaveFilePath() {
return this.functions.getSaveFilePath();
}
saveSaveFiles() {
this.functions.saveSaveFiles();
this.FS.syncfs(false, () => {});
}
supportsStates() {
return !!this.functions.supportsStates();
}
getSaveFile() {
this.saveSaveFiles();
const exists = FS.analyzePath(this.getSaveFilePath()).exists;
return (exists ? FS.readFile(this.getSaveFilePath()) : null);
}
loadSaveFiles() {
this.clearEJSResetTimer();
this.functions.loadSaveFiles();
}
setFastForwardRatio(ratio) {
this.functions.setFastForwardRatio(ratio);
}
toggleFastForward(active) {
this.functions.toggleFastForward(active);
}
setSlowMotionRatio(ratio) {
this.functions.setSlowMotionRatio(ratio);
}
toggleSlowMotion(active) {
this.functions.toggleSlowMotion(active);
}
setRewindGranularity(value) {
this.functions.setRewindGranularity(value);
}
getFrameNum() {
return this.functions.getFrameNum();
}
}
window.EJS_GameManager = EJS_GameManager;

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

File diff suppressed because one or more lines are too long

View File

@ -1,16 +1,29 @@
(async function() {
const folderPath = (path) => path.substring(0, path.length - path.split('/').pop().length);
const scripts = [
"emulator.js",
"nipplejs.js",
"shaders.js",
"storage.js",
"gamepad.js",
"GameManager.js",
"socket.io.min.js",
"compression.js"
];
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;
} else {
return scriptPath+file;
return scriptPath + "src/" + file;
}
}();
script.onload = resolve;
@ -20,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;
@ -42,35 +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") {
await loadScript('emulator.js');
await loadScript('nipplejs.js');
await loadScript('shaders.js');
await loadScript('storage.js');
await loadScript('gamepad.js');
await loadScript('GameManager.js');
await loadScript('socket.io.min.js');
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)) {
await loadScript('emulator.js');
await loadScript('nipplejs.js');
await loadScript('shaders.js');
await loadScript('storage.js');
await loadScript('gamepad.js');
await loadScript('GameManager.js');
await loadScript('socket.io.min.js');
await loadStyle('emulator.css');
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");
} 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;
@ -98,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;
@ -107,26 +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;
if (typeof window.EJS_language === "string" && window.EJS_language !== "en-US") {
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 : {});
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") {
@ -136,9 +194,19 @@
window.EJS_emulator.on("start", window.EJS_onGameStart);
}
if (typeof window.EJS_onLoadState === "function") {
window.EJS_emulator.on("load", window.EJS_onLoadState);
window.EJS_emulator.on("loadState", window.EJS_onLoadState);
}
if (typeof window.EJS_onSaveState === "function") {
window.EJS_emulator.on("save", window.EJS_onSaveState);
window.EJS_emulator.on("saveState", window.EJS_onSaveState);
}
if (typeof window.EJS_onLoadSave === "function") {
window.EJS_emulator.on("loadSave", window.EJS_onLoadSave);
}
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,348 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>EmulalorJS | 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>
<center>
<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">
</center>
<br>
<textarea id="box1" rows="39.5" cols="30"></textarea>
<textarea id="box2" placeholder="Copy what is on the left into google translate, then translate it into the language you whant and paste the translation here." rows="39.5" cols="50"></textarea>
<button onclick="startc()">Next</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"></textarea>
</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",
"Context Menu": "-Context Menu",
"Enter Fullscreen": "-Enter Fullscreen",
"Exit Fullscreen": "-Exit Fullscreen",
"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",
"Create a Room": "-Create a Room",
"Rooms": "-Rooms",
"Start Game": "-Start Game",
"Loading...": "-Loading...",
"Download Game Core": "-Download Game Core",
"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",
"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",
"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;
navigator.clipboard.writeText(document.getElementById('box3').value);
console.log(data7);
}
</script>
</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

@ -9,40 +9,40 @@
"7": "7",
"8": "8",
"9": "9",
"Restart": "Neu starten",
"Restart": "Neustart",
"Pause": "Pause",
"Play": "Spielen",
"Save State": "Sicherer Staat",
"Load State": "Ladezustand",
"Control Settings": "Kontrolleinstellungen",
"Cheats": "Betrüger",
"Save State": "Zustand speichern",
"Load State": "Zustand laden",
"Control Settings": "Steuerung",
"Cheats": "Cheats",
"Cache Manager": "Cache-Manager",
"Export Save File": "Speichern Sie die Datei exportieren",
"Import Save File": "Speicherdatei importieren",
"Netplay": "Spiel am Netz",
"Export Save File": "Speicherstand exportieren",
"Import Save File": "Speicherstand importieren",
"Netplay": "Onlinespiel",
"Mute": "Stumm",
"Unmute": "Stummschaltung aufheben",
"Settings": "Einstellungen",
"Enter Fullscreen": "Vollbildmodus aktivieren",
"Exit Fullscreen": "Beenden Sie den Vollbildmodus",
"Exit Fullscreen": "Vollbildmodus verlassen",
"Reset": "Zurücksetzen",
"Clear": "Klar",
"Clear": "Löschen",
"Close": "Schließen",
"QUICK SAVE STATE": "SCHNELLER SPEICHERENZUSTAND",
"QUICK LOAD STATE": "SCHNELLER LADEZUSTAND",
"QUICK SAVE STATE": "SCHNELLSPEICHERN",
"QUICK LOAD STATE": "SCHNELLLADEN",
"CHANGE STATE SLOT": "STATUS-SLOT ÄNDERN",
"FAST FORWARD": "SCHNELLER VORLAUF",
"FAST FORWARD": "VORSPULEN",
"Player": "Spieler",
"Connected Gamepad": "Verbundenes Gamepad",
"Gamepad": "Gamepad",
"Keyboard": "Tastatur",
"Set": "Satz",
"Set": "Setzen",
"Add Cheat": "Cheat hinzufügen",
"Create a Room": "Erstellen Sie einen Raum",
"Create a Room": "Raum erstellen",
"Rooms": "Räume",
"Start Game": "Spiel beginnen",
"Loading...": "Wird geladen...",
"Download Game Core": "Laden Sie Game Core herunter",
"Download Game Core": "Game Core herunterladen",
"Decompress Game Core": "Game Core entpacken",
"Download Game Data": "Spieldaten herunterladen",
"Decompress Game Data": "Spieldaten entpacken",
@ -57,16 +57,16 @@
"FPS": "FPS",
"show": "zeigen",
"hide": "verstecken",
"Fast Forward Ratio": "Schnellvorlaufverhältnis",
"Fast Forward": "Schneller Vorlauf",
"Enabled": "Ermöglicht",
"Save State Slot": "Status-Slot speichern",
"Save State Location": "Bundeslandstandort speichern",
"Fast Forward Ratio": "Vorspulgeschwindigkeit",
"Fast Forward": "Vorspulen",
"Enabled": "Aktiviert",
"Save State Slot": "Speicherplatz",
"Save State Location": "Speicherort",
"Download": "Herunterladen",
"Keep in Browser": "Im Browser behalten",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "KUMPEL",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
@ -77,59 +77,59 @@
"Player 1": "Spieler 1",
"Player 2": "Spieler 2",
"Both": "Beide",
"SAVED STATE TO SLOT": "STATUS FÜR SLOT GESPEICHERT",
"LOADED STATE FROM SLOT": "GELADENER STATUS VON SLOT",
"SET SAVE STATE SLOT TO": "SAVE STATE SLOT EINSTELLEN AUF",
"SAVED STATE TO SLOT": "STATUS IN SLOT SPEICHERN",
"LOADED STATE FROM SLOT": "STATUS VON SLOT GELADEN",
"SET SAVE STATE SLOT TO": "SPEICHERPLATZ ÄNDERN",
"Network Error": "Netzwerkfehler",
"Submit": "Einreichen",
"Submit": "Abschicken",
"Description": "Beschreibung",
"Code": "Code",
"Add Cheat Code": "Cheat-Code hinzufügen",
"Leave Room": "Zimmer verlassen",
"Leave Room": "Raum verlassen",
"Password": "Passwort",
"Password (optional)": "Passwort (optional)",
"Max Players": "Maximale Spieleranzahl",
"Room Name": "Raumname",
"Join": "Verbinden",
"Join": "Beitreten",
"Player Name": "Spielername",
"Set Player Name": "Legen Sie den Spielernamen fest",
"Set Player Name": "Spielernamen festlegen",
"Left Handed Mode": "Linkshänder-Modus",
"Virtual Gamepad": "Virtuelles Gamepad",
"Disk": "Scheibe",
"Press Keyboard": "Drücken Sie Tastatur",
"Press Keyboard": "Taste drücken",
"INSERT COIN": "MÜNZE EINWERFEN",
"Remove": "Entfernen",
"SAVE LOADED FROM BROWSER": "SPEICHERN VOM BROWSER GELADEN",
"SAVE SAVED TO BROWSER": "SPEICHERN 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",
"Download Game BIOS": "Laden Sie das Spiel-BIOS herunter",
"Decompress Game BIOS": "Dekomprimieren Sie das Spiel-BIOS",
"Download Game Parent": "Laden Sie Game Parent herunter",
"Decompress Game Parent": "Dekomprimieren Sie das übergeordnete Spiel",
"Download Game Patch": "Laden Sie den Spiel-Patch herunter",
"Decompress Game Patch": "Dekomprimieren Sie den Spiel-Patch",
"Download Game BIOS": "Spiel-BIOS herunterladen",
"Decompress Game BIOS": "Spiel-BIOS entpacken",
"Download Game Parent": "Game Parent herunterladen",
"Decompress Game Parent": "Game Parent entpacken",
"Download Game Patch": "Spiel-Patch herunterladen",
"Decompress Game Patch": "Spiel-Patch entpacken",
"Download Game State": "Spielstatus herunterladen",
"Check console": "Überprüfen Sie die Konsole",
"Error for site owner": "Fehler für Websitebesitzer",
"EmulatorJS": "EmulatorJS",
"Clear All": "Alles löschen",
"Take Screenshot": "Einen Screenshot machen",
"Take Screenshot": "Screenshot aufnehmen",
"Quick Save": "Schnellspeichern",
"Quick Load": "Schnell laden",
"REWIND": "ZURÜCKSPULEN",
"Rewind Enabled (requires restart)": "Rücklauf aktiviert (Neustart erforderlich)",
"Rewind Granularity": "Granularität zurückspulen",
"Slow Motion Ratio": "Zeitlupenverhältnis",
"Rewind Enabled (requires restart)": "Zurückspulen aktiviert (Neustart erforderlich)",
"Rewind Granularity": "Zurückspulgeschwindigkeit",
"Slow Motion Ratio": "Zeitlupengeschwindigkeit",
"Slow Motion": "Zeitlupe",
"Home": "Heim",
"Home": "Zurück",
"EmulatorJS License": "EmulatorJS-Lizenz",
"RetroArch License": "RetroArch-Lizenz",
"SLOW MOTION": "ZEITLUPE",
"A": "A",
"B": "B",
"SELECT": "WÄHLEN",
"SELECT": "SELECT",
"START": "START",
"UP": "HOCH",
"DOWN": "RUNTER",
@ -140,12 +140,12 @@
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "Bleiben Sie dran",
"STICK DOWN": "HALTE DICH",
"STICK LEFT": "LINKS STEHEN",
"STICK RIGHT": "HALTEN SIE SICH NACH RECHTS",
"C-PAD UP": "C-PAD nach oben",
"C-PAD DOWN": "C-PAD NACH UNTEN",
"STICK UP": "STICK NACH OBEN",
"STICK DOWN": "STICK NOCH UNTEN",
"STICK LEFT": "STICK LINKS",
"STICK RIGHT": "STICK RECHTS",
"C-PAD UP": "C-PAD HOCH",
"C-PAD DOWN": "C-PAD RUNTER",
"C-PAD LEFT": "C-PAD LINKS",
"C-PAD RIGHT": "C-PAD RECHTS",
"MICROPHONE": "MIKROFON",
@ -171,83 +171,83 @@
"COLOR": "FARBE",
"B/W": "S/W",
"PAUSE": "PAUSE",
"OPTION": "MÖGLICHKEIT",
"OPTION": "EINSTELLUNGEN",
"OPTION 1": "OPTION 1",
"OPTION 2": "OPTION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L BLEIB DURCH",
"L STICK DOWN": "L HALTE DICH",
"L STICK UP": "L STICK NACH OBEN",
"L STICK DOWN": "L STICK NACH UNTEN",
"L STICK LEFT": "L STICK LINKS",
"L STICK RIGHT": "L HALTE NACH RECHTS",
"R STICK UP": "R HALTEN SIE SICH AUF",
"R STICK DOWN": "R HALTEN SIE SICH NACH UNTEN",
"L STICK RIGHT": "L STICK RECHTS",
"R STICK UP": "R STICK NACH OBEN",
"R STICK DOWN": "R STICK NACH UNTEN",
"R STICK LEFT": "R STICK LINKS",
"R STICK RIGHT": "R STICK NACH RECHTS",
"R STICK RIGHT": "R STICK RECHTS",
"Start": "Start",
"Select": "Wählen",
"Select": "Select",
"Fast": "Schnell",
"Slow": "Langsam",
"a": "A",
"b": "B",
"c": "C",
"d": "D",
"a": "a",
"b": "b",
"c": "c",
"d": "d",
"e": "e",
"f": "F",
"g": "G",
"h": "H",
"i": "ich",
"g": "g",
"h": "h",
"i": "i",
"j": "J",
"k": "k",
"l": "l",
"m": "M",
"n": "N",
"o": "Ö",
"p": "P",
"q": "Q",
"r": "R",
"s": "S",
"t": "T",
"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": "j",
"x": "x",
"y": "y",
"z": "z",
"enter": "eingeben",
"escape": "Flucht",
"space": "Raum",
"enter": "ENTER",
"escape": "ESC",
"space": "Leertaste",
"tab": "Tab",
"backspace": "Rücktaste",
"delete": "löschen",
"delete": "ENTF",
"arrowup": "Pfeil nach oben",
"arrowdown": "Pfeil nach unten",
"arrowleft": "Pfeil nach links",
"arrowright": "Pfeil nach rechts",
"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": "Schicht",
"control": "Kontrolle",
"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": "strg",
"alt": "alt",
"meta": "Meta",
"capslock": "Feststelltaste",
"insert": "einfügen",
"home": "heim",
"end": "Ende",
"pageup": "Seite nach oben",
"pagedown": "Bild nach unten",
"capslock": "capslock",
"insert": "einf",
"home": "pos1",
"end": "ende",
"pageup": "bild hoch",
"pagedown": "bild runter",
"!": "!",
"@": "@",
"#": "#",
@ -282,15 +282,15 @@
"RIGHT_STICK_Y": "RIGHT_STICK_Y",
"LEFT_TRIGGER": "LINKER TRIGGER",
"RIGHT_TRIGGER": "RIGHT_TRIGGER",
"A_BUTTON": "EIN KNOPF",
"A_BUTTON": "A_BUTTON",
"B_BUTTON": "B_BUTTON",
"X_BUTTON": "X_BUTTON",
"Y_BUTTON": "Y_BUTTON",
"START_BUTTON": "START KNOPF",
"SELECT_BUTTON": "AUSWAHLKNOPF",
"L1_BUTTON": "L1_TASTE",
"START_BUTTON": "START",
"SELECT_BUTTON": "SELECT",
"L1_BUTTON": "L1_BUTTON",
"R1_BUTTON": "R1_BUTTON",
"L2_BUTTON": "L2_TASTE",
"L2_BUTTON": "L2_BUTTON",
"R2_BUTTON": "R2_BUTTON",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "RIGHT_THUMB_BUTTON",
@ -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": "ΑΠΟΘΗΚΕΥΣΗ ΦΟΡΤΩΜΕΝΟΥ ΑΠΟ ΤΟ 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,302 +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",
"Create a Room": "-Create a Room",
"Rooms": "-Rooms",
"Start Game": "-Start Game",
"Loading...": "-Loading...",
"Download Game Core": "-Download Game Core",
"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",
"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",
"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

@ -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": "Reanudar",
"Pause": "Pausa",
"Play": "Jugar",
"Save State": "Guardar Estado",
"Load State": "Estado de carga",
"Control Settings": "Ajustes de control",
"Cheats": "trucos",
"Cache Manager": "Administrador de caché",
"Export Save File": "Exportar archivo guardado",
"Import Save File": "Importar archivo guardado",
"Netplay": "Juego de red",
"Mute": "Silenciar",
"Unmute": "No silenciar",
"Settings": "Ajustes",
"Enter Fullscreen": "Ingrese a pantalla completa",
"Exit Fullscreen": "Salir de pantalla completa",
"Reset": "Reiniciar",
"Clear": "Claro",
"Close": "Cerca",
"QUICK SAVE STATE": "ESTADO DE GUARDADO RÁPIDO",
"QUICK LOAD STATE": "ESTADO DE CARGA RÁPIDA",
"CHANGE STATE SLOT": "CAMBIAR ESTADO SLOT",
"FAST FORWARD": "AVANCE RÁPIDO",
"Player": "Jugador",
"Connected Gamepad": "Mando conectado",
"Gamepad": "mando",
"Keyboard": "Teclado",
"Set": "Colocar",
"Add Cheat": "Añadir truco",
"Create a Room": "Crear una habitación",
"Rooms": "Habitaciones",
"Start Game": "Empezar juego",
"Loading...": "Cargando...",
"Download Game Core": "Descargar Game Core",
"Decompress Game Core": "Descomprimir Game Core",
"Download Game Data": "Descargar datos del juego",
"Decompress Game Data": "Descomprimir datos del juego",
"Shaders": "sombreadores",
"Disabled": "Desactivado",
"2xScaleHQ": "2xEscalaHQ",
"4xScaleHQ": "4xEscalaHQ",
"CRT easymode": "modo fácil CRT",
"CRT aperture": "Apertura de tubo de rayos catódicos",
"CRT geom": "geometría CRT",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "espectáculo",
"hide": "esconder",
"Fast Forward Ratio": "Relación de avance rápido",
"Fast Forward": "Avance rápido",
"Enabled": "Activado",
"Save State Slot": "Guardar ranura de estado",
"Save State Location": "Guardar ubicación de estado",
"Download": "Descargar",
"Keep in Browser": "Mantener en el navegador",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "CAMARADA",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Bajo",
"High": "Alto",
"Very High": "Muy alto",
"None": "Ninguno",
"Player 1": "Jugador 1",
"Player 2": "jugador 2",
"Both": "Ambos",
"SAVED STATE TO SLOT": "ESTADO GUARDADO EN RANURA",
"LOADED STATE FROM SLOT": "ESTADO CARGADO DESDE LA RANURA",
"SET SAVE STATE SLOT TO": "ESTABLECER GUARDAR RANURA DE ESTADO EN",
"Network Error": "Error de red",
"Submit": "Entregar",
"Description": "Descripción",
"Code": "Código",
"Add Cheat Code": "Agregar código de trucos",
"Leave Room": "Dejar la habitación",
"Password": "Contraseña",
"Password (optional)": "Contraseña (opcional)",
"Max Players": "Jugadores máximos",
"Room Name": "Nombre de la habitación",
"Join": "Unirse",
"Player Name": "Nombre del jugador",
"Set Player Name": "Establecer nombre de jugador",
"Left Handed Mode": "Modo para zurdos",
"Virtual Gamepad": "Mando virtual",
"Disk": "Disco",
"Press Keyboard": "Oprimá 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",
"Join the discord": "Únete a la discordia",
"View on GitHub": "Ver en GitHub",
"Failed to start game": "No se pudo iniciar el juego",
"Download Game BIOS": "Descargar BIOS del juego",
"Decompress Game BIOS": "Descomprimir BIOS del juego",
"Download Game Parent": "Descargar juego para padres",
"Decompress Game Parent": "Padre del juego de descompresión",
"Download Game Patch": "Descargar el parche del juego",
"Decompress Game Patch": "Parche de descompresión del juego",
"Download Game State": "Descargar estado del juego",
"Check console": "Comprobar consola",
"Error for site owner": "Error para el propietario del sitio",
"EmulatorJS": "EmuladorJS",
"Clear All": "Limpiar todo",
"Take Screenshot": "Tomar captura de pantalla",
"Quick Save": "Guardado rápido",
"Quick Load": "Carga rápida",
"REWIND": "REBOBINAR",
"Rewind Enabled (requires restart)": "Rebobinado habilitado (requiere reinicio)",
"Rewind Granularity": "Granularidad de rebobinado",
"Slow Motion Ratio": "Relación de cámara lenta",
"Slow Motion": "Camara lenta",
"Home": "Hogar",
"EmulatorJS License": "Licencia EmulatorJS",
"RetroArch License": "Licencia RetroArch",
"SLOW MOTION": "CAMARA LENTA",
"A": "A",
"B": "B",
"SELECT": "SELECCIONAR",
"START": "COMENZAR",
"UP": "ARRIBA",
"DOWN": "ABAJO",
"LEFT": "IZQUIERDA",
"RIGHT": "BIEN",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "PEGARSE",
"STICK DOWN": "PEGAR",
"STICK LEFT": "PALO IZQUIERDO",
"STICK RIGHT": "PEGAR A LA DERECHA",
"C-PAD UP": "C-PAD ARRIBA",
"C-PAD DOWN": "C-PAD ABAJO",
"C-PAD LEFT": "C-PAD IZQUIERDO",
"C-PAD RIGHT": "C-PAD DERECHO",
"MICROPHONE": "MICRÓFONO",
"BUTTON 1 / START": "BOTÓN 1 / INICIO",
"BUTTON 2": "BOTÓN 2",
"BUTTON": "BOTÓN",
"LEFT D-PAD UP": "D-PAD IZQUIERDO ARRIBA",
"LEFT D-PAD DOWN": "D-PAD IZQUIERDO ABAJO",
"LEFT D-PAD LEFT": "D-PAD IZQUIERDO IZQUIERDO",
"LEFT D-PAD RIGHT": "D-PAD IZQUIERDO DERECHO",
"RIGHT D-PAD UP": "D-PAD DERECHO ARRIBA",
"RIGHT D-PAD DOWN": "D-PAD DERECHO ABAJO",
"RIGHT D-PAD LEFT": "D-PAD DERECHO IZQUIERDO",
"RIGHT D-PAD RIGHT": "D-PAD DERECHO DERECHO",
"C": "C",
"MODE": "MODO",
"FIRE": "FUEGO",
"RESET": "REINICIAR",
"LEFT DIFFICULTY A": "IZQUIERDA DIFICULTAD A",
"LEFT DIFFICULTY B": "IZQUIERDA DIFICULTAD B",
"RIGHT DIFFICULTY A": "CORRECTA DIFICULTAD A",
"RIGHT DIFFICULTY B": "CORRECTA DIFICULTAD B",
"COLOR": "COLOR",
"B/W": "B/N",
"PAUSE": "PAUSA",
"OPTION": "OPCIÓN",
"OPTION 1": "OPCIÓN 1",
"OPTION 2": "OPCION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK UP",
"L STICK DOWN": "L STICK ABAJO",
"L STICK LEFT": "PALO L IZQUIERDO",
"L STICK RIGHT": "PALO L DERECHO",
"R STICK UP": "R STICK UP",
"R STICK DOWN": "PALO R HACIA ABAJO",
"R STICK LEFT": "PALANCA R IZQUIERDA",
"R STICK RIGHT": "PALANCA R DERECHA",
"Start": "Comenzar",
"Select": "Seleccionar",
"Fast": "Rápido",
"Slow": "Lento",
"a": "a",
"b": "b",
"c": "C",
"d": "d",
"e": "mi",
"f": "F",
"g": "gramo",
"h": "h",
"i": "i",
"j": "j",
"k": "k",
"l": "yo",
"m": "metro",
"n": "norte",
"o": "o",
"p": "pag",
"q": "q",
"r": "r",
"s": "s",
"t": "t",
"u": "tu",
"v": "v",
"w": "w",
"x": "X",
"y": "y",
"z": "z",
"enter": "ingresar",
"escape": "escapar",
"space": "espacio",
"tab": "pestaña",
"backspace": "retroceso",
"delete": "borrar",
"arrowup": "flecha arriba",
"arrowdown": "flecha abajo",
"arrowleft": "flecha izquierda",
"arrowright": "flecha derecha",
"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": "cambio",
"control": "control",
"alt": "alternativa",
"meta": "meta",
"capslock": "Bloq Mayús",
"insert": "insertar",
"home": "hogar",
"end": "fin",
"pageup": "página arriba",
"pagedown": "Página abajo",
"!": "!",
"@": "@",
"#": "#",
"$": "ps",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "LEFT_STICK_X",
"LEFT_STICK_Y": "LEFT_STICK_Y",
"RIGHT_STICK_X": "PALO_DERECHO_X",
"RIGHT_STICK_Y": "PALO_DERECHO_Y",
"LEFT_TRIGGER": "GATILLO IZQUIERDO",
"RIGHT_TRIGGER": "DERECHO_TRIGGER",
"A_BUTTON": "UN BOTÓN",
"B_BUTTON": "B_BOTÓN",
"X_BUTTON": "BOTÓN_X",
"Y_BUTTON": "BOTÓN Y_",
"START_BUTTON": "BOTÓN DE INICIO",
"SELECT_BUTTON": "SELECCIONAR_BOTÓN",
"L1_BUTTON": "L1_BOTÓN",
"R1_BUTTON": "R1_BOTÓN",
"L2_BUTTON": "L2_BOTÓN",
"R2_BUTTON": "R2_BOTÓN",
"LEFT_THUMB_BUTTON": "LEFT_THUMB_BUTTON",
"RIGHT_THUMB_BUTTON": "DERECHO_THUMB_BOTÓN",
"DPAD_UP": "DPAD ARRIBA",
"DPAD_DOWN": "DPAD_ABAJO",
"DPAD_LEFT": "DPAD_IZQUIERDA",
"DPAD_RIGHT": "DPAD_DERECHO"
}

310
data/localization/es.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": "Reiniciar",
"Pause": "Pausar",
"Play": "Reanudar",
"Save State": "Guardar Estado",
"Load State": "Cargar Estado",
"Control Settings": "Ajustes de Control",
"Cheats": "Trucos",
"Cache Manager": "Administrador de Caché",
"Export Save File": "Exportar Archivo de Guardado",
"Import Save File": "Importar Archivo de Guardado",
"Netplay": "Juego en Red",
"Mute": "Silenciar",
"Unmute": "Activar Sonido",
"Settings": "Ajustes",
"Enter Fullscreen": "Pantalla Completa",
"Exit Fullscreen": "Salir de Pantalla Completa",
"Context Menu": "Menú Contextual",
"Reset": "Reiniciar",
"Clear": "Limpiar",
"Close": "Cerrar",
"QUICK SAVE STATE": "GUARDADO RÁPIDO DE ESTADO",
"QUICK LOAD STATE": "CARGA RÁPIDA DE ESTADO",
"CHANGE STATE SLOT": "CAMBIAR RANURA DE ESTADO",
"FAST FORWARD": "AVANCE RÁPIDO",
"Player": "Jugador",
"Connected Gamepad": "Mando Conectado",
"Gamepad": "Mando",
"Keyboard": "Teclado",
"Set": "Guardar",
"Add Cheat": "Añadir Truco",
"Note that some cheats require a restart to disable": "Algunos trucos requieren reiniciar para desactivarlos",
"Create a Room": "Crear una Sala",
"Rooms": "Salas",
"Start Game": "Iniciar juego",
"Click to resume Emulator": "Haz clic para reanudar el Emulador",
"Drop save state here to load": "Suelta el estado guardado aquí para cargarlo",
"Loading...": "Cargando...",
"Download Game Core": "Descargando Núcleo del Juego",
"Outdated graphics driver": "Controlador de gráficos obsoleto",
"Decompress Game Core": "Descomprimiendo Núcleo del Juego",
"Download Game Data": "Descargando Datos del Juego",
"Decompress Game Data": "Descomprimiendo Datos del Juego",
"Shaders": "Shaders",
"Disabled": "Desactivado",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "mostrar",
"hide": "ocultar",
"Fast Forward Ratio": "Proporción de Avance Rápido",
"Fast Forward": "Avance Rápido",
"Enabled": "Activado",
"Save State Slot": "Guardar Ranura de Estado",
"Save State Location": "Guardar Ubicación de Estado",
"Download": "Descargar",
"Keep in Browser": "Mantener en Navegador",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Bajo",
"High": "Alto",
"Very High": "Muy alto",
"None": "Ninguno",
"Player 1": "Jugador 1",
"Player 2": "jugador 2",
"Both": "Ambos",
"SAVED STATE TO SLOT": "ESTADO GUARDADO EN RANURA",
"LOADED STATE FROM SLOT": "ESTADO CARGADO DESDE LA RANURA",
"SET SAVE STATE SLOT TO": "ESTABLECER RANURA DE GUARDADO DE ESTADO EN",
"Network Error": "Error de Red",
"Submit": "Enviar",
"Description": "Descripción",
"Code": "Código",
"Add Cheat Code": "Agregar Código de Trucos",
"Leave Room": "Dejar la Sala",
"Password": "Contraseña",
"Password (optional)": "Contraseña (opcional)",
"Max Players": "Jugadores Máximos",
"Room Name": "Nombre de la Sala",
"Join": "Unirse",
"Player Name": "Nombre del Jugador",
"Set Player Name": "Establecer Nombre de Jugador",
"Left Handed Mode": "Modo para Zurdos",
"Virtual Gamepad": "Mando Virtual",
"Disk": "Disco",
"Press Keyboard": "Presionar Teclado",
"INSERT COIN": "INSERTE MONEDA",
"Remove": "Eliminar",
"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",
"Download Game BIOS": "Descargando BIOS del Juego",
"Decompress Game BIOS": "Descomprimiendo BIOS del Juego",
"Download Game Parent": "Descargando Juego Principal",
"Decompress Game Parent": "Descomprimiendo Juego Principal",
"Download Game Patch": "Descargando Parche del Juego",
"Decompress Game Patch": "Descomprimiendo Parche del Juego",
"Download Game State": "Descargando Estado del Juego",
"Check console": "Verificar consola",
"Error for site owner": "Error para el propietario del sitio",
"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",
"Quick Save": "Guardado Rápido",
"Quick Load": "Carga Rápida",
"REWIND": "REBOBINAR",
"Rewind Enabled (requires restart)": "Rebobinado Habilitado (requiere reinicio)",
"Rewind Granularity": "Granularidad de Rebobinado",
"Slow Motion Ratio": "Proporción de Cámara Lenta",
"Slow Motion": "Cámara Lenta",
"Home": "Inicio",
"EmulatorJS License": "Licencia de EmulatorJS",
"RetroArch License": "Licencia de RetroArch",
"This project is powered by": "Este proyecto está impulsado por",
"View the RetroArch license here": "Ver la licencia de RetroArch aquí",
"SLOW MOTION": "CÁMARA LENTA",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "ARRIBA",
"DOWN": "ABAJO",
"LEFT": "IZQUIERDA",
"RIGHT": "DERECHA",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "STICK ARRIBA",
"STICK DOWN": "STICK ABAJO",
"STICK LEFT": "STICK IZQUIERDA",
"STICK RIGHT": "STICK DERECHA",
"C-PAD UP": "C-PAD ARRIBA",
"C-PAD DOWN": "C-PAD ABAJO",
"C-PAD LEFT": "C-PAD IZQUIERDA",
"C-PAD RIGHT": "C-PAD DERECHA",
"MICROPHONE": "MICRÓFONO",
"BUTTON 1 / START": "BOTÓN 1 / INICIO",
"BUTTON 2": "BOTÓN 2",
"BUTTON": "BOTÓN",
"LEFT D-PAD UP": "D-PAD IZQUIERDO ARRIBA",
"LEFT D-PAD DOWN": "D-PAD IZQUIERDO ABAJO",
"LEFT D-PAD LEFT": "D-PAD IZQUIERDO IZQUIERDA",
"LEFT D-PAD RIGHT": "D-PAD IZQUIERDO DERECHA",
"RIGHT D-PAD UP": "D-PAD DERECHO ARRIBA",
"RIGHT D-PAD DOWN": "D-PAD DERECHO ABAJO",
"RIGHT D-PAD LEFT": "D-PAD DERECHO IZQUIERDO",
"RIGHT D-PAD RIGHT": "D-PAD DERECHO DERECHA",
"C": "C",
"MODE": "MODO",
"FIRE": "FUEGO",
"RESET": "RESET",
"LEFT DIFFICULTY A": "IZQUIERDA DIFICULTAD A",
"LEFT DIFFICULTY B": "IZQUIERDA DIFICULTAD B",
"RIGHT DIFFICULTY A": "DERECHA DIFICULTAD A",
"RIGHT DIFFICULTY B": "DERECHA DIFICULTAD B",
"COLOR": "COLOR",
"B/W": "B/N",
"PAUSE": "PAUSA",
"OPTION": "OPCIÓN",
"OPTION 1": "OPCIÓN 1",
"OPTION 2": "OPCION 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK ARRIBA",
"L STICK DOWN": "L STICK ABAJO",
"L STICK LEFT": "L STICK IZQUIERDA",
"L STICK RIGHT": "L STICK DERECHA",
"R STICK UP": "R STICK ARRIBA",
"R STICK DOWN": "R STICK ABAJO",
"R STICK LEFT": "R STICK IZQUIERDA",
"R STICK RIGHT": "R STICK DERECHA",
"Start": "Start",
"Select": "Select",
"Fast": "Rápido",
"Slow": "Lento",
"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": "intro",
"escape": "escape",
"space": "espacio",
"tab": "tabulador",
"backspace": "retroceso",
"delete": "borrar",
"arrowup": "flecha arriba",
"arrowdown": "flecha abajo",
"arrowleft": "flecha izquierda",
"arrowright": "flecha derecha",
"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": "bloq mayús",
"insert": "insertar",
"home": "inicio",
"end": "fin",
"pageup": "página arriba",
"pagedown": "página abajo",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "STICK_IZQUIERDO_X",
"LEFT_STICK_Y": "STICK_IZQUIERDO_Y",
"RIGHT_STICK_X": "STICK_DERECHO_X",
"RIGHT_STICK_Y": "STICK_DERECHO_Y",
"LEFT_TRIGGER": "GATILLO_IZQUIERDO",
"RIGHT_TRIGGER": "GATILLO_DERECHO",
"A_BUTTON": "BOTÓN_A",
"B_BUTTON": "BOTÓN_B",
"X_BUTTON": "BOTÓN_X",
"Y_BUTTON": "BOTÓN_Y",
"START_BUTTON": "BOTÓN_START",
"SELECT_BUTTON": "BOTÓN_SELECT",
"L1_BUTTON": "BOTÓN_L1",
"R1_BUTTON": "BOTÓN_R1",
"L2_BUTTON": "BOTÓN_L2",
"R2_BUTTON": "BOTÓN_R2",
"LEFT_THUMB_BUTTON": "BOTÓN_L3",
"RIGHT_THUMB_BUTTON": "BOTÓN_R3",
"DPAD_UP": "DPAD ARRIBA",
"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": "डीपीएडी_दाएँ"
}
}

302
data/localization/it.json Normal file
View File

@ -0,0 +1,302 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Riavvia",
"Pause": "Pausa",
"Play": "Play",
"Save State": "Salva Stato",
"Load State": "Carica Stato",
"Control Settings": "Impostazioni Controlli",
"Cheats": "Trucchi",
"Cache Manager": "Gestore Cache",
"Export Save File": "Esporta File Salvataggio",
"Import Save File": "Importa File Salvataggio",
"Netplay": "Netplay",
"Mute": "Disattiva Volume",
"Unmute": "Riattiva Volume",
"Settings": "Impostazioni",
"Context Menu": "Menu contestuale",
"Enter Fullscreen": "Schermo Intero",
"Exit Fullscreen": "Esci Schermo Intero",
"Reset": "Reset",
"Clear": "Pulisci",
"Close": "Chiudi",
"QUICK SAVE STATE": "SALVA STATO VELOCE",
"QUICK LOAD STATE": "CARICA STATO VELOCE",
"CHANGE STATE SLOT": "CAMBIA SLOT STATO",
"FAST FORWARD": "AVANZA VELOCE",
"Player": "Player",
"Connected Gamepad": "Gamepad Connesso",
"Gamepad": "Gamepad",
"Keyboard": "Tastiera",
"Set": "Imposta",
"Add Cheat": "Aggiungi Trucco",
"Create a Room": "Crea una Stanza",
"Rooms": "Stanze",
"Start Game": "Avvia Gioco",
"Loading...": "Caricamento...",
"Download Game Core": "Scaricamento Core Gioco",
"Decompress Game Core": "Decompressione Core Gioco",
"Download Game Data": "Scaricamento Dati Gioco",
"Decompress Game Data": "Decompressione Dati Gioco",
"Shaders": "Shaders",
"Disabled": "Disabilitato",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "mostra",
"hide": "nascondi",
"Fast Forward Ratio": "Rapporto Avanzamento Veloce",
"Fast Forward": "Avanzamento Veloce",
"Enabled": "Abilitato",
"Save State Slot": "Salva Slot Stato",
"Save State Location": "Salva Posizione Stato",
"Download": "Scarica",
"Keep in Browser": "Tieni nel Browser",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Basso",
"High": "Alto",
"Very High": "Molto Alto",
"None": "Nessuno",
"Player 1": "Giocatore 1",
"Player 2": "Giocatore 2",
"Both": "Entrambi",
"SAVED STATE TO SLOT": "STATO SALVATO SU SLOT",
"LOADED STATE FROM SLOT": "STATO CARICATO DA SLOT",
"SET SAVE STATE SLOT TO": "IMPOSTA SLOT SALVATAGGIO STATO SU",
"Network Error": "Errore di Rete",
"Submit": "Invia",
"Description": "Descrizione",
"Code": "Codice",
"Add Cheat Code": "Aggiungi Trucco",
"Leave Room": "Lascia Stanza",
"Password": "Password",
"Password (optional)": "Password (opzionale)",
"Max Players": "Giocatori Massimi",
"Room Name": "Nome Stanza",
"Join": "Entra",
"Player Name": "Nome Giocatore",
"Set Player Name": "Imposta Nome Giocatore",
"Left Handed Mode": "Modalità per mancini",
"Virtual Gamepad": "Gamepad Virtuale",
"Disk": "Disco",
"Press Keyboard": "Premi Tastiera",
"INSERT COIN": "INSERISCI GETTONE",
"Remove": "Rimuovi",
"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",
"Download Game BIOS": "Scaricamento BIOS Gioco",
"Decompress Game BIOS": "Decompressione BIOS Gioco",
"Download Game Parent": "Scaricamento Parent Gioco",
"Decompress Game Parent": "Decompressione Parent Gioco",
"Download Game Patch": "Scaricamento Patch Gioco",
"Decompress Game Patch": "Decompressione Patch Gioco",
"Download Game State": "Scarica Stato Gioco",
"Check console": "Controlla la console",
"Error for site owner": "Errore per proprietario sito",
"EmulatorJS": "EmulatorJS",
"Clear All": "Pulisci Tutto",
"Take Screenshot": "Acquisisci Screenshot",
"Quick Save": "Caricamento Veloce",
"Quick Load": "Salvataggio Veloce",
"REWIND": "RIAVVOLGI",
"Rewind Enabled (requires restart)": "Riavvolgimento Abilitato (richiede riavvio)",
"Rewind Granularity": "Granularità Riavvolgimento",
"Slow Motion Ratio": "Rapporto Slow Motion",
"Slow Motion": "Slow Motion",
"Home": "Home",
"EmulatorJS License": "Licenza EmulatorJS",
"RetroArch License": "Licenza RetroArch",
"SLOW MOTION": "SLOW MOTION",
"A": "A",
"B": "B",
"SELECT": "SELECT",
"START": "START",
"UP": "SU",
"DOWN": "GIU",
"LEFT": "SINISTRA",
"RIGHT": "DESTRA",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "STICK SU",
"STICK DOWN": "STICK GIU",
"STICK LEFT": "STICK SINISTRA",
"STICK RIGHT": "STICK DESTRA",
"C-PAD UP": "C-PAD SU",
"C-PAD DOWN": "C-PAD GIU",
"C-PAD LEFT": "C-PAD DESTRA",
"C-PAD RIGHT": "C-PAD SINISTRA",
"MICROPHONE": "MICROFONO",
"BUTTON 1 / START": "PULSANTE 1 / START",
"BUTTON 2": "PULSANTE 2",
"BUTTON": "PULSANTE",
"LEFT D-PAD UP": "D-PAD SINISTRO SU",
"LEFT D-PAD DOWN": "D-PAD SINISTRO GIU",
"LEFT D-PAD LEFT": "D-PAD SINISTRO SINISTRA",
"LEFT D-PAD RIGHT": "D-PAD SINISTRO DESTRA",
"RIGHT D-PAD UP": "D-PAD DESTRO SU",
"RIGHT D-PAD DOWN": "D-PAD DESTRO GIU",
"RIGHT D-PAD LEFT": "D-PAD DESTRO SINISTRA",
"RIGHT D-PAD RIGHT": "D-PAD DESTRO DESTRA",
"C": "C",
"MODE": "MODO",
"FIRE": "FIRE",
"RESET": "RESET",
"LEFT DIFFICULTY A": "SINISTRA DIFFICOLTA A",
"LEFT DIFFICULTY B": "SINISTRA DIFFICOLTA B",
"RIGHT DIFFICULTY A": "DESTRA DIFFICOLTA A",
"RIGHT DIFFICULTY B": "DESTRA DIFFICOLTA B",
"COLOR": "COLORE",
"B/W": "B/N",
"PAUSE": "PAUSA",
"OPTION": "OPTZIONE",
"OPTION 1": "OPTZIONE 1",
"OPTION 2": "OPTZIONE 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "L STICK SU",
"L STICK DOWN": "L STICK GIU",
"L STICK LEFT": "L STICK SINISTRA",
"L STICK RIGHT": "L STICK DESTRA",
"R STICK UP": "R STICK SU",
"R STICK DOWN": "R STICK GIU",
"R STICK LEFT": "R STICK SINISTRA",
"R STICK RIGHT": "R STICK DESTRA",
"Start": "Start",
"Select": "Select",
"Fast": "Veloce",
"Slow": "Lento",
"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": "invio",
"escape": "esc",
"space": "spazio",
"tab": "tab",
"backspace": "backspace",
"delete": "cancella",
"arrowup": "frecciasu",
"arrowdown": "frecciagiu",
"arrowleft": "frecciasinistra",
"arrowright": "frecciadestra",
"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": "STICK_SINISTRO_X",
"LEFT_STICK_Y": "STICK_SINISTRO_Y",
"RIGHT_STICK_X": "STICK_DESTRO_X",
"RIGHT_STICK_Y": "STICK_DESTRO_Y",
"LEFT_TRIGGER": "TRIGGER_SINISTRO",
"RIGHT_TRIGGER": "TRIGGER_DESTRO",
"A_BUTTON": "PULSANTE_A",
"B_BUTTON": "PULSANTE_B",
"X_BUTTON": "PULSANTE_X",
"Y_BUTTON": "PULSANTE_Y",
"START_BUTTON": "PULSANTE_START",
"SELECT_BUTTON": "PULSANTE_SELECT",
"L1_BUTTON": "PULSANTE_L1",
"R1_BUTTON": "PULSANTE_R1",
"L2_BUTTON": "PULSANTE_L2",
"R2_BUTTON": "PULSANTE_R2",
"LEFT_THUMB_BUTTON": "PULSANTE_L3",
"RIGHT_THUMB_BUTTON": "PULSANTE_R3",
"DPAD_UP": "DPAD_SU",
"DPAD_DOWN": "DPAD_GIU",
"DPAD_LEFT": "DPAD_SINISTRA",
"DPAD_RIGHT": "DPAD_DESTRA"
}

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,53 +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>
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` by [@cesarcristianodeoliveira](https://github.com/cesarcristianodeoliveira) <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>
## 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_СПРАВО"
}
}

310
data/localization/tr.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": "Baştan Başlat",
"Pause": "Durdur",
"Play": "Başlat",
"Save State": "Durumu Kaydet",
"Load State": "Durumu Yükle",
"Control Settings": "Kontrol Ayarları",
"Cheats": "Hileler",
"Cache Manager": "Önbellek Yöneticisi",
"Export Save File": "Kayıt Dosyasını Dışa Aktar",
"Import Save File": "Kayıt Dosyasını İçe Aktar",
"Netplay": "Çevrimiçi Oynama",
"Mute": "Sessize Al",
"Unmute": "Sesi Geri Aç",
"Settings": "Ayarlar",
"Enter Fullscreen": "Tam Ekrana Geç",
"Exit Fullscreen": "Tam Ekrandan Çık",
"Context Menu": "Bağlamsal Menü",
"Reset": "Sıfırla",
"Clear": "Temizle",
"Close": "Kapat",
"QUICK SAVE STATE": "DURUMU HIZLI KAYDET",
"QUICK LOAD STATE": "DURUMU HIZLI YÜKLE",
"CHANGE STATE SLOT": "DURUM SLOTUNU DEĞİŞTİR",
"FAST FORWARD": "İLERİ SAR",
"Player": "Oyuncu",
"Connected Gamepad": "Bağlı Olan Oyun Kolu",
"Gamepad": "Oyun Kolu",
"Keyboard": "Klavye",
"Set": "Ayarla",
"Add Cheat": "Hile Ekle",
"Note that some cheats require a restart to disable": "Not: Bazı hileleri devre dışı bırakmak, tekrardan başlatmayı gerektirebilir.",
"Create a Room": "Bir Oda Oluştur",
"Rooms": "Odalar",
"Start Game": "Oyunu Başlar",
"Click to resume Emulator": "Emülatörü devam ettirmek için tıklayınız",
"Drop save state here to load": "Durum kayıt dosyanızı buraya sürükleyerek yükleyiniz",
"Loading...": "Yükleniyor...",
"Download Game Core": "Oyun Çekirdeği İndiriliyor",
"Outdated graphics driver": "Güncel olmayan grafik sürücüsü tespit edildi",
"Decompress Game Core": "Sıkıştırılmış Oyun Çekirdeği Açılıyor",
"Download Game Data": "Oyun Verisi İndiriliyor",
"Decompress Game Data": "Sıkıştırılmış Oyun Verisi Açılıyor",
"Shaders": "Tonlayıcılar",
"Disabled": "Devre Dışı",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT easymode",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "göster",
"hide": "gizle",
"Fast Forward Ratio": "İleri Sarma Oranı",
"Fast Forward": "İleri Sar",
"Enabled": "Aktif",
"Save State Slot": "Durum Kayıt Slotu",
"Save State Location": "Durum Kayıt Lokasyonu",
"Download": "İndir",
"Keep in Browser": "Tarayıcıda Tut",
"Auto": "Otomatik",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Düşük",
"High": "Yüksek",
"Very High": "Çok Yüksek",
"None": "Hiçbiri",
"Player 1": "Oyuncu 1",
"Player 2": "Oyuncu 2",
"Both": "Her İkisi De",
"SAVED STATE TO SLOT": "DURUM SLOTA KAYDEDİLDİ",
"LOADED STATE FROM SLOT": "SLOTTAN DURUM YÜKLENDİ",
"SET SAVE STATE SLOT TO": "DURUM KAYIT SLOTU DEĞİŞTİRİLDİ",
"Network Error": "Ağ Hatası",
"Submit": "Gönder",
"Description": "Açıklama",
"Code": "Kod",
"Add Cheat Code": "Hile Kodu Ekle",
"Leave Room": "Odadan Çık",
"Password": "Parola",
"Password (optional)": "Parola (opsiyonel)",
"Max Players": "Maksimum Oyuncu Sayısı",
"Room Name": "Oda İsmi",
"Join": "Katıl",
"Player Name": "Oyuncu İsmi",
"Set Player Name": "Oyuncu İsmini Ayarla",
"Left Handed Mode": "Sol El Modu",
"Virtual Gamepad": "Sanal Oyun Kolu",
"Disk": "Disk",
"Press Keyboard": "Klavyeye Basın",
"INSERT COIN": "JETON ATINIZ",
"Remove": "Kaldır",
"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ı",
"Download Game BIOS": "Oyun BIOS'unu İndir",
"Decompress Game BIOS": "Sıkıştırılmış Oyun BIOS'unu Aç",
"Download Game Parent": "Oyun Ek Dosyalarını İndir",
"Decompress Game Parent": "Sıkıştırılmış Oyun Ek Dosyalarını Aç",
"Download Game Patch": "Oyun Yamasını İndir",
"Decompress Game Patch": "Sıkıştırılmış Oyun Yamasını Aç",
"Download Game State": "Oyun Durumunu İndir",
"Check console": "Konsolu kontrol et",
"Error for site owner": "Site sahibi için hata",
"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",
"Quick Save": "Hızlı Kaydet",
"Quick Load": "Hızlı Yükle",
"REWIND": "GERİ SAR",
"Rewind Enabled (requires restart)": "Geri Sarma Aktive Edildi (tekrardan başlatma gerektirir)",
"Rewind Granularity": "Geri Sarma Hassasiyeti",
"Slow Motion Ratio": "Ağır Çekim Oranı",
"Slow Motion": "Ağır Çekim",
"Home": "Anasayfa",
"EmulatorJS License": "EmulatorJS Lisansı",
"RetroArch License": "RetroArch Lisansı",
"This project is powered by": "Bu proje şununla geliştirildi:",
"View the RetroArch license here": "RetroArch lisansını buradan görüntüleyebilirsiniz",
"SLOW MOTION": "AĞIR ÇEKİM",
"A": "A",
"B": "B",
"SELECT": "SEÇ",
"START": "BAŞLAT",
"UP": "YUKARI",
"DOWN": "AŞAĞI",
"LEFT": "SOL",
"RIGHT": "SAĞ",
"X": "X",
"Y": "Y",
"L": "L",
"R": "R",
"Z": "Z",
"STICK UP": "ANALOG YUKARI",
"STICK DOWN": "ANALOG AŞAĞI",
"STICK LEFT": "ANALOG SOL",
"STICK RIGHT": "ANALOG SAĞ",
"C-PAD UP": "C-PAD YUKARI",
"C-PAD DOWN": "C-PAD AŞAĞI",
"C-PAD LEFT": "C-PAD SOL",
"C-PAD RIGHT": "C-PAD SAĞ",
"MICROPHONE": "MİKROFON",
"BUTTON 1 / START": "BUTON 1 / START",
"BUTTON 2": "BUTON 2",
"BUTTON": "BUTON",
"LEFT D-PAD UP": "SOL D-PAD YUKARI",
"LEFT D-PAD DOWN": "SOL D-PAD AŞAĞI",
"LEFT D-PAD LEFT": "SOL D-PAD SOL",
"LEFT D-PAD RIGHT": "SOL D-PAD SAĞ",
"RIGHT D-PAD UP": "SAĞ D-PAD YUKARI",
"RIGHT D-PAD DOWN": "SAĞ D-PAD AŞAĞI",
"RIGHT D-PAD LEFT": "SAĞ D-PAD SOL",
"RIGHT D-PAD RIGHT": "SAĞ D-PAD SAĞ",
"C": "C",
"MODE": "MOD",
"FIRE": "ATEŞ",
"RESET": "SIFIRLA",
"LEFT DIFFICULTY A": "SOL ZORLUK A",
"LEFT DIFFICULTY B": "SOL ZORLUK B",
"RIGHT DIFFICULTY A": "SAĞ ZORLUK A",
"RIGHT DIFFICULTY B": "SAĞ ZORLUK B",
"COLOR": "RENK",
"B/W": "Siyah/Beyaz",
"PAUSE": "DURDUR",
"OPTION": "AYAR",
"OPTION 1": "AYAR 1",
"OPTION 2": "AYAR 2",
"L2": "L2",
"R2": "R2",
"L3": "L3",
"R3": "R3",
"L STICK UP": "SOL-ANALOG YUKARI",
"L STICK DOWN": "SOL-ANALOG AŞAĞI",
"L STICK LEFT": "SOL-ANALOG SOL",
"L STICK RIGHT": "SOL-ANALOG SAĞ",
"R STICK UP": "SAĞ-ANALOG YUKARI",
"R STICK DOWN": "SAĞ-ANALOG AŞAĞI",
"R STICK LEFT": "SAĞ-ANALOG SOL",
"R STICK RIGHT": "SAĞ-ANALOG SAĞ",
"Start": "Başlat",
"Select": "Seç",
"Fast": "Hızlı",
"Slow": "Yavaş",
"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": "esc",
"space": "boşluk",
"tab": "tab",
"backspace": "backspace",
"delete": "delete",
"arrowup": "yukarı_ok",
"arrowdown": "aşağı_ok",
"arrowleft": "sol_ok",
"arrowright": "sağ_ok",
"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": "capslock",
"insert": "insert",
"home": "home",
"end": "end",
"pageup": "pageup",
"pagedown": "pagedown",
"!": "!",
"@": "@",
"#": "#",
"$": "$",
"%": "%",
"^": "^",
"&": "&",
"*": "*",
"(": "(",
")": ")",
"-": "-",
"_": "_",
"+": "+",
"=": "=",
"[": "[",
"]": "]",
"{": "{",
"}": "}",
";": ";",
":": ":",
"'": "'",
"\"": "\"",
",": ",",
".": ".",
"<": "<",
">": ">",
"/": "/",
"?": "?",
"LEFT_STICK_X": "SOL_ANALOG_X",
"LEFT_STICK_Y": "SOL_ANALOG_Y",
"RIGHT_STICK_X": "SAĞ_ANALOG_X",
"RIGHT_STICK_Y": "SAĞ_ANALOG_Y",
"LEFT_TRIGGER": "SOL_TETİK",
"RIGHT_TRIGGER": "SAĞ_TETİK",
"A_BUTTON": "A_BUTONU",
"B_BUTTON": "B_BUTONU",
"X_BUTTON": "X_BUTONU",
"Y_BUTTON": "Y_BUTONU",
"START_BUTTON": "BAŞLAT_BUTONU",
"SELECT_BUTTON": "SEÇ_BUTONU",
"L1_BUTTON": "L1_BUTONU",
"R1_BUTTON": "R1_BUTONU",
"L2_BUTTON": "L2_BUTONU",
"R2_BUTTON": "R2_BUTONU",
"LEFT_THUMB_BUTTON": "SOL_ANALOG_BUTONU",
"RIGHT_THUMB_BUTTON": "SAĞ_ANALOG_BUTONU",
"DPAD_UP": "DPAD_YUKARI",
"DPAD_DOWN": "DPAD_AŞAĞI",
"DPAD_LEFT": "DPAD_SOL",
"DPAD_RIGHT": "DPAD_SAĞ"
}

302
data/localization/vi.json Normal file
View File

@ -0,0 +1,302 @@
{
"0": "0",
"1": "1",
"2": "2",
"3": "3",
"4": "4",
"5": "5",
"6": "6",
"7": "7",
"8": "8",
"9": "9",
"Restart": "Chạy lại",
"Pause": "Tạm dừng",
"Play": "Chơi",
"Save State": "Lưu State",
"Load State": "Nạp State",
"Control Settings": "Cài đặt điều khiển",
"Cheats": "Gian lận xíu",
"Cache Manager": "Bộ nhớ đệm",
"Export Save File": "Xuất tệp lưu",
"Import Save File": "Nhập tệp lưu ",
"Netplay": "Chơi qua mạng",
"Mute": "Tắt âm",
"Unmute": "Mở âm",
"Settings": "Cài đặt",
"Enter Fullscreen": "Toàn màn hình",
"Exit Fullscreen": "Thoát toàn màn hình",
"Context Menu": "Menu chuột phải",
"Reset": "Đặt lại",
"Clear": "Xoá",
"Close": "Đóng",
"QUICK SAVE STATE": "LƯU NHANH",
"QUICK LOAD STATE": "NẠP NHANH",
"CHANGE STATE SLOT": "ĐỔI NHANH",
"FAST FORWARD": "TIẾN NHANH ",
"Player": "Người chơi",
"Connected Gamepad": "Bảng điều khiển đã kết nối",
"Gamepad": "Bảng điều khiển ",
"Keyboard": "Bàn phím",
"Set": "Đặt",
"Add Cheat": "Thêm mật mã",
"Create a Room": "Tạo phòng",
"Rooms": "Các phòng",
"Start Game": "Bắt đầu chơi",
"Loading...": "Đang nạp...",
"Download Game Core": "Tải xuống nhân trò chơi",
"Decompress Game Core": "Giải nén nhân trò chơi",
"Download Game Data": "Tải xuống dữ liệu trò chơi",
"Decompress Game Data": "Giải nén dữ liệu trò chơi ",
"Shaders": "Shaders",
"Disabled": "Vô hiệu",
"2xScaleHQ": "2xScaleHQ",
"4xScaleHQ": "4xScaleHQ",
"CRT easymode": "CRT chế độ dễ",
"CRT aperture": "CRT aperture",
"CRT geom": "CRT geom",
"CRT mattias": "CRT mattias",
"FPS": "FPS",
"show": "hiện",
"hide": "ẩn",
"Fast Forward Ratio": "Tỷ lệ tiến nhanh",
"Fast Forward": "Tiến nhanh",
"Enabled": "Cho phép",
"Save State Slot": "Lưu trạng thái thẻ",
"Save State Location": "Lưu trạng thái vị trí",
"Download": "Tải về",
"Keep in Browser": "Giữ ở trình duyệt",
"Auto": "Auto",
"NTSC": "NTSC",
"PAL": "PAL",
"Dendy": "Dendy",
"8:7 PAR": "8:7 PAR",
"4:3": "4:3",
"Low": "Thấp",
"High": "Cao",
"Very High": "Rất cao",
"None": "Không gì",
"Player 1": "Game thủ 1",
"Player 2": "Game thủ 2",
"Both": "Cả hai",
"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": "Mạng bị lỗi",
"Submit": "Gửi đi",
"Description": "Mô tả",
"Code": "Mã",
"Add Cheat Code": "Thêm mã gian lận",
"Leave Room": "Rời phòng",
"Password": "Mật khẩu",
"Password (optional)": "Mật khẩu (tùy chọn)",
"Max Players": "Người chơi tối đa",
"Room Name": "Tên phòng",
"Join": "Tham gia",
"Player Name": "Tên người chơi",
"Set Player Name": "Đặt tên người chơi",
"Left Handed Mode": "Chế độ tay trái",
"Virtual Gamepad": "Bàn phím ảo",
"Disk": "Đĩa",
"Press Keyboard": "Bàn phím",
"INSERT COIN": "THÊM XU",
"Remove": "Loại bỏ",
"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",
"Download Game BIOS": "Tải Game BIOS",
"Decompress Game BIOS": "Giải nén Game BIOS",
"Download Game Parent": "Tải Game cha",
"Decompress Game Parent": "Giải nén Game cha",
"Download Game Patch": "Tải vá Game ",
"Decompress Game Patch": "Giải nén Game vá",
"Download Game State": "Tải trạng thái Game",
"Check console": "Kiểm tra log console",
"Error for site owner": "Lỗi sở hữu trang chủ",
"EmulatorJS": "EmulatorJS",
"Clear All": "Xóa hết",
"Take Screenshot": "Chụp màn hình",
"Quick Save": "Lưu nhanh",
"Quick Load": "Nạp nhanh",
"REWIND": "REWIND",
"Rewind Enabled (requires restart)": "Cho phép quay lui (cần khởi động lại)",
"Rewind Granularity": "Rewind Granularity",
"Slow Motion Ratio": "Tỷ lệ chuyển động chậm",
"Slow Motion": "chuyển động chậm",
"Home": "Nhà",
"EmulatorJS License": "Giấy phép EmulatorJS",
"RetroArch License": "Giấy phép RetroArch ",
"SLOW MOTION": "CHUYỂN ĐỘNG CHẬM",
"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"
}

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,35 +0,0 @@
# 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.
<br>
## Requirements
- **[NodeJS]**
<br>
## Steps
1. Open a terminal in`/data/minify`.
2. Install the dependencies with:
```sh
npm install
```
3. Start the minification with:
```sh
node index.js
```
<!----------------------------------------------------------------------------->
[NodeJS]: https://nodejs.org/en/download/

View File

@ -1,27 +0,0 @@
const UglifyJS = require("uglify-js");
const fs = require('fs');
const uglifycss = require('uglifycss');
let files = [
'nipplejs.js',
'shaders.js',
'storage.js',
'gamepad.js',
'GameManager.js',
'socket.io.min.js',
'emulator.js'
]
let code = "(function() {\n";
for (let i=0; i<files.length; i++) {
code += fs.readFileSync('../'+files[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"
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

472
data/src/GameManager.js Normal file
View File

@ -0,0 +1,472 @@
class EJS_GameManager {
constructor(Module, EJS) {
this.EJS = EJS;
this.Module = Module;
this.FS = this.Module.FS;
this.functions = {
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.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.FS.unmount("/data/saves");
setTimeout(() => {
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';
}
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") {
for (const key in this.EJS.config.externalFiles) {
await new Promise(done => {
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();
}
let path = key;
if (key.trim().endsWith("/")) {
const invalidCharacters = /[#<$+%>!`&*'|{}/\\?"=@:^\r\n]/ig;
let name = this.EJS.config.externalFiles[key].split("/").pop().split("#")[0].split("?")[0].replace(invalidCharacters, "").trim();
if (!name) return done();
const files = await this.EJS.checkCompression(new Uint8Array(res.data), this.EJS.localization("Decompress Game Assets"));
if (files["!!notCompressedData"]) {
path += name;
} else {
for (const k in files) {
this.writeFile(path + k, files[k]);
}
return done();
}
}
try {
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();
});
})
}
}
resolve();
});
}
writeFile(path, data) {
const parts = path.split("/");
let current = "/";
for (let i = 0; i < parts.length - 1; i++) {
if (!parts[i].trim()) continue;
current += parts[i] + "/";
this.mkdir(current);
}
this.FS.writeFile(path, data);
}
mkdir(path) {
try {
this.FS.mkdir(path);
} catch(e) {}
}
getRetroArchCfg() {
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") {
this.FS.writeFile(`/shader/${shaderFileName}`, shader);
}
}
}
clearEJSResetTimer() {
if (this.EJS.resetTimeout) {
clearTimeout(this.EJS.resetTimeout);
delete this.EJS.resetTimeout;
}
}
restart() {
this.clearEJSResetTimer();
this.functions.restart();
}
getState() {
return this.Module.EmulatorJSGetState();
}
loadState(state) {
try {
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) {}
}, 5000)
}
screenshot() {
try {
this.FS.unlink("/screenshot.png");
} catch(e) {}
this.functions.screenshot();
return new Promise(async resolve => {
while (1) {
try {
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;
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";
this.clearEJSResetTimer();
this.functions.loadState(name, 0);
})();
}
simulateInput(player, index, value) {
if (this.EJS.isNetplay) {
this.EJS.netplay.simulateInput(player, index, value);
return;
}
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";
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";
this.quickLoad(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;
} 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());
}
if (index === 27) {
this.functions.toggleFastForward(this.EJS.isFastForward ? !value : value);
}
if (index === 29) {
this.functions.toggleSlowMotion(this.EJS.isSlowMotion ? !value : value);
}
if (index === 28) {
if (this.EJS.rewindEnabled) {
this.functions.toggleRewind(value);
}
}
return;
}
this.functions.simulateInput(player, index, value);
}
getFileNames() {
if (this.EJS.getCore() === "picodrive") {
return ["bin", "gen", "smd", "md", "32x", "cue", "iso", "sms", "68k", "chd"];
} else {
return ["toc", "ccd", "exe", "pbp", "chd", "img", "bin", "iso"];
}
}
createCueFile(fileNames) {
try {
if (fileNames.length > 1) {
fileNames = fileNames.filter((item) => {
return this.getFileNames().includes(item.split(".").pop().toLowerCase());
})
fileNames = fileNames.sort((a, b) => {
if (isNaN(a.charAt()) || isNaN(b.charAt())) throw new Error("Incorrect file name format");
return (parseInt(a.charAt()) > parseInt(b.charAt())) ? 1 : -1;
})
}
} catch(e) {
if (fileNames.length > 1) {
console.warn("Could not auto-create cue file(s).");
return null;
}
}
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;
}
}
if (fileNames.length === 0) {
console.warn("Could not auto-create cue file(s).");
return null;
}
let baseFileName = fileNames[0].split("/").pop();
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);
}
if (fileNames.length > 1) {
let contents = "";
for (let i = 0; i < fileNames.length; i++) {
contents += "/" + baseFileName + "-" + i + ".cue\n";
}
this.FS.writeFile("/" + baseFileName + ".m3u", contents);
}
return (fileNames.length === 1) ? baseFileName + "-0.cue" : baseFileName + ".m3u";
}
loadPpssppAssets() {
return new Promise(resolve => {
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.style.color = "red";
return;
}
this.mkdir("/PPSSPP");
for (const file in pspassets) {
const data = pspassets[file];
const path = "/PPSSPP/" + file;
const paths = path.split("/");
let cp = "";
for (let i = 0; i < paths.length - 1; i++) {
if (paths[i] === "") continue;
cp += "/" + paths[i];
if (!this.FS.analyzePath(cp).exists) {
this.FS.mkdir(cp);
}
}
if (!path.endsWith("/")) {
this.FS.writeFile(path, data);
}
}
resolve();
})
});
})
}
setVSync(enabled) {
this.functions.setVSync(enabled);
}
toggleMainLoop(playing) {
this.functions.toggleMainLoop(playing);
}
getCoreOptions() {
return this.functions.getCoreOptions();
}
setVariable(option, value) {
this.functions.setVariable(option, value);
}
setCheat(index, enabled, code) {
this.functions.setCheat(index, enabled, code);
}
resetCheat() {
this.functions.resetCheat();
}
toggleShader(active) {
this.functions.toggleShader(active);
}
getDiskCount() {
return this.functions.getDiskCount();
}
getCurrentDisk() {
return this.functions.getCurrentDisk();
}
setCurrentDisk(disk) {
this.functions.setCurrentDisk(disk);
}
getSaveFilePath() {
return this.functions.getSaveFilePath();
}
saveSaveFiles() {
this.functions.saveSaveFiles();
this.EJS.callEvent("saveSaveFiles", this.getSaveFile(false));
//this.FS.syncfs(false, () => {});
}
supportsStates() {
return !!this.functions.supportsStates();
}
getSaveFile(save) {
if (save !== false) {
this.saveSaveFiles();
}
const exists = this.FS.analyzePath(this.getSaveFilePath()).exists;
return (exists ? this.FS.readFile(this.getSaveFilePath()) : null);
}
loadSaveFiles() {
this.clearEJSResetTimer();
this.functions.loadSaveFiles();
}
setFastForwardRatio(ratio) {
this.functions.setFastForwardRatio(ratio);
}
toggleFastForward(active) {
this.functions.toggleFastForward(active);
}
setSlowMotionRatio(ratio) {
this.functions.setSlowMotionRatio(ratio);
}
toggleSlowMotion(active) {
this.functions.toggleSlowMotion(active);
}
setRewindGranularity(value) {
this.functions.setRewindGranularity(value);
}
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;

213
data/src/compression.js Normal file
View File

@ -0,0 +1,213 @@
/**
* 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;
}
/**
* 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;
}
/**
* 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 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(async (resolve, reject) => {
let path, obj;
if (method === "7z") {
path = "compression/extract7z.js";
obj = "sevenZip";
} else if (method === "zip") {
path = "compression/extractzip.js";
obj = "zip";
} else if (method === "rar") {
path = "compression/libunrar.js";
obj = "rar";
}
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;
}
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 + `";
}
};
` + 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);
const worker = new Worker(URL.createObjectURL(file));
const files = {};
worker.onmessage = (data) => {
if (!data.data) return;
//data.data.t/ 4=progress, 2 is file, 1 is zip done
if (data.data.t === 4) {
const pg = data.data;
const num = Math.floor(pg.current / pg.total * 100);
if (isNaN(num)) return;
const progress = " " + num.toString() + "%";
updateMsg(progress, true);
}
if (data.data.t === 2) {
if (typeof fileCbFunc === "function") {
fileCbFunc(data.data.file, data.data.data);
files[data.data.file] = true;
} else {
files[data.data.file] = data.data.data;
}
}
if (data.data.t === 1) {
callback(files);
}
}
worker.postMessage(data);
});
}
}
window.EJS_COMPRESSION = EJSCompression;

7273
data/src/emulator.js Normal file

File diff suppressed because one or more lines are too long

View File

@ -37,7 +37,16 @@ class GamepadHandler {
this.timeout = setTimeout(this.loop.bind(this), 10);
}
updateGamepadState() {
const gamepads = 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;
@ -50,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,
@ -67,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") {
@ -85,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;

1
data/src/nipplejs.js Normal file

File diff suppressed because one or more lines are too long

236
data/src/shaders.js Normal file

File diff suppressed because one or more lines are too long

7
data/src/socket.io.min.js vendored Normal file

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 @@
{ "current_version": 401.1 }
{
"read_me": "CURRENT_VERSION IS NO LONGER UPDATED. USE VERSION",
"current_version": 999999,
"version": "4.2.3"
}

View File

@ -1,134 +0,0 @@
<br>
<div align = center>
# Contributors
<br>
<br>
![Ethan Avatar]
### Owner
***Main Contributor***
<a href="https://github.com/ethanaobrien" target="_blank">**![Badge Ethan GitHub]**</a>
<br>
<br>
![Allan Avatar]
### Co-Owner
***Various Fixes & Additions***
<a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a>
<br>
<br>
![BinBashBanana Avatar]
### Back-End Developer
***RetroArch Core Development***
<a href="https://github.com/BinBashBanana" target="_blank">**![Badge BinBashBanana GitHub]**</a>
<a href="https://binbashbanana.github.io/" target="_blank">**![Badge BinBashBanana Website]**</a>
<br>
<br>
![Archiver Avatar]
***Documentation Design***
<a href="https://github.com/ElectronicsArchiver" target="_blank">**![Badge Archiver GitHub]**</a>
<a href="https://github.com/MarkedDown" target="_blank">**![Badge Archiver Marked]**</a>
<br>
<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/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/rwv" target="_blank" title="rwv - seedgou">![Avatar seedgou]</a>&nbsp;
<a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea">![Avatar incredibleIdea]</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/cheesykyle" target="_blank" title="CheesyKyle - Kyle Steffel">![Avatar Kyle]</a>&nbsp;
<a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita">![Avatar andrigamerita]</a>&nbsp;
<a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Protektor">![Avatar Protektor]</a>&nbsp;
<a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Priyansh Prajapat">![Avatar Priyansh]</a>&nbsp;
<a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01">![Avatar debuggerx01]</a>&nbsp;
<a href="https://github.com/eric183" target="_blank" title="eric183 - ericKuang">![Avatar ericKuang]</a>&nbsp;
<a href="https://github.com/michael-j-green" target="_blank" title="michael-j-green - Michael Green">![Avatar Michael]</a>&nbsp;
<a href="https://github.com/gantoine" target="_blank" title="gantoine - Georges-Antoine Assi">![Avatar gantoine]</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 seedgou]: https://github.com/rwv.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 Michael]: https://github.com/michael-j-green.png?size=95
[Avatar gantoine]: https://github.com/gantoine.png?size=95
<!----------------------------------{ Ethan }----------------------------------->
[Badge Ethan GitHub]: https://img.shields.io/badge/Ethan_O'_Brien-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Ethan Avatar]: https://avatars.githubusercontent.com/u/77750390?s=90 'Ethan O\'Brien'
<!---------------------------{ ElectronicsArchiver }--------------------------->
[Badge Archiver GitHub]: https://img.shields.io/badge/ElectronicsArchiver-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Archiver Marked]: https://img.shields.io/badge/-49a2d5.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Archiver Avatar]: https://avatars.githubusercontent.com/u/85485984?s=90 'ElectronicsArchiver - トトも'
<!----------------------------------{ Allan }---------------------------------->
[Badge Allan GitHub]: https://img.shields.io/badge/allancoding-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Allan Avatar]: https://avatars.githubusercontent.com/u/74841470?s=90 'Allancoding - Allan Niles'
<!----------------------------------{ BinBashBanana }---------------------------------->
[Badge BinBashBanana GitHub]: https://img.shields.io/badge/BinBashBanana-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge BinBashBanana Website]: https://img.shields.io/badge/binbashbanana.github.io-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA3lBMVEVHcEwiIgAYGAqfngcdHhIVFRHHyZkAAAAbGxMfGQVub1TR0Ak+Py05PBnb2QohIBeblnJ2d1tiYkthYQCOkG60swiamQciHBQoKBySk3BLSwIpLhEtMBlPSBJgXgOpqAe4LiBLDAqoqoJ3d1tlYgXBw5SzsgiDgwWio3wsLB+kowiSkQdrblVMTDheWUOkpn6dmwZ/fQWYmwc6CQkeJQKfoHmNjAZBTgMjJwRESQI6RQRmVEBiDw1sRSB0GhaQOzCBexOEhF13YyfU1qPkaCnOPiHEwgm1tAiRkAiurQs+wUq/AAAAQ3RSTlMABCP9GhL8ASoKcvtKIf5D/o5YLqTK6FY5ukIyedNR/P19zlpt+cOMzVLg4FFXcsKmu/JYbtTt48ySw9Ka/vv+9DT+PQB0UwAAAKhJREFUGBlNwQUSgkAABdAP7LK7tIXd3d0tYNz/Qs4wKr6HEDEY5YhQOVPIcBk/xtDmPJ9m+JBs06a8y/HBhDGvHqppwhAS2tI5+X5lP07GBQAzq6rOOQgqjuepMQYkm9nB9XI7FkdaR60JIKZRiPLrOWUg9ThDSOpZj76MCGtbd6WBPyRlKW4OfxIpXXFLEiKJll5ebfOE4Muc6LN1cbfBj1TKCboovAFtNA6G3DFC7wAAAABJRU5ErkJggg==
[BinBashBanana Avatar]: https://avatars.githubusercontent.com/u/51469593?s=90 'BinBashBanana'

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"
}
]
}

125
docs/contributors.md Normal file
View File

@ -0,0 +1,125 @@
<br>
<div align = center>
# Contributors
<br>
<br>
![Ethan Avatar]
### Owner
***Main Contributor***
<a href="https://github.com/ethanaobrien" target="_blank">**![Badge Ethan GitHub]**</a>
<a href="https://ethanthesleepy.one" target="_blank">**![Badge Ethan Website]**</a>
<br>
<br>
![Allan Avatar]
### Co-Owner
***Maintainer, Along with Various Fixes and Additions***
<a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a>
<a href="https://allancoding.dev/" target="_blank">**![Badge Allan Website]**</a>
<br>
<br>
![BinBashBanana Avatar]
### Back-End Developer
***RetroArch Core Development***
<a href="https://github.com/BinBashBanana" target="_blank">**![Badge BinBashBanana GitHub]**</a>
<a href="https://binbashbanana.github.io/" target="_blank">**![Badge BinBashBanana Website]**</a>
<br>
<br>
![Michael Avatar]
***External Project Maintainer***
<a href="https://github.com/michael-j-green" target="_blank">**![Badge Michael GitHub]**</a>
<a href="https://www.mrgtech.net/" target="_blank">**![Badge Michael Website]**</a>
<br>
<br>
![Archiver Avatar]
***Documentation Design***
<a href="https://github.com/ElectronicsArchiver" target="_blank">**![Badge Archiver GitHub]**</a>
<a href="https://github.com/MarkedDown" target="_blank">**![Badge Archiver Marked]**</a>
<br>
<br>
<br>
<!-- 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
[Badge Ethan Website]: https://img.shields.io/badge/ethanthesleepy.one-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAKTSURBVEhLtdVbaM5hHMDxlzmvHNoyzbHEZlphyanckRslh0SK2sUutms3btyhKBdiEgoX5GK5IOdQIo0UEW2hOZ/mkOOcvt/1PH9v75937zK/+vTufd49p9//9zz/zP+OovBZSAzACAzFD3xFl9ErfP4tirEQyzAVfWF8Qwv24TA+o1vhaqfjPL4HP+GqHdy/3YXtrXARg1BQjMRGvMcHnMQLOGATjsCBn+IYXsL/24bRyBsDsQVu+TVWwvS8ggPNx1g8xhssxgxcgrs7irw7mQcH78AiWARbw/dm9IOxAabJT9M5GabKne1Cb6RiCK7Df9qOSajBRTiYO5sQLICTXsM0VGATPuEd3GkqGuDgskJu4A4+wgnuhzbdghPodmizj2my/w70RxKWa1xpT7iAUUhyZeWMgZVTj5nBWhhWUmzTLGyGcRCxfTZMkwfSlCcxBU9g6VXZQLir1XBF5j/3UK6Cvx3o/PY7fI7P4DlKdpDd2XqPEX93oNww10budWO7/TrHjAO0wx/6oAyWnuJ9U4rYJmu9BIZVE9s9Rx42D94XJCv3jvEhm6orMFWGuZwDD9ZlxJ3Yz3KthpV2E4YL9Nrw4K1AG5JYD9PjIP9qN+KhTMIqsgLcWi1cvSt0R3ayuoYHlbDi7mFiaKvDW5ger5g/xjo4wXN4x7jlPfD5HEe8rp3MSXfCvDvJ1dB2GqnVx7B298MT6urWYDm82Jx0LtzZXbjaJTDnZ+Dgp+BlmDdM1Qm4agdx5Q/D90bsDX/7AD2xTuyzOwt3UlAMhgfIEnSw+PBNX/YLR95V5zAeqcg9ndnhGfFWXIpxKIdXin1c9SM8gCs/BAskFfkmiOEB8kU/LLCPO/OF5Iuo2+/jHoxM5hef3tZ5zF6TlgAAAABJRU5ErkJggg==
[Ethan Avatar]: https://avatars.githubusercontent.com/u/77750390?s=90 'Ethan O\'Brien'
<!---------------------------{ ElectronicsArchiver }--------------------------->
[Badge Archiver GitHub]: https://img.shields.io/badge/ElectronicsArchiver-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Archiver Marked]: https://img.shields.io/badge/-49a2d5.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Archiver Avatar]: https://avatars.githubusercontent.com/u/85485984?s=90 'ElectronicsArchiver - トトも'
<!----------------------------------{ 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.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 }---------------------------------->
[Badge BinBashBanana GitHub]: https://img.shields.io/badge/BinBashBanana-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge BinBashBanana Website]: https://img.shields.io/badge/binbashbanana.github.io-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA3lBMVEVHcEwiIgAYGAqfngcdHhIVFRHHyZkAAAAbGxMfGQVub1TR0Ak+Py05PBnb2QohIBeblnJ2d1tiYkthYQCOkG60swiamQciHBQoKBySk3BLSwIpLhEtMBlPSBJgXgOpqAe4LiBLDAqoqoJ3d1tlYgXBw5SzsgiDgwWio3wsLB+kowiSkQdrblVMTDheWUOkpn6dmwZ/fQWYmwc6CQkeJQKfoHmNjAZBTgMjJwRESQI6RQRmVEBiDw1sRSB0GhaQOzCBexOEhF13YyfU1qPkaCnOPiHEwgm1tAiRkAiurQs+wUq/AAAAQ3RSTlMABCP9GhL8ASoKcvtKIf5D/o5YLqTK6FY5ukIyedNR/P19zlpt+cOMzVLg4FFXcsKmu/JYbtTt48ySw9Ka/vv+9DT+PQB0UwAAAKhJREFUGBlNwQUSgkAABdAP7LK7tIXd3d0tYNz/Qs4wKr6HEDEY5YhQOVPIcBk/xtDmPJ9m+JBs06a8y/HBhDGvHqppwhAS2tI5+X5lP07GBQAzq6rOOQgqjuepMQYkm9nB9XI7FkdaR60JIKZRiPLrOWUg9ThDSOpZj76MCGtbd6WBPyRlKW4OfxIpXXFLEiKJll5ebfOE4Muc6LN1cbfBj1TKCboovAFtNA6G3DFC7wAAAABJRU5ErkJggg==
[BinBashBanana Avatar]: https://avatars.githubusercontent.com/u/51469593?s=90 'BinBashBanana'
<!----------------------------------{ Michael }---------------------------------->
[Badge Michael GitHub]: https://img.shields.io/badge/michaeljgreen-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Michael Website]: https://img.shields.io/badge/www.mrgtech.net-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAe1BMVEVHcEwUFhkUFhkUFhkUFhkUFhkUFhkqKioTFRkTFhkVFxocHBwVFxkRESIYGBgVFxr///8YGh35+fkhIyY6PD7y8vL8/Pzc3d1maGpKTE5dXmC/v8DNzs6HiInU1dWrrK3j5OSam5wnKSwsLjBxcnR9foCAgYLq6urp6upDOJtqAAAAD3RSTlMA+e3V54a0Bm9NpRHaDxUPtKeMAAABIElEQVQYGVXBB3KkQBAAwQYGtyupehye9Ub/f+FBcFKgTFkd67zI0gSSNCvy+iibsjL8YapSFuWBjQ/BszmUIlKxuj8np+qm151VJXI0gO2+1bXn88npu7OAOUoN2NnFOViw/ajNbIFacqBrLoGNvarrgFwKuL914D9rR33foZAMXnqy/Lq1+oRMUpj0ys7QTJBKgnf6YG9ynkQgaNOz99QAAkHjjb1OA0iCd/HG3uw8iaQwusCOb0cw8gEPndm56gMyKcC3MfDDX5vWQyE52D62gc1w0tgDudQsuhhfwdrbMKrGjkUtX4ZFf2rcpY2NNqeehfkUqVj54Xxx7nIePKtKRMoDG7tgcyhlUVaGP0xVyuazzovMJJCkH0Vef8niH/cwItH/Rh67AAAAAElFTkSuQmCC
[Michael Avatar]: https://avatars.githubusercontent.com/u/84688932?s=90 'michael-j-green - Michael Green'

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,28 +101,50 @@
<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>
var enableDebug = false;
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;
if (enableDebug == true) {
console.log("Debug is enabled");
} else {
console.log("Debug is disabled");
}
input.onchange = async () => {
const url = new Blob([input.files[0]])
const parts = input.files[0].name.split(".")
if (parseInt(urlParams.get("threads")) === 1 || urlParams.get("threads") === "true") {
if (window.SharedArrayBuffer) {
enableThreads = true;
console.log("Threads are enabled");
} else {
console.warn("Threads are disabled as SharedArrayBuffer is not available. Threads requires two headers to be set when sending you html page. See https://stackoverflow.com/a/68630724");
console.log("Threads are disabled");
}
} else {
console.log("Threads are disabled");
}
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))
@ -146,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
@ -170,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",
@ -179,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];
@ -232,10 +271,19 @@
window.EJS_startOnLoaded = true;
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>

31
minify/README.md Normal file
View File

@ -0,0 +1,31 @@
# 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.
<br>
## Requirements
- **[NodeJS]**
<br>
## Steps
1. Open a terminal inthe root of the project.
2. Install the dependencies with:
```sh
npm i
```
3. Start the minification with:
```sh
node run minify
```
<!----------------------------------------------------------------------------->
[NodeJS]: https://nodejs.org/en/download/

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,12 +1,39 @@
{
"name": "EmulatorJS",
"version": "4.0.10",
"repository": "https://github.com/EmulatorJS/EmulatorJS.git",
"license": "GPL-3.0",
"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.");