Compare commits

..

No commits in common. "main" and "v4.1.1" have entirely different histories.
main ... v4.1.1

67 changed files with 9599 additions and 13373 deletions

1
.gitattributes vendored
View File

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

View File

@ -11,32 +11,8 @@ jobs:
runs-on: emulatorjs-server
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set Permissions
uses: actions/checkout@v3
- name: Run Script
run: |
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"
./.latest.sh

View File

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

View File

@ -9,59 +9,12 @@ jobs:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- uses: actions/setup-node@v3
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
- run: npm ci
- run: npm publish --access public
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}

View File

@ -11,59 +11,8 @@ jobs:
runs-on: emulatorjs-server
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set Variables
run: |
cd /mnt/HDD/public/
wget -q "https://api.github.com/repos/EmulatorJS/EmulatorJS/releases/latest" -O .tmp.json
version=$(jq -r '.tag_name' .tmp.json)
download_url=$(jq -r '.assets[0].browser_download_url' .tmp.json)
name=$(jq -r '.assets[0].name' .tmp.json)
old_version=$(jq -r '.github' versions.json)
v_version="$version"
if [[ $version == v* ]]; then
version="${version:1}"
fi
rm .tmp.json
echo "VERSION=$version" >> $GITHUB_ENV
echo "DOWNLOAD_URL=$download_url" >> $GITHUB_ENV
echo "NAME=$name" >> $GITHUB_ENV
echo "OLD_VERSION=$old_version" >> $GITHUB_ENV
echo "V_VERSION=$v_version" >> $GITHUB_ENV
- name: Download Stable
run: |
cd /mnt/HDD/public/
mkdir -p ".stable"
wget -q "$DOWNLOAD_URL" -O ".stable/$NAME"
- name: Extract Stable
run: |
cd /mnt/HDD/public/.stable/
7z x "$NAME"
- name: Move Versions
run: |
cd /mnt/HDD/public/
mv ".stable/$NAME" releases/
mv "$OLD_VERSION" "$VERSION"
mv stable "$OLD_VERSION"
mv .stable stable
jq --arg version "$VERSION" '.github = $version' versions.json | sponge versions.json
- name: Set Permissions
uses: actions/checkout@v3
- name: Run Script
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/"
./.stable.sh

15
.gitignore vendored
View File

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

View File

@ -1,16 +0,0 @@
.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,99 +1,6 @@
# Changes
# 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)
# 4.1.1
- 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))
@ -114,7 +21,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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))
@ -127,14 +33,12 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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.
@ -149,7 +53,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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))
@ -161,7 +64,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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))
@ -175,7 +77,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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.
@ -193,7 +94,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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))
@ -201,7 +101,6 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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
@ -216,25 +115,20 @@ In my opinion, this is the most stable release we've had in a while. Many featur
- 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.
@ -245,12 +139,10 @@ 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
@ -258,7 +150,6 @@ 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.
@ -276,79 +167,63 @@ 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.
@ -356,19 +231,16 @@ 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!
@ -376,30 +248,25 @@ 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
@ -411,7 +278,6 @@ 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.
@ -419,7 +285,6 @@ 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.
@ -428,7 +293,6 @@ 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.
@ -443,7 +307,6 @@ 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.
@ -459,7 +322,6 @@ 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.
@ -475,7 +337,6 @@ 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.
@ -484,33 +345,27 @@ 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.
@ -518,11 +373,9 @@ 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,54 +2,10 @@
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!
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"
}
```
[libretro](https://retroarch.com/index.php?page=donate)
[EmulatorJS](https://www.patreon.com/EmulatorJS)

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) 2022-2024 Ethan O'Brien
Copyright (C) 2023 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-2025 Ethan O'Brien
EmulatorJS Copyright (C) 2023 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.

123
README.md
View File

@ -1,3 +1,4 @@
<div align = center>
<img width = 300 src = docs/Logo-light.png#gh-dark-mode-only>
@ -7,30 +8,39 @@
<br>
[![Badge License]][License]
Self-hosted **Javascript** emulation for various systems.
Self-hosted **Javascript** emulation for various system.
<br>
[![Button Website]][Website]
[![Button Website]][Website]
[![Button Usage]][Usage]<br>
[![Button Configurator]][Configurator]<br>
[![Button Demo]][Demo]<br>
[![Button Contributors]][Contributors]
[![Button Demo]][Demo]
[![Button Legacy]][Legacy]
[![Button Contributors]][Contributors]
Join our Discord server:
[![Join our Discord server!](https://invidget.switchblade.xyz/6akryGkETU)](https://discord.gg/6akryGkETU)
Or the Matrix server (#emulatorjs:matrix.emulatorjs.org):
<a href="https://matrix.to/#/#emulatorjs:matrix.emulatorjs.org" rel="noopener" target="_blank"><img src="https://matrix.to/img/matrix-badge.svg" alt="Chat on Matrix"></a>
</div>
<br>
> [!NOTE]
> **As of EmulatorJS version 4.0, this project is no longer a reverse-engineered version of the emulatorjs.com project. It is now a complete rewrite.**
> **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.**
> [!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 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).
> 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.
> [!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.
@ -48,6 +58,7 @@ Join our Discord server:
<br>
### Issues
*If something doesn't work, please consider opening an* ***[Issue]*** <br>
@ -55,74 +66,34 @@ 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 three different version names that you need to be aware of:
There are 3 different version name 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 considered alpha.
<br>
3. **nightly** - This will contain the latest code and the latest cores. The cores will be updated every day, so this is consiterd alpha.
### 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/`.
**EmulatorJS provides a CDN** at `https://cdn.emulatorjs.org/`, allowing access to any version of the emulator.
### Extensions
To use it, set `EJS_pathtodata` to `https://cdn.emulatorjs.org/<version>/data/`, replacing `<version>` with `stable`, `latest`, `nightly`, or another main release.
**[GameLibrary]**
Be sure to also update the `loader.js` path to:
`https://cdn.emulatorjs.org/<version>/data/loader.js`
*A library overview for your **ROM** folder.*
<br>
### Development:
*Run a local server with:*
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.
```
npm i
npm start
```
<br>
<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**
**>>When reporting bugs, please specify that you are using the old version**
<br>
<br>
@ -157,7 +128,7 @@ If you want to help with localization, please check out the [localization](data/
**[Saturn][Sega Saturn]**|
**[32X][Sega 32X]**|
**[CD][Sega CD]**
<br>
<br>
@ -186,40 +157,36 @@ If you want to help with localization, please check out the [localization](data/
<br>
### Other
**[PlayStation]**|
**[PlayStation Portable]**|
**[Arcade]**
**[Arcade]**|
**[3DO]**
**[3DO]** |
**[MAME 2003]** |
**[ColecoVision]**
</div>
<br>
## Star History
<a href="https://star-history.com/#EmulatorJS/EmulatorJS&Date">
<picture>
<source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date&theme=dark" />
<source media="(prefers-color-scheme: light)" srcset="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date" />
<img alt="Star History Chart" src="https://api.star-history.com/svg?repos=EmulatorJS/EmulatorJS&type=Date" />
</picture>
</a>
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[License]: LICENSE
[Issue]: https://github.com/ethanaobrien/emulatorjs/issues
[patreon]: https://patreon.com/EmulatorJS
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Extensions 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[GameLibrary]: https://github.com/Ramaerel/emulatorjs-GameLibrary
<!-- 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 Quicklinks 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 🎮 --->
[Configurator]: https://emulatorjs.org/editor
[Contributors]: docs/contributors.md
[Contributors]: docs/Contributors.md
[Website]: https://emulatorjs.org/
[Legacy]: https://coldcast.org/games/1/Super-Mario-Bros
[Usage]: https://emulatorjs.org/docs/
[Demo]: https://demo.emulatorjs.org/
@ -254,7 +221,6 @@ If you want to help with localization, please check out the [localization](data/
[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
@ -273,9 +239,10 @@ If you want to help with localization, please check out the [localization](data/
[Badge License]: https://img.shields.io/badge/License-GPLv3-blue.svg?style=for-the-badge
[Button Configurator]: https://img.shields.io/badge/Code%20Generator-992cb3?style=for-the-badge
[Button Configurator]: https://img.shields.io/badge/Configurator-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
View File

@ -1,183 +0,0 @@
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,11 +0,0 @@
# 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

View File

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

View File

@ -1,21 +0,0 @@
# 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>
```

View File

@ -1,24 +0,0 @@
# 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
```

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -10,15 +10,16 @@
"compression.js"
];
const folderPath = (path) => path.substring(0, path.length - path.split("/").pop().length);
const folderPath = (path) => path.substring(0, path.length - path.split('/').pop().length);
let scriptPath = (typeof window.EJS_pathtodata === "string") ? window.EJS_pathtodata : folderPath((new URL(document.currentScript.src)).pathname);
if (!scriptPath.endsWith("/")) scriptPath += "/";
if (!scriptPath.endsWith('/')) scriptPath+='/';
//console.log(scriptPath);
function loadScript(file) {
return new Promise(function(resolve) {
let script = document.createElement("script");
return new Promise(function (resolve, reject) {
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;
@ -33,16 +34,15 @@
document.head.appendChild(script);
})
}
function loadStyle(file) {
return new Promise(function(resolve) {
let css = document.createElement("link");
css.rel = "stylesheet";
return new Promise(function(resolve, reject) {
let css = document.createElement('link');
css.rel = 'stylesheet';
css.href = function() {
if ("undefined" != typeof EJS_paths && typeof EJS_paths[file] === "string") {
if ('undefined' != typeof EJS_paths && typeof EJS_paths[file] === 'string') {
return EJS_paths[file];
} else {
return scriptPath + file;
return scriptPath+file;
}
}();
css.onload = resolve;
@ -56,27 +56,27 @@
async function filesmissing(file) {
console.error("Failed to load " + file);
let minifiedFailed = file.includes(".min.") && !file.includes("socket");
console[minifiedFailed ? "warn" : "error"]("Failed to load " + file + " beacuse it's likly that the minified files are missing.\nTo fix this you have 3 options:\n1. You can download the zip from the latest release here: https://github.com/EmulatorJS/EmulatorJS/releases/latest - Stable\n2. You can download the zip from here: https://cdn.emulatorjs.org/latest/data/emulator.min.zip and extract it to the data/ folder. (easiest option) - Beta\n3. You can build the files by running `npm i && npm run build` in the data/minify folder. (hardest option) - Beta\nNote: you will probably need to do the same for the cores, extract them to the data/cores/ folder.");
console[minifiedFailed?"warn":"error"]("Failed to load " + file + " beacuse it's likly that the minified files are missing.\nTo fix this you have 3 options:\n1. You can download the zip from the latest release here: https://github.com/EmulatorJS/EmulatorJS/releases/latest - Stable\n2. You can download the zip from here: https://cdn.emulatorjs.org/latest/data/emulator.min.zip and extract it to the data/ folder. (easiest option) - Beta\n3. You can build the files by running `npm i && npm run build` in the data/minify folder. (hardest option) - Beta\nNote: you will probably need to do the same for the cores, extract them to the data/cores/ folder.");
if (minifiedFailed) {
console.log("Attempting to load non-minified files");
if (file === "emulator.min.js") {
for (let i = 0; i < scripts.length; i++) {
for (let i=0; i<scripts.length; i++) {
await loadScript(scripts[i]);
}
} else {
await loadStyle("emulator.css");
await loadStyle('emulator.css');
}
}
}
if (("undefined" != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX)) {
for (let i = 0; i < scripts.length; i++) {
if (('undefined' != typeof EJS_DEBUG_XX && true === EJS_DEBUG_XX)) {
for (let i=0; i<scripts.length; i++) {
await loadScript(scripts[i]);
}
await loadStyle("emulator.css");
await loadStyle('emulator.css');
} else {
await loadScript("emulator.min.js");
await loadStyle("emulator.min.css");
await loadScript('emulator.min.js');
await loadStyle('emulator.min.css');
}
const config = {};
config.gameUrl = window.EJS_gameUrl;
@ -104,7 +104,6 @@
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;
@ -114,77 +113,29 @@
config.disableCue = window.EJS_disableCue;
config.startBtnName = window.EJS_startButtonName;
config.softLoad = window.EJS_softLoad;
config.capture = window.EJS_screenCapture;
config.screenRecording = window.EJS_screenRecording;
config.externalFiles = window.EJS_externalFiles;
config.dontExtractRom = window.EJS_dontExtractRom;
config.dontExtractBIOS = window.EJS_dontExtractBIOS;
config.disableDatabases = window.EJS_disableDatabases;
config.disableLocalStorage = window.EJS_disableLocalStorage;
config.forceLegacyCores = window.EJS_forceLegacyCores;
config.noAutoFocus = window.EJS_noAutoFocus;
config.videoRotation = window.EJS_videoRotation;
config.hideSettings = window.EJS_hideSettings;
config.browserMode = window.EJS_browserMode;
config.shaders = Object.assign({}, window.EJS_SHADERS, window.EJS_shaders ? window.EJS_shaders : {});
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";
if (typeof window.EJS_language === "string" && window.EJS_language !== "en-US") {
try {
let languagePath;
let fallbackPath = false;
console.log("Loading language", language);
if ("undefined" != typeof EJS_paths && typeof EJS_paths[language] === "string") {
languagePath = EJS_paths[language];
let path;
if ('undefined' != typeof EJS_paths && typeof EJS_paths[window.EJS_language] === 'string') {
path = EJS_paths[window.EJS_language];
} else {
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;
path = scriptPath+"localization/"+window.EJS_language+".json";
}
config.language = window.EJS_language;
config.langJson = JSON.parse(await (await fetch(path)).text());
} catch(e) {
console.log("Missing language:", language, "!!");
delete config.language;
delete config.langJson;
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") {
@ -205,8 +156,4 @@
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

@ -1,66 +0,0 @@
# 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

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

View File

@ -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": "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": "يزيل",
"LOADED STATE FROM BROWSER": "حالة تحميل من المتصفح",
"SAVED STATE TO BROWSER": "الحالة المحفوظة في المتصفح",
"SAVE LOADED FROM BROWSER": "وفر محملًا من المتصفح",
"SAVE SAVED 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": "অপসারণ",
"LOADED STATE FROM BROWSER": "ব্রাউজার থেকে লোড করা অবস্থা",
"SAVED STATE TO BROWSER": "রাষ্ট্র ব্রাউজারে সংরক্ষিত হয়",
"SAVE LOADED FROM BROWSER": "ব্রাউজার থেকে লোড সংরক্ষণ করুন",
"SAVE SAVED TO BROWSER": "ব্রাউজারে সংরক্ষণ করুন",
"Join the discord": "বিরোধে যোগ দিন",
"View on GitHub": "GitHub এ দেখুন",
"Failed to start game": "খেলা শুরু করতে ব্যর্থ",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_DOWN",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "DPAD_RIGHT"
}
}

View File

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

View File

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

View File

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

View File

@ -1,310 +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": "خارج شدن از حالت تمام صفحه",
"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": "دی پد راست"
}

View File

@ -1,339 +0,0 @@
{
"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": "निकालना",
"LOADED STATE FROM BROWSER": "ब्राउज़र से लोड किया गया राज्य",
"SAVED STATE TO BROWSER": "राज्य को ब्राउज़र में सहेजा गया",
"SAVE LOADED FROM BROWSER": "ब्राउज़र से लोड किया गया सेव करें",
"SAVE SAVED TO BROWSER": "ब्राउज़र में सहेजा गया सहेजें",
"Join the discord": "कलह में शामिल हों",
"View on GitHub": "GitHub पर देखें",
"Failed to start game": "गेम प्रारंभ करने में विफल",
@ -298,4 +298,4 @@
"DPAD_DOWN": "डीपीएडी_डाउन",
"DPAD_LEFT": "DPAD_LEFT",
"DPAD_RIGHT": "डीपीएडी_दाएँ"
}
}

View File

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

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 マティアス",
"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"
}

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 (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",
"LOADED STATE FROM BROWSER": "NEGARA YANG DIMUAT DARI BROWSER",
"SAVED STATE TO BROWSER": "NEGARA TERSIMPAN KE BROWSER",
"SAVE LOADED FROM BROWSER": "Simpen dimuat saka BROWSER",
"SAVE SAVED TO BROWSER": "SAVE disimpen menyang 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

@ -0,0 +1,301 @@
{
"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"
}

View File

@ -1,372 +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": "전체화면 종료",
"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",
"LOADED STATE FROM BROWSER": "ESTADO CARREGADO DO NAVEGADOR",
"SAVED STATE TO BROWSER": "ESTADO SALVO NO NAVEGADOR",
"SAVE LOADED FROM BROWSER": "SAVE STATE CARREGADO DO BROWSER",
"SAVE SAVED TO BROWSER": "SAVE STATE ARMAZENADO NO BROWSER",
"Join the discord": "Participar do discord",
"View on GitHub": "Ver no GitHub",
"Failed to start game": "Falha ao iniciar o jogo",

View File

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

File diff suppressed because it is too large Load Diff

View File

@ -1,310 +0,0 @@
{
"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": "Удалить",
"LOADED STATE FROM BROWSER": "ЗАГРУЖЕННОЕ СОСТОЯНИЕ ИЗ БРАУЗЕРА",
"SAVED STATE TO BROWSER": "СОХРАНЕННОЕ СОСТОЯНИЕ В БРАУЗЕРЕ",
"SAVE LOADED FROM BROWSER": "ЗАГРУЖЕНО ИЗ БРАУЗЕРА",
"SAVE SAVED TO BROWSER": "СОХРАНЕНО В БРАУЗЕРЕ",
"Join the discord": "Присоединяйтесь к discord",
"View on GitHub": "Посмотреть на GitHub",
"Failed to start game": "Не удалось запустить игру",
@ -298,4 +298,4 @@
"DPAD_DOWN": "DPAD_ВНИЗ",
"DPAD_LEFT": "DPAD_ВЛЕВО",
"DPAD_RIGHT": "DPAD_СПРАВО"
}
}

View File

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

View File

@ -100,8 +100,8 @@
"Press Keyboard": "Bàn phím",
"INSERT COIN": "THÊM XU",
"Remove": "Loại bỏ",
"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",
"SAVE LOADED FROM BROWSER": "SAVE LOADED FROM BROWSER",
"SAVE SAVED TO BROWSER": "SAVE SAVED TO BROWSER",
"Join the discord": "Tham gia thảo luận",
"View on GitHub": "Xem trên GitHub",
"Failed to start game": "Thất bại khởi động game",

View File

@ -99,8 +99,8 @@
"Press Keyboard": "按键盘",
"INSERT COIN": "投币",
"Remove": "消除",
"LOADED STATE FROM BROWSER": "浏览器加载状态",
"SAVED STATE TO BROWSER": "已将状态保存至浏览器",
"SAVE LOADED FROM BROWSER": "已从浏览器加载状态",
"SAVE SAVED TO BROWSER": "已将状态保存到浏览器",
"Join the discord": "加入discord",
"View on GitHub": "在GitHub上查看",
"Failed to start game": "无法开始游戏",
@ -297,55 +297,5 @@
"DPAD_UP": "十字键向上",
"DPAD_DOWN": "十字键向下",
"DPAD_LEFT": "十字键向左",
"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"
}
"DPAD_RIGHT": "十字键向右"
}

View File

@ -1,6 +1,9 @@
# 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.
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>
@ -12,19 +15,20 @@ Before pushing the script files onto your production server it is recommended to
## Steps
1. Open a terminal inthe root of the project.
1. Open a terminal in`/data/minify`.
2. Install the dependencies with:
```sh
npm i
```
```sh
npm install
```
3. Start the minification with:
```sh
node run minify
```
```sh
node index.js
```
<!----------------------------------------------------------------------------->

28
data/minify/index.js Normal file
View File

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

22
data/minify/package.json Normal file
View File

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

View File

@ -4,91 +4,69 @@ class EJS_GameManager {
this.Module = Module;
this.FS = this.Module.FS;
this.functions = {
restart: this.Module.cwrap("system_restart", "", []),
//saveStateInfo: this.Module.cwrap("save_state_info", "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"])
restart: this.Module.cwrap('system_restart', '', []),
saveStateInfo: this.Module.cwrap('save_state_info', 'null', []),
loadState: this.Module.cwrap('load_state', 'number', ['string', 'number']),
screenshot: this.Module.cwrap('cmd_take_screenshot', '', []),
simulateInput: this.Module.cwrap('simulate_input', 'null', ['number', 'number', 'number']),
toggleMainLoop: this.Module.cwrap('toggleMainLoop', 'null', ['number']),
getCoreOptions: this.Module.cwrap('get_core_options', 'string', []),
setVariable: this.Module.cwrap('ejs_set_variable', 'null', ['string', 'string']),
setCheat: this.Module.cwrap('set_cheat', 'null', ['number', 'number', 'string']),
resetCheat: this.Module.cwrap('reset_cheat', 'null', []),
toggleShader: this.Module.cwrap('shader_enable', 'null', ['number']),
getDiskCount: this.Module.cwrap('get_disk_count', 'number', []),
getCurrentDisk: this.Module.cwrap('get_current_disk', 'number', []),
setCurrentDisk: this.Module.cwrap('set_current_disk', 'null', ['number']),
getSaveFilePath: this.Module.cwrap('save_file_path', 'string', []),
saveSaveFiles: this.Module.cwrap('cmd_savefiles', '', []),
supportsStates: this.Module.cwrap('supports_states', 'number', []),
loadSaveFiles: this.Module.cwrap('refresh_save_files', 'null', []),
toggleFastForward: this.Module.cwrap('toggle_fastforward', 'null', ['number']),
setFastForwardRatio: this.Module.cwrap('set_ff_ratio', 'null', ['number']),
toggleRewind: this.Module.cwrap('toggle_rewind', 'null', ['number']),
setRewindGranularity: this.Module.cwrap('set_rewind_granularity', 'null', ['number']),
toggleSlowMotion: this.Module.cwrap('toggle_slow_motion', 'null', ['number']),
setSlowMotionRatio: this.Module.cwrap('set_sm_ratio', 'null', ['number']),
getFrameNum: this.Module.cwrap('get_current_frame_count', 'number', ['']),
setVSync: this.Module.cwrap('set_vsync', 'null', ['number'])
}
this.writeFile("/home/web_user/.config/retroarch/retroarch.cfg", this.getRetroArchCfg());
this.mkdir("/data");
this.mkdir("/data/saves");
this.writeFile("/home/web_user/retroarch/userdata/retroarch.cfg", this.getRetroArchCfg());
this.FS.mount(this.FS.filesystems.IDBFS, {autoPersist: true}, '/data/saves');
//this.FS.syncfs(true, () => {});
this.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");
this.functions.saveSaveFiles();
setTimeout(() => {
try {
this.Module.abort();
} catch(e) {
console.warn(e);
};
try {window.abort()} catch(e){};
}, 1000);
})
}
setupPreLoadSettings() {
this.Module.callbacks.setupCoreSettingFile = (filePath) => {
if (this.EJS.debug) console.log("Setting up core settings with path:", filePath);
this.writeFile(filePath, this.EJS.getCoreSettings());
}
}
mountFileSystems() {
return new Promise(async resolve => {
this.mkdir("/data");
this.mkdir("/data/saves");
this.FS.mount(this.FS.filesystems.IDBFS, { autoPersist: true }, "/data/saves");
this.FS.syncfs(true, resolve);
});
}
writeConfigFile() {
if (!this.EJS.defaultCoreOpts.file || !this.EJS.defaultCoreOpts.settings) {
return;
}
let output = "";
for (const k in this.EJS.defaultCoreOpts.settings) {
output += k + ' = "' + this.EJS.defaultCoreOpts.settings[k] + '"\n';
output += k + ' = "' + this.EJS.defaultCoreOpts.settings[k] +'"\n';
}
this.writeFile("/home/web_user/retroarch/userdata/config/" + this.EJS.defaultCoreOpts.file, output);
}
loadExternalFiles() {
return new Promise(async (resolve, reject) => {
if (this.EJS.config.externalFiles && this.EJS.config.externalFiles.constructor.name === "Object") {
if (this.EJS.config.externalFiles && this.EJS.config.externalFiles.constructor.name === 'Object') {
for (const key in this.EJS.config.externalFiles) {
await new Promise(done => {
this.EJS.downloadFile(this.EJS.config.externalFiles[key], null, true, { responseType: "arraybuffer", method: "GET" }).then(async (res) => {
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();
@ -103,18 +81,18 @@ class EJS_GameManager {
path += name;
} else {
for (const k in files) {
this.writeFile(path + k, files[k]);
this.writeFile(path+k, files[k]);
}
return done();
}
}
try {
this.writeFile(path, new Uint8Array(res.data));
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"});
})
}
}
@ -124,7 +102,7 @@ class EJS_GameManager {
writeFile(path, data) {
const parts = path.split("/");
let current = "/";
for (let i = 0; i < parts.length - 1; i++) {
for (let i=0; i<parts.length-1; i++) {
if (!parts[i].trim()) continue;
current += parts[i] + "/";
this.mkdir(current);
@ -137,55 +115,26 @@ class EJS_GameManager {
} 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;
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 (!this.EJS.config.shaders) return;
this.mkdir("/shader");
for (const shaderFileName in this.EJS.config.shaders) {
const shader = this.EJS.config.shaders[shaderFileName];
if (typeof shader === "string") {
if (typeof shader === 'string') {
this.FS.writeFile(`/shader/${shaderFileName}`, shader);
}
}
@ -201,25 +150,23 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
this.functions.restart();
}
getState() {
return this.Module.EmulatorJSGetState();
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.FS.unlink('game.state');
} catch(e){}
this.FS.writeFile('/game.state', state);
this.clearEJSResetTimer();
this.functions.loadState("game.state", 0);
setTimeout(() => {
try {
this.FS.unlink("game.state");
} catch(e) {}
this.FS.unlink('game.state');
} catch(e){}
}, 5000)
}
screenshot() {
try {
this.FS.unlink("/screenshot.png");
} catch(e) {}
this.functions.screenshot();
return new Promise(async resolve => {
while (1) {
@ -227,28 +174,26 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
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;
(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";
let name = slot + '-quick.state';
this.clearEJSResetTimer();
this.functions.loadState(name, 0);
})();
@ -260,28 +205,25 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
}
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"));
}
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";
const slot = this.EJS.settings['save-state-slot'] ? this.EJS.settings['save-state-slot'] : "1";
this.quickLoad(slot);
this.EJS.displayMessage(this.EJS.localization("LOADED STATE FROM SLOT") + " " + slot);
this.EJS.displayMessage(this.EJS.localization("LOADED STATE FROM SLOT")+" "+slot);
}
if (index === 26 && value === 1) {
let newSlot;
try {
newSlot = parseFloat(this.EJS.settings["save-state-slot"] ? this.EJS.settings["save-state-slot"] : "1") + 1;
newSlot = parseFloat(this.EJS.settings['save-state-slot'] ? this.EJS.settings['save-state-slot'] : "1") + 1;
} catch(e) {
newSlot = 1;
}
if (newSlot > 9) newSlot = 1;
this.EJS.displayMessage(this.EJS.localization("SET SAVE STATE SLOT TO") + " " + newSlot);
this.EJS.changeSettingOption("save-state-slot", newSlot.toString());
this.EJS.displayMessage(this.EJS.localization("SET SAVE STATE SLOT TO")+" "+newSlot);
this.EJS.changeSettingOption('save-state-slot', newSlot.toString());
}
if (index === 27) {
this.functions.toggleFastForward(this.EJS.isFastForward ? !value : value);
@ -322,7 +264,7 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
return null;
}
}
for (let i = 0; i < fileNames.length; i++) {
for (let i=0; i<fileNames.length; i++) {
if (fileNames[i].split(".").pop().toLowerCase() === "ccd") {
console.warn("Did not auto-create cue file(s). Found a ccd.");
return null;
@ -336,49 +278,47 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
if (baseFileName.includes(".")) {
baseFileName = baseFileName.substring(0, baseFileName.length - baseFileName.split(".").pop().length - 1);
}
for (let i = 0; i < fileNames.length; i++) {
const contents = " FILE \"" + fileNames[i] + "\" BINARY\n TRACK 01 MODE1/2352\n INDEX 01 00:00:00";
this.FS.writeFile("/" + baseFileName + "-" + i + ".cue", contents);
for (let i=0; i<fileNames.length; i++) {
const contents = " FILE \""+fileNames[i]+"\" BINARY\n TRACK 01 MODE1/2352\n INDEX 01 00:00:00";
this.FS.writeFile("/"+baseFileName+"-"+i+".cue", contents);
}
if (fileNames.length > 1) {
let contents = "";
for (let i = 0; i < fileNames.length; i++) {
contents += "/" + baseFileName + "-" + i + ".cue\n";
for (let i=0; i<fileNames.length; i++) {
contents += "/"+baseFileName+"-"+i+".cue\n";
}
this.FS.writeFile("/" + baseFileName + ".m3u", contents);
this.FS.writeFile("/"+baseFileName+".m3u", contents);
}
return (fileNames.length === 1) ? baseFileName + "-0.cue" : baseFileName + ".m3u";
return (fileNames.length === 1) ? baseFileName+"-0.cue" : baseFileName+".m3u";
}
loadPpssppAssets() {
return new Promise(resolve => {
this.EJS.downloadFile("cores/ppsspp-assets.zip", null, false, { responseType: "arraybuffer", method: "GET" }).then((res) => {
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.innerText = this.localization('Network Error');
this.EJS.textElem.style.color = "red";
return;
}
this.mkdir("/PPSSPP");
for (const file in pspassets) {
const data = pspassets[file];
const path = "/PPSSPP/" + file;
const path = "/PPSSPP/"+file;
const paths = path.split("/");
let cp = "";
for (let i = 0; i < paths.length - 1; i++) {
for (let i=0; i<paths.length-1; i++) {
if (paths[i] === "") continue;
cp += "/" + paths[i];
if (!this.FS.analyzePath(cp).exists) {
cp += "/"+paths[i];
if (!FS.analyzePath(cp).exists) {
this.FS.mkdir(cp);
}
}
if (!path.endsWith("/")) {
this.FS.writeFile(path, data);
}
this.FS.writeFile(path, data);
}
resolve();
})
});
}, null, false, {responseType: "arraybuffer", method: "GET"});
})
}
setVSync(enabled) {
@ -416,16 +356,13 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
}
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();
}
getSaveFile() {
this.saveSaveFiles();
const exists = this.FS.analyzePath(this.getSaveFilePath()).exists;
return (exists ? this.FS.readFile(this.getSaveFilePath()) : null);
}
@ -451,22 +388,6 @@ IF EXIST AUTORUN.BAT AUTORUN.BAT
getFrameNum() {
return this.functions.getFrameNum();
}
setVideoRotation(rotation) {
this.functions.setVideoRoation(rotation);
}
getVideoDimensions(type) {
try {
return this.functions.getVideoDimensions(type);
} catch(e) {
console.warn(e);
}
}
setKeyboardEnabled(enabled) {
this.functions.setKeyboardEnabled(enabled === true ? 1 : 0);
}
setAltKeyEnabled(enabled) {
this.functions.setKeyboardEnabled(enabled === true ? 3 : 2);
}
}
window.EJS_GameManager = EJS_GameManager;

View File

@ -1,81 +1,30 @@
/**
* 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
*/
class EJS_COMPRESSION {
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;
isCompressed(data) { //https://www.garykessler.net/library/file_sigs.html
//todo. Use hex instead of numbers
if ((data[0] === 80 && data[1] === 75) && ((data[2] === 3 && data[3] === 4) || (data[2] === 5 && data[3] === 6) || (data[2] === 7 && data[3] === 8))) {
return 'zip';
} else if (data[0] === 55 && data[1] === 122 && data[2] === 188 && data[3] === 175 && data[4] === 39 && data[5] === 28) {
return '7z';
} else if ((data[0] === 82 && data[1] === 97 && data[2] === 114 && data[3] === 33 && data[4] === 26 && data[5] === 7) && ((data[6] === 0) || (data[6] === 1 && data[7] == 0))) {
return 'rar';
}
/**
* 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.
*/
return null;
}
decompress(data, updateMsg, fileCbFunc) {
const compressed = this.isCompressed(data.slice(0, 10));
if (compressed === null) {
if (typeof fileCbFunc === "function") {
fileCbFunc("!!notCompressedData", data);
}
return new Promise(resolve => resolve({ "!!notCompressedData": data }));
return new Promise(resolve => resolve({"!!notCompressedData": data}));
}
return this.decompressFile(compressed, data, updateMsg, fileCbFunc);
}
/**
* Retrieves the appropriate worker script for the specified compression method.
*
* @param {string} method - The compression method ('7z', 'zip', or 'rar')
* @returns {Promise<Blob>} Promise that resolves to a Blob containing the worker script
*
* @description
* Downloads the necessary worker script and WASM files for the specified compression
* method. For RAR files, also downloads the libunrar.wasm file and creates a custom
* worker script with the WASM binary embedded.
*
* @throws {Error} When network errors occur during file downloads
*/
getWorkerFile(method) {
return new Promise(async (resolve, reject) => {
return new Promise((resolve, reject) => {
let path, obj;
if (method === "7z") {
path = "compression/extract7z.js";
@ -87,97 +36,33 @@ class EJSCompression {
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"));
this.EJS.downloadFile(path, (res) => {
if (res === -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 + `";
if (method === "rar") {
this.EJS.downloadFile("compression/libunrar.wasm", (res2) => {
if (res2 === -1) {
this.EJS.startGameError(this.EJS.localization('Network Error'));
return;
}
};
` + 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);
}
const path = URL.createObjectURL(new Blob([res2.data], {type: "application/wasm"}));
let data = '\nlet dataToPass = [];\nModule = {\n monitorRunDependencies: function(left) {\n if (left == 0) {\n setTimeout(function() {\n unrar(dataToPass, null);\n }, 100);\n }\n },\n onRuntimeInitialized: function() {\n },\n locateFile: function(file) {\n return \''+path+'\';\n }\n};\n'+res.data+'\nlet unrar = function(data, password) {\n let cb = function(fileName, fileSize, progress) {\n postMessage({"t":4,"current":progress,"total":fileSize, "name": fileName});\n };\n\n let rarContent = readRARContent(data.map(function(d) {\n return {\n name: d.name,\n content: new Uint8Array(d.content)\n }\n }), password, cb)\n let rec = function(entry) {\n if (!entry) return;\n if (entry.type === \'file\') {\n postMessage({"t":2,"file":entry.fullFileName,"size":entry.fileSize,"data":entry.fileContent});\n } else if (entry.type === \'dir\') {\n Object.keys(entry.ls).forEach(function(k) {\n rec(entry.ls[k]);\n })\n } else {\n throw "Unknown type";\n }\n }\n rec(rarContent);\n postMessage({"t":1});\n return rarContent;\n};\nonmessage = function(data) {\n dataToPass.push({name: \'test.rar\', content: data.data});\n};\n ';
const blob = new Blob([data], {
type: 'application/javascript'
})
resolve(blob);
}, null, false, {responseType: "arraybuffer", method: "GET"});
} else {
const blob = new Blob([res.data], {
type: 'application/javascript'
})
resolve(blob);
}
}, null, false, {responseType: "arraybuffer", method: "GET"});
})
}
/**
* 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);
@ -190,7 +75,7 @@ class EJSCompression {
const pg = data.data;
const num = Math.floor(pg.current / pg.total * 100);
if (isNaN(num)) return;
const progress = " " + num.toString() + "%";
const progress = ' '+num.toString()+'%';
updateMsg(progress, true);
}
if (data.data.t === 2) {
@ -210,4 +95,4 @@ class EJSCompression {
}
}
window.EJS_COMPRESSION = EJSCompression;
window.EJS_COMPRESSION = EJS_COMPRESSION;

File diff suppressed because one or more lines are too long

View File

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

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

View File

@ -27,7 +27,7 @@
<a href="https://github.com/allancoding" target="_blank">**![Badge Allan GitHub]**</a>
<a href="https://allancoding.dev/" target="_blank">**![Badge Allan Website]**</a>
<a href="https://allancoding.is-a.dev/" target="_blank">**![Badge Allan Website]**</a>
<br>
<br>
@ -68,36 +68,66 @@
<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;
<a href="https://github.com/n-at" target="_blank" title="n-at - Alexey Nurgaliev">![Avatar Alexey]</a>&nbsp;
<a href="https://github.com/incredibleIdea" target="_blank" title="incredibleIdea">![Avatar incredibleIdea]</a>&nbsp;
<a href="https://github.com/angelmarfil" target="_blank" title="angelmarfil - Angel Marfil">![Avatar angelmarfil]</a>&nbsp;
<a href="https://github.com/gantoine" target="_blank" title="gantoine - Georges-Antoine Assi">![Avatar gantoine]</a>&nbsp;
<a href="https://github.com/E-Sh4rk" target="_blank" title="E-Sh4rk - Mickaël Laurent" width="95px"><img src="https://github.com/E-Sh4rk.png?size=95" width="95px"></a>&nbsp;
<a href="https://github.com/Grey41" target="_blank" title="Grey41 - Grey Hope">![Avatar Grey]</a>&nbsp;
<a href="https://github.com/imneckro" target="_blank" title="ImNekro - ck-oneman">![Avatar Nekro]</a>&nbsp;
<a href="https://github.com/cheesykyle" target="_blank" title="CheesyKyle - Kyle Steffel">![Avatar Kyle]</a>&nbsp;
<a href="https://github.com/Protektor-Desura" target="_blank" title="Protektor-Desura - Protektor">![Avatar Protektor]</a>&nbsp;
<a href="https://github.com/eric183" target="_blank" title="eric183 - ericKuang">![Avatar ericKuang]</a>&nbsp;
<a href="https://github.com/debuggerx01" target="_blank" title="debuggerx01">![Avatar debuggerx01]</a>&nbsp;
<a href="https://github.com/oyepriyansh" target="_blank" title="oyepriyansh - Priyansh Prajapat">![Avatar Priyansh]</a>&nbsp;
<a href="https://github.com/andrigamerita" target="_blank" title="andrigamerita">![Avatar andrigamerita]</a>&nbsp;
<a href="https://github.com/MattiaPell" target="_blank" title="MattiaPell">![Avatar MattiaPell]</a>&nbsp;
<a href="https://github.com/TimKieu" target="_blank" title="TimKieu"><img src="https://github.com/TimKieu.png?size=95" width="95px"></a>&nbsp;
<a href="https://github.com/jonas0b1011001" target="_blank" title="jonas0b1011001">![Avatar jonas0b1011001]</a>&nbsp;
<a href="https://github.com/IvanMazzoli" target="_blank" title="IvanMazzoli">![Avatar IvanMazzoli]</a>&nbsp;
<a href="https://github.com/iGoodie" target="_blank" title="iGoodie - Anılcan Metinyurt">![Avatar iGoodie]</a>&nbsp;
<a href="https://github.com/ZhaoTonggang" target="_blank" title="ZhaoTonggang - 赵彤刚">![Avatar ZhaoTonggang]</a>&nbsp;
</div>
<!------------------------------------------------------------------------------>
[Avatar Nekro]: https://github.com/imneckro.png?size=95
[Avatar Grey]: https://github.com/Grey41.png?size=95
[Avatar Kyle]: https://github.com/cheesykyle.png?size=95
[Avatar Protektor]: https://github.com/Protektor-Desura.png?size=95
[Avatar ericKuang]: https://github.com/eric183.png?size=95
[Avatar incredibleIdea]: https://github.com/incredibleIdea.png?size=95
[Avatar Alexey]: https://github.com/n-at.png?size=95
[Avatar Mickaël]: https://github.com/E-Sh4rk.png?size=95
[Avatar andrigamerita]: https://github.com/andrigamerita.png?size=95
[Avatar Priyansh]: https://github.com/oyepriyansh.png?size=95
[Avatar debuggerx01]: https://github.com/debuggerx01.png?size=95
[Avatar gantoine]: https://github.com/gantoine.png?size=95
[Avatar angelmarfil]: https://github.com/angelmarfil.png?size=95
[Avatar MattiaPell]: https://github.com/MattiaPell.png?size=95
[Avatar jonas0b1011001]: https://github.com/jonas0b1011001.png?size=95
[Avatar IvanMazzoli]: https://github.com/IvanMazzoli.png?size=95
[Avatar iGoodie]: https://github.com/iGoodie.png?size=95
[Avatar ZhaoTonggang]: https://github.com/ZhaoTonggang.png?size=95
<!-- Others End -->
<!----------------------------------{ Ethan }----------------------------------->
[Badge Ethan GitHub]: https://img.shields.io/badge/Ethan_O'_Brien-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
@ -111,7 +141,7 @@
<!----------------------------------{ Allan }---------------------------------->
[Badge Allan GitHub]: https://img.shields.io/badge/allancoding-181717.svg?style=for-the-badge&logo=GitHub&logoColor=white
[Badge Allan Website]: https://img.shields.io/badge/allancoding.dev-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAATCAYAAACKsM07AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALJSURBVEhLtZVNSFRRGIbfc2emctLUimmV4KIWBbNpUf4lZAYRBBH0syioTZA/1cKKcVGkbqQkCKJNGRlRVLpwMSiWlakhakaaWv7kIFqZVKhDznjv13vGASWTGdCel4d75zuHc+6ZOeeODdGjaAF101ZdiIZoJ9CDn6M+6qDbaDuNiBG+RiKPjg4C1Z1ABe/1g53QDZGIZoIc+pODV1lKVTmVul8P3GZtNT2mOyyFU/QkB181oFT1gGGItl+pB5zEzrZ8ekR3XAz93XqU0pcFbKBptHI7kJmh1J5QNUydSHUH8Ia3egIv/aXr8xERqKKiIsnP1w+y/HBsoLS0lBP9Hzwej9iys7MvB1MDaJJGeMWLFJWKErMYKUYqcs3TSFCJeCQP0SFv4UQMcq0cDDPXrTIEGI95EVvUVtyVO6ixatAoDaiQexhkpur9s7uo1qpFuVWOdmlDkOlHH3ziwxPrMSqtpygzr2JIhjAogzikDiOByVK78VyewWTOmnnolm7csm7iPaPHWMFoQiv4kTIOUQKdFmlBl3TiA7qwSW3Gd4whQ2XCpVxYyejV+Jg+fIKL6WWu2IoxKl/gVm5uLTt6pAfjzLr69VD6Nygo0G+AOV6+8CMYFPj9FpKSHPD5gtwRbKDpO5143eAPtcXFGpgOCPsCu7KccLn0zp2jsLAQ9kAggImJiXBplslJP9rbfmNkJIi0dCeGPgcxPDyD+HgDlsTgXcc0vn2dgV2/NIhp8gXlTkRMTLgQRo+tHA7HNRouzcFN4LIsy22z2eoyLSs1WWRHuClEr2G8alaq1TTNvYZhNPEsLTgHQb20CJynB/j+ie0zjIZ5J9nLmv4Vj1N92hfln0f4Lzy06yNQbzcML5c2pUT2JwMHWV9Lb+hOS6WQ7hsD4vhH4OT9UXpGN0QimhVodL9LtJmuoRtpGV1W9CQl9ELoU1QAfwCDI3HISCyhigAAAABJRU5ErkJggg==
[Badge Allan Website]: https://img.shields.io/badge/allancoding.isa.dev-lightgray.svg?style=for-the-badge&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAATCAYAAACKsM07AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAALJSURBVEhLtZVNSFRRGIbfc2emctLUimmV4KIWBbNpUf4lZAYRBBH0syioTZA/1cKKcVGkbqQkCKJNGRlRVLpwMSiWlakhakaaWv7kIFqZVKhDznjv13vGASWTGdCel4d75zuHc+6ZOeeODdGjaAF101ZdiIZoJ9CDn6M+6qDbaDuNiBG+RiKPjg4C1Z1ABe/1g53QDZGIZoIc+pODV1lKVTmVul8P3GZtNT2mOyyFU/QkB181oFT1gGGItl+pB5zEzrZ8ekR3XAz93XqU0pcFbKBptHI7kJmh1J5QNUydSHUH8Ia3egIv/aXr8xERqKKiIsnP1w+y/HBsoLS0lBP9Hzwej9iys7MvB1MDaJJGeMWLFJWKErMYKUYqcs3TSFCJeCQP0SFv4UQMcq0cDDPXrTIEGI95EVvUVtyVO6ixatAoDaiQexhkpur9s7uo1qpFuVWOdmlDkOlHH3ziwxPrMSqtpygzr2JIhjAogzikDiOByVK78VyewWTOmnnolm7csm7iPaPHWMFoQiv4kTIOUQKdFmlBl3TiA7qwSW3Gd4whQ2XCpVxYyejV+Jg+fIKL6WWu2IoxKl/gVm5uLTt6pAfjzLr69VD6Nygo0G+AOV6+8CMYFPj9FpKSHPD5gtwRbKDpO5143eAPtcXFGpgOCPsCu7KccLn0zp2jsLAQ9kAggImJiXBplslJP9rbfmNkJIi0dCeGPgcxPDyD+HgDlsTgXcc0vn2dgV2/NIhp8gXlTkRMTLgQRo+tHA7HNRouzcFN4LIsy22z2eoyLSs1WWRHuClEr2G8alaq1TTNvYZhNPEsLTgHQb20CJynB/j+ie0zjIZ5J9nLmv4Vj1N92hfln0f4Lzy06yNQbzcML5c2pUT2JwMHWV9Lb+hOS6WQ7hsD4vhH4OT9UXpGN0QimhVodL9LtJmuoRtpGV1W9CQl9ELoU1QAfwCDI3HISCyhigAAAABJRU5ErkJggg==
[Allan Avatar]: https://avatars.githubusercontent.com/u/74841470?s=90 'Allancoding - Allan Niles'
<!----------------------------------{ BinBashBanana }---------------------------------->

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 170 KiB

View File

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

View File

@ -1,48 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 9.2 KiB

View File

@ -1,26 +0,0 @@
<?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>

Before

Width:  |  Height:  |  Size: 2.5 KiB

File diff suppressed because it is too large Load Diff

Before

Width:  |  Height:  |  Size: 170 KiB

View File

@ -1,7 +1,7 @@
<!DOCTYPE html>
<html>
<head>
<title>EmulatorJS</title>
<title>EmulatorJS Demo</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,12 +40,10 @@
font-weight: bold;
font-size: 20px;
margin: 5px;
text-align: center;
padding: 10px;
}
#box:hover, #box[drag] {
border-color: #1AAFFF;
border-color: #38f;
color: #ddd
}
@ -56,7 +54,7 @@
top: 0;
width: 100%;
height: 100%;
opacity: 0;
opacity: 0
}
#display {
@ -88,7 +86,7 @@
.logo {
width: 130px;
height: 130px;
filter: drop-shadow(0 0 8px white);
filter: drop-shadow(0 0 10px white);
}
#top {
@ -101,27 +99,25 @@
<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" title="Upload" />
<div id = box>
<input type = file id = input>
Drag ROM file or click here
</div>
<script>
let enableDebug = false;
let enableThreads = false;
let browserMode;
const queryString = window.location.search;
const urlParams = new URLSearchParams(queryString);
if (parseInt(urlParams.get("debug")) === 1 || urlParams.get("debug") === "true") {
if (urlParams.get('debug') == 1) {
enableDebug = true;
console.log("Debug is enabled");
} else {
console.log("Debug is disabled");
}
if (parseInt(urlParams.get("threads")) === 1 || urlParams.get("threads") === "true") {
if (urlParams.get('threads') == 1) {
if (window.SharedArrayBuffer) {
enableThreads = true;
console.log("Threads are enabled");
@ -132,19 +128,10 @@
} 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(".");
input.onchange = async () => {
const url = input.files[0]
const parts = input.files[0].name.split(".")
const core = await (async (ext) => {
if (["fds", "nes", "unif", "unf"].includes(ext))
@ -170,9 +157,6 @@
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
@ -197,7 +181,6 @@
"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",
@ -207,20 +190,9 @@
"Commodore 128": "vice_x128",
"Commodore VIC20": "vice_xvic",
"Commodore Plus/4": "vice_xplus4",
"Commodore PET": "vice_xpet",
}
if (enableThreads) {
coreValues["DOSBOX-PURE"] = "dosbox_pure";
coreValues["PlayStation Portable"] = "ppsspp";
"Commodore PET": "vice_xpet"
}
for (let core in coreValues) {
if (core.toLowerCase() === ext) {
resolve(core)
}
}
const cores = Object.keys(coreValues).sort().reduce(
(obj, key) => {
obj[key] = coreValues[key];
@ -272,18 +244,10 @@
window.EJS_DEBUG_XX = enableDebug;
window.EJS_disableDatabases = true;
window.EJS_threads = enableThreads;
if (browserMode) {
window.EJS_browserMode = browserMode;
}
script.src = "data/loader.js";
document.body.appendChild(script);
}
input.onchange = async () => {
run(true);
}
box.ondragover = () => box.setAttribute("drag", true);
box.ondragleave = () => box.removeAttribute("drag");
</script>

View File

@ -1,38 +0,0 @@
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,39 +1,16 @@
{
"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"
}
"name": "@emulatorjs/emulatorjs",
"version": "4.0.12",
"repository": {
"type": "git",
"url": "https://github.com/EmulatorJS/EmulatorJS.git"
},
"license": "GPL-3.0",
"description": "EmulatorJS is a frontend for RetroArch in the web browser.",
"scripts": {
"start": "http-server"
},
"dependencies": {
"http-server": "^14.1.1"
}
}

135
update.js
View File

@ -1,135 +0,0 @@
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.");