Compare commits

..

80 Commits
v2.19 ... v2.24

Author SHA1 Message Date
dualshock-tools
4344b8abed Bump to v2.24 2026-01-13 12:09:29 +01:00
dualshock-tools
2c5ebcab7e Update hu_hu translation 2026-01-13 12:05:00 +01:00
dualshock-tools
f7fe3d297e DS5: add models BDM-060M/BDM-060X 2026-01-13 12:01:19 +01:00
Alain
b66d418bfa Merge pull request #201 from ClausNC3/main
Updating danish translation
2026-01-08 17:17:57 +01:00
dualshock-tools
3518decae7 DS5: Add Icon Blue color detection 2026-01-08 17:17:18 +01:00
ClausNC3
2ea560f844 Updating danish translation 2026-01-03 22:52:24 +01:00
ClausNC3
ab9bfc301b Updating danish translation 2026-01-03 22:41:11 +01:00
Marekk
963503dcb4 Updated pl-pl 2025-12-30 21:54:49 +01:00
czrps
f3c30f0307 Update tr_tr.json
Typos and sentence errors have been fixed
2025-12-30 17:39:00 +01:00
Alain
d10e4e7d4d Merge pull request #195 from sladkOy/main
Update ua_ua.json
2025-12-26 20:59:16 +01:00
Alain
11acb4ec60 Merge pull request #196 from czrps/patch-11
Update tr_tr.json
2025-12-26 20:58:49 +01:00
czrps
b717b97669 Update tr_tr.json
Version 2.23 translation is done.
2025-12-26 16:49:34 +03:00
sladkOy
5293fbed29 Update ua_ua.json 2025-12-26 14:21:41 +02:00
Alain
ac0b46b2b6 Merge pull request #194 from sladkOy/patch-8
Update ua_ua.json
2025-12-25 20:40:14 +01:00
dualshock-tools
70142bb6b5 Update it_it lang 2025-12-25 20:39:13 +01:00
sladkOy
c43ad02baf Update ua_ua.json 2025-12-25 11:51:48 +02:00
Mathias Malmqvist
4e3c48c4fb Update the version number 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
5776340091 Add missing translation call 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
38d147dc70 Fixed review comments 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
0bf5e18e0b Update translations and fix related issues 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
0d89de8acc Raise the threashold before showing failed calibration modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
a6259a0bbc Open Quick Test when pressing L1 + Options on the controller 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
bd13f66c1c Tidy 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
4d7f966d8c Adapt range modal to single-stick devices 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
b0fea23081 Refactor the code reading and writing local storage 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
e63eb47374 Show a warning on the Connect screen if the changes were not saved 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
f9d43626e7 Show info about the last connected controller at the bottom of the Connect screen 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
060b24a9f8 Limit the number of times the range-calibration-failed modal will be shown 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
4693e5a08f Show LX, LY, RX, RY in the range calibration modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
21d2cc3630 Remove the numbers from the calibration buttons 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
6b1c5a8dc4 Show a info-icon and modal when average circularity error is below 5% 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
66b7107167 Refactor the Calibration History modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
dda8fc2ff1 On connecting to a controller, show a message if the last calibration change was not saved 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
55ef87d561 Reset the trackpad size when switching between controller types 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
3de54422d2 Collect DS4 Bluetooth addresses for analysis and clone detection 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
a704160fc2 Add icon linking to version history page 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
e2d4124e53 Press L2 or R2 in finetune modal to binary-search for circularity values 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
24ec34929c Add option to restore previous calibration settings for DS5 and Edge 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
ba10cfcbdd Add stick dials to the range calibration modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
35f59f3d92 Add Repeat-button to the Haptic test 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
257a0b5a6a Add Expert Mode option for the range calibration modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
3bb0bd2861 Remove the outdated reference to gamepad tester site 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
abd2b91e07 Add option for which center calibration method to use on DS5 and Edge controllers 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
66712f7094 Improve the unsupported browser warning and clarofy that this utility cannot fix drift 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
e865213018 Allow finetuning with the keyboard arrows 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
8e01d92572 Be smarter when resetting circularity data in finetune modal 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
c8f7c40cb7 Show not-genuin-sony-controller message also for DS5 when calibration can't be started 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
1138440119 Show power-saving warning in Quick Test modal when battery is low 2025-12-24 13:44:39 +01:00
Mathias Malmqvist
b72c9c93c9 Make sure the range calibration modal is destroyed when pulling the cable out 2025-12-24 13:44:39 +01:00
dualshock-tools
4da151a3a3 Bump to version v2.22 2025-12-21 12:21:22 +01:00
dualshock-tools
496b0ea3d7 Update it_it language 2025-12-21 12:20:51 +01:00
dualshock-tools
5aeaae377e DS5Edge: fix barcode reading 2025-12-21 12:19:43 +01:00
Alain
718c7f7ab0 Merge pull request #184 from cxd000000675/main
Update zh_cn.json
2025-12-20 09:26:31 +01:00
修手柄的小丁
ec583436ed Update zh_cn.json 2025-12-20 09:44:44 +08:00
Alain
a1447b867d Merge pull request #181 from Marekk2k/main
Update pl_pl (slighty corrections)
2025-12-16 18:43:31 +01:00
Alain
d6bfe2842d Merge pull request #182 from czrps/patch-9
Update tr_tr.json
2025-12-16 18:42:47 +01:00
czrps
6aacfad161 Update tr_tr.json
Finished translating Version 2.21 (2025-12-06).
2025-12-10 13:35:16 +03:00
Marekk
1917b18eee Update pl_pl (slighty corrections) 2025-12-10 01:07:07 +01:00
Alain
bbfb76c052 Merge pull request #179 from GoomisPL/patch-2
Update pl_pl.json
2025-12-09 20:45:29 +01:00
Bartosz
f905a502fd Update pl_pl.json 2025-12-08 08:05:22 +01:00
Alain
bd53192bd7 Merge pull request #176 from sladkOy/main
Update ua_ua.json
2025-12-07 13:08:50 +01:00
Alain
19aa3d3feb Merge pull request #177 from Marekk2k/main
Updated pl-pl translations
2025-12-07 13:08:19 +01:00
Marekk
cc9dbaae73 Merge branch 'main' into main 2025-12-06 21:30:04 +01:00
Marekk
16e4e24f65 Updated pl-pl translations 2025-12-06 21:27:16 +01:00
sladkOy
a3cc71b361 Update ua_ua.json 2025-12-06 20:53:51 +02:00
Alain Carlucci
ecb038f9f3 Bump to v2.21 2025-12-06 16:43:41 +01:00
Alain Carlucci
acac70de5f Add CREDITS.md file 2025-12-06 16:43:12 +01:00
Alain Carlucci
6bea7dfec2 Add copy button for firmware information 2025-12-06 16:42:58 +01:00
dualshock-tools
420648d851 Updated hu_hu language 2025-12-06 10:12:57 +01:00
sladkOy
13a6b0994e Update ua_ua.json 2025-12-06 10:11:25 +01:00
sladkOy
fc14d5353b Update ua_ua.json 2025-12-06 10:11:25 +01:00
czrps
2f39c94f05 Update tr_tr.json
Başlık çevirisi yapıldı
2025-12-06 10:10:53 +01:00
Alain Carlucci
1de4ea0121 Disable quick tests for VR2 2025-11-22 11:30:01 +01:00
Alain Carlucci
e586dddbeb Update it_it lang 2025-11-22 11:30:01 +01:00
Alain Carlucci
d3298dbdad Update translations related to VR2 controller 2025-11-22 11:30:01 +01:00
Alain Carlucci
49e7661832 Add basic support for PS VR2 controllers 2025-11-22 11:30:01 +01:00
dualshock-tools
a543438462 Add vi_vn translation 2025-11-15 13:12:52 +01:00
MrRepairman
70c527f2ae Update fa_fa.json – Persian translation completed and FAQ added
Added full Persian (Farsi) translation and localized FAQ section.
Fixed JSON structure and improved readability.
2025-10-29 14:12:51 +01:00
ClausNC3
479e101aa6 Add missing strings and translated all to danish 2025-10-29 14:12:19 +01:00
czrps
9b30912805 Update tr_tr.json
Version 2.19 (2025-10-18) – Updates include icon display corrections and refined Turkish language support.
2025-10-25 15:34:21 +02:00
51 changed files with 4028 additions and 842 deletions

13
CREDITS.md Normal file
View File

@@ -0,0 +1,13 @@
# Credits
## Developers
- the_al
- Mathias Malmqvist
## Special Thanks
- **Board model detection**: [Battle Beaver Customs](https://battlebeavercustoms.com/)
- **Color detection**: romek77 from Poland
---
Thank you to everyone who contributed to this project, whether through code, testing, feedback, or translations. Your support makes this project possible!

View File

@@ -1,25 +1,27 @@
<svg xmlns="http://www.w3.org/2000/svg" class="d-none">
<symbol id="paypal" viewBox="0 0 384 512">
<path fill="#ffffff" d="M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9 152.3 0 165.1-3.7 204 11.4 60.1 23.3 65.6 79.5 44 140.3-21.5 62.6-72.5 89.5-140.1 90.3-43.4 .7-69.5-7-75.3 24.2zM357.1 152c-1.8-1.3-2.5-1.8-3 1.3-2 11.4-5.1 22.5-8.8 33.6-39.9 113.8-150.5 103.9-204.5 103.9-6.1 0-10.1 3.3-10.9 9.4-22.6 140.4-27.1 169.7-27.1 169.7-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9 .7-5.4-1.1 6.1 14.4-91.3 4.6-22 14.3-19.7 29.3-19.7 71 0 126.4-28.8 142.9-112.3 6.5-34.8 4.6-71.4-23.8-92.6z"/>
<path fill="currentColor" d="M111.4 295.9c-3.5 19.2-17.4 108.7-21.5 134-.3 1.8-1 2.5-3 2.5H12.3c-7.6 0-13.1-6.6-12.1-13.9L58.8 46.6c1.5-9.6 10.1-16.9 20-16.9 152.3 0 165.1-3.7 204 11.4 60.1 23.3 65.6 79.5 44 140.3-21.5 62.6-72.5 89.5-140.1 90.3-43.4 .7-69.5-7-75.3 24.2zM357.1 152c-1.8-1.3-2.5-1.8-3 1.3-2 11.4-5.1 22.5-8.8 33.6-39.9 113.8-150.5 103.9-204.5 103.9-6.1 0-10.1 3.3-10.9 9.4-22.6 140.4-27.1 169.7-27.1 169.7-1 7.1 3.5 12.9 10.6 12.9h63.5c8.6 0 15.7-6.3 17.4-14.9 .7-5.4-1.1 6.1 14.4-91.3 4.6-22 14.3-19.7 29.3-19.7 71 0 126.4-28.8 142.9-112.3 6.5-34.8 4.6-71.4-23.8-92.6z"/>
</symbol>
<symbol id="ethereum" viewBox="0 0 320 512">
<path fill="#ffffff" d="M311.9 260.8L160 353.6 8 260.8 160 0l151.9 260.8zM160 383.4L8 290.6 160 512l152-221.4-152 92.8z"/>
<path fill="currentColor" d="M311.9 260.8L160 353.6 8 260.8 160 0l151.9 260.8zM160 383.4L8 290.6 160 512l152-221.4-152 92.8z"/>
</symbol>
<symbol id="info" viewBox="0 -860 960 960">
<path d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/>
<symbol id="info" viewBox="0 -880 960 960">
<path fill="currentColor" d="M440-280h80v-240h-80v240Zm40-320q17 0 28.5-11.5T520-640q0-17-11.5-28.5T480-680q-17 0-28.5 11.5T440-640q0 17 11.5 28.5T480-600Zm0 520q-83 0-156-31.5T197-197q-54-54-85.5-127T80-480q0-83 31.5-156T197-763q54-54 127-85.5T480-880q83 0 156 31.5T763-763q54 54 85.5 127T880-480q0 83-31.5 156T763-197q-54 54-127 85.5T480-80Zm0-80q134 0 227-93t93-227q0-134-93-227t-227-93q-134 0-227 93t-93 227q0 134 93 227t227 93Zm0-320Z"/>
</symbol>
<symbol id="discord" viewBox="0 0 640 512">
<path d="M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"/>
<path fill="currentColor" d="M524.531,69.836a1.5,1.5,0,0,0-.764-.7A485.065,485.065,0,0,0,404.081,32.03a1.816,1.816,0,0,0-1.923.91,337.461,337.461,0,0,0-14.9,30.6,447.848,447.848,0,0,0-134.426,0,309.541,309.541,0,0,0-15.135-30.6,1.89,1.89,0,0,0-1.924-.91A483.689,483.689,0,0,0,116.085,69.137a1.712,1.712,0,0,0-.788.676C39.068,183.651,18.186,294.69,28.43,404.354a2.016,2.016,0,0,0,.765,1.375A487.666,487.666,0,0,0,176.02,479.918a1.9,1.9,0,0,0,2.063-.676A348.2,348.2,0,0,0,208.12,430.4a1.86,1.86,0,0,0-1.019-2.588,321.173,321.173,0,0,1-45.868-21.853,1.885,1.885,0,0,1-.185-3.126c3.082-2.309,6.166-4.711,9.109-7.137a1.819,1.819,0,0,1,1.9-.256c96.229,43.917,200.41,43.917,295.5,0a1.812,1.812,0,0,1,1.924.233c2.944,2.426,6.027,4.851,9.132,7.16a1.884,1.884,0,0,1-.162,3.126,301.407,301.407,0,0,1-45.89,21.83,1.875,1.875,0,0,0-1,2.611,391.055,391.055,0,0,0,30.014,48.815,1.864,1.864,0,0,0,2.063.7A486.048,486.048,0,0,0,610.7,405.729a1.882,1.882,0,0,0,.765-1.352C623.729,277.594,590.933,167.465,524.531,69.836ZM222.491,337.58c-28.972,0-52.844-26.587-52.844-59.239S193.056,219.1,222.491,219.1c29.665,0,53.306,26.82,52.843,59.239C275.334,310.993,251.924,337.58,222.491,337.58Zm195.38,0c-28.971,0-52.843-26.587-52.843-59.239S388.437,219.1,417.871,219.1c29.667,0,53.307,26.82,52.844,59.239C470.715,310.993,447.538,337.58,417.871,337.58Z"/>
</symbol>
<symbol id="mail" viewBox="0 0 512 512">
<path d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/>
<path fill="currentColor" d="M48 64C21.5 64 0 85.5 0 112c0 15.1 7.1 29.3 19.2 38.4L236.8 313.6c11.4 8.5 27 8.5 38.4 0L492.8 150.4c12.1-9.1 19.2-23.3 19.2-38.4c0-26.5-21.5-48-48-48H48zM0 176V384c0 35.3 28.7 64 64 64H448c35.3 0 64-28.7 64-64V176L294.4 339.2c-22.8 17.1-54 17.1-76.8 0L0 176z"/>
</symbol>
<symbol id="github" viewBox="0 0 496 512">
<path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/>
<path fill="currentColor" d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/>
</symbol>
<symbol id="time-back" viewBox="0 0 16 16">
<path fill="currentColor" d="M8,0C5.609,0,3.463,1.047,2,2.709V0H0v6h6V4H3.528C3.6,3.916,3.681,3.838,3.756,3.756 C4.891,2.625,6.397,2,8,2s3.109,0.625,4.244,1.756C13.375,4.891,14,6.397,14,8s-0.625,3.109-1.756,4.244 C11.109,13.375,9.603,14,8,14s-3.113-0.619-4.244-1.756S2,9.603,2,8H0c0,4.419,3.581,8,8,8s8-3.581,8-8S12.419,0,8,0z M7,4v4.416 l3.291,3.291l1.416-1.416L9,7.584V4H7z" />
</symbol>
<symbol id="mug" viewBox="0 0 512 512">
<path fill="#ffffff" d="M88 0C74.7 0 64 10.7 64 24c0 38.9 23.4 59.4 39.1 73.1l1.1 1C120.5 112.3 128 119.9 128 136c0 13.3 10.7 24 24 24s24-10.7 24-24c0-38.9-23.4-59.4-39.1-73.1l-1.1-1C119.5 47.7 112 40.1 112 24c0-13.3-10.7-24-24-24zM32 192c-17.7 0-32 14.3-32 32V416c0 53 43 96 96 96H288c53 0 96-43 96-96h16c61.9 0 112-50.1 112-112s-50.1-112-112-112H352 32zm352 64h16c26.5 0 48 21.5 48 48s-21.5 48-48 48H384V256zM224 24c0-13.3-10.7-24-24-24s-24 10.7-24 24c0 38.9 23.4 59.4 39.1 73.1l1.1 1C232.5 112.3 240 119.9 240 136c0 13.3 10.7 24 24 24s24-10.7 24-24c0-38.9-23.4-59.4-39.1-73.1l-1.1-1C231.5 47.7 224 40.1 224 24z"/>
<path fill="currentColor" d="M88 0C74.7 0 64 10.7 64 24c0 38.9 23.4 59.4 39.1 73.1l1.1 1C120.5 112.3 128 119.9 128 136c0 13.3 10.7 24 24 24s24-10.7 24-24c0-38.9-23.4-59.4-39.1-73.1l-1.1-1C119.5 47.7 112 40.1 112 24c0-13.3-10.7-24-24-24zM32 192c-17.7 0-32 14.3-32 32V416c0 53 43 96 96 96H288c53 0 96-43 96-96h16c61.9 0 112-50.1 112-112s-50.1-112-112-112H352 32zm352 64h16c26.5 0 48 21.5 48 48s-21.5 48-48 48H384V256zM224 24c0-13.3-10.7-24-24-24s-24 10.7-24 24c0 38.9 23.4 59.4 39.1 73.1l1.1 1C232.5 112.3 240 119.9 240 136c0 13.3 10.7 24 24 24s24-10.7 24-24c0-38.9-23.4-59.4-39.1-73.1l-1.1-1C231.5 47.7 224 40.1 224 24z"/>
</symbol>
<symbol id="lang" viewBox="0 0 640 512">
<path d="M0 128C0 92.7 28.7 64 64 64H256h48 16H576c35.3 0 64 28.7 64 64V384c0 35.3-28.7 64-64 64H320 304 256 64c-35.3 0-64-28.7-64-64V128zm320 0V384H576V128H320zM178.3 175.9c-3.2-7.2-10.4-11.9-18.3-11.9s-15.1 4.7-18.3 11.9l-64 144c-4.5 10.1 .1 21.9 10.2 26.4s21.9-.1 26.4-10.2l8.9-20.1h73.6l8.9 20.1c4.5 10.1 16.3 14.6 26.4 10.2s14.6-16.3 10.2-26.4l-64-144zM160 233.2L179 276H141l19-42.8zM448 164c11 0 20 9 20 20v4h44 16c11 0 20 9 20 20s-9 20-20 20h-2l-1.6 4.5c-8.9 24.4-22.4 46.6-39.6 65.4c.9 .6 1.8 1.1 2.7 1.6l18.9 11.3c9.5 5.7 12.5 18 6.9 27.4s-18 12.5-27.4 6.9l-18.9-11.3c-4.5-2.7-8.8-5.5-13.1-8.5c-10.6 7.5-21.9 14-34 19.4l-3.6 1.6c-10.1 4.5-21.9-.1-26.4-10.2s.1-21.9 10.2-26.4l3.6-1.6c6.4-2.9 12.6-6.1 18.5-9.8l-12.2-12.2c-7.8-7.8-7.8-20.5 0-28.3s20.5-7.8 28.3 0l14.6 14.6 .5 .5c12.4-13.1 22.5-28.3 29.8-45H448 376c-11 0-20-9-20-20s9-20 20-20h52v-4c0-11 9-20 20-20z"/>

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -15,6 +15,7 @@ dl.row dd {
#left-stick-card,
#right-stick-card {
cursor: pointer;
outline: none !important;
}
.stick-card-active {
@@ -113,6 +114,16 @@ dl.row dd {
animation: blink 1s infinite;
}
/* Pulsing animation for text */
@keyframes pulse-text {
0%, 100% { opacity: 1; }
50% { opacity: 0.5; }
}
.pulsing-text {
animation: pulse-text 0.75s ease-in-out infinite;
}
/* Set text color to red for internationalized elements */
/* .ds-i18n {
color: red;

View File

@@ -74,12 +74,27 @@
<div class="container p-2">
<div id="missinghid" style="display: none;">
<p class="ds-i18n">Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).</p>
<!-- Unsupported Browser Warning -->
<div id="missinghid" style="bottom: 80px; left: 0; right: 0; z-index: 1030; padding: 12px 20px; display: none;">
<div class="container">
<div style="border: 2px solid #0d6efd; border-radius: 8px; color: #0d6efd; padding: 12px; background-color: white;">
<p class="mb-1">
<i class="fas fa-hand"></i>&nbsp;&nbsp;
<span class="ds-i18n">Unsupported browser.</span>
</p>
<p class="mb-1">
<span class="ds-i18n">Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.</span>
<span class="ds-i18n">Firefox is supported with the WebHID extension installed.</span>
</p>
<p class="mb-0">
<span class="ds-i18n">Using this utility on a phone or tablet is not supported.</span>
</p>
</div>
</div>
</div>
<div id="offlinebar" class="vstack p-2" style="display: none;">
<p class="ds-i18n">Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.</p>
<p class="ds-i18n">Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.</p>
<button id="btnconnect" type="button" class="btn btn-outline-primary" onclick="connect()">
<span class="spinner-border spinner-border-sm" style="display: none;" id="connectspinner" aria-hidden="true"></span>
<span class="ds-i18n">Connect</span>
@@ -137,7 +152,7 @@
</div>
<br>
<div class="d-flex justify-content-end">
<div class="d-flex justify-content-end" id="quick-tests-div">
<button type="button" class="btn btn-outline-primary ds-btn mb-3" onclick="show_quick_test_modal()" id="quick-test-btn">
<i class="fas fa-vial" id="quick-test-icon"></i>&nbsp;&nbsp;
<span id="quick-test-text" class="ds-i18n">Quick Test</span>
@@ -153,26 +168,63 @@
<div class="col-md-6 col-sm-12" style="min-width: 330px;">
<div class="vstack gap-2 p-2">
<button type="button" class="btn btn-primary ds-btn" onclick="calibrate_stick_centers()" id="four-step-center-calib" style="display: none;">
1. <span class="ds-i18n">Calibrate stick center</span>
</button>
<button type="button" class="btn btn-primary ds-btn" onclick="auto_calibrate_stick_centers()" id="quick-center-calib" style="display: none;">
1. <span class="ds-i18n">Calibrate stick center</span>
</button>
<button type="button" class="btn btn-primary ds-btn" onclick="calibrate_range()">
2. <span class="ds-i18n">Calibrate stick range</span>
<span class="ds-i18n">Calibrate stick center</span>
</button>
<div class="btn-group w-100" role="group" style="display: none;" id="quick-center-calib-group">
<button type="button" class="btn btn-primary ds-btn flex-grow-1" onclick="executeSelectedCenterCalibration()" id="quick-center-calib">
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="ds-i18n">Calibrate stick center</span>
</button>
<button type="button" class="btn btn-primary ds-btn dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false" style="flex: 0 0 35px;">
<span class="visually-hidden">Toggle dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" onclick="setCenterCalibrationMethod('quick', event)">
<i class="fas fa-check me-2" id="check-quick" style="display: none;"></i><span class="ds-i18n">Use quick calibration</span>
</a></li>
<li><a class="dropdown-item" href="#" onclick="setCenterCalibrationMethod('four-step', event)">
<i class="fas fa-check me-2" id="check-four-step"></i><span class="ds-i18n">Use four-step calibration</span>
</a></li>
</ul>
</div>
<div class="btn-group w-100" role="group" id="range-calib-group">
<button type="button" class="btn btn-primary ds-btn flex-grow-1" onclick="executeSelectedRangeCalibration()" id="range-calib">
<span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span>
<span class="ds-i18n">Calibrate stick range</span>
</button>
<button type="button" class="btn btn-primary ds-btn dropdown-toggle dropdown-toggle-split" data-bs-toggle="dropdown" aria-expanded="false" style="flex: 0 0 35px;">
<span class="visually-hidden">Toggle dropdown</span>
</button>
<ul class="dropdown-menu">
<li><a class="dropdown-item" href="#" onclick="setRangeCalibrationMethod('normal', event)">
<i class="fas fa-check me-2" id="check-range-normal"></i><span class="ds-i18n">Use normal mode</span>
</a></li>
<li><a class="dropdown-item" href="#" onclick="setRangeCalibrationMethod('expert', event)">
<i class="fas fa-check me-2" id="check-range-expert" style="display: none;"></i><span class="ds-i18n">Use expert mode</span>
</a></li>
</ul>
</div>
<button type="button" class="btn btn-primary ds-btn" onclick="ds5_finetune()" id="ds5finetune">
3. <span class="ds-i18n">Finetune stick calibration</span>
<span class="ds-i18n">Finetune stick calibration</span>
</button>
<hr>
<button id="savechanges" type="button" class="btn btn-success ds-btn ds-i18n" onclick="flash_all_changes()" id="resetBtn">Save changes permanently</button>
<button id="savechanges" type="button" class="btn btn-success ds-btn ds-i18n" onclick="flash_all_changes()">Save changes permanently</button>
<button id="restore-calibration-btn" type="button" class="btn btn-secondary ds-btn ds-i18n" onclick="openCalibrationHistoryModal()">Restore calibration</button>
<button type="button" class="btn btn-danger ds-btn ds-i18n" onclick="reboot_controller()" id="resetBtn">Reboot controller</button>
<div class="card text-bg-light" >
<div class="card-header"><i class="fas fa-crosshairs"></i>&nbsp;&nbsp;<span class="ds-i18n">Joystick Info</span></div>
<div class="vstack px-2">
<center>
<canvas id="stickCanvas" width="300" height="150"></canvas>
<div style="position: relative; display: inline-block;">
<canvas id="stickCanvas" width="300" height="150"></canvas>
<svg
id="circularityCheckIcon" class="bi" width="32" height="32"
style="cursor: pointer; color: #ff4000cb; position: absolute; top: 25px; right: -30px; display: none;"
onclick="show_circularity_warning()"
>
<use xlink:href="#info"/></svg>
</div>
</center>
</div>
<div class="px-2">
@@ -187,12 +239,12 @@
<pre id="ly-lbl" style="min-width: 80px;"></pre>
</div>
<div class="vstack" style="text-align: center;">
<div id="stick-item-rx" class="vstack" style="text-align: center;">
<span>RX:</span>
<pre id="rx-lbl" style="min-width: 80px;"></pre>
</div>
<div class="vstack" style="text-align: center;">
<div id="stick-item-ry" class="vstack" style="text-align: center;">
<span>RY:</span>
<pre id="ry-lbl" style="min-width: 80px;"></pre>
</div>
@@ -314,16 +366,46 @@
</div>
</div>
<!-- About drift and this utility -->
<div id="aboutdrift" style="position: fixed; bottom: 70px; left: 0; right: 0; z-index: 1030; display: none;">
<div class="container">
<div class="mb-4" style="border: 2px solid #0d6efd; border-radius: 8px; color: #0d6efd; padding: 12px; background-color: white;">
<p class="mb-2">
<i class="fas fa-hand-point-up"></i>&nbsp;&nbsp;
<span class="ds-i18n">This utility cannot fix stick drift.</span>
</p>
<p class="mb-2">
<span class="ds-i18n">Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.</span>
<span class="ds-i18n">After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.</span></p>
<p class="mb-0">
<i class="fas fa-regular fa-triangle-exclamation"></i>&nbsp;&nbsp;
<span class="ds-i18n">Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.</span>
</p>
</div>
<div id="lastConnected" class="gap-2">
<span class="text-muted"><i class="fas fa-history"></i>&nbsp;&nbsp;<span class="ds-i18n">Last connected</span>:</span>
<span id="lastConnectedInfo"></span>
<div id="lastConnectedWarning" style="display: none;">
<p class="text-danger" style="margin-top: 8px; margin-bottom: 0;">
<i class="fas fa-regular fa-triangle-exclamation"></i>&nbsp;&nbsp;<span class="ds-i18n">This controller has unsaved changes that will be lost when the controller is rebooted.</span>
</p>
</div>
</div>
</div>
</div>
<!-- Fixed Footer -->
<footer class="fixed-bottom bg-body-tertiary border-top">
<div class="container">
<div class="d-flex flex-column flex-sm-row justify-content-between py-3" id="footbody">
<p class="mb-0"><a target="_blank" href="https://github.com/dualshock-tools/dualshock-tools.github.io/commits/main/"><span class="ds-i18n">Version</span> 2.19</a> (2025-10-18) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a>&nbsp;<span id="authorMsg"></span></p>
<p class="mb-0"><a target="_blank" href="https://github.com/dualshock-tools/dualshock-tools.github.io/commits/main/"><span class="ds-i18n">Version</span> 2.24</a> (2026-01-13) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a>&nbsp;<span id="authorMsg"></span></p>
<ul class="list-unstyled d-flex mb-0">
<li class="ms-3"><a class="link-body-emphasis" href="mailto:ds4@the.al" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#mail"/></svg></a></li>
<li class="ms-3"><a class="link-body-emphasis" href="https://discord.gg/w2P7Rrs2Yp" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#discord"/></svg></a></li>
<li class="ms-3"><a class="link-body-emphasis" href="https://github.com/dualshock-tools/" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#github"/></svg></a></li>
<li class="ms-3"><a class="text-dark" href="mailto:ds4@the.al" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#mail"/></svg></a></li>
<li class="ms-3"><a class="text-dark" href="https://discord.gg/w2P7Rrs2Yp" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#discord"/></svg></a></li>
<li class="ms-3"><a class="text-dark" href="https://github.com/dualshock-tools/" target="_blank"><svg class="bi" width="24" height="24"><use xlink:href="#github"/></svg></a></li>
<li class="ms-3"><a class="text-dark" href="https://the.al/ds_history/"><svg class="bi" width="24" height="24"><use xlink:href="#time-back"/></svg></a></li>
</ul>
</div>
</div>

View File

@@ -1,7 +1,10 @@
'use strict';
import { sleep, la } from './utils.js';
import { l } from './translations.js'
import { l } from './translations.js';
import { Storage } from './storage.js';
const NOT_GENUINE_SONY_CONTROLLER_MSG = "Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.";
/**
* Controller Manager - Manages the current controller instance and provides unified interface
@@ -35,7 +38,7 @@ class ControllerManager {
this.batteryStatus = {
bat_txt: "",
changed: false,
bat_capacity: 0,
charge_level: 0,
cable_connected: false,
is_charging: false,
is_error: false
@@ -43,12 +46,73 @@ class ControllerManager {
this._lastBatteryText = "";
}
/**
* Save has_changes_to_write state to storage
*/
async _saveHasChangesState() {
if (!this.currentController) return;
try {
const serialNumber = await this.currentController.getSerialNumber();
Storage.hasChangesState.set(serialNumber, this.has_changes_to_write);
} catch (e) {
console.warn('Failed to save changes state:', e);
}
}
/**
* Restore has_changes_to_write state from storage
*/
async _restoreHasChangesState() {
if (!this.currentController) return;
try {
const serialNumber = await this.currentController.getSerialNumber();
const restoredState = Storage.hasChangesState.get(serialNumber);
if (restoredState !== null) {
this.has_changes_to_write = restoredState;
this._updateUI();
}
} catch (e) {
console.warn('Failed to restore changes state:', e);
}
}
/**
* Update UI based on current has_changes_to_write state
*/
_updateUI() {
const saveBtn = $("#savechanges");
saveBtn
.prop('disabled', !this.has_changes_to_write)
.toggleClass('btn-success', this.has_changes_to_write)
.toggleClass('btn-outline-secondary', !this.has_changes_to_write);
}
/**
* Clear controller state: remove storage entry and reset UI
* @private
*/
async _clearControllerState() {
if (this.currentController) {
try {
const serialNumber = await this.currentController.getSerialNumber();
Storage.hasChangesState.clear(serialNumber);
} catch (e) {
console.warn('Failed to clear storage:', e);
}
}
this.has_changes_to_write = false;
this._updateUI();
}
/**
* Set the current controller instance
* @param {BaseController} controller Controller instance
*/
setControllerInstance(instance) {
this.currentController = instance;
if (instance) {
this._restoreHasChangesState().catch(e => console.warn('Failed to restore changes state:', e));
}
}
/**
@@ -158,13 +222,9 @@ class ControllerManager {
if (hasChanges === this.has_changes_to_write)
return;
const saveBtn = $("#savechanges");
saveBtn
.prop('disabled', !hasChanges)
.toggleClass('btn-success', hasChanges)
.toggleClass('btn-outline-secondary', !hasChanges);
this.has_changes_to_write = hasChanges;
this._updateUI();
this._saveHasChangesState().catch(e => console.warn('Failed to save changes state:', e));
}
// Unified controller operations that delegate to the current controller
@@ -173,7 +233,7 @@ class ControllerManager {
* Flash/save changes to the controller
*/
async flash(progressCallback = null) {
this.setHasChangesToWrite(false);
await this._clearControllerState();
return this.currentController.flash(progressCallback);
}
@@ -181,7 +241,8 @@ class ControllerManager {
* Reset the controller
*/
async reset() {
await this.currentController.reset();
await this._clearControllerState();
return this.currentController.reset();
}
/**
@@ -211,7 +272,7 @@ class ControllerManager {
async calibrateSticksBegin() {
const res = await this.currentController.calibrateSticksBegin();
if (!res.ok) {
throw new Error(`${l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
throw new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG), { cause: res.error });
}
}
@@ -245,7 +306,7 @@ class ControllerManager {
async calibrateRangeBegin() {
const res = await this.currentController.calibrateRangeBegin();
if (!res.ok) {
throw new Error(`${l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
throw new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG), { cause: res.error });
}
}
@@ -253,6 +314,9 @@ class ControllerManager {
* Handle range calibration on close
*/
async calibrateRangeOnClose() {
if(!this.currentController) {
return { success: false };
}
const res = await this.currentController.calibrateRangeEnd();
if(res?.ok) {
this.setHasChangesToWrite(true);
@@ -575,7 +639,7 @@ class ControllerManager {
/**
* Convert battery percentage to display text with icons
*/
_batteryPercentToText({bat_capacity, is_charging, is_error}) {
_batteryPercentToText({charge_level, is_charging, is_error}) {
if (is_error) {
return '<font color="red">' + l("error") + '</font>';
}
@@ -587,10 +651,10 @@ class ControllerManager {
{ threshold: 80, icon: 'fa-battery-three-quarters' },
];
const icon_txt = batteryIcons.find(item => bat_capacity < item.threshold)?.icon || 'fa-battery-full';
const icon_txt = batteryIcons.find(item => charge_level < item.threshold)?.icon || 'fa-battery-full';
const icon_full = `<i class="fa-solid ${icon_txt}"></i>`;
const bolt_txt = is_charging ? '<i class="fa-solid fa-bolt"></i>' : '';
return [`${bat_capacity}%`, icon_full, bolt_txt].join(' ');
return [`${charge_level}%`, icon_full, bolt_txt].join(' ');
}
/**

View File

@@ -35,6 +35,10 @@ class BaseController {
return this.finetuneMaxValue;
}
getNumberOfSticks() {
return 0;
}
/**
* Set input report handler
* @param {Function} handler Input report handler function
@@ -96,6 +100,14 @@ class BaseController {
}
}
/**
* Get the serial number of the device
* @returns {Promise<string>} The device serial number
*/
async getSerialNumber() {
throw new Error('getSerialNumber() must be implemented by subclass');
}
// Abstract methods that must be implemented by subclasses
async getInfo() {
throw new Error('getInfo() must be implemented by subclass');

View File

@@ -3,6 +3,7 @@
import DS4Controller from './ds4-controller.js';
import DS5Controller from './ds5-controller.js';
import DS5EdgeController from './ds5-edge-controller.js';
import VR2Controller from './vr2-controller.js';
import { dec2hex } from '../utils.js';
/**
@@ -14,7 +15,9 @@ class ControllerFactory {
const ds4v2 = { vendorId: 0x054c, productId: 0x09cc };
const ds5 = { vendorId: 0x054c, productId: 0x0ce6 };
const ds5edge = { vendorId: 0x054c, productId: 0x0df2 };
return [ds4v1, ds4v2, ds5, ds5edge];
const vr2_left = { vendorId: 0x054c, productId: 0x0e45 };
const vr2_right = { vendorId: 0x054c, productId: 0x0e46 };
return [ds4v1, ds4v2, ds5, ds5edge, vr2_left, vr2_right];
}
@@ -35,6 +38,12 @@ class ControllerFactory {
case 0x0df2: // DS5 Edge
return new DS5EdgeController(device);
case 0x0e45: // VR2 Left
return new VR2Controller(device, true);
case 0x0e46: // VR2 Right
return new VR2Controller(device, false);
default:
throw new Error(`Unsupported device: ${dec2hex(device.vendorId)}:${dec2hex(device.productId)}`);
}
@@ -55,6 +64,10 @@ class ControllerFactory {
return "Sony DualSense";
case 0x0df2:
return "Sony DualSense Edge";
case 0x0e45:
return "VR2 Left Controller";
case 0x0e46:
return "VR2 Right Controller";
default:
return "Unknown Device";
}
@@ -73,8 +86,10 @@ class ControllerFactory {
showInfo: false,
showFinetune: false,
showInfoTab: false,
showQuickTests: true,
showFourStepCalib: true,
showQuickCalib: false
showQuickCalib: false,
showCalibrationHistory: false
};
case 0x0ce6: // DS5
@@ -83,8 +98,21 @@ class ControllerFactory {
showInfo: true,
showFinetune: true,
showInfoTab: true,
showQuickTests: true,
showFourStepCalib: false,
showQuickCalib: true
showQuickCalib: true,
showCalibrationHistory: true
};
case 0x0e45: // VR2 Left Controller
case 0x0e46: // VR2 Right Controller
return {
showInfo: true,
showFinetune: false,
showInfoTab: true,
showQuickTests: false,
showFourStepCalib: true,
showQuickCalib: false
};
default:
@@ -92,8 +120,10 @@ class ControllerFactory {
showInfo: false,
showFinetune: false,
showInfoTab: false,
showQuickTests: false,
showFourStepCalib: false,
showQuickCalib: false
showQuickCalib: false,
showCalibrationHistory: false
};
}
}

View File

@@ -11,8 +11,6 @@ import {
} from '../utils.js';
import { l } from '../translations.js';
const NOT_GENUINE_SONY_CONTROLLER_MSG = "Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.";
// DS4 Button mapping configuration
const DS4_BUTTON_MAP = [
{ name: 'up', byte: 4, mask: 0x0 }, // Dpad handled separately
@@ -133,6 +131,10 @@ class DS4Controller extends BaseController {
return DS4_INPUT_CONFIG;
}
async getSerialNumber() {
return await this.getBdAddr();
}
async getInfo() {
// Device-only: collect info and return a common structure; do not touch the DOM
try {
@@ -169,18 +171,21 @@ class DS4Controller extends BaseController {
deviceTypeText = l("clone");
}
const hw_version = `${dec2hex(hw_ver_major)}:${dec2hex(hw_ver_minor)}`;
const sw_version = `${dec2hex(sw_ver_major)}:${dec2hex(sw_ver_minor)}`;
const infoItems = [
{ key: l("Build Date"), value: `${k1} ${k2}`, cat: "fw" },
{ key: l("HW Version"), value: `${dec2hex(hw_ver_major)}:${dec2hex(hw_ver_minor)}`, cat: "hw" },
{ key: l("SW Version"), value: `${dec2hex32(sw_ver_major)}:${dec2hex(sw_ver_minor)}`, cat: "fw" },
{ key: l("HW Version"), value: hw_version, cat: "hw" },
{ key: l("SW Version"), value: sw_version, cat: "fw" },
{ key: l("Device Type"), value: deviceTypeText, cat: "hw", severity: is_clone ? 'danger' : undefined },
];
const board_model = this.hwToBoardModel(hw_ver_minor);
const bd_addr = await this.getBdAddr();
if(!is_clone) {
// Add Board Model (UI will append the info icon)
infoItems.push({ key: l("Board Model"), value: this.hwToBoardModel(hw_ver_minor), cat: "hw", addInfoIcon: 'board' });
const bd_addr = await this.getBdAddr();
infoItems.push({ key: l("Board Model"), value: board_model, cat: "hw", addInfoIcon: 'board', copyable: true });
infoItems.push({ key: l("Bluetooth Address"), value: bd_addr, cat: "hw" });
}
@@ -188,6 +193,8 @@ class DS4Controller extends BaseController {
const rare = this.isRare(hw_ver_minor);
const disable_bits = is_clone ? 1 : 0; // 1: clone
la("ds4_get_info", { hw_version, board_model, bd_addr, is_clone }); // Collect Bluetooth address for analytics
return { ok: true, infoItems, nv, disable_bits, rare };
} catch(error) {
// Return error but do not touch DOM
@@ -256,7 +263,7 @@ class DS4Controller extends BaseController {
la("ds4_calibrate_range_begin_failed", {"d1": d1, "d2": d2});
return {
ok: false,
error: new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
error: new Error(`Stick range calibration begin failed: ${d1}, ${d2}`),
code: 1, d1, d2
};
}
@@ -304,7 +311,7 @@ class DS4Controller extends BaseController {
la("ds4_calibrate_sticks_begin_failed", {"d1": d1, "d2": d2});
return {
ok: false,
error: new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
error: new Error(`Stick center calibration begin failed: ${d1}, ${d2}`),
code: 1, d1, d2,
};
}
@@ -420,29 +427,29 @@ class DS4Controller extends BaseController {
const bat_status = (bat >> 4) & 1;
const cable_connected = bat_status === 1;
let bat_capacity = 0;
let charge_level = 0;
let is_charging = false;
let is_error = false;
if (cable_connected) {
if (bat_data < 10) {
bat_capacity = Math.min(bat_data * 10 + 5, 100);
charge_level = Math.min(bat_data * 10 + 5, 100);
is_charging = true;
} else if (bat_data === 10) {
bat_capacity = 100;
charge_level = 100;
is_charging = true;
} else if (bat_data === 11) {
bat_capacity = 100; // Fully charged
charge_level = 100; // Fully charged
} else {
bat_capacity = 0;
charge_level = 0;
is_error = true;
}
} else {
// On battery power
bat_capacity = bat_data < 10 ? bat_data * 10 + 5 : 100;
charge_level = bat_data < 10 ? bat_data * 10 + 5 : 100;
}
return { bat_capacity, cable_connected, is_charging, is_error };
return { charge_level, cable_connected, is_charging, is_error };
}
/**
@@ -691,6 +698,10 @@ class DS4Controller extends BaseController {
}
}
getNumberOfSticks() {
return 2;
}
/**
* Get the list of supported quick tests for DS4 controller
* DS4 does not support adaptive triggers, speaker, or microphone

View File

@@ -193,7 +193,9 @@ class DS5OutputStruct {
}
}
function ds5_color(x) {
function ds5_color(serialNumber) {
// Color is obtained by the 5th and 6th characters of the serial number
// e.g. A12305xxx0000000 -> '05' -> Starlight Blue
const colorMap = {
'00': 'White',
'01': 'Midnight Black',
@@ -214,9 +216,10 @@ function ds5_color(x) {
'Z3': 'Astro Bot',
'Z4': 'Fortnite',
'Z6': 'The Last of Us',
'ZB': 'Icon Blue Limited Edition',
};
const colorCode = x.slice(4, 6);
const colorCode = serialNumber.slice(4, 6);
const colorName = colorMap[colorCode] || 'Unknown';
return colorName;
}
@@ -266,6 +269,10 @@ class DS5Controller extends BaseController {
return DS5_INPUT_CONFIG;
}
async getSerialNumber() {
return await this.getSystemInfo(1, 19, 17);
}
async getInfo() {
return this._getInfo(false);
}
@@ -298,16 +305,16 @@ class DS5Controller extends BaseController {
const serial_number = await this.getSystemInfo(1, 19, 17);
const color = ds5_color(serial_number);
const infoItems = [
{ key: l("Serial Number"), value: serial_number, cat: "hw" },
{ key: l("MCU Unique ID"), value: await this.getSystemInfo(1, 9, 9, false), cat: "hw", isExtra: true },
{ key: l("Serial Number"), value: serial_number, cat: "hw", copyable: true },
{ key: l("MCU Unique ID"), value: await this.getSystemInfo(1, 9, 9, false), cat: "hw", isExtra: true, copyable: true },
{ key: l("PCBA ID"), value: reverse_str(await this.getSystemInfo(1, 17, 14)), cat: "hw", isExtra: true },
{ key: l("Battery Barcode"), value: await this.getSystemInfo(1, 24, 23), cat: "hw", isExtra: true },
{ key: l("VCM Left Barcode"), value: await this.getSystemInfo(1, 26, 16), cat: "hw", isExtra: true },
{ key: l("VCM Right Barcode"), value: await this.getSystemInfo(1, 28, 16), cat: "hw", isExtra: true },
{ key: l("Battery Barcode"), value: await this.getSystemInfo(1, 24, 23), cat: "hw", isExtra: true, copyable: true },
{ key: l("VCM Left Barcode"), value: await this.getSystemInfo(1, 26, 16), cat: "hw", isExtra: true, copyable: true },
{ key: l("VCM Right Barcode"), value: await this.getSystemInfo(1, 28, 16), cat: "hw", isExtra: true, copyable: true },
{ key: l("Color"), value: l(color), cat: "hw", addInfoIcon: 'color' },
{ key: l("Color"), value: l(color), cat: "hw", addInfoIcon: 'color', copyable: true },
...(is_edge ? [] : [{ key: l("Board Model"), value: this.hwToBoardModel(hwinfo), cat: "hw", addInfoIcon: 'board' }]),
...(is_edge ? [] : [{ key: l("Board Model"), value: this.hwToBoardModel(hwinfo), cat: "hw", addInfoIcon: 'board', copyable: true }]),
{ key: l("FW Build Date"), value: build_date + " " + build_time, cat: "fw" },
{ key: l("FW Type"), value: "0x" + dec2hex(fwtype), cat: "fw", isExtra: true },
@@ -320,7 +327,7 @@ class DS5Controller extends BaseController {
{ key: l("Venom FW Version"), value: "0x" + dec2hex32(fwversion2), cat: "fw", isExtra: true },
{ key: l("Spider FW Version"), value: "0x" + dec2hex32(fwversion3), cat: "fw", isExtra: true },
{ key: l("Touchpad ID"), value: await this.getSystemInfo(5, 2, 8, false), cat: "hw", isExtra: true },
{ key: l("Touchpad ID"), value: await this.getSystemInfo(5, 2, 8, false), cat: "hw", isExtra: true, copyable: true },
{ key: l("Touchpad FW Version"), value: await this.getSystemInfo(5, 4, 8, false), cat: "fw", isExtra: true },
];
@@ -538,6 +545,10 @@ class DS5Controller extends BaseController {
if(a == 0x05) return "BDM-030";
if(a == 0x06) return "BDM-040";
if(a == 0x07 || a == 0x08) return "BDM-050";
// TODO 0x09..0x10?
if(a == 0x11) return "BDM-060M";
// TODO 0x12?
if(a == 0x13) return "BDM-060X";
return l("Unknown");
}
@@ -830,6 +841,10 @@ class DS5Controller extends BaseController {
}
}
getNumberOfSticks() {
return 2;
}
/**
* Parse DS5 battery status from input data
*/
@@ -840,7 +855,7 @@ class DS5Controller extends BaseController {
const bat_charge = bat & 0x0f;
const bat_status = bat >> 4;
let bat_capacity = 0;
let charge_level = 0;
let cable_connected = false;
let is_charging = false;
let is_error = false;
@@ -848,32 +863,33 @@ class DS5Controller extends BaseController {
switch (bat_status) {
case 0:
// On battery power
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
charge_level = Math.min(bat_charge * 10 + 5, 100);
break;
case 1:
// Charging
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
charge_level = Math.min(bat_charge * 10 + 5, 100);
is_charging = true;
cable_connected = true;
break;
case 2:
// Fully charged
bat_capacity = 100;
charge_level = 100;
cable_connected = true;
break;
case 15:
// Battery is flat
bat_capacity = 0;
charge_level = 0;
is_charging = true;
cable_connected = true;
break;
case 11: // not sure yet what this error means
default:
// Error state
is_error = true;
break;
}
return { bat_capacity, cable_connected, is_charging, is_error };
return { charge_level, cable_connected, is_charging, is_error };
}
}

View File

@@ -50,14 +50,25 @@ class DS5EdgeController extends DS5Controller {
}
async getBarcode() {
await this.sendFeatureReport(0x80, [21,34]);
await sleep(100);
const data = await this.receiveFeatureReport(0x81);
const td = new TextDecoder();
const r_bc = td.decode(data.buffer.slice(21, 21+17));
const l_bc = td.decode(data.buffer.slice(40, 40+17));
return [r_bc, l_bc];
try {
const td = new TextDecoder();
await this.sendFeatureReport(0x80, [21,34,0]);
await sleep(100);
const r_data = await this.receiveFeatureReport(0x81);
const r_bc = td.decode(r_data.buffer.slice(21, 21+17));
await this.sendFeatureReport(0x80, [21,34,1]);
await sleep(100);
const l_data = await this.receiveFeatureReport(0x81);
const l_bc = td.decode(l_data.buffer.slice(21, 21+17));
return [l_bc, r_bc];
} catch(error) {
la("ds5_edge_barcode_modules_failed", {"r": error});
throw new Error(l("Cannot read module barcodes"), { cause: error });
}
}
async unlockModule(i) {
@@ -242,6 +253,11 @@ class DS5EdgeController extends DS5Controller {
const pkg = data.reduce((acc, val) => acc.concat([val & 0xff, val >> 8]), [12, 1]);
await this.sendFeatureReport(0x80, pkg)
}
getNumberOfSticks() {
return 2;
}
}
export default DS5EdgeController;

View File

@@ -0,0 +1,646 @@
'use strict';
import BaseController from './base-controller.js';
import {
sleep,
buf2hex,
dec2hex,
dec2hex32,
dec2hex8,
format_mac_from_view,
reverse_str,
la,
} from '../utils.js';
import { l } from '../translations.js';
// DS5 Button mapping configuration
const DS5_BUTTON_MAP = [
{ name: 'up', byte: 0, mask: 0x0 }, // Disabled
{ name: 'right', byte: 0, mask: 0x0 }, // Disabled
{ name: 'down', byte: 0, mask: 0x0 }, // Disabled
{ name: 'left', byte: 0, mask: 0x0 }, // Disabled
{ name: 'square', byte: 9, mask: 0x10, svg: 'Square' },
{ name: 'cross', byte: 9, mask: 0x20, svg: 'Cross' },
{ name: 'circle', byte: 9, mask: 0x40, svg: 'Circle' },
{ name: 'triangle', byte: 9, mask: 0x80, svg: 'Triangle' },
{ name: 'l1', byte: 9, mask: 0x10, svg: 'L1' },
{ name: 'l2', byte: 4, mask: 0xff }, // analog handled separately
{ name: 'r1', byte: 9, mask: 0x20, svg: 'R1' },
{ name: 'r2', byte: 4, mask: 0xff }, // analog handled separately
{ name: 'create', byte: 10, mask: 0x01, svg: 'Create' },
{ name: 'options', byte: 10, mask: 0x02, svg: 'Options' },
{ name: 'l3', byte: 10, mask: 0x04, svg: 'L3' },
{ name: 'r3', byte: 10, mask: 0x08, svg: 'R3' },
{ name: 'ps', byte: 10, mask: 0x10, svg: 'PS' },
{ name: 'touchpad', byte: 0, mask: 0x00, svg: 'Trackpad' },
{ name: 'mute', byte: 0, mask: 0x00, svg: 'Mute' },
];
// DS5 Input processing configuration
const DS5_INPUT_CONFIG = {
buttonMap: DS5_BUTTON_MAP,
dpadByte: 7,
l2AnalogByte: 4,
r2AnalogByte: 4,
touchpadOffset: 32,
};
// DS5 Adaptive Trigger Effect Modes
const DS5_TRIGGER_EFFECT_MODE = {
OFF: 0x00, // No effect
RESISTANCE: 0x01, // Constant resistance
TRIGGER: 0x02, // Single-trigger effect with release
AUTO_TRIGGER: 0x06, // Automatic trigger with vibration
};
// DS5 Output Report Constants
const DS5_OUTPUT_REPORT = {
USB_REPORT_ID: 0x02,
BT_REPORT_ID: 0x31,
}
const DS5_VALID_FLAG0 = {
RIGHT_VIBRATION: 0x01, // Bit 0 for right vibration motor
LEFT_VIBRATION: 0x02, // Bit 1 for left vibration motor
LEFT_TRIGGER: 0x04, // Bit 2 for left adaptive trigger
RIGHT_TRIGGER: 0x08, // Bit 3 for right adaptive trigger
HEADPHONE_VOLUME: 0x10, // Bit 4 for headphone volume control
SPEAKER_VOLUME: 0x20, // Bit 5 for speaker volume control
MIC_VOLUME: 0x40, // Bit 6 for microphone volume control
AUDIO_CONTROL: 0x80, // Bit 7 for audio control
};
const DS5_VALID_FLAG1 = {
MUTE_LED: 0x01, // Bit 0 for mute LED control
POWER_SAVE_MUTE: 0x02, // Bit 1 for power-save mute control
LIGHTBAR_COLOR: 0x04, // Bit 2 for lightbar color control
RESERVED_BIT_3: 0x08, // Bit 3 (reserved)
PLAYER_INDICATOR: 0x10, // Bit 4 for player indicator LED control
LED_BRIGHTNESS: 0x20, // Bit 6 for LED brightness control
LIGHTBAR_SETUP: 0x40, // Bit 6 for lightbar setup control
RESERVED_BIT_7: 0x80, // Bit 7 (reserved)
}
const DS5_VALID_FLAG2 = {
LED_BRIGHTNESS: 0x01, // Bit 0 for LED brightness control
LIGHTBAR_SETUP: 0x02, // Bit 1 for lightbar setup control
};
// Basic DS5 Output Structure for adaptive trigger control
class DS5OutputStruct {
constructor(currentState = null) {
// Create a 47-byte buffer for DS5 output report (USB)
this.buffer = new ArrayBuffer(47);
this.view = new DataView(this.buffer);
// Control flags
this.validFlag0 = currentState.validFlag0 || 0;
this.validFlag1 = currentState.validFlag1 || 0;
this.validFlag2 = currentState.validFlag2 || 0;
// Vibration motors
this.bcVibrationRight = currentState.bcVibrationRight || 0;
this.bcVibrationLeft = currentState.bcVibrationLeft || 0;
// Audio control
this.headphoneVolume = currentState.headphoneVolume || 0;
this.speakerVolume = currentState.speakerVolume || 0;
this.micVolume = currentState.micVolume || 0;
this.audioControl = currentState.audioControl || 0;
this.audioControl2 = currentState.audioControl2 || 0;
// LED and indicator control
this.muteLedControl = currentState.muteLedControl || 0;
this.powerSaveMuteControl = currentState.powerSaveMuteControl || 0;
this.lightbarSetup = currentState.lightbarSetup || 0;
this.ledBrightness = currentState.ledBrightness || 0;
this.playerIndicator = currentState.playerIndicator || 0;
this.ledCRed = currentState.ledCRed || 0;
this.ledCGreen = currentState.ledCGreen || 0;
this.ledCBlue = currentState.ledCBlue || 0;
// Adaptive trigger parameters
this.adaptiveTriggerLeftMode = currentState.adaptiveTriggerLeftMode || 0;
this.adaptiveTriggerLeftParam0 = currentState.adaptiveTriggerLeftParam0 || 0;
this.adaptiveTriggerLeftParam1 = currentState.adaptiveTriggerLeftParam1 || 0;
this.adaptiveTriggerLeftParam2 = currentState.adaptiveTriggerLeftParam2 || 0;
this.adaptiveTriggerRightMode = currentState.adaptiveTriggerRightMode || 0;
this.adaptiveTriggerRightParam0 = currentState.adaptiveTriggerRightParam0 || 0;
this.adaptiveTriggerRightParam1 = currentState.adaptiveTriggerRightParam1 || 0;
this.adaptiveTriggerRightParam2 = currentState.adaptiveTriggerRightParam2 || 0;
// Haptic feedback
this.hapticVolume = currentState.hapticVolume || 0;
}
// Pack the data into the output buffer
pack() {
// Based on DS5 output report structure from HID descriptor
// Byte 0-1: Control flags (16-bit little endian)
this.view.setUint16(0, (this.validFlag1 << 8) | this.validFlag0, true);
// Byte 2-3: Vibration motors
this.view.setUint8(2, this.bcVibrationRight);
this.view.setUint8(3, this.bcVibrationLeft);
// Bytes 4-7: Audio control (reserved for now)
this.view.setUint8(4, this.headphoneVolume);
this.view.setUint8(5, this.speakerVolume);
this.view.setUint8(6, this.micVolume);
this.view.setUint8(7, this.audioControl);
// Byte 8: Mute LED control
this.view.setUint8(8, this.muteLedControl);
// Byte 9: Reserved
this.view.setUint8(9, 0);
// Bytes 10-20: Right adaptive trigger
this.view.setUint8(10, this.adaptiveTriggerRightMode);
this.view.setUint8(11, this.adaptiveTriggerRightParam0);
this.view.setUint8(12, this.adaptiveTriggerRightParam1);
this.view.setUint8(13, this.adaptiveTriggerRightParam2);
// Additional trigger parameters (bytes 14-20 reserved for extended params)
for (let i = 14; i <= 20; i++) {
this.view.setUint8(i, 0);
}
// Bytes 21-31: Left adaptive trigger
this.view.setUint8(21, this.adaptiveTriggerLeftMode);
this.view.setUint8(22, this.adaptiveTriggerLeftParam0);
this.view.setUint8(23, this.adaptiveTriggerLeftParam1);
this.view.setUint8(24, this.adaptiveTriggerLeftParam2);
// Additional trigger parameters (bytes 25-31 reserved for extended params)
for (let i = 25; i <= 31; i++) {
this.view.setUint8(i, 0);
}
// Bytes 32-42: Reserved
for (let i = 32; i <= 42; i++) {
this.view.setUint8(i, 0);
}
// Byte 43: Player LED indicator
this.view.setUint8(43, this.playerIndicator);
// Bytes 44-46: Lightbar RGB
this.view.setUint8(44, this.ledCRed);
this.view.setUint8(45, this.ledCGreen);
this.view.setUint8(46, this.ledCBlue);
return this.buffer;
}
}
/**
* VR2 Controller implementation
*/
class VR2Controller extends BaseController {
constructor(device, isLeft) {
super(device);
this.model = "VR2";
this.finetuneMaxValue = 65535; // 16-bit max value for DS5
// Initialize current output state to track controller settings
this.currentOutputState = {
validFlag0: 0,
validFlag1: 0,
validFlag2: 0,
bcVibrationRight: 0,
bcVibrationLeft: 0,
headphoneVolume: 0,
speakerVolume: 0,
micVolume: 0,
audioControl: 0,
audioControl2: 0,
muteLedControl: 0,
powerSaveMuteControl: 0,
lightbarSetup: 0,
ledBrightness: 0,
playerIndicator: 0,
ledCRed: 0,
ledCGreen: 0,
ledCBlue: 0,
adaptiveTriggerLeftMode: 0,
adaptiveTriggerLeftParam0: 0,
adaptiveTriggerLeftParam1: 0,
adaptiveTriggerLeftParam2: 0,
adaptiveTriggerRightMode: 0,
adaptiveTriggerRightParam0: 0,
adaptiveTriggerRightParam1: 0,
adaptiveTriggerRightParam2: 0,
hapticVolume: 0
};
}
getInputConfig() {
return DS5_INPUT_CONFIG;
}
async getSerialNumber() {
return await this.getSystemInfo(1, 19, 17);
}
async getInfo() {
return this._getInfo(false);
}
async _getInfo(is_edge) {
// Device-only: collect info and return a common structure; do not touch the DOM
try {
console.log("Fetching controller info...");
const view = await this.receiveFeatureReport(0x20);
console.log("Got VR2 info report:", buf2hex(view.buffer));
const cmd = view.getUint8(0, true);
if(cmd != 0x20 || view.buffer.byteLength != 64)
return { ok: false, error: new Error("Invalid response for ds5_info") };
const build_date = new TextDecoder().decode(view.buffer.slice(1, 1+11));
const build_time = new TextDecoder().decode(view.buffer.slice(12, 20));
const fwtype = view.getUint16(20, true);
const swseries = view.getUint16(22, true);
const hwinfo = view.getUint32(24, true);
const fwversion = view.getUint32(28, true);
const updversion = view.getUint16(44, true);
const unk = view.getUint8(46, true);
const fwversion1 = view.getUint32(48, true);
const fwversion2 = view.getUint32(52, true);
const fwversion3 = view.getUint32(56, true);
const serial_number = await this.getSystemInfo(1, 19, 17);
const infoItems = [
{ key: l("Serial Number"), value: serial_number, cat: "hw" },
{ key: l("MCU Unique ID"), value: await this.getSystemInfo(1, 9, 9, false), cat: "hw", isExtra: true },
{ key: l("PCBA ID"), value: reverse_str(await this.getSystemInfo(1, 17, 14)), cat: "hw", isExtra: true },
{ key: l("Battery Barcode"), value: await this.getSystemInfo(1, 24, 23), cat: "hw", isExtra: true },
{ key: l("VCM Left Barcode"), value: await this.getSystemInfo(1, 26, 16), cat: "hw", isExtra: true },
{ key: l("VCM Right Barcode"), value: await this.getSystemInfo(1, 28, 16), cat: "hw", isExtra: true },
...(is_edge ? [] : [{ key: l("Board Model"), value: this.hwToBoardModel(hwinfo), cat: "hw", addInfoIcon: 'board' }]),
{ key: l("FW Build Date"), value: build_date + " " + build_time, cat: "fw" },
{ key: l("FW Type"), value: "0x" + dec2hex(fwtype), cat: "fw", isExtra: true },
{ key: l("FW Series"), value: "0x" + dec2hex(swseries), cat: "fw", isExtra: true },
{ key: l("HW Model"), value: "0x" + dec2hex32(hwinfo), cat: "hw", isExtra: true },
{ key: l("FW Version"), value: "0x" + dec2hex32(fwversion), cat: "fw", isExtra: true },
{ key: l("FW Update"), value: "0x" + dec2hex(updversion), cat: "fw", isExtra: true },
{ key: l("FW Update Info"), value: "0x" + dec2hex8(unk), cat: "fw", isExtra: true },
{ key: l("SBL FW Version"), value: "0x" + dec2hex32(fwversion1), cat: "fw", isExtra: true },
{ key: l("Venom FW Version"), value: "0x" + dec2hex32(fwversion2), cat: "fw", isExtra: true },
{ key: l("Spider FW Version"), value: "0x" + dec2hex32(fwversion3), cat: "fw", isExtra: true },
{ key: l("Touchpad ID"), value: await this.getSystemInfo(5, 2, 8, false), cat: "hw", isExtra: true },
{ key: l("Touchpad FW Version"), value: await this.getSystemInfo(5, 4, 8, false), cat: "fw", isExtra: true },
];
const old_controller = build_date.search(/ 2020| 2021/);
let disable_bits = 0;
if(old_controller != -1) {
la("vr2_info_error", {"r": "old"})
disable_bits |= 2; // 2: outdated firmware
}
const nv = await this.queryNvStatus();
const bd_addr = await this.getBdAddr();
infoItems.push({ key: l("Bluetooth Address"), value: bd_addr, cat: "hw", isExtra: true });
const pending_reboot = (nv?.status === 'pending_reboot');
return { ok: true, infoItems, nv, disable_bits, pending_reboot };
} catch(error) {
la("vr2_info_error", {"r": error})
return { ok: false, error, disable_bits: 1 };
}
}
async flash(progressCallback = null) {
la("vr2_flash");
try {
await this.nvsUnlock();
const lockRes = await this.nvsLock();
if(!lockRes.ok) throw (lockRes.error || new Error("NVS lock failed"));
return { success: true, message: l("Changes saved successfully") };
} catch(error) {
throw new Error(l("Error while saving changes"), { cause: error });
}
}
async reset() {
la("vr2_reset");
try {
await this.sendFeatureReport(0x80, [1,1]);
} catch(error) {
}
}
async nvsLock() {
// la("vr2_nvlock");
try {
await this.sendFeatureReport(0x80, [3,1]);
await this.receiveFeatureReport(0x81);
return { ok: true };
} catch(error) {
return { ok: false, error };
}
}
async nvsUnlock() {
// la("vr2_nvunlock");
try {
await this.sendFeatureReport(0x80, [3,2, 101, 50, 64, 12]);
const data = await this.receiveFeatureReport(0x81);
} catch(error) {
await sleep(500);
throw new Error(l("NVS Unlock failed"), { cause: error });
}
}
async getBdAddr() {
await this.sendFeatureReport(0x80, [9,2]);
const data = await this.receiveFeatureReport(0x81);
return format_mac_from_view(data, 4);
}
async getSystemInfo(base, num, length, decode = true) {
await this.sendFeatureReport(128, [base,num])
const pcba_id = await this.receiveFeatureReport(129);
if(pcba_id.getUint8(1) != base || pcba_id.getUint8(2) != num || pcba_id.getUint8(3) != 2) {
return l("error");
}
if(decode)
return new TextDecoder().decode(pcba_id.buffer.slice(4, 4+length));
return buf2hex(pcba_id.buffer.slice(4, 4+length));
}
async calibrateSticksBegin() {
la("vr2_calibrate_sticks_begin");
try {
// Begin
await this.sendFeatureReport(0x82, [1,1,1]);
// Assert
const data = await this.receiveFeatureReport(0x83);
if(data.getUint32(0, false) != 0x83010101) {
const d1 = dec2hex32(data.getUint32(0, false));
la("vr2_calibrate_sticks_begin_failed", {"d1": d1});
throw new Error(`Stick center calibration begin failed: ${d1}`);
}
return { ok: true };
} catch(error) {
la("vr2_calibrate_sticks_begin_failed", {"r": error});
return { ok: false, error };
}
}
async calibrateSticksSample() {
la("vr2_calibrate_sticks_sample");
try {
// Sample
await this.sendFeatureReport(0x82, [3,1,1]);
// Assert
const data = await this.receiveFeatureReport(0x83);
if(data.getUint32(0, false) != 0x83010101) {
const d1 = dec2hex32(data.getUint32(0, false));
la("vr2_calibrate_sticks_sample_failed", {"d1": d1});
throw new Error(`Stick center calibration sample failed: ${d1}`);
}
return { ok: true };
} catch(error) {
la("vr2_calibrate_sticks_sample_failed", {"r": error});
return { ok: false, error };
}
}
async calibrateSticksEnd() {
la("vr2_calibrate_sticks_end");
try {
// Write
await this.sendFeatureReport(0x82, [2,1,1]);
const data = await this.receiveFeatureReport(0x83);
if(data.getUint32(0, false) != 0x83010102) {
const d1 = dec2hex32(data.getUint32(0, false));
la("vr2_calibrate_sticks_failed", {"s": 3, "d1": d1});
throw new Error(`Stick center calibration end failed: ${d1}`);
}
return { ok: true };
} catch(error) {
la("vr2_calibrate_sticks_end_failed", {"r": error});
return { ok: false, error };
}
}
async calibrateRangeBegin() {
la("vr2_calibrate_range_begin");
try {
// Begin
await this.sendFeatureReport(0x82, [1,1,2]);
// Assert
const data = await this.receiveFeatureReport(0x83);
if(data.getUint32(0, false) != 0x83010201) {
const d1 = dec2hex32(data.getUint32(0, false));
la("vr2_calibrate_range_begin_failed", {"d1": d1});
throw new Error(`Stick range calibration begin failed: ${d1}`);
}
return { ok: true };
} catch(error) {
la("vr2_calibrate_range_begin_failed", {"r": error});
return { ok: false, error };
}
}
async calibrateRangeEnd() {
la("vr2_calibrate_range_end");
try {
// Write
await this.sendFeatureReport(0x82, [2,1,2]);
// Assert
const data = await this.receiveFeatureReport(0x83);
if(data.getUint32(0, false) != 0x83010202) {
const d1 = dec2hex32(data.getUint32(0, false));
la("vr2_calibrate_range_end_failed", {"d1": d1});
throw new Error(`Stick range calibration end failed: ${d1}`);
}
return { ok: true };
} catch(error) {
la("vr2_calibrate_range_end_failed", {"r": error});
return { ok: false, error };
}
}
async queryNvStatus() {
try {
await this.sendFeatureReport(0x80, [3,3]);
const data = await this.receiveFeatureReport(0x81);
const ret = data.getUint32(1, false);
if (ret === 0x15010100) {
return { device: 'ds5', status: 'pending_reboot', locked: null, code: 4, raw: ret };
}
if (ret === 0x03030201) {
return { device: 'ds5', status: 'locked', locked: true, mode: 'temporary', code: 1, raw: ret };
}
if (ret === 0x03030200) {
return { device: 'ds5', status: 'unlocked', locked: false, mode: 'permanent', code: 0, raw: ret };
}
if (ret === 1 || ret === 2) {
return { device: 'ds5', status: 'unknown', locked: null, code: 2, raw: ret };
}
return { device: 'ds5', status: 'unknown', locked: null, code: ret, raw: ret };
} catch (error) {
return { device: 'ds5', status: 'error', locked: null, code: 2, error };
}
}
hwToBoardModel(hw_ver) {
return l("Unknown");
}
async getInMemoryModuleData() {
// DualSense
await this.sendFeatureReport(0x80, [12, 2]);
await sleep(100);
const data = await this.receiveFeatureReport(0x81);
const cmd = data.getUint8(0, true);
const [p1, p2, p3] = [1, 2, 3].map(i => data.getUint8(i, true));
if(cmd != 129 || p1 != 12 || (p2 != 2 && p2 != 4) || p3 != 2)
return null;
return Array.from({ length: 12 }, (_, i) => data.getUint16(4 + i * 2, true));
}
async writeFinetuneData(data) {
const pkg = data.reduce((acc, val) => acc.concat([val & 0xff, val >> 8]), [12, 1]);
await this.sendFeatureReport(0x80, pkg);
}
/**
* Send output report to the DS5 controller
* @param {ArrayBuffer} data - The output report data
*/
async sendOutputReport(data, reason = "") {
if (!this.device?.opened) {
throw new Error('Device is not opened');
}
try {
console.log(`Sending output report${ reason ? ` to ${reason}` : '' }:`, DS5_OUTPUT_REPORT.USB_REPORT_ID, buf2hex(data));
await this.device.sendReport(DS5_OUTPUT_REPORT.USB_REPORT_ID, new Uint8Array(data));
} catch (error) {
throw new Error(`Failed to send output report: ${error.message}`);
}
}
/**
* Update the current output state with values from an OutputStruct
* @param {DS5OutputStruct} outputStruct - The output structure to copy state from
*/
updateCurrentOutputState(outputStruct) {
this.currentOutputState = { ...outputStruct };
}
/**
* Get a copy of the current output state
* @returns {Object} A copy of the current output state
*/
getCurrentOutputState() {
return { ...this.currentOutputState };
}
/**
* Initialize the current output state when the controller is first connected.
* Since DS5 controllers don't provide a way to read the current output state,
* this method sets up reasonable defaults and attempts to detect any current settings.
*/
async initializeCurrentOutputState() {
try {
// Reset all output state to known defaults
this.currentOutputState = {
...this.getCurrentOutputState(),
validFlag1: 0b1111_0111,
ledCRed: 0,
ledCGreen: 0,
ledCBlue: 255,
};
// Send a "reset" output report to ensure the controller is in a known state
// This will turn off any existing effects and set the controller to defaults
const resetOutputStruct = new DS5OutputStruct(this.currentOutputState);
await this.sendOutputReport(resetOutputStruct.pack(), 'init default states');
// Update our state to reflect what we just sent
this.updateCurrentOutputState(resetOutputStruct);
} catch (error) {
console.warn("Failed to initialize DS5 output state:", error);
// Even if the reset fails, we still have the default state initialized
}
}
/**
* Parse DS5 battery status from input data
*/
parseBatteryStatus(data) {
const bat = data.getUint8(52); // DS5 battery byte is at position 52
// DS5: bat_charge = low 4 bits, bat_status = high 4 bits
const bat_charge = bat & 0x0f;
const bat_status = bat >> 4;
let bat_capacity = 0;
let cable_connected = false;
let is_charging = false;
let is_error = false;
switch (bat_status) {
case 0:
// On battery power
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
break;
case 1:
// Charging
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
is_charging = true;
cable_connected = true;
break;
case 2:
// Fully charged
bat_capacity = 100;
cable_connected = true;
break;
case 15:
// Battery is flat
bat_capacity = 0;
is_charging = true;
cable_connected = true;
break;
default:
// Error state
is_error = true;
break;
}
return { bat_capacity, cable_connected, is_charging, is_error };
}
getNumberOfSticks() {
return 1;
}
getSupportedQuickTests() {
return [];
}
}
export default VR2Controller;

View File

@@ -1,19 +1,22 @@
'use strict';
import { sleep, float_to_str, dec2hex, dec2hex32, lerp_color, initAnalyticsApi, la, createCookie, readCookie } from './utils.js';
import { sleep, float_to_str, dec2hex, dec2hex32, lerp_color, initAnalyticsApi, la } from './utils.js';
import { Storage } from './storage.js';
import { initControllerManager } from './controller-manager.js';
import ControllerFactory from './controllers/controller-factory.js';
import { lang_init, l } from './translations.js';
import { loadAllTemplates } from './template-loader.js';
import { draw_stick_position, CIRCULARITY_DATA_SIZE } from './stick-renderer.js';
import { draw_stick_dial, CIRCULARITY_DATA_SIZE, calculateCircularityError } from './stick-renderer.js';
import { ds5_finetune, isFinetuneVisible, finetune_handle_controller_input } from './modals/finetune-modal.js';
import { calibrate_stick_centers, auto_calibrate_stick_centers } from './modals/calib-center-modal.js';
import { calibrate_range } from './modals/calib-range-modal.js';
import { calibrate_range, rangeCalibHandleControllerInput } from './modals/calib-range-modal.js';
import {
show_quick_test_modal,
isQuickTestVisible,
quicktest_handle_controller_input
} from './modals/quick-test-modal.js';
import { show_calibration_history_modal } from './modals/calibration-history-modal.js';
import { FinetuneHistory } from './finetune-history.js';
// Application State - manages app-wide state and UI
const app = {
@@ -22,6 +25,12 @@ const app = {
last_disable_btn: 0,
shownRangeCalibrationWarning: false,
failedCalibrationDetectionsCount: 0,
failedCalibrationModalShownCount: 0,
// Calibration method preference
centerCalibrationMethod: 'four-step', // 'quick' or 'four-step'
rangeCalibrationMethod: 'normal', // 'normal' or 'expert'
// Language and UI state
lang_orig_text: {},
@@ -107,12 +116,12 @@ function gboot() {
initAnalyticsApi(app); // init just with gu for now
lang_init(app, handleLanguageChange, show_welcome_modal);
show_welcome_modal();
initCalibrationMethod();
$("input[name='displayMode']").on('change', on_stick_mode_change);
// Setup edge modal "Don't show again" checkbox
$('#edgeModalDontShowAgain').on('change', function() {
localStorage.setItem('edgeModalDontShowAgain', this.checked.toString());
Storage.edgeModalDontShowAgain.set(this.checked);
});
}
@@ -132,6 +141,8 @@ function gboot() {
}
$("#offlinebar").show();
$("#aboutdrift").show();
updateLastConnectedInfo();
navigator.hid.addEventListener("disconnect", handleDisconnectedDevice);
}
@@ -209,12 +220,15 @@ async function continue_connection({data, device}) {
}
// Helper to apply basic UI visibility based on device type
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showFourStepCalib, showQuickCalib }) {
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showQuickTests, showFourStepCalib, showQuickCalib, showCalibrationHistory }) {
$("#infoshowall").toggle(!!showInfo);
$("#ds5finetune").toggle(!!showFinetune);
$("#info-tab").toggle(!!showInfoTab);
$("#quick-tests-div").css("visibility", showQuickTests ? "visible" : "hidden");
$("#four-step-center-calib").toggle(!!showFourStepCalib);
$("#quick-center-calib").toggle(!!showQuickCalib);
$("#quick-center-calib-group").toggle(!!showQuickCalib);
$("#restore-calibration-btn").toggle(!!showCalibrationHistory);
}
let controllerInstance = null;
@@ -259,14 +273,47 @@ async function continue_connection({data, device}) {
$("#onlinebar").show();
$("#mainmenu").show();
$("#resetBtn").show();
$("#aboutdrift").hide();
$("#d-nvstatus").text = l("Unknown");
$("#d-bdaddr").text = l("Unknown");
$('#controller-tab').tab('show');
const numOfSticks = controllerInstance.getNumberOfSticks();
if(numOfSticks == 2) {
$("#stick-item-rx").show();
$("#stick-item-ry").show();
} else if(numOfSticks == 1) {
$("#stick-item-rx").hide();
$("#stick-item-ry").hide();
} else {
throw new Error(`Invalid number of sticks: ${numOfSticks}`);
}
const model = controllerInstance.getModel();
// Save controller info to local storage
const lastConnectedInfo = {
deviceName: deviceName,
timestamp: new Date().toISOString(),
serialNumber: await controllerInstance.getSerialNumber(),
};
// Extract info from infoItems
if (info.infoItems && Array.isArray(info.infoItems)) {
for (const item of info.infoItems) {
if (item.key === l("Board Model")) {
lastConnectedInfo.boardModel = item.value;
} else if (item.key === l("Color")) {
lastConnectedInfo.color = item.value;
}
}
}
Storage.lastConnectedController.set(lastConnectedInfo);
updateLastConnectedInfo();
// Initialize SVG controller based on model
await init_svg_controller(model);
@@ -304,6 +351,28 @@ async function continue_connection({data, device}) {
if(model == "DS5_Edge") {
show_edge_modal();
}
if(model == "VR2") {
show_popup(l("<p>Support for PS VR2 controllers is <b>minimal and highly experimental</b>.</p><p>I currently don't own these controllers, so I cannot verify the calibration process myself.</p><p>If you'd like to help improve full support, you can contribute with a donation or even send the controllers for testing.</p><p>Feel free to contact me on Discord (the_al) or by email at ds4@the.al .</p><br><p>Thank you for your support!</p>"), true)
}
// Check for unsaved calibration changes
if (controller.has_changes_to_write) {
show_popup(`<p>${
l("It appears the latest joystick calibration has not been saved.")
}</p><p>${
l("You should save your changes, or reboot the controller to revert back to the previous state.")
}</p>`, true);
}
// Save finetune parameters for DS5 and Edge controllers
if (model === "DS5" || model === "DS5_Edge") {
if (!controller.has_changes_to_write) {
const finetuneData = await controllerInstance.getInMemoryModuleData();
const serialNumber = await controllerInstance.getSerialNumber();
FinetuneHistory.save(finetuneData, serialNumber);
}
}
} catch(err) {
await disconnect();
throw err;
@@ -321,6 +390,8 @@ async function disconnect() {
}
app.gj = 0;
app.disable_btn = 0;
app.shownRangeCalibrationWarning = false;
app.failedCalibrationDetectionsCount = 0;
update_disable_btn();
await controller.disconnect();
@@ -329,6 +400,45 @@ async function disconnect() {
$("#offlinebar").show();
$("#onlinebar").hide();
$("#mainmenu").hide();
$("#aboutdrift").show();
updateLastConnectedInfo();
}
function updateLastConnectedInfo() {
const $lastConnected = $("#lastConnected");
const $infoDiv = $("#lastConnectedInfo");
const info = Storage.lastConnectedController.get();
if (!info) {
console.log("No last connected info found.", $lastConnected);
$lastConnected.hide();
return;
}
try {
const parts = [];
if (info.color) parts.push(l(info.color));
if (info.boardModel) parts.push(info.boardModel);
if (info.deviceName) parts.push(info.deviceName);
let text = parts.join(" ");
if (info.serialNumber) {
text += ", " + l("serial number") + " " + info.serialNumber;
}
$infoDiv.text(text);
if (info.serialNumber) {
const hasChanges = Storage.hasChangesState.get(info.serialNumber);
const $warning = $("#lastConnectedWarning");
$warning.toggle(hasChanges);
}
$lastConnected.show();
} catch (error) {
console.error("Error parsing last connected info:", error);
$lastConnected.hide();
}
}
// Wrapper function for HTML onclick handlers
@@ -384,7 +494,7 @@ function set_edge_progress(score) {
}
function show_welcome_modal() {
const already_accepted = readCookie("welcome_accepted");
const already_accepted = Storage.getString("welcome_accepted");
if(already_accepted == "1")
return;
@@ -393,7 +503,7 @@ function show_welcome_modal() {
function welcome_accepted() {
la("welcome_accepted");
createCookie("welcome_accepted", "1");
Storage.setString("welcome_accepted", "1");
$("#welcomeModal").modal("hide");
}
@@ -406,6 +516,10 @@ async function init_svg_controller(model) {
svgFileName = 'dualshock-controller.svg';
} else if (model === 'DS5' || model === 'DS5_Edge') {
svgFileName = 'dualsense-controller.svg';
} else if (model === 'VR2') {
// Disable SVG controller for VR2
svgContainer.innerHTML = '';
return;
} else {
throw new Error(`Unknown controller model: ${model}`);
}
@@ -426,6 +540,9 @@ async function init_svg_controller(model) {
svgContainer.innerHTML = svgContent;
// Reset trackpad bounding box so it's recalculated for the new SVG
trackpadBbox = undefined;
const lightBlue = '#7ecbff';
const midBlue = '#3399cc';
const dualshock = document.getElementById('Controller');
@@ -467,9 +584,9 @@ function collectCircularityData(stickStates, leftData, rightData) {
}
}
function clear_circularity() {
ll_data.fill(0);
rr_data.fill(0);
function clear_circularity(leftOrRight = 'both') {
if(['left', 'both'].includes(leftOrRight)) ll_data.fill(0);
if(['right', 'both'].includes(leftOrRight)) rr_data.fill(0);
}
function reset_circularity_mode() {
@@ -481,35 +598,42 @@ function reset_circularity_mode() {
function refresh_stick_pos() {
if(!controller) return;
const hasSingleStick = (controller.currentController?.getNumberOfSticks() == 1);
const c = document.getElementById("stickCanvas");
const ctx = c.getContext("2d");
const sz = 60;
const hb = 20 + sz;
const yb = 15 + sz;
const w = c.width;
const hb = hasSingleStick ? w / 2 : 20 + sz;
ctx.clearRect(0, 0, c.width, c.height);
const { left: { x: plx, y: ply }, right: { x: prx, y: pry } } = controller.button_states.sticks;
const enable_zoom_center = center_zoom_checked();
const enable_circ_test = circ_checked();
// Draw left stick
draw_stick_position(ctx, hb, yb, sz, plx, ply, {
draw_stick_dial(ctx, hb, yb, sz, plx, ply, {
circularity_data: enable_circ_test ? ll_data : null,
enable_zoom_center,
});
// Draw right stick
draw_stick_position(ctx, w-hb, yb, sz, prx, pry, {
circularity_data: enable_circ_test ? rr_data : null,
enable_zoom_center,
});
if(!hasSingleStick) {
// Draw right stick
draw_stick_dial(ctx, w-hb, yb, sz, prx, pry, {
circularity_data: enable_circ_test ? rr_data : null,
enable_zoom_center,
});
}
const precision = enable_zoom_center ? 3 : 2;
$("#lx-lbl").text(float_to_str(plx, precision));
$("#ly-lbl").text(float_to_str(ply, precision));
$("#rx-lbl").text(float_to_str(prx, precision));
$("#ry-lbl").text(float_to_str(pry, precision));
if(!hasSingleStick) {
$("#rx-lbl").text(float_to_str(prx, precision));
$("#ry-lbl").text(float_to_str(pry, precision));
}
// Move L3 and R3 SVG elements according to stick position
try {
@@ -557,6 +681,17 @@ function refresh_stick_pos() {
} catch (e) {
// Fail silently if SVG not present
}
const circularityCheckIcon = document.getElementById('circularityCheckIcon');
if (!enable_circ_test) {
circularityCheckIcon.style.display = 'none';
return;
}
const ll_error = calculateCircularityError(ll_data);
const rr_error = calculateCircularityError(rr_data);
const isTooSmall = (ll_error && ll_error < 5 || rr_error && rr_error < 5);
circularityCheckIcon.style.display = isTooSmall ? 'block' : 'none';
}
const circ_checked = () => $("#checkCircularityMode").is(':checked');
@@ -596,7 +731,7 @@ const throttled_refresh_sticks = (() => {
const update_stick_graphics = (changes) => throttled_refresh_sticks(changes);
function update_battery_status({/* bat_capacity, cable_connected, is_charging, is_error, */ bat_txt, changed}) {
function update_battery_status({/* charge_level, cable_connected, is_charging, is_error, */ bat_txt, changed}) {
if(changed) {
$("#d-bat").html(bat_txt);
}
@@ -722,18 +857,48 @@ function detectFailedRangeCalibration(changes) {
const hasOpenModals = document.querySelectorAll('.modal.show').length > 0;
if (failedCalibration && !app.shownRangeCalibrationWarning && !hasOpenModals) {
app.failedCalibrationDetectionsCount++;
if (app.failedCalibrationDetectionsCount < 5) {
return; // require 5 consecutive detections
}
app.failedCalibrationModalShownCount++;
Storage.failedCalibrationCount.set(app.failedCalibrationModalShownCount);
app.shownRangeCalibrationWarning = true;
show_popup(l("Range calibration appears to have failed. Please try again and make sure you rotate the sticks."));
if (app.failedCalibrationCount <= 6) { // keep it from getting annoying
show_popup(l("Range calibration appears to have failed. Please try again and make sure you rotate the sticks."));
}
}
}
function isRangeCalibrationVisible() {
const modal = document.getElementById('rangeModal');
if (!modal) return false;
return modal.classList.contains('show');
}
// Callback function to handle UI updates after controller input processing
function handleControllerInput({ changes, inputConfig, touchPoints, batteryStatus }) {
const { buttonMap } = inputConfig;
// Open Quick Test modal if options button is pressed while L1 is held down
if (changes.options && controller.button_states.l1) {
update_ds_button_svg({ l1: false }, buttonMap); // Clear L1
show_quick_test_modal(controller);
return;
}
// Update range calibration modal stick visualization if visible
if (isRangeCalibrationVisible() && changes.sticks) {
collectCircularityData(changes.sticks, ll_data, rr_data);
rangeCalibHandleControllerInput(changes);
return;
}
// Handle Quick Test Modal input (can be open from any tab)
if (isQuickTestVisible()) {
quicktest_handle_controller_input(changes);
quicktest_handle_controller_input(changes, batteryStatus);
return;
}
@@ -858,20 +1023,11 @@ function render_info_to_dom(infoItems) {
if (!Array.isArray(infoItems)) return;
// Add new info items
infoItems.forEach(({key, value, addInfoIcon, severity, isExtra, cat}) => {
infoItems.forEach(({key, value, addInfoIcon, severity, isExtra, cat, copyable}) => {
if (!key) return;
// Compose value with optional info icon
let valueHtml = String(value ?? "");
if (addInfoIcon === 'board') {
const icon = '&nbsp;<a class="link-body-emphasis" href="#" onclick="board_model_info()">' +
'<svg class="bi" width="1.3em" height="1.3em"><use xlink:href="#info"/></svg></a>';
valueHtml += icon;
} else if (addInfoIcon === 'color') {
const icon = '&nbsp;<a class="link-body-emphasis" href="#" onclick="edge_color_info()">' +
'<svg class="bi" width="1.3em" height="1.3em"><use xlink:href="#info"/></svg></a>';
valueHtml += icon;
}
// Apply severity formatting if requested
if (severity) {
@@ -881,25 +1037,43 @@ function render_info_to_dom(infoItems) {
}
if (isExtra) {
append_info_extra(key, valueHtml, cat || "hw");
appendInfoExtra(key, valueHtml, cat || "hw", copyable ?? false);
} else {
append_info(key, valueHtml, cat || "hw");
appendInfo(key, valueHtml, cat || "hw", copyable ?? false);
}
});
}
function append_info_extra(key, value, cat) {
function copyValueToClipboard(text) {
navigator.clipboard.writeText(text).then(function() {
infoAlert(l("The item has been copied to the clipboard."), 2000);
}).catch(function(err) {
errorAlert(l("Cannot copy text to the clipboard:") + " " + str(err));
});
}
function genCopyString(value, copyable) {
if(!copyable)
return '';
const cleanStringRegex = value.match(/^[A-Za-z0-9_.-]+/);
const escapedValue = cleanStringRegex ? cleanStringRegex[0] : "";
return '&nbsp;<i style="cursor:pointer;" class="fa-regular fa-copy" onclick=\'copyValueToClipboard("' + escapedValue + '")\'></i>';
}
function appendInfoExtra(key, value, cat, copyable) {
// TODO escape html
const s = '<dt class="text-muted col-sm-4 col-md-6 col-xl-5">' + key + '</dt><dd class="col-sm-8 col-md-6 col-xl-7" style="text-align: right;">' + value + '</dd>';
const s = '<dt class="text-muted col-sm-4 col-md-6 col-xl-5">' + key + '</dt><dd class="col-sm-8 col-md-6 col-xl-7" style="text-align: right;">' + value + genCopyString(value, copyable) + '</dd>';
$("#fwinfoextra-" + cat).html($("#fwinfoextra-" + cat).html() + s);
}
function append_info(key, value, cat) {
function appendInfo(key, value, cat, copyable) {
// TODO escape html
const s = '<dt class="text-muted col-6">' + key + '</dt><dd class="col-6" style="text-align: right;">' + value + '</dd>';
const s = '<dt class="text-muted col-6">' + key + '</dt><dd class="col-6" style="text-align: right;">' + value + genCopyString(value, copyable) + '</dd>';
$("#fwinfo").html($("#fwinfo").html() + s);
append_info_extra(key, value, cat);
appendInfoExtra(key, value, cat, copyable);
}
function show_popup(text, is_html = false) {
@@ -923,8 +1097,7 @@ function show_donate_modal() {
function show_edge_modal() {
// Check if user has chosen not to show the modal again
const dontShowAgain = localStorage.getItem('edgeModalDontShowAgain');
if (dontShowAgain === 'true') {
if (Storage.edgeModalDontShowAgain.get()) {
return;
}
@@ -937,23 +1110,13 @@ function show_info_tab() {
$('#info-tab').tab('show');
}
function discord_popup() {
la("discord_popup");
show_popup(l("My handle on discord is: the_al"));
}
function edge_color_info() {
la("cm_info");
const text = l("Color detection thanks to") + ' romek77 from Poland.';
show_popup(text, true);
}
function board_model_info() {
la("bm_info");
const l1 = l("This feature is experimental.");
const l2 = l("Please let me know if the board model of your controller is not detected correctly.");
const l3 = l("Board model detection thanks to") + ' <a href="https://battlebeavercustoms.com/">Battle Beaver Customs</a>.';
show_popup(l3 + "<br><br>" + l1 + " " + l2, true);
function show_circularity_warning() {
const message = `<p>
${l("Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.")
}</p><p>
${l("Aim for a circularity error of around 7-9 % for the best playing experience.")}`;
show_popup(message, true);
}
// Alert Management Functions
@@ -1041,52 +1204,155 @@ window.connect = connect;
window.disconnect = disconnectSync;
window.show_faq_modal = show_faq_modal;
window.show_info_tab = show_info_tab;
window.calibrate_range = () => calibrate_range(
controller,
{ ll_data, rr_data },
(success, message) => {
if (success) {
resetStickDiagrams();
successAlert(message);
switchToRangeMode();
app.shownRangeCalibrationWarning = false
}
}
);
window.copyValueToClipboard = copyValueToClipboard;
window.calibrate_stick_centers = () => calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
successAlert(message);
switchTo10xZoomMode();
}
}
);
window.auto_calibrate_stick_centers = () => auto_calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
successAlert(message);
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
window.ds5_finetune = () => ds5_finetune(
controller,
{ ll_data, rr_data, clear_circularity },
(success) => success && switchToRangeMode()
);
window.openCalibrationHistoryModal = async () => {
let currentFinetuneData = null;
let controllerSerialNumber = null;
try {
if (controller && typeof controller.getInMemoryModuleData === 'function') {
currentFinetuneData = await controller.getInMemoryModuleData('finetune');
}
if (controller && typeof controller.getDeviceInfo === 'function') {
const info = await controller.getDeviceInfo();
const serialNumberItem = info?.infoItems?.find(item => item.key === l("Serial Number"));
controllerSerialNumber = serialNumberItem?.value;
}
} catch (error) {
console.warn('Could not retrieve current finetune data or serial number:', error);
}
la("calibration_history_modal_open");
await show_calibration_history_modal(controller, currentFinetuneData, controllerSerialNumber, (success, message) => {
if(!message) return;
success ? infoAlert(message) : errorAlert(message);
});
};
window.flash_all_changes = flash_all_changes;
window.reboot_controller = reboot_controller;
window.refresh_nvstatus = refresh_nvstatus;
window.nvsunlock = nvsunlock;
// Calibration method selection
window.setCenterCalibrationMethod = (method, event) => {
if (event) {
event.preventDefault();
event.stopPropagation();
}
app.centerCalibrationMethod = method;
Storage.centerCalibrationMethod.set(method);
updateCalibrationMethodUI();
// Close the dropdown
const dropdownButton = event?.target?.closest('.dropdown-menu')?.previousElementSibling;
if (dropdownButton) {
const dropdown = bootstrap.Dropdown.getInstance(dropdownButton);
if (dropdown) dropdown.hide();
}
};
window.executeSelectedCenterCalibration = () => {
if (app.centerCalibrationMethod === 'quick') {
auto_calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
} else {
calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
}
};
window.setRangeCalibrationMethod = (method, event) => {
if (event) {
event.preventDefault();
event.stopPropagation();
}
app.rangeCalibrationMethod = method;
Storage.rangeCalibrationMethod.set(method);
updateCalibrationMethodUI();
// Close the dropdown
const dropdownButton = event?.target?.closest('.dropdown-menu')?.previousElementSibling;
if (dropdownButton) {
const dropdown = bootstrap.Dropdown.getInstance(dropdownButton);
if (dropdown) dropdown.hide();
}
};
window.executeSelectedRangeCalibration = () => {
calibrate_range(
controller,
{ ll_data, rr_data },
(success, message) => {
resetStickDiagrams();
if(message) {
infoAlert(message, 2_000);
}
switchToRangeMode();
},
app.rangeCalibrationMethod === 'expert'
);
};
function updateCalibrationMethodUI() {
$('#check-quick').toggle(app.centerCalibrationMethod === 'quick');
$('#check-four-step').toggle(app.centerCalibrationMethod === 'four-step');
$('#check-range-normal').toggle(app.rangeCalibrationMethod === 'normal');
$('#check-range-expert').toggle(app.rangeCalibrationMethod === 'expert');
}
function initCalibrationMethod() {
const savedCenterMethod = Storage.centerCalibrationMethod.get();
if (savedCenterMethod && (savedCenterMethod === 'quick' || savedCenterMethod === 'four-step')) {
app.centerCalibrationMethod = savedCenterMethod;
}
const savedRangeMethod = Storage.rangeCalibrationMethod.get();
if (savedRangeMethod && (savedRangeMethod === 'normal' || savedRangeMethod === 'expert')) {
app.rangeCalibrationMethod = savedRangeMethod;
}
const savedFailedCalibrationCount = Storage.failedCalibrationCount.get();
if (savedFailedCalibrationCount > 0) {
app.failedCalibrationModalShownCount = savedFailedCalibrationCount;
}
updateCalibrationMethodUI();
}
window.nvslock = nvslock;
window.welcome_accepted = welcome_accepted;
window.show_donate_modal = show_donate_modal;
window.board_model_info = board_model_info;
window.edge_color_info = edge_color_info;
window.show_circularity_warning = show_circularity_warning;
window.show_quick_test_modal = () => {
show_quick_test_modal(controller).catch(error => {
throw new Error("Failed to show quick test modal", { cause: error });
@@ -1094,4 +1360,4 @@ window.show_quick_test_modal = () => {
};
// Auto-initialize the application when the module loads
gboot();
gboot();

183
js/finetune-history.js Normal file
View File

@@ -0,0 +1,183 @@
'use strict';
import { Storage } from './storage.js';
const MAX_HISTORY_ENTRIES_PER_CONTROLLER = 10;
/**
* Manages finetune parameter history for DS5 and Edge controllers
* Stores entries per controller identified by serial number
*/
export class FinetuneHistory {
/**
* Save current finetune settings for a controller
* @param {Array} finetuneData - Array of 12 finetune values
* @param {string} controllerSerialNumber - Serial number of the controller
* @returns {string} The ID of the saved entry
*/
static save(finetuneData, controllerSerialNumber) {
if (!Array.isArray(finetuneData) || finetuneData.length !== 12) {
throw new Error(`Finetune data must be an array of 12 values, got "${finetuneData}"`);
}
if (!controllerSerialNumber || typeof controllerSerialNumber !== 'string') {
throw new Error('Controller serial number is required');
}
const allHistory = this._getAllHistory();
const controllerHistory = allHistory[controllerSerialNumber] || [];
// Check if the most recent entry has the same data
if (controllerHistory.length > 0 && this._dataEquals(controllerHistory[0].data, finetuneData)) {
// Update the timestamp of the existing entry
controllerHistory[0].timestamp = Date.now();
allHistory[controllerSerialNumber] = controllerHistory;
this._saveAllHistory(allHistory);
return controllerHistory[0].id;
}
const entry = {
id: this._generateId(),
timestamp: Date.now(),
data: finetuneData
};
controllerHistory.unshift(entry);
// Keep only the latest MAX_HISTORY_ENTRIES_PER_CONTROLLER for this controller
if (controllerHistory.length > MAX_HISTORY_ENTRIES_PER_CONTROLLER) {
controllerHistory.pop();
}
allHistory[controllerSerialNumber] = controllerHistory;
this._saveAllHistory(allHistory);
return entry.id;
}
/**
* Get all saved finetune settings for a specific controller
* @param {string} controllerSerialNumber - Serial number of the controller
* @returns {Array} Array of saved settings entries for the controller
*/
static getAll(controllerSerialNumber) {
if (!controllerSerialNumber || typeof controllerSerialNumber !== 'string') {
return [];
}
const allHistory = this._getAllHistory();
return allHistory[controllerSerialNumber] || [];
}
/**
* Get finetune settings by ID
* @param {string} id - Entry ID
* @param {string} controllerSerialNumber - Serial number of the controller
* @returns {Object|null} Entry object or null if not found
*/
static getById(id, controllerSerialNumber) {
if (!controllerSerialNumber || typeof controllerSerialNumber !== 'string') {
return null;
}
const history = this.getAll(controllerSerialNumber);
return history.find(entry => entry.id === id) || null;
}
/**
* Delete a saved entry
* @param {string} id - Entry ID
* @param {string} controllerSerialNumber - Serial number of the controller
* @returns {boolean} True if deleted, false if not found
*/
static delete(id, controllerSerialNumber) {
if (!controllerSerialNumber || typeof controllerSerialNumber !== 'string') {
return false;
}
const allHistory = this._getAllHistory();
const controllerHistory = allHistory[controllerSerialNumber] || [];
const index = controllerHistory.findIndex(entry => entry.id === id);
if (index >= 0) {
controllerHistory.splice(index, 1);
allHistory[controllerSerialNumber] = controllerHistory;
this._saveAllHistory(allHistory);
return true;
}
return false;
}
/**
* Clear all saved finetune settings for a specific controller
* @param {string} controllerSerialNumber - Serial number of the controller
*/
static clearAll(controllerSerialNumber) {
if (!controllerSerialNumber || typeof controllerSerialNumber !== 'string') {
return;
}
const allHistory = this._getAllHistory();
delete allHistory[controllerSerialNumber];
this._saveAllHistory(allHistory);
}
/**
* Get finetune data from a specific entry
* @param {string} id - Entry ID
* @param {string} controllerSerialNumber - Serial number of the controller
* @returns {Array|null} Finetune data array or null if not found
*/
static getDataById(id, controllerSerialNumber) {
const entry = this.getById(id, controllerSerialNumber);
return entry ? entry.data : null;
}
// ==================== PRIVATE METHODS ====================
/**
* Get all history from storage (for all controllers)
* @private
*/
static _getAllHistory() {
try {
return Storage.finetuneHistory.getAll();
} catch (e) {
console.error('Failed to parse finetune history:', e);
return {};
}
}
/**
* Save all history to storage
* @private
*/
static _saveAllHistory(allHistory) {
try {
Storage.finetuneHistory.setAll(allHistory);
} catch (e) {
console.error('Failed to save finetune history:', e);
}
}
/**
* Generate unique ID
* @private
*/
static _generateId() {
return `${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;
}
/**
* Compare two data arrays for equality
* @private
*/
static _dataEquals(data1, data2) {
if (!Array.isArray(data1) || !Array.isArray(data2)) {
return false;
}
if (data1.length !== data2.length) {
return false;
}
return data1.every((val, idx) => val === data2[idx]);
}
}

View File

@@ -109,7 +109,7 @@ export class CalibCenterModal {
this._updateUI(6, "Stick center calibration", "Done", true);
yield 6;
this._close(true);
this._close(true, l("Stick calibration completed"));
}
/**

View File

@@ -1,8 +1,8 @@
'use strict';
import { sleep } from '../utils.js';
import { sleep, float_to_str } from '../utils.js';
import { l } from '../translations.js';
import { CIRCULARITY_DATA_SIZE } from '../stick-renderer.js';
import { CIRCULARITY_DATA_SIZE, draw_stick_dial } from '../stick-renderer.js';
const SECONDS_UNTIL_UNLOCK = 15;
@@ -11,7 +11,7 @@ const SECONDS_UNTIL_UNLOCK = 15;
* Handles stick range calibration
*/
export class CalibRangeModal {
constructor(controllerInstance, { ll_data, rr_data }, doneCallback = null) {
constructor(controllerInstance, { ll_data, rr_data }, doneCallback = null, expertMode = false) {
// Dependencies
this.controller = controllerInstance;
this.ll_data = ll_data;
@@ -34,8 +34,40 @@ export class CalibRangeModal {
this.leftCycleProgress = 0;
this.rightCycleProgress = 0;
this.expertMode = expertMode;
this.allDonePromiseResolve = undefined;
this.doneCallback = doneCallback;
this.hasSingleStick = (this.controller.currentController.getNumberOfSticks() == 1);
// Stick rendering
this.stickRenderInterval = null;
this.currentStickPositions = {
left: { x: 0, y: 0 },
right: { x: 0, y: 0 }
};
this._initEventListeners();
}
/**
* Initialize event listeners for the calibration modal
*/
_initEventListeners() {
$('#rangeModal').on('hidden.bs.modal', () => {
console.log("Closing range calibration modal");
if (currentCalibRangeInstance === this) {
this.onClose().catch(err => console.error("Error in onClose:", err));
}
});
}
/**
* Remove event listeners
*/
removeEventListeners() {
$('#rangeModal').off('hidden.bs.modal');
}
async open() {
@@ -53,29 +85,37 @@ export class CalibRangeModal {
this.ll_data.fill(0);
this.rr_data.fill(0);
this.updateProgress(); // reset progress bar
this.startProgressMonitoring();
// Start rendering loop
this.startStickRendering();
this.resetAlertEnhancement();
this.startCountdown();
this._updateUIVisibility();
if (!this.expertMode) {
this.updateProgress(); // reset progress bar
this.startProgressMonitoring();
this.resetAlertEnhancement();
this.startCountdown();
}
await sleep(1000);
await this.controller.calibrateRangeBegin();
}
async onClose() {
this.stopStickRendering();
this.stopProgressMonitoring();
this.stopCountdown();
bootstrap.Modal.getOrCreateInstance('#rangeModal').hide();
const result = await this.controller.calibrateRangeOnClose();
// Call the done callback if provided (range calibration is always successful when onClose is called)
if (this.doneCallback && typeof this.doneCallback === 'function') {
this.doneCallback(true, result?.message);
// Call the done callback if provided
if (result && this.doneCallback && typeof this.doneCallback === 'function') {
this.doneCallback(result.success, result.message);
}
this.allDonePromiseResolve();
if (this.allDonePromiseResolve) {
this.allDonePromiseResolve();
}
destroyCurrentInstance();
}
/**
@@ -107,16 +147,10 @@ export class CalibRangeModal {
// Every second, update countdown
this.countdownInterval = setInterval(() => {
this.countdownSeconds--;
if (this.countdownSeconds <= 0 || this.leftCycleProgress + this.rightCycleProgress >= 100) {
// If there is only one stick, sum two times leftCycleProgress, so that it can reach 100.
if (this.countdownSeconds <= 0 || this.leftCycleProgress + (this.hasSingleStick ? this.leftCycleProgress : this.rightCycleProgress) >= 100) {
this.stopCountdown();
$('#range-calibration-alert').hide();
$('#range-done-btn')
.prop('disabled', false)
.toggleClass('btn-primary', true)
.toggleClass('btn-outline-primary', false);
this.updateCountdownButton();
this._enableDoneButton();
} else {
this.checkAndEnhanceAlert();
}
@@ -145,11 +179,22 @@ export class CalibRangeModal {
$('#range-done-btn').text(text);
}
/**
* Enable the Done button and hide calibration alert
*/
_enableDoneButton() {
$('#range-calibration-alert').hide();
$('#range-done-btn')
.prop('disabled', false)
.toggleClass('btn-primary', true)
.toggleClass('btn-outline-primary', false);
}
/**
* Check if ll_data and rr_data have received data
*/
checkDataProgress() {
const JOYSTICK_EXTREME_THRESHOLD = 0.95;
const JOYSTICK_EXTREME_THRESHOLD = 0.80;
const CIRCLE_FILL_THRESHOLD = 0.95;
// Count the number of times the joysticks have been rotated full circle
@@ -160,19 +205,29 @@ export class CalibRangeModal {
this.ll_data.fill(0);
}
const rightNonZeroCount = this.rr_data.filter(v => v > JOYSTICK_EXTREME_THRESHOLD).length;
const rightFillRatio = rightNonZeroCount / CIRCULARITY_DATA_SIZE;
if (rightFillRatio >= CIRCLE_FILL_THRESHOLD) {
this.rightFullCycles++;
this.rr_data.fill(0);
if(this.hasSingleStick) {
// Update progress if counts changed
if (leftNonZeroCount !== this.leftNonZeroCount) {
this.leftNonZeroCount = leftNonZeroCount;
this.updateProgress();
}
} else {
const rightNonZeroCount = this.rr_data.filter(v => v > JOYSTICK_EXTREME_THRESHOLD).length;
const rightFillRatio = rightNonZeroCount / CIRCULARITY_DATA_SIZE;
if (rightFillRatio >= CIRCLE_FILL_THRESHOLD) {
this.rightFullCycles++;
this.rr_data.fill(0);
}
// Update progress if counts changed
if (leftNonZeroCount !== this.leftNonZeroCount || rightNonZeroCount !== this.rightNonZeroCount) {
this.leftNonZeroCount = leftNonZeroCount;
this.rightNonZeroCount = rightNonZeroCount;
this.updateProgress();
}
}
// Update progress if counts changed
if (leftNonZeroCount !== this.leftNonZeroCount || rightNonZeroCount !== this.rightNonZeroCount) {
this.leftNonZeroCount = leftNonZeroCount;
this.rightNonZeroCount = rightNonZeroCount;
this.updateProgress();
}
}
/**
@@ -191,8 +246,11 @@ export class CalibRangeModal {
const rightCurrentProgress = (this.rightNonZeroCount / CIRCULARITY_DATA_SIZE) * (50 / this.requiredFullCycles);
const totalProgress = Math.round(
Math.min(50, leftCycleProgress + leftCurrentProgress) +
Math.min(50, rightCycleProgress + rightCurrentProgress)
this.hasSingleStick ?
Math.min(100, 2*(leftCycleProgress + leftCurrentProgress)) : (
Math.min(50, leftCycleProgress + leftCurrentProgress) +
Math.min(50, rightCycleProgress + rightCurrentProgress)
)
);
const $progressBar = $('#range-progress-bar');
@@ -202,14 +260,19 @@ export class CalibRangeModal {
.css('width', `${totalProgress}%`)
.attr('aria-valuenow', totalProgress);
$progressText.text(`${totalProgress}% (L:${this.leftFullCycles}/${this.requiredFullCycles}, R:${this.rightFullCycles}/${this.requiredFullCycles})`);
if(!this.hasSingleStick) {
$progressText.text(`${totalProgress}% (L:${this.leftFullCycles}/${this.requiredFullCycles}, R:${this.rightFullCycles}/${this.requiredFullCycles})`);
} else {
$progressText.text(`${totalProgress}% (L:${this.leftFullCycles}/${this.requiredFullCycles})`);
}
}
checkAndEnhanceAlert() {
const secondsElapsed = SECONDS_UNTIL_UNLOCK - this.countdownSeconds;
const alertIsVisible = $('#range-calibration-alert').is(":visible")
const progressBelowThreshold = this.leftCycleProgress < 10 || this.rightCycleProgress < 10;
const progressBelowThreshold = this.leftCycleProgress < 10 || (this.hasSingleStick ? false : this.rightCycleProgress < 10);
if (secondsElapsed >= 5 && progressBelowThreshold && !alertIsVisible) {
$('#range-calibration-alert').show();
}
@@ -223,18 +286,119 @@ export class CalibRangeModal {
resetAlertEnhancement() {
$('#keep-rotating-alert').removeClass('blink-text');
}
/**
* Update UI visibility based on expert mode
*/
_updateUIVisibility() {
if (this.expertMode) {
// Hide progress bar, progress text, and alert in expert mode. Enable Done button immediately.
$('#range-progress-container').hide();
$('#range-progress-text-container').hide();
$('#range-calibration-alert').hide();
this._enableDoneButton();
} else {
// Show progress bar and progress text in normal mode
$('#range-progress-container').show();
$('#range-progress-text-container').show();
}
// Hide right stick elements if single stick controller
$('#range-right-stick-canvas').toggle(!this.hasSingleStick);
$('#range-rx').toggle(!this.hasSingleStick);
$('#range-ry').toggle(!this.hasSingleStick);
}
/**
* Clear a canvas with white background
*/
_clearCanvas(ctx, canvas) {
if (!ctx) return;
ctx.fillStyle = '#ffffff';
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
/**
* Update current stick positions for rendering
*/
handleControllerInput({sticks}) {
if (sticks?.left) {
this.currentStickPositions.left = { ...sticks.left };
}
if (sticks?.right) {
this.currentStickPositions.right = { ...sticks.right };
}
}
/**
* Start stick rendering loop
*/
startStickRendering() {
if (this.stickRenderInterval) return;
this.stickRenderInterval = setInterval(() => {
this._renderSticks();
}, 16); // ~60 FPS
}
/**
* Stop stick rendering loop
*/
stopStickRendering() {
if (this.stickRenderInterval) {
clearInterval(this.stickRenderInterval);
this.stickRenderInterval = null;
}
}
/**
* Render both stick dials
*/
_renderSticks() {
const leftCanvas = document.getElementById('range-left-stick-canvas');
const leftCtx = leftCanvas.getContext('2d');
// Draw stick dials in normal mode (no circularity data, no zoom)
const size = 60;
const centerX = leftCanvas.width / 2;
const centerY = leftCanvas.height / 2;
const {left, right} = this.currentStickPositions;
this._clearCanvas(leftCtx, leftCanvas);
draw_stick_dial(leftCtx, centerX, centerY, size, left.x, left.y);
const precision = 2;
$("#range-lx-lbl").text(float_to_str(left.x, precision));
$("#range-ly-lbl").text(float_to_str(left.y, precision));
// Only render right stick if not a single stick controller
if (!this.hasSingleStick) {
const rightCanvas = document.getElementById('range-right-stick-canvas');
const rightCtx = rightCanvas.getContext('2d');
this._clearCanvas(rightCtx, rightCanvas);
draw_stick_dial(rightCtx, centerX, centerY, size, right.x, right.y);
$("#range-rx-lbl").text(float_to_str(right.x, precision));
$("#range-ry-lbl").text(float_to_str(right.y, precision));
}
}
}
// Global reference to the current range calibration instance
let currentCalibRangeInstance = null;
function destroyCurrentInstance() {
currentCalibRangeInstance = null;
if (currentCalibRangeInstance) {
console.log("Destroying current range calibration instance");
currentCalibRangeInstance.removeEventListeners();
currentCalibRangeInstance = null;
}
}
export async function calibrate_range(controller, dependencies, doneCallback = null) {
export async function calibrate_range(controller, dependencies, doneCallback = null, expertMode = false) {
destroyCurrentInstance(); // Clean up any existing instance
currentCalibRangeInstance = new CalibRangeModal(controller, dependencies, doneCallback);
currentCalibRangeInstance = new CalibRangeModal(controller, dependencies, doneCallback, expertMode);
await currentCalibRangeInstance.open();
return new Promise((resolve) => {
@@ -244,10 +408,15 @@ export async function calibrate_range(controller, dependencies, doneCallback = n
async function calibrate_range_on_close() {
if (currentCalibRangeInstance) {
await currentCalibRangeInstance.onClose();
destroyCurrentInstance();
bootstrap.Modal.getOrCreateInstance('#rangeModal').hide();
}
}
export function rangeCalibHandleControllerInput(changes) {
if (currentCalibRangeInstance) {
currentCalibRangeInstance.handleControllerInput(changes);
}
}
// Expose functions to window for HTML onclick handlers
window.calibrate_range_on_close = calibrate_range_on_close;
window.calibrate_range_on_close = calibrate_range_on_close;

View File

@@ -0,0 +1,200 @@
'use strict';
import { FinetuneHistory } from '../finetune-history.js';
import { formatLocalizedDate, la } from '../utils.js';
import { l } from '../translations.js';
export class CalibrationHistoryModal {
constructor(controllerInstance = null, doneCallback = null) {
this.modalElement = null;
this.bootstrapModal = null;
this.currentFinetuneData = null;
this.currentControllerSerialNumber = null;
this.controller = controllerInstance;
this.doneCallback = doneCallback;
this._boundModalHidden = () => {
destroyCurrentInstance();
};
this._initEventListeners();
}
_initEventListeners() {
this.modalElement = document.getElementById('calibrationHistoryModal');
if (this.modalElement) {
this.bootstrapModal = new bootstrap.Modal(this.modalElement);
this.modalElement.addEventListener('hidden.bs.modal', this._boundModalHidden);
}
}
removeEventListeners() {
if (this.modalElement) {
this.modalElement.removeEventListener('hidden.bs.modal', this._boundModalHidden);
}
}
async open(currentFinetuneData = null, controllerSerialNumber = null) {
this.currentFinetuneData = currentFinetuneData;
this.currentControllerSerialNumber = controllerSerialNumber;
await this._populateHistory();
this.bootstrapModal.show();
}
close() {
if (this.bootstrapModal) {
this.bootstrapModal.hide();
}
}
/**
* Populate the history list
* @private
*/
async _populateHistory() {
const history = FinetuneHistory.getAll(this.currentControllerSerialNumber);
const container = document.getElementById('historyListContainer');
if (!history || history.length === 0) {
container.innerHTML = `<p class="text-muted ds-i18n">${l('No saved calibrations found.')}</p>`;
document.getElementById('clearAllBtn').style.display = 'none';
return;
}
document.getElementById('clearAllBtn').style.display = 'block';
let html = '<div class="list-group">';
history.forEach(entry => {
const date = formatLocalizedDate(entry.timestamp);
const isCurrent = this.currentFinetuneData && this._dataEquals(entry.data, this.currentFinetuneData);
html += `
<div class="list-group-item">
<div class="d-flex justify-content-between align-items-start">
<div class="flex-grow-1">
<h6 class="mb-1">${date}</h6>
<p class="mb-0 small">${l('Values')}: ${entry.data.join(', ')}</p>
</div>
<div class="btn-group-sm" role="group">
${isCurrent ?
`<button type="button" class="btn btn-sm btn-success ds-i18n" disabled>${l('Current')}</button>` :
`<button type="button" class="btn btn-sm btn-primary ds-i18n" onclick="calibration_history_restore('${entry.id}')">${l('Restore')}</button>
<button type="button" class="btn btn-sm btn-outline-danger ds-i18n" onclick="calibration_history_delete('${entry.id}')">${l('Delete')}</button>`
}
</div>
</div>
</div>
`;
});
html += '</div>';
container.innerHTML = html;
}
/**
* Compare two data arrays for equality
* @private
*/
_dataEquals(data1, data2) {
if (!Array.isArray(data1) || !Array.isArray(data2)) {
return false;
}
if (data1.length !== data2.length) {
return false;
}
return data1.every((val, idx) => val === data2[idx]);
}
/**
* Apply finetune calibration to the controller
* @param {Array} finetuneData - The finetune data to apply
* @private
*/
async _applyCalibration(finetuneData) {
if (!this.controller || !this.controller.isConnected()) {
throw new Error('Controller not connected');
}
if (!Array.isArray(finetuneData) || finetuneData.length !== 12) {
throw new Error('Invalid finetune data');
}
await this.controller.writeFinetuneData(finetuneData);
this.controller.setHasChangesToWrite(true);
}
/**
* Restore a saved calibration
* @param {string} entryId - The ID of the entry to revert to
*/
async restoreCalibration(entryId) {
const entry = FinetuneHistory.getById(entryId, this.currentControllerSerialNumber);
if (!entry) throw new Error('Calibration settings not found.');
await this._applyCalibration(entry.data);
this.close();
this.doneCallback(true, l('The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.'));
la("calibration_history_restored");
}
/**
* Delete a saved entry
* @param {string} entryId - The ID of the entry to delete
*/
async delete(entryId) {
const entry = FinetuneHistory.getById(entryId, this.currentControllerSerialNumber);
if (!entry) {
return;
}
if (confirm(l(`Delete this calibration entry?`))) {
FinetuneHistory.delete(entryId, this.currentControllerSerialNumber);
await this._populateHistory();
}
}
/**
* Clear all saved entries
*/
async clearAll() {
if (confirm(l('Delete all calibration history for this controller? This cannot be undone.'))) {
FinetuneHistory.clearAll(this.currentControllerSerialNumber);
await this._populateHistory();
}
}
}
let currentCalibrationHistoryInstance = null;
function destroyCurrentInstance() {
if (currentCalibrationHistoryInstance) {
currentCalibrationHistoryInstance.removeEventListeners();
currentCalibrationHistoryInstance = null;
}
}
export async function show_calibration_history_modal(controllerInstance = null, currentFinetuneData = null, controllerSerialNumber = null, doneCallback = null) {
destroyCurrentInstance();
currentCalibrationHistoryInstance = new CalibrationHistoryModal(controllerInstance, doneCallback);
await currentCalibrationHistoryInstance.open(currentFinetuneData, controllerSerialNumber);
}
window.calibration_history_restore = (entryId) => {
if (currentCalibrationHistoryInstance) {
currentCalibrationHistoryInstance.restoreCalibration(entryId);
}
};
window.calibration_history_delete = (entryId) => {
if (currentCalibrationHistoryInstance) {
currentCalibrationHistoryInstance.delete(entryId);
}
};
window.calibration_history_clear_all = () => {
if (currentCalibrationHistoryInstance) {
currentCalibrationHistoryInstance.clearAll();
}
};
window.show_calibration_history_modal = show_calibration_history_modal;

View File

@@ -1,7 +1,8 @@
'use strict';
import { draw_stick_position } from '../stick-renderer.js';
import { draw_stick_dial } from '../stick-renderer.js';
import { dec2hex32, float_to_str, la } from '../utils.js';
import { Storage } from '../storage.js';
import { auto_calibrate_stick_centers } from './calib-center-modal.js';
import { calibrate_range } from './calib-range-modal.js';
@@ -95,6 +96,19 @@ export class Finetune {
left: { x: 0, y: 0 },
right: { x: 0, y: 0 }
};
// Binary search state for R2/L2 circularity calibration
this.binarySearch = {
active: false,
minValue: 0,
maxValue: 65535,
lastAdjustedValue: 0,
inputSuffix: null,
lastAxisValue: 0,
targetAxisMin: 0.99,
searchIterations: 0,
maxIterations: 20
};
}
get mode() {
@@ -208,6 +222,7 @@ export class Finetune {
this._initSliderListeners(lOrR);
this._initButtonListeners(lOrR);
this._initKeyboardListeners(lOrR);
});
}
@@ -250,6 +265,24 @@ export class Finetune {
});
}
/**
* Initialize keyboard event listeners for a specific stick card
*/
_initKeyboardListeners(lOrR) {
const stickCard = $(`#${lOrR}-stick-card`);
stickCard.on('keydown', (e) => {
this._onKeyboardEvent(e, true);
});
stickCard.on('keyup', (e) => {
this._onKeyboardEvent(e, false);
});
// Make stick cards focusable
stickCard.attr('tabindex', '0');
}
/**
* Clean up event listeners for the finetune modal
*/
@@ -274,7 +307,7 @@ export class Finetune {
_removeStickEventListeners() {
LEFT_AND_RIGHT.forEach(lOrR => {
// Remove stick card listeners
$(`#${lOrR}-stick-card`).off('click');
$(`#${lOrR}-stick-card`).off('click keydown keyup');
// Remove slider listeners
const sliderId = `#${lOrR}CircularitySlider`;
@@ -343,6 +376,42 @@ export class Finetune {
}
}
/**
* Handle keyboard events for arrow key adjustments
* Arrow keys work like D-pad buttons for fine-tuning
*/
_onKeyboardEvent(event, isKeyDown) {
const key = event.key;
// Map arrow keys to button names (D-pad)
const keyToButtonMap = {
'ArrowLeft': 'left',
'ArrowRight': 'right',
'ArrowUp': 'up',
'ArrowDown': 'down'
};
const button = keyToButtonMap[key];
if (!button) return;
event.preventDefault();
// Arrow keys work as D-pad buttons for adjustments
if (!this.active_stick) return;
const changes = {};
if (isKeyDown) {
// Simulate button press by creating a change object
changes[button] = true;
this.handleDpadAdjustment(changes);
} else {
// Simulate button release
changes[button] = false;
this.handleDpadAdjustment(changes);
}
}
/* Set the quick calibrating state to prevent dialog destruction
* @param {boolean} isCalibrating - Whether quick calibration is in progress
*/
@@ -428,13 +497,12 @@ export class Finetune {
// Private methods
/**
* Restore the show raw numbers checkbox state from localStorage
* Restore the show raw numbers checkbox state from storage
*/
_restoreShowRawNumbersCheckbox() {
const savedState = localStorage.getItem('showRawNumbersCheckbox');
if (savedState) {
const isChecked = savedState === 'true';
$("#showRawNumbersCheckbox").prop('checked', isChecked);
const isChecked = Storage.showRawNumbersCheckbox.get();
if (isChecked) {
$("#showRawNumbersCheckbox").prop('checked', true);
}
}
@@ -643,13 +711,13 @@ export class Finetune {
if (this._mode === 'circularity') {
// Draw stick position with circle
const circularityData = lOrR === 'left' ? this.ll_data : this.rr_data;
draw_stick_position(ctx, hb, yb, sz, plx, ply, {
draw_stick_dial(ctx, hb, yb, sz, plx, ply, {
circularity_data: circularityData,
highlight
});
} else {
// Draw stick position with crosshair
draw_stick_position(ctx, hb, yb, sz, plx, ply, {
draw_stick_dial(ctx, hb, yb, sz, plx, ply, {
enable_zoom_center: true,
highlight
});
@@ -672,7 +740,7 @@ export class Finetune {
const showRawNumbers = $("#showRawNumbersCheckbox").is(":checked");
const modal = $("#finetuneModal");
modal.toggleClass("hide-raw-numbers", !showRawNumbers);
localStorage.setItem('showRawNumbersCheckbox', showRawNumbers);
Storage.showRawNumbersCheckbox.set(showRawNumbers);
this.refresh_finetune_sticks();
}
@@ -832,6 +900,25 @@ export class Finetune {
const quadrant = this._getStickQuadrant(currentStick.x, currentStick.y);
if (changes.r2_analog !== undefined || changes.l2_analog !== undefined) {
const r2Value = this.controller.button_states.r2_analog || 0;
const l2Value = this.controller.button_states.l2_analog || 0;
if (r2Value === 0 && l2Value === 0) {
this.binarySearch.inputSuffix = null;
this.stopContinuousDpadAdjustment();
return;
}
if (!this.binarySearch.active && !this.binarySearch.inputSuffix && !this._isDpadAdjustmentActive()) {
const inputSuffix = this._getFinetuneInputSuffixForQuadrant(this.active_stick, quadrant);
if (inputSuffix) {
this._startBinarySearch(inputSuffix);
}
}
return;
}
// Use circularity step size for circularity mode
const adjustmentStep = this._circularityStepSize;
@@ -890,14 +977,8 @@ export class Finetune {
const element = $(`#finetune${inputSuffix}`);
if (!element.length) return;
// Initialize previous axis values for the active stick
if (this.active_stick && this.controller.button_states.sticks) {
const currentStick = this.controller.button_states.sticks[this.active_stick];
this._previousAxisValues[this.active_stick].x = currentStick.x;
this._previousAxisValues[this.active_stick].y = currentStick.y;
}
this._savePreviousStickPosition();
// Perform initial adjustment immediately...
this._performDpadAdjustment(element, adjustment);
this.clearCircularity();
@@ -916,12 +997,117 @@ export class Finetune {
clearTimeout(this.continuous_adjustment.initial_delay);
this.continuous_adjustment.initial_delay = null;
this.binarySearch.active = false;
}
_isDpadAdjustmentActive() {
return !!this.continuous_adjustment.initial_delay;
}
_savePreviousStickPosition() {
if (this.active_stick && this.controller.button_states.sticks) {
const currentStick = this.controller.button_states.sticks[this.active_stick];
this._previousAxisValues[this.active_stick].x = currentStick.x;
this._previousAxisValues[this.active_stick].y = currentStick.y;
}
}
_startBinarySearch(inputSuffix) {
const element = $(`#finetune${inputSuffix}`);
if (!element.length) return;
const currentValue = parseInt(element.val()) || 0;
this.binarySearch = {
active: true,
minValue: Math.max(0, currentValue - 500),
maxValue: Math.min(65535, currentValue + 500),
lastAdjustedValue: currentValue,
inputSuffix: inputSuffix,
lastAxisValue: 0,
targetAxisMin: 0.99,
searchIterations: 0,
maxIterations: 20
};
this._savePreviousStickPosition();
this._performBinarySearchStep();
}
async _performBinarySearchStep() {
if (!this.binarySearch.active || !this.binarySearch.inputSuffix) return;
const element = $(`#finetune${this.binarySearch.inputSuffix}`);
if (!element.length) return;
const midValue = this._calculateBinarySearchMidpoint();
element.val(midValue);
this.binarySearch.lastAdjustedValue = midValue;
await this._onFinetuneChange();
this.clearCircularity();
await new Promise(resolve => setTimeout(resolve, 50));
const absAxis = this._calculateBinarySearchAxisValue();
this.binarySearch.lastAxisValue = absAxis;
this.binarySearch.searchIterations++;
if (this._isBinarySearchConverged(absAxis)) {
this.binarySearch.active = false;
this.stopContinuousDpadAdjustment();
return;
}
this._updateBinarySearchBounds(midValue, absAxis);
this.continuous_adjustment.repeat_delay = setTimeout(
() => this._performBinarySearchStep(),
50
);
}
_calculateBinarySearchMidpoint() {
const { minValue, maxValue, searchIterations, lastAdjustedValue } = this.binarySearch;
return searchIterations === 0
? lastAdjustedValue
: Math.floor((minValue + maxValue) / 2);
}
_calculateBinarySearchAxisValue() {
if (!this.binarySearch.inputSuffix || !this.active_stick) {
return 0;
}
const currentStick = this.controller.button_states.sticks[this.active_stick];
if (!currentStick) {
return 0;
}
const lastChar = this.binarySearch.inputSuffix.slice(-1);
const axis = (['X', 'L', 'R'].includes(lastChar)) ? currentStick.x : currentStick.y;
return Math.abs(axis);
}
_isBinarySearchConverged(absAxis) {
const convergenceThreshold = 0.005;
const diff = Math.abs(absAxis - this.binarySearch.targetAxisMin);
const hasConverged = diff < convergenceThreshold;
const maxIterationsReached = this.binarySearch.searchIterations >= this.binarySearch.maxIterations;
return hasConverged || maxIterationsReached;
}
_updateBinarySearchBounds(midValue, absAxis) {
if (!this.binarySearch.inputSuffix) return;
const isInvertedDirection = this.binarySearch.inputSuffix.endsWith('R') || this.binarySearch.inputSuffix.endsWith('B');
const isAxisTooLow = absAxis < this.binarySearch.targetAxisMin;
if (isAxisTooLow === isInvertedDirection) {
this.binarySearch.maxValue = midValue;
} else {
this.binarySearch.minValue = midValue;
}
}
async _performDpadAdjustment(element, adjustment) {
const currentValue = parseInt(element.val()) || 0;
const maxValue = this.controller.getFinetuneMaxValue();
@@ -970,25 +1156,23 @@ export class Finetune {
}
/**
* Save step size to localStorage
* Save step size to storage
*/
_saveStepSizeToLocalStorage() {
localStorage.setItem('finetuneCenterStepSize', this._centerStepSize.toString());
localStorage.setItem('finetuneCircularityStepSize', this._circularityStepSize.toString());
Storage.finetuneCenterStepSize.set(this._centerStepSize);
Storage.finetuneCircularityStepSize.set(this._circularityStepSize);
}
/**
* Restore step size from localStorage
* Restore step size from storage
*/
_restoreStepSizeFromLocalStorage() {
// Restore center step size
const savedCenterStepSize = localStorage.getItem('finetuneCenterStepSize');
const savedCenterStepSize = Storage.finetuneCenterStepSize.get();
if (savedCenterStepSize) {
this._centerStepSize = parseInt(savedCenterStepSize);
}
// Restore circularity step size
const savedCircularityStepSize = localStorage.getItem('finetuneCircularityStepSize');
const savedCircularityStepSize = Storage.finetuneCircularityStepSize.get();
if (savedCircularityStepSize) {
this._circularityStepSize = parseInt(savedCircularityStepSize);
}
@@ -996,14 +1180,6 @@ export class Finetune {
this._updateStepSizeUI();
}
/**
* Reset circularity sliders to zero position
*/
_resetCircularitySliders() {
$(`#leftCircularitySlider`).val(0);
$(`#rightCircularitySlider`).val(0);
}
/**
* Handle the start of circularity slider adjustment
* Store base values and reset previous slider value
@@ -1112,7 +1288,7 @@ export class Finetune {
circData.fill(0);
// Call the clearCircularity function to update the display
this.clearCircularity();
this.clearCircularity(lOrR);
// Trigger the change event to update the finetune data once when slider is released
this._onFinetuneChange();
@@ -1170,7 +1346,7 @@ export class Finetune {
this._showErrorSlackButton(lOrR);
// Clear the circularity data display
this.clearCircularity();
this.clearCircularity(lOrR);
// Trigger the change event to update the finetune data
this._onFinetuneChange();

View File

@@ -1,7 +1,8 @@
'use strict';
import { l } from '../translations.js';
import { la } from '../utils.js'
import { la } from '../utils.js';
import { Storage } from '../storage.js';
const TEST_SEQUENCE = ['usb', 'buttons', 'adaptive', 'haptic', 'lights', 'speaker', 'headphone', 'microphone'];
const TEST_NAMES = {
@@ -93,36 +94,33 @@ export class QuickTestModal {
isTransitioning: false,
skippedTests: [],
lightsAnimationInterval: null,
batteryAlertShown: false,
};
}
/**
* Save skipped tests to localStorage
* Save skipped tests to storage
*/
_saveSkippedTestsToStorage() {
try {
localStorage.setItem('quickTestSkippedTests', JSON.stringify(this.state.skippedTests));
Storage.quickTestSkippedTests.set(this.state.skippedTests);
} catch (error) {
console.warn('Failed to save skipped tests to localStorage:', error);
console.warn('Failed to save skipped tests to storage:', error);
}
}
/**
* Load skipped tests from localStorage
* Load skipped tests from storage
*/
_loadSkippedTestsFromStorage() {
try {
const saved = localStorage.getItem('quickTestSkippedTests');
if (saved) {
const skippedTests = JSON.parse(saved);
if (Array.isArray(skippedTests)) {
this.state.skippedTests = skippedTests.filter(test => TEST_SEQUENCE.includes(test));
// Apply the skipped tests to the UI
this._applySkippedTestsToUI();
}
const skippedTests = Storage.quickTestSkippedTests.get();
if (Array.isArray(skippedTests) && skippedTests.length > 0) {
this.state.skippedTests = skippedTests.filter(test => TEST_SEQUENCE.includes(test));
this._applySkippedTestsToUI();
}
} catch (error) {
console.warn('Failed to load skipped tests from localStorage:', error);
console.warn('Failed to load skipped tests from storage:', error);
this.state.skippedTests = [];
}
}
@@ -263,6 +261,7 @@ export class QuickTestModal {
case 'haptic':
const hapticTestDesc = l('This test will activate the controller\'s vibration motors, first the heavy one, and then the light one.');
const hapticInstructions = l('Feel for vibration in the controller.');
const hapticRepeat = l('Repeat');
return `
<p>${hapticTestDesc}</p>
<p><strong>${instructions}:</strong> ${hapticInstructions}</p>
@@ -273,6 +272,9 @@ export class QuickTestModal {
<button type="button" class="btn btn-danger" id="haptic-fail-btn" onclick="markTestResult('haptic', false)">
<i class="fas fa-times me-1"></i><span>${fail}</span>
</button>
<button type="button" class="btn btn-outline-primary" id="haptic-replay-btn" onclick="replayHapticTest()">
<i class="fas fa-redo me-1"></i><span>${hapticRepeat}</span>
</button>
</div>
`;
case 'adaptive':
@@ -376,13 +378,13 @@ export class QuickTestModal {
}
/**
* Clear saved skipped tests from localStorage
* Clear saved skipped tests from storage
*/
_clearSkippedTestsFromStorage() {
try {
localStorage.removeItem('quickTestSkippedTests');
Storage.quickTestSkippedTests.clear();
} catch (error) {
console.warn('Failed to clear skipped tests from localStorage:', error);
console.warn('Failed to clear skipped tests from storage:', error);
}
}
@@ -1099,7 +1101,7 @@ export class QuickTestModal {
this.state.skippedTests.push(testType);
}
// Save to localStorage
// Save to storage
this._saveSkippedTestsToStorage();
// Stop any ongoing test activities
@@ -1275,9 +1277,21 @@ export class QuickTestModal {
/**
* Handle controller input for test navigation and control
*/
handleControllerInput(changes) {
handleControllerInput(changes, batteryStatus) {
if(this.state.isTransitioning) return;
// Check battery status and show/hide warning if charge is 5% or less
if (batteryStatus) {
// Only update visibility if alert hasn't been shown or charge level changed
if (!this.state.batteryAlertShown || batteryStatus.changed ) {
console.log("Battery status changed:", batteryStatus);
const { charge_level, is_error } = batteryStatus;
const $batteryWarning = $('#battery-warning-alert');
$batteryWarning.toggle(charge_level <= 5 || is_error);
this.state.batteryAlertShown = true;
}
}
const activeTest = this._getCurrentActiveTest();
// If buttons test is active, track button presses
@@ -1503,7 +1517,7 @@ export class QuickTestModal {
// Reset state
this._initializeState();
// Load saved skipped tests from localStorage
// Load saved skipped tests from storage
this._loadSkippedTestsFromStorage();
// Reset button colors to initial state
@@ -1572,9 +1586,9 @@ export function isQuickTestVisible() {
/**
* Handle controller input for the Quick Test Modal
*/
export function quicktest_handle_controller_input(changes) {
export function quicktest_handle_controller_input(changes, batteryStatus) {
if (currentQuickTestInstance && isQuickTestVisible()) {
currentQuickTestInstance.handleControllerInput(changes);
currentQuickTestInstance.handleControllerInput(changes, batteryStatus);
}
}
@@ -1632,6 +1646,12 @@ function replaySpeakerTest() {
}
}
function replayHapticTest() {
if (currentQuickTestInstance) {
currentQuickTestInstance._startHapticTest();
}
}
// Legacy compatibility - expose functions to window for HTML onclick handlers
window.markTestResult = markTestResult;
window.resetAllTests = resetAllTests;
@@ -1640,3 +1660,4 @@ window.skipTest = skipTest;
window.addTestBack = addTestBack;
window.testHeadphoneAudio = testHeadphoneAudio;
window.replaySpeakerTest = replaySpeakerTest;
window.replayHapticTest = replayHapticTest;

View File

@@ -16,7 +16,7 @@ export const CIRCULARITY_DATA_SIZE = 48; // Number of angular positions to sampl
* @param {boolean} opts.enable_zoom_center - Whether to apply center zoom transformation
* @param {boolean} opts.highlight - Whether to highlight the stick position
*/
export function draw_stick_position(ctx, center_x, center_y, sz, stick_x, stick_y, opts = {}) {
export function draw_stick_dial(ctx, center_x, center_y, sz, stick_x, stick_y, opts = {}) {
const { circularity_data = null, enable_zoom_center = false, highlight } = opts;
// Draw base circle
@@ -168,7 +168,7 @@ export function draw_stick_position(ctx, center_x, center_y, sz, stick_x, stick_
* @param {number[]} data - Array of distance values at different angular positions
* @returns {number} RMS deviation as percentage
*/
function calculateCircularityError(data) {
export function calculateCircularityError(data) {
// Sum of squared deviations from ideal distance of 1.0, only for values > 0.2
const sumSquaredDeviations = data.reduce((acc, val) =>
val > 0.2 ? acc + Math.pow(val - 1, 2) : acc, 0);

245
js/storage.js Normal file
View File

@@ -0,0 +1,245 @@
'use strict';
export const Storage = {
STORAGE_KEYS: {
LAST_CONNECTED_CONTROLLER: 'lastConnectedController',
EDGE_MODAL_DONT_SHOW_AGAIN: 'edgeModalDontShowAgain',
FAILED_CALIBRATION_COUNT: 'failedCalibrationCount',
CENTER_CALIBRATION_METHOD: 'centerCalibrationMethod',
RANGE_CALIBRATION_METHOD: 'rangeCalibrationMethod',
QUICK_TEST_SKIPPED_TESTS: 'quickTestSkippedTests',
SHOW_RAW_NUMBERS_CHECKBOX: 'showRawNumbersCheckbox',
FINETUNE_CENTER_STEP_SIZE: 'finetuneCenterStepSize',
FINETUNE_CIRCULARITY_STEP_SIZE: 'finetuneCircularityStepSize',
FINETUNE_HISTORY: 'finetuneHistory',
},
getChangesStorageKey(serialNumber) {
if (!serialNumber) return null;
return `changes_${serialNumber}`;
},
setString(key, value) {
try {
localStorage.setItem(key, value);
} catch (e) {
console.warn(`Failed to save to localStorage (${key}):`, e);
}
},
getString(key) {
try {
return localStorage.getItem(key);
} catch (e) {
console.warn(`Failed to read from localStorage (${key}):`, e);
return null;
}
},
setObject(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (e) {
console.warn(`Failed to save object to localStorage (${key}):`, e);
}
},
getObject(key) {
try {
const value = localStorage.getItem(key);
return value ? JSON.parse(value) : null;
} catch (e) {
console.warn(`Failed to read object from localStorage (${key}):`, e);
return null;
}
},
removeItem(key) {
try {
localStorage.removeItem(key);
} catch (e) {
console.warn(`Failed to remove from localStorage (${key}):`, e);
}
},
setBoolean(key, value) {
this.setString(key, value.toString());
},
getBoolean(key, defaultValue = false) {
const value = this.getString(key);
return value !== null ? value === 'true' : defaultValue;
},
setNumber(key, value) {
this.setString(key, value.toString());
},
getNumber(key, defaultValue = 0) {
const value = this.getString(key);
return value !== null ? parseInt(value, 10) : defaultValue;
},
lastConnectedController: {
set(info) {
Storage.setObject(Storage.STORAGE_KEYS.LAST_CONNECTED_CONTROLLER, info);
},
get() {
return Storage.getObject(Storage.STORAGE_KEYS.LAST_CONNECTED_CONTROLLER);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.LAST_CONNECTED_CONTROLLER);
},
},
edgeModalDontShowAgain: {
set(value) {
Storage.setBoolean(Storage.STORAGE_KEYS.EDGE_MODAL_DONT_SHOW_AGAIN, value);
},
get() {
return Storage.getBoolean(Storage.STORAGE_KEYS.EDGE_MODAL_DONT_SHOW_AGAIN);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.EDGE_MODAL_DONT_SHOW_AGAIN);
},
},
failedCalibrationCount: {
set(count) {
Storage.setNumber(Storage.STORAGE_KEYS.FAILED_CALIBRATION_COUNT, count);
},
get() {
return Storage.getNumber(Storage.STORAGE_KEYS.FAILED_CALIBRATION_COUNT, 0);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.FAILED_CALIBRATION_COUNT);
},
},
centerCalibrationMethod: {
set(method) {
Storage.setString(Storage.STORAGE_KEYS.CENTER_CALIBRATION_METHOD, method);
},
get(defaultValue = 'four-step') {
return Storage.getString(Storage.STORAGE_KEYS.CENTER_CALIBRATION_METHOD) || defaultValue;
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.CENTER_CALIBRATION_METHOD);
},
},
rangeCalibrationMethod: {
set(method) {
Storage.setString(Storage.STORAGE_KEYS.RANGE_CALIBRATION_METHOD, method);
},
get(defaultValue = 'normal') {
return Storage.getString(Storage.STORAGE_KEYS.RANGE_CALIBRATION_METHOD) || defaultValue;
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.RANGE_CALIBRATION_METHOD);
},
},
quickTestSkippedTests: {
set(tests) {
Storage.setObject(Storage.STORAGE_KEYS.QUICK_TEST_SKIPPED_TESTS, tests);
},
get() {
return Storage.getObject(Storage.STORAGE_KEYS.QUICK_TEST_SKIPPED_TESTS) || [];
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.QUICK_TEST_SKIPPED_TESTS);
},
},
showRawNumbersCheckbox: {
set(value) {
Storage.setString(Storage.STORAGE_KEYS.SHOW_RAW_NUMBERS_CHECKBOX, value.toString());
},
get() {
const value = Storage.getString(Storage.STORAGE_KEYS.SHOW_RAW_NUMBERS_CHECKBOX);
return value === 'true';
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.SHOW_RAW_NUMBERS_CHECKBOX);
},
},
finetuneCenterStepSize: {
set(value) {
Storage.setString(Storage.STORAGE_KEYS.FINETUNE_CENTER_STEP_SIZE, value.toString());
},
get() {
return Storage.getString(Storage.STORAGE_KEYS.FINETUNE_CENTER_STEP_SIZE);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.FINETUNE_CENTER_STEP_SIZE);
},
},
finetuneCircularityStepSize: {
set(value) {
Storage.setString(Storage.STORAGE_KEYS.FINETUNE_CIRCULARITY_STEP_SIZE, value.toString());
},
get() {
return Storage.getString(Storage.STORAGE_KEYS.FINETUNE_CIRCULARITY_STEP_SIZE);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.FINETUNE_CIRCULARITY_STEP_SIZE);
},
},
hasChangesState: {
set(serialNumber, hasChanges) {
const key = Storage.getChangesStorageKey(serialNumber);
if (key) {
Storage.setObject(key, hasChanges);
}
},
get(serialNumber) {
const key = Storage.getChangesStorageKey(serialNumber);
if (!key) return false;
return Storage.getObject(key) || false;
},
clear(serialNumber) {
const key = Storage.getChangesStorageKey(serialNumber);
if (key) {
Storage.removeItem(key);
}
},
},
finetuneHistory: {
getAll() {
return Storage.getObject(Storage.STORAGE_KEYS.FINETUNE_HISTORY) || {};
},
setAll(history) {
Storage.setObject(Storage.STORAGE_KEYS.FINETUNE_HISTORY, history);
},
clear() {
Storage.removeItem(Storage.STORAGE_KEYS.FINETUNE_HISTORY);
},
},
};

View File

@@ -83,10 +83,11 @@ export async function loadAllTemplates() {
const edgeModalHtml = await loadTemplate('edge-modal');
const donateModalHtml = await loadTemplate('donate-modal');
const quickTestModalHtml = await loadTemplate('quick-test-modal');
const calibrationHistoryModalHtml = await loadTemplate('calibration-history-modal');
// Create modals container
const modalsContainer = document.createElement('div');
modalsContainer.id = 'modals-container';
modalsContainer.innerHTML = faqModalHtml + popupModalHtml + finetuneModalHtml + calibCenterModalHtml + welcomeModalHtml + autoCalibCenterModalHtml + rangeModalHtml + edgeProgressModalHtml + edgeModalHtml + donateModalHtml + quickTestModalHtml;
modalsContainer.innerHTML = faqModalHtml + popupModalHtml + finetuneModalHtml + calibCenterModalHtml + welcomeModalHtml + autoCalibCenterModalHtml + rangeModalHtml + edgeProgressModalHtml + edgeModalHtml + donateModalHtml + quickTestModalHtml + calibrationHistoryModalHtml;
document.body.appendChild(modalsContainer);
}

View File

@@ -1,6 +1,7 @@
'use strict';
import { la, createCookie, readCookie } from './utils.js';
import { la } from './utils.js';
import { Storage } from './storage.js';
// Alphabetical order
const available_langs = {
@@ -24,6 +25,7 @@ const available_langs = {
"ru_ru": { "name": "Русский", "file": "ru_ru.json", "direction": "ltr"},
"tr_tr": { "name": "Türkçe", "file": "tr_tr.json", "direction": "ltr"},
"ua_ua": { "name": "Українська", "file": "ua_ua.json", "direction": "ltr"},
"vi_vn": { "name": "Tiếng Việt", "file": "vi_vn.json", "direction": "ltr"},
"zh_cn": { "name": "中文", "file": "zh_cn.json", "direction": "ltr"},
"zh_tw": { "name": "中文(繁)", "file": "zh_tw.json", "direction": "ltr"}
};
@@ -49,7 +51,7 @@ export function lang_init(appState, handleLanguageChangeCb, welcomeModalCb) {
}
translationState.lang_orig_text[".title"] = document.title;
const force_lang = readCookie("force_lang");
const force_lang = Storage.getString("force_lang");
if (force_lang != null) {
lang_set(force_lang, true).catch(error => {
console.error("Failed to set forced language:", error);
@@ -88,9 +90,9 @@ async function lang_set(lang, skip_modal=false) {
}
await handleLanguageChange(lang);
createCookie("force_lang", lang);
Storage.setString("force_lang", lang);
if(!skip_modal && welcomeModal) {
createCookie("welcome_accepted", "0");
Storage.setString("welcome_accepted", "0");
welcomeModal();
}
}

View File

@@ -1,5 +1,7 @@
'use strict';
import { Storage } from './storage.js';
/**
* Utility functions for DualShock controller operations
*/
@@ -118,38 +120,27 @@ export function lerp_color(a, b, t) {
}
/**
* Create a cookie with specified name, value, and expiration days
* @param {string} name Cookie name
* @param {string} value Cookie value
* @param {number} days Number of days until expiration
* Get the appropriate locale for date formatting based on language and timezone
* @returns {string} Locale string for use with toLocaleString()
*/
export function createCookie(name, value, days) {
const expires = days ? "; expires=" + new Date(Date.now() + days * 24 * 60 * 60 * 1000).toGMTString() : "";
document.cookie = encodeURIComponent(name) + "=" + encodeURIComponent(value) + expires + "; path=/";
}
export function getLocaleForDateFormatting() {
let lang = Storage.getString('force_lang') || navigator.language;
const timezone = Intl.DateTimeFormat().resolvedOptions().timeZone;
/**
* Read a cookie value by name
* @param {string} name Cookie name
* @returns {string|null} Cookie value or null if not found
*/
export function readCookie(name) {
const nameEQ = encodeURIComponent(name) + "=";
const ca = document.cookie.split(';');
for (let i = 0; i < ca.length; i++) {
let c = ca[i];
while (c.charAt(0) === ' ')
c = c.substring(1, c.length);
if (c.indexOf(nameEQ) === 0)
return decodeURIComponent(c.substring(nameEQ.length, c.length));
// Replace en_US with en_UK if timezone does not start with "America"
if (lang.toLowerCase() === 'en_us' && !timezone.startsWith('America')) {
lang = 'en_UK';
}
return null;
return lang.replace('_', '-').toLowerCase();
}
/**
* Delete a cookie by setting its expiration to the past
* @param {string} name Cookie name to delete
* Format a timestamp as a localized date/time string
* @param {number|string} timestamp Unix timestamp or date string
* @returns {string} Formatted date/time string
*/
export function eraseCookie(name) {
createCookie(name, "", -1);
export function formatLocalizedDate(timestamp) {
const locale = getLocaleForDateFormatting();
return new Date(timestamp).toLocaleString(locale);
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "الترجمة من طرف سجاد رحيم Sajjad Rahim",
"DualShock Calibration GUI": "DualShock Calibration GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "المتصفح غير معتمد. الرجاء استخدام متصفح بدعم WebHID (على سبيل المثال Chrome).",
"Connect": "اتصال",
"Connected to:": "متصل بـ:",
"Disconnect": "قطع الاتصال",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "إعادة تسجيل عصا وحدة التحكم.",
"Please do not close this window and do not disconnect your controller. ": "الرجاء عدم إغلاق هذه النافذة وعدم قطع اتصال يد التحكم. ",
"Range calibration": "معايرة المدى",
"<b>The controller is now sampling data!</b>": "<b>يد التحكم تقوم الآن بأخذ عينات من البيانات!</b>",
"The controller is now sampling data!": "يد التحكم تقوم الآن بأخذ عينات من البيانات!",
"Done": "تمّ",
"Hi, thank you for using this software.": "مرحباً، شكراً لك على استخدام هذا البرنامج.",
"If you're finding it helpful and you want to support my efforts, feel free to": "إذا كنت تجد ذلك مفيداً وترغب في دعم جهودي، لا تتردد في",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "الجهاز المتصل غير صالح،",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "خطأ،",
"My handle on discord is: the_al": "معرفي على ديسكورد هو، the_al",
"Initializing...": "تتم التهيئة...",
"Storing calibration...": "خزن المعايرة...",
"Sampling...": "أخذ العينات...",
"Calibration in progress": "جارٍ المعايرة",
"Start": "بدء",
"Continue": "متابعة",
"You can check the calibration with the": "يمكنك التحقق من المعايرة من خلال",
"Have a nice day :)": "أتمنى لك يومًا سعيدًا :)",
"Welcome to the Calibration GUI": "مرحباً بك في Calibration GUI",
"Just few things to know before you can start:": "بعض الأشياء التي يجب أن تعرفها قبل أن تبدأ",
@@ -125,9 +121,6 @@
", to help more people like you!": "، لمساعدة المزيد من الناس من أمثالك!",
"This website uses analytics to improve the service.": "يستخدم هذا الموقع التحليلات لتحسين الخدمة.",
"Board Model": "نوع اللوحة",
"This feature is experimental.": "هذه الخاصية تجريبية.",
"Please let me know if the board model of your controller is not detected correctly.": "من فضلك أخبرني إذا لم يتم اكتشاف نوع لوحة التحكم بشكل صحيح.",
"Board model detection thanks to": "كشف نوع اللوحة بفضل",
"This DualSense controller has outdated firmware.": "يد تحكم DualSense هذه تستخدم برمجيات قديمة.",
"Please update the firmware and try again.": "الرجاء حدث البرمجيات وحاول مرة أخرى.",
"Joystick Info": "معلومات عصا التحكم",
@@ -185,13 +178,20 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -201,13 +201,18 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Fail": "",
"Failed": "",
@@ -217,6 +222,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -228,7 +234,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -241,15 +249,17 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
"Nova Pink": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -265,6 +275,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -282,7 +294,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
@@ -290,8 +306,16 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"We are not responsible for any damage caused by attempting this modification.": "",
@@ -299,6 +323,7 @@
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You can do this in two ways:": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Превод на Български е извършен от: <a href='https://www.youtube.com/channel/UC8pzDCIt_CUj8sa7cYgPzHQ'>Tamir-Teknik</a>",
"DualShock Calibration GUI": "DualShock калибрационен интерфейс",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Неподдържан браузър. Моля, използвайте уеб браузър с поддръжка на WebHID (например Chrome).",
"Connect": "Свържи",
"Connected to:": "Свързан с:",
"Disconnect": "Изключване",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Повторно центриране на джойстиците на контролера.",
"Please do not close this window and do not disconnect your controller. ": "Моля, не затваряйте този прозорец и не изключвайте контролера си. ",
"Range calibration": "Калибриране на обхвата",
"<b>The controller is now sampling data!</b>": "<b>Контролерът в момента примерява данни!</b>",
"The controller is now sampling data!": "Контролерът в момента примерява данни!",
"Done": "Готово",
"Hi, thank you for using this software.": "Здравейте, благодарим ви, че използвате този софтуер.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Ако намирате, че е полезно и искате да подкрепите усилията ми, не се колебайте",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Свързан невалидно устройство",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Грешка",
"My handle on discord is: the_al": "Моят ник в discord е: the_al",
"Initializing...": "Инициализация...",
"Storing calibration...": "Запазване на калибрацията...",
"Sampling...": "Проба...",
"Calibration in progress": "Калибрация в ход",
"Start": "Започни",
"Continue": "Продължи",
"You can check the calibration with the": "Можете да проверите калибрацията с",
"Have a nice day :)": "Приятен ден! :)",
"Welcome to the Calibration GUI": "Добре дошли в Calibration GUI",
"Just few things to know before you can start:": "Просто няколко неща, които трябва да знаете, преди да започнете:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", за да помогнете на повече хора като вас!",
"This website uses analytics to improve the service.": "Този уебсайт използва анализи за подобряване на услугата.",
"Board Model": "Модел на платката",
"This feature is experimental.": "Тази функция е експериментална.",
"Please let me know if the board model of your controller is not detected correctly.": "Моля, уведомете ме, ако моделът на платката на вашия контролер не е разпознат правилно.",
"Board model detection thanks to": "Разпознаване на модела на платката благодарение на",
"This DualSense controller has outdated firmware.": "Този контролер DualSense има остарял фърмуер.",
"Please update the firmware and try again.": "Моля, актуализирайте фърмуера и опитайте отново.",
"Joystick Info": "Информация за джойстика",
@@ -160,15 +153,22 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -178,16 +178,21 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"FW Build Date": "",
"FW Series": "",
@@ -203,6 +208,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -216,7 +222,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -230,6 +238,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
@@ -237,9 +246,10 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -255,6 +265,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -277,7 +289,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
@@ -285,12 +301,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You can do this in two ways:": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "Překlad od Rowan_CZE <a href='https://beardedvillains.cz/'>Bearded Villains Czech Republic</a>",
"DualShock Calibration GUI": "DualShock Calibration GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nepodporovaný prohlížeč. Použijte prosím webový prohlížeč s podporou WebHID (např. Chrome).",
"Connect": "Připojit",
"Connected to:": "Připojeno:",
"Disconnect": "Odpojit",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Vycentrování páček.",
"Please do not close this window and do not disconnect your controller. ": "Nezavírejte toto okno a neodpojujte ovladač. ",
"Range calibration": "Kalibrace rozsahu",
"<b>The controller is now sampling data!</b>": "<b>Regulátor nyní vzorkuje data!</b>",
"The controller is now sampling data!": "Regulátor nyní vzorkuje data!",
"Done": "Hotovo",
"Hi, thank you for using this software.": "Dobrý den, děkujeme, že používáte tento software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Pokud to považujete za užitečné a chcete mé úsilí podpořit, neváhejte",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Připojené neplatné zařízení",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Chyba",
"My handle on discord is: the_al": "Můj Discord to: the_al",
"Initializing...": "Inicializace...",
"Storing calibration...": "Uložení kalibrace...",
"Sampling...": "Vzorkování...",
"Calibration in progress": "Probíhá kalibrace",
"Start": "Start",
"Continue": "Pokračovat",
"You can check the calibration with the": "Kalibraci můžete zkontrolovat pomocí",
"Have a nice day :)": "Hezký den :)",
"Welcome to the Calibration GUI": "Vítejte v GUI kalibrace",
"Just few things to know before you can start:": "Jen pár věcí, které byste měli vědět, než začnete",
@@ -124,9 +120,6 @@
", to help more people like you!": ", pomoci více lidem, jako jste vy!",
"This website uses analytics to improve the service.": "Tento web používá analýzy ke zlepšení služeb.",
"Board Model": "Model základní desky",
"This feature is experimental.": "Tato funkce je experimentální.",
"Please let me know if the board model of your controller is not detected correctly.": "Prosím, dejte mi vědět, pokud model základní desky vašeho ovládače není správně detekován",
"Board model detection thanks to": "díky za detekci modelu základní desky",
"This DualSense controller has outdated firmware.": "Tento ovladač DualSense má zastaralý firmware.",
"Please update the firmware and try again.": "Aktualizujte firmware a zkuste to znovu.",
"Joystick Info": "Informace o joysticku",
@@ -143,17 +136,24 @@
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After range calibration, joysticks always go in corners.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Can I reset a permanent calibration to previous calibration?": "",
"Can you overwrite a permanent calibration?": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -164,17 +164,22 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Does this software resolve stickdrift?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Error while saving changes": "",
"FW Build Date": "",
@@ -191,6 +196,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -205,7 +211,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -220,6 +228,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"No.": "",
"Normal": "",
@@ -229,10 +238,11 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please read the instructions.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -249,6 +259,8 @@
"Reboot controller": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -273,7 +285,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "",
@@ -283,12 +299,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"Yes. Simply do another permanent calibration.": "",
"You can do this in two ways:": "",
"You have to rotate the joysticks before you press \"Done\".": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Oversættelse til dansk af Claus Christensen",
"DualShock Calibration GUI": "DualShock Kalibrerings GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Browseren understøttes ikke. Brug venligst en webbrowser med WebHID-understøttelse (f.eks. Chrome).",
"Connect": "Tilslut",
"Connected to:": "Tilsluttet til:",
"Disconnect": "Afbryd",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Genjustering af controllerens styrepinde.",
"Please do not close this window and do not disconnect your controller. ": "Luk venligst ikke dette vindue, og frakobl ikke din controller. ",
"Range calibration": "Rækkeviddekalibrering",
"<b>The controller is now sampling data!</b>": "<b>Controlleren indsamler nu data!</b>",
"The controller is now sampling data!": "Controlleren indsamler nu data!",
"Done": "Færdig",
"Hi, thank you for using this software.": "Hej, tak fordi du bruger denne software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Hvis du finder den nyttig, og du ønsker at støtte mine bestræbelser, er du velkommen til at",
@@ -66,16 +65,14 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Forbundet til en ugyldig enhed",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "Enheden ser ud til at være en kopi. Al kalibreringsfunktionalitet er deaktiveret.",
"Error": "Fejl",
"My handle on discord is: the_al": "Mit brugernavn på Discord er: the_al",
"Initializing...": "Initialiserer...",
"Storing calibration...": "Gemmer kalibrering...",
"Sampling...": "Sampling...",
"Calibration in progress": "Kalibrering er i gang",
"Start": "Start",
"Continue": "Fortsæt",
"You can check the calibration with the": "Du kan tjekke kalibreringen med",
"Have a nice day :)": "Hav en god dag :)",
"Welcome to the Calibration GUI": "Velkommen til Kalibrerings GUI",
"Just few things to know before you can start:": "Bare et par ting, du skal vide, før du går i gang:",
@@ -125,9 +122,6 @@
", to help more people like you!": ", for at hjælpe flere personer som dig!",
"This website uses analytics to improve the service.": "Hjemmesiden anvender analyseværktøjer for at forbedre servicen.",
"Board Model": "Board Model",
"This feature is experimental.": "Denne funktion er eksperimentel.",
"Please let me know if the board model of your controller is not detected correctly.": "Giv mig venligst besked, hvis board modellen på din controller ikke bliver registreret korrekt.",
"Board model detection thanks to": "Board model detektion, tak til",
"This DualSense controller has outdated firmware.": "Denne DualSense controller har forældet firmware.",
"Please update the firmware and try again.": "Opdater venligst firmwaren og prøv igen.",
"Joystick Info": "Joystick Info",
@@ -182,7 +176,6 @@
"Chroma Teal": "Chroma Teal",
"Cobalt Blue": "Cobalt Blue",
"Color": "Farve",
"Color detection thanks to": "Farvedetektering, tak til",
"Cosmic Red": "Cosmic Red",
"DualSense Edge Calibration": "DualSense Edge Kalibrering",
"FW Update": "FW Opdatering",
@@ -201,7 +194,6 @@
"More details and images": "Flere detaljer og billeder",
"Nova Pink": "Nova Pink",
"PCBA ID": "PCBA ID",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Forbind venligst en DualShock 4-, DualSense- eller DualSense Edge-controller til din computer, og tryk på Tilslut.",
"Right Module Barcode": "Højre Modul Stregkode",
"SBL FW Version": "SBL FW Version",
"Spider FW Version": "Spider FW Version",
@@ -238,76 +230,110 @@
"Show raw numbers": "Vis faktiske tal",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Enheden er forbundet via Bluetooth. Afbryd forbindelsen, og tilslut den igen med et USB-kabel i stedet.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Din enhed er muligvis ikke en ægte Sony-controller. Hvis det ikke er en kopi, bedes du rapportere dette problem.",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Center": "",
"Circularity": "",
"Controller does not support adaptive trigger control": "",
"Don't show again": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
"Failed to disable adaptive trigger": "",
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"Keep rotating the sticks even if you see no progress!": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
"Long-press [circle] to skip ahead.": "",
"Microphone": "",
"Microphone Level:": "",
"No controller connected": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
"Press [square] to begin or [circle] to close": "",
"Press [triangle] to go back.": "",
"Press each button until they turn green.": "",
"Progress": "",
"Quick Test": "",
"Quick calibrate": "",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
"Speaker": "",
"Step size": "",
"Test Speaker": "",
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"USB Connector": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"failed": "",
"hide": "",
"passed": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Gennemsnitlig cirkularitetsfejl:</strong> mindre er ikke altid bedre! Sigt efter 7-9 %.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "En genstart er nødvendig for at fortsætte med at bruge denne DualSense Edge. Afbryd forbindelsen til controlleren, og tilslut den igen.",
"Adaptive Trigger": "Adaptiv aftrækker",
"Adaptive triggers are only supported on DualSense controllers": "Adaptive aftrækkere understøttes kun på DualSense-controllere.",
"Add test": "Tilføj test",
"Be gentle to avoid damage.": "Vær forsigtig for at undgå skader.",
"Buttons": "Knapper",
"Center": "Centrer",
"Circularity": "Cirkularitet",
"Controller does not support adaptive trigger control": "Controlleren understøtter ikke kontrol af adaptive aftrækkere.",
"Don't show again": "Vis ikke igen",
"Fail": "Fejl",
"Failed": "Mislykkedes",
"Failed to connect to device": "Kunne ikke oprette forbindelse til enheden.",
"Failed to disable adaptive trigger": "Kunne ikke deaktivere adaptiv aftrækker.",
"Failed to set speaker tone": "Kunne ikke indstille højttalertone.",
"Failed to set vibration": "Kunne ikke indstille vibration.",
"Feel for vibration in the controller.": "Mærk efter vibration i controlleren.",
"Haptic Vibration": "Haptisk vibration",
"Headphone Jack": "Hovedtelefonstik",
"Increase non-circularity": "Øg ikke-cirkulariteten",
"Instructions": "Instruktioner",
"Keep rotating the sticks even if you see no progress!": "Bliv ved med at dreje pindene, selvom du ikke ser nogen fremgang!",
"Learn more...": "Læs mere",
"Lights": "Lys",
"Listen for a tone from the controller speaker.": "Lyt efter en tone fra controllerens højttaler.",
"Long-press [circle] to skip ahead.": "Tryk og hold [circle] nede for at springe fremad.",
"Microphone": "Mikrofon",
"Microphone Level:": "Mikrofonniveau:",
"No controller connected": "Ingen controller tilsluttet",
"No tests completed yet.": "Ingen tests er færdige endnu.",
"Not tested": "Ikke testet",
"Pass": "Godkend",
"Passed": "Godkendt",
"Plug in headphones to the 3.5mm jack": "Tilslut hovedtelefoner til 3,5 mm-stikket.",
"Press L2 and R2 triggers to feel the trigger resistance.": "Tryk på L2- og R2-aftrækkere for at mærke aftrækkerens modstand.",
"Press [circle] to close, or [square] to start over": "Tryk på [circle] for at lukke, eller [square] for at starte forfra.",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Tryk på [square] for at godkende, [cross] for at fejle, eller [circle] for at springe over.",
"Press [square] to begin or [circle] to close": "Tryk på [square] for at starte eller [circle] for at lukke.",
"Press [triangle] to go back.": "Tryk på [triangle] for at gå tilbage.",
"Press each button until they turn green.": "Tryk på hver knap, indtil den bliver grøn.",
"Progress": "Fremgang",
"Quick Test": "Hurtig Test",
"Quick calibrate": "Hurtig kalibrering",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Kalibrering af rækkevidde ser ud til at være mislykket. Prøv igen, og sørg for at dreje pindene.",
"Repeat": "Gentag",
"Restart": "Genstart",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Drej pinde langsomt mindst 2 gange i den ene retning og 2 gange i den anden retning for at dække hele bevægelsesområdet.",
"Run through these tests to verify your controller's functionality.": "Gennemfør disse tests for at verificere, at din controller fungerer korrekt.",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Sony-controllere leveres fra fabrikken kalibreret med en gennemsnitlig cirkularitetsfejl på næsten 10 %, og det er nu det, spil forventer. For perfekt cirkularitet kan få bevægelser og sigte til at føles stive og uresponsive i nogle spil.",
"Speaker": "Højttaler",
"Step size": "Trinstørrelse",
"Test Speaker": "Test højttaler",
"Test Summary": "Testoversigt",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Test alle knapper, eller tryk og hold [square] for at godkende, [cross] for at fejle, eller [circle] for at springe over.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "<b>Færdig</b>-knappen vil blive tilgængelig efter højst 15 sekunder. Hvis du trykker på <b>Færdig</b> uden at dreje pindene, vil kalibreringen være ufuldstændig, og du bliver nødt til at gentage den.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Denne test kontrollerer alle controllerens knapper ved at kræve, at du trykker på hver knap op til tre gange.",
"This test checks the headphone jack functionality.": "Denne test kontrollerer hovedtelefonstikkens funktionalitet.",
"This test checks the reliability of the USB port.": "Denne test kontrollerer USB-portens pålidelighed.",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Denne test vil skifte mellem rødt, grønt og blåt på controllerens lysbjælke, animere spillerindikatorlysene og blinke med mute-knappen.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Denne test vil aktivere stærk modstand på både L2- og R2-aftrækkere.",
"USB Connector": "USB-stik",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Se controllerens lys skifte farve, spillerlysene animere og mute-knappen blinke.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Mens du holder den pind, der skal justeres, lige op/ned/venstre/højre, foretag justeringer, indtil du ser lyseblå sektorer i alle fire retninger efter at have cirklet pinden både til venstre og højre. Brug derefter...",
"Wiggle the USB cable to see if the controller disconnects.": "Vrik med USB-kablet for at se, om controlleren afbrydes.",
"failed": "fejlet",
"hide": "skjul",
"passed": "godkendt",
"skipped": "sprunget over",
"tests completed": "tests er gennemført",
"to increase the non-circularity.": "for at øge ikke-cirkulariteten.",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "Efter de er blevet udskiftet, kan dette værktøj bruges til at kalibrere controlleren til at fungere med de nye joysticks.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "Sigt efter en cirkularitetsfejl på omkring 7-9 % for den bedste spiloplevelse.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "Batteriniveauet er lavt. Tests kan fejle, fordi controlleren er i strømbesparende tilstand.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "Kalibrering uden udskiftning af joysticks kan hjælpe midlertidigt, men det kan også gøre problemet værre, uden mulighed for at fortryde det.",
"Calibration History": "Kalibreringshistorik",
"Cannot copy text to the clipboard:": "Kan ikke kopiere tekst til udklipsholderen:",
"Cannot read module barcodes": "Kan ikke læse modul-stregkoder",
"Clear All": "Ryd alt",
"Current": "Aktuel",
"Delete": "Slet",
"Delete all calibration history for this controller? This cannot be undone.": "Slet al kalibreringshistorik for denne controller? Dette kan ikke fortrydes.",
"Delete this calibration entry?": "Slet denne kalibreringspost?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "Drift skyldes, at mekaniske dele i joysticket er slidte, og de skal udskiftes for at løse problemet.",
"Firefox is supported with the WebHID extension installed.": "Firefox understøttes med WebHID-udvidelsen installeret.",
"It appears the latest joystick calibration has not been saved.": "Det ser ud til, at den seneste joystick-kalibrering ikke er blevet gemt.",
"Last connected": "Sidst tilsluttet",
"No saved calibrations found.": "Ingen gemte kalibreringer fundet.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Tilslut venligst en DualShock 4, DualSense, DualSense Edge eller VR2 controller til din computer og tryk på Tilslut.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Brug venligst en webbrowser med WebHID-understøttelse (f.eks. Google Chrome eller Microsoft Edge) på en PC eller Mac.",
"Restore": "Gendan",
"Restore calibration": "Gendan kalibrering",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "Kalibreringen blev gendannet! Husk at gemme ændringerne, så de ikke går tabt, når controlleren genstartes.",
"The item has been copied to the clipboard.": "Elementet er blevet kopieret til udklipsholderen.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "Denne controller har ikke-gemte ændringer, som vil gå tabt, når controlleren genstartes.",
"This utility cannot fix stick drift.": "Dette værktøj kan ikke rette stick drift.",
"Unsupported browser.": "Browseren understøttes ikke.",
"Use expert mode": "Brug eksperttilstand",
"Use four-step calibration": "Brug fire-trins kalibrering",
"Use normal mode": "Brug normal tilstand",
"Use quick calibration": "Brug hurtig kalibrering",
"Using this utility on a phone or tablet is not supported.": "Brug af dette værktøj på en telefon eller tablet understøttes ikke.",
"Values": "Værdier",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Du bør gemme dine ændringer, eller genstarte controlleren for at vende tilbage til den tidligere tilstand.",
"serial number": "serienummer",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Deutsch Übersetzung von <a href='https://chat.openai.com'>ChatGPT</a>",
"DualShock Calibration GUI": "DualShock-Kalibrierungs-GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nicht unterstützter Browser. Verwende bitte einen Webbrowser mit WebHID-Unterstützung (z.B. Chrome).",
"Connect": "Verbinden",
"Connected to:": "Verbunden mit:",
"Disconnect": "Trennen",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Controller-Sticks zurücksetzen.",
"Please do not close this window and do not disconnect your controller. ": "Bitte schließe das Fenster nicht und trenne deinen Controller nicht. ",
"Range calibration": "Bereichskalibrierung",
"<b>The controller is now sampling data!</b>": "<b>Der Controller erfasst jetzt Daten!</b>",
"The controller is now sampling data!": "Der Controller erfasst jetzt Daten!</b>",
"Done": "Fertig",
"Hi, thank you for using this software.": "Hallo, vielen Dank, dass du diese Software verwendest.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Wenn du sie hilfreich findest und meine Bemühungen unterstützen möchten, kannst du mir gerne",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Verbundenes ungültiges Gerät",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Fehler",
"My handle on discord is: the_al": "Mein Handle auf Discord ist: the_al",
"Initializing...": "Initialisierung...",
"Storing calibration...": "Kalibrierung speichern...",
"Sampling...": "Probenahme...",
"Calibration in progress": "Kalibrierung läuft",
"Start": "Start",
"Continue": "Fortfahren",
"You can check the calibration with the": "Du kannst die Kalibrierung mit dem",
"Have a nice day :)": "Einen schönen Tag noch! :)",
"Welcome to the Calibration GUI": "Willkommen bei der Kalibrierungs-GUI",
"Just few things to know before you can start:": "Nur wenige Dinge, die du wissen solltest, bevor du beginnst:",
@@ -125,9 +121,6 @@
", to help more people like you!": ", um mehr Menschen wie dir zu helfen!",
"This website uses analytics to improve the service.": "Diese Website verwendet Analytics, um den Service zu verbessern.",
"Board Model": "Platinentyp",
"This feature is experimental.": "Diese Funktion ist experimentell.",
"Please let me know if the board model of your controller is not detected correctly.": "Bitte lasse mich wissen, wenn das Platinentyp Ihres Controllers nicht korrekt erkannt wird.",
"Board model detection thanks to": "Platinentyp-Erkennung dank",
"This DualSense controller has outdated firmware.": "Dieser DualSense-Controller hat eine veraltete Firmware.",
"Please update the firmware and try again.": "Bitte aktualisiere die Firmware und versuche es erneut.",
"Joystick Info": "Joystick-Informationen",
@@ -177,13 +170,20 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -193,13 +193,18 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"FW Update": "",
"FW Update Info": "",
@@ -211,6 +216,7 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -223,7 +229,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Lights": "",
@@ -236,6 +244,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
@@ -243,9 +252,10 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -261,6 +271,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
@@ -279,7 +291,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
@@ -287,10 +303,18 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You can do this in two ways:": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Traducción al Español realizado por Ruben Martins, Miguel Borja @closesim :)",
"DualShock Calibration GUI": "GUI de Calibración DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Navegador no soportado. Por favor utiliza un explorador con soporte WebHID (ej. Chrome).",
"Connect": "Conectar",
"Connected to:": "Conectado a:",
"Disconnect": "Desconectar",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Re-centrando los análogos del mando.",
"Please do not close this window and do not disconnect your controller. ": "Por favor, no cierre esta ventana y/o desconecte el mando. ",
"Range calibration": "Calibración de rango",
"<b>The controller is now sampling data!</b>": "<b>El mando ahora esta captando información!</b>",
"The controller is now sampling data!": "El mando ahora esta captando información!</b>",
"Done": "Listo",
"Hi, thank you for using this software.": "Hola, gracias por utilizar este software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Si te ha parecido útil y te gustaria apoyar mis esfuerzos, no te cortes",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo conectado no válido",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Error",
"My handle on discord is: the_al": "Mi usuario de discord es: the_al",
"Initializing...": "Inicializando...",
"Storing calibration...": "Guardando Calibración...",
"Sampling...": "Captando...",
"Calibration in progress": "Calibración en proceso",
"Start": "Empezar",
"Continue": "Continuar",
"You can check the calibration with the": "Puede verificar su calibración con el",
"Have a nice day :)": "Que tenga un buen dia! :)",
"Welcome to the Calibration GUI": "Bienvenido a la GUI de Calibración",
"Just few things to know before you can start:": "Un par de cosas antes de empezar:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", para que ayude más personas como tu!",
"This website uses analytics to improve the service.": "Este sitio web utiliza análisis para mejorar el servicio.",
"Board Model": "Modelo de la placa",
"This feature is experimental.": "Esta función es experimental.",
"Please let me know if the board model of your controller is not detected correctly.": "Por favor, avísame si el modelo de la placa de tu controlador no se detecta correctamente.",
"Board model detection thanks to": "Detección del modelo de la placa gracias a",
"This DualSense controller has outdated firmware.": "Este mando DualSense tiene un firmware desactualizado.",
"Please update the firmware and try again.": "Por favor, actualiza el firmware y vuelve a intentarlo.",
"Joystick Info": "Información del joystick",
@@ -143,17 +136,24 @@
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After range calibration, joysticks always go in corners.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Can I reset a permanent calibration to previous calibration?": "",
"Can you overwrite a permanent calibration?": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -164,17 +164,22 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Does this software resolve stickdrift?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Error while saving changes": "",
"FW Build Date": "",
@@ -191,6 +196,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -205,7 +211,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -220,6 +228,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"No.": "",
"Normal": "",
@@ -229,10 +238,11 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please read the instructions.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -249,6 +259,8 @@
"Reboot controller": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -273,7 +285,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "",
@@ -283,12 +299,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"Yes. Simply do another permanent calibration.": "",
"You can do this in two ways:": "",
"You have to rotate the joysticks before you press \"Done\".": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "ترجمه توسط آرش رسول زاده",
".authorMsg": "گسترش و ترجمه توسط محمد میرحسینی",
"DualShock Calibration GUI": "رابط کاربری کالیبراسیون DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "مرورگر پشتیبانی نمی‌شود. لطفاً از مرورگری با پشتیبانی WebHID استفاده کنید (مثل Chrome).",
"Connect": "اتصال",
"Connected to:": "متصل به:",
"Disconnect": "قطع اتصال",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "بازتنظیم مرکز استیک‌های کنترلر در حال انجام است.",
"Please do not close this window and do not disconnect your controller. ": "لطفاً این پنجره را نبندید و کنترلر را قطع نکنید.",
"Range calibration": "کالیبراسیون محدوده",
"<b>The controller is now sampling data!</b>": "<b>کنترلر اکنون در حال نمونه‌برداری از داده‌هاست!</b>",
"The controller is now sampling data!": "کنترلر اکنون در حال نمونه‌برداری از داده‌هاست!",
"Done": "تکمیل",
"Hi, thank you for using this software.": "سلام، از استفاده شما از این نرم‌افزار متشکرم.",
"If you're finding it helpful and you want to support my efforts, feel free to": "اگر این نرم‌افزار برایتان مفید بود و می‌خواهید از تلاش‌های من حمایت کنید، می‌توانید",
@@ -66,16 +65,13 @@
"Sony DualSense": "سونی DualSense",
"Sony DualSense Edge": "سونی DualSense Edge",
"Connected invalid device": "دستگاه متصل نامعتبر است",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "خطا",
"My handle on discord is: the_al": "شناسه من در دیسکورد: the_al",
"Initializing...": "در حال راه‌اندازی...",
"Storing calibration...": "در حال ذخیره‌سازی کالیبراسیون...",
"Sampling...": "در حال نمونه‌برداری...",
"Calibration in progress": "کالیبراسیون در حال انجام است",
"Start": "شروع",
"Continue": "ادامه",
"You can check the calibration with the": "می‌توانید کالیبراسیون را با",
"Have a nice day :)": "روز خوبی داشته باشید :)",
"Welcome to the Calibration GUI": "به رابط کاربری کالیبراسیون خوش آمدید",
"Just few things to know before you can start:": "چند نکته قبل از شروع:",
@@ -87,17 +83,80 @@
"Version": "نسخه",
"Frequently Asked Questions": "سؤالات متداول",
"Close": "بستن",
"Welcome to the F.A.Q. section! Below, you'll find answers to some of the most commonly asked questions about this website. If you have any other inquiries or need further assistance, feel free to reach out to me directly. Your feedback and questions are always welcome!": "به بخش سؤالات متداول خوش آمدید! در اینجا پاسخ پرسش‌های رایج درباره‌ی این وب‌سایت را خواهید یافت. در صورت نیاز به راهنمایی بیشتر می‌توانید با ما تماس بگیرید.",
"How does it work?": "این ابزار چگونه کار می‌کند؟",
"Behind the scenes, this website is the culmination of one year of dedicated effort in reverse-engineering DualShock controllers for fun/hobby from a random guy on the internet.": "در پشت صحنه، این وب‌سایت حاصل بیش از یک سال تلاش برای مهندسی معکوس کنترلرهای DualShock توسط فردی علاقه‌مند است.",
"Through": "از طریق",
", it was discovered that there exist some undocumented commands on DualShock controllers that can be sent via USB and are used during factory assembly process. If these commands are sent, the controller starts the recalibration of analog sticks.": "مشخص شد که مجموعه‌ای از دستورات غیرمستند در کنترلرهای DualShock وجود دارد که از طریق USB قابل ارسال هستند و در فرآیند کارخانه‌ای مونتاژ استفاده می‌شوند. ارسال این دستورات باعث آغاز بازکالیبراسیون آنالوگ استیک‌ها می‌شود.",
"While the primary focus of this research wasn't initially centered on recalibration, it became apparent that a service offering this capability could greatly benefit numerous individuals. And thus, here we are.": "اگرچه هدف اصلی این تحقیق بازکالیبراسیون نبود، اما مشخص شد که ارائه‌ی چنین قابلیتی می‌تواند برای افراد زیادی مفید باشد — و نتیجه آن همین وب‌سایت است.",
"Does the calibration remain effective during gameplay on PS4/PS5?": "آیا کالیبراسیون در زمان بازی روی PS4 یا PS5 فعال باقی می‌ماند؟",
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "بله، اگر گزینه‌ی «نوشتن تغییرات به‌صورت دائمی در کنترلر» را فعال کنید، تنظیمات کالیبراسیون در حافظه‌ی کنترلر ذخیره می‌شود و روی هر کنسولی باقی می‌ماند.",
"Is this an officially endorsed service?": "آیا این یک سرویس رسمی است؟",
"No, this service is simply a creation by a DualShock enthusiast.": "خیر، این یک پروژه‌ی مستقل و شخصی است که توسط یک علاقه‌مند به کنترلرهای DualShock توسعه داده شده است.",
"Does this website detect if a controller is a clone?": "آیا این سایت می‌تواند کنترلرهای غیراصل (کپی) را شناسایی کند؟",
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "بله، فعلاً فقط برای کنترلرهای DualShock4 فعال است. پس از خرید تصادفی چند کنترلر غیراصل، تفاوت‌ها بررسی و این قابلیت برای جلوگیری از خطا در آینده افزوده شد.",
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "متأسفانه کنترلرهای غیراصل قابل کالیبره کردن نیستند چون فقط رفتار معمولی DualShock4 را شبیه‌سازی می‌کنند و به دستورات پیشرفته پاسخ نمی‌دهند.",
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "اگر مایلید قابلیت شناسایی به DualSense هم اضافه شود، کافی است یک کنترلر غیراصل برای ما ارسال کنید تا پس از بررسی اضافه شود.",
"What development is in plan?": "برنامه‌های توسعه آینده چیست؟",
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "برای این پروژه دو فهرست کار جداگانه دارم، هرچند هنوز ترتیب اولویت‌ها نهایی نشده است.",
"The first list is about enhancing support for DualShock4 and DualSense controllers:": "فهرست اول مربوط به بهبود پشتیبانی از کنترلرهای DualShock4 و DualSense است:",
"Implement calibration of L2/R2 triggers.": "افزودن امکان کالیبره کردن دکمه‌های L2/R2.",
"Improve detection of clones, particularly beneficial for those seeking to purchase used controllers with assurance of authenticity.": "بهبود شناسایی کنترلرهای غیراصل، مفید برای کسانی که قصد خرید کنترلر کارکرده دارند.",
"Enhance user interface (e.g. provide additional controller information)": "بهبود رابط کاربری (نمایش اطلاعات بیشتر درباره کنترلر).",
"Add support for recalibrating IMUs.": "افزودن پشتیبانی از بازکالیبراسیون حسگرهای حرکتی (IMU).",
"Additionally, explore the possibility of reviving non-functioning DualShock controllers (further discussion available on Discord for interested parties).": "بررسی امکان احیای کنترلرهای ازکارافتاده DualShock (بحث بیشتر در Discord در دسترس است).",
"The second list contains new controllers I aim to support:": "فهرست دوم شامل کنترلرهایی است که قصد پشتیبانی از آن‌ها را دارم:",
"DualSense Edge": "DualSense Edge",
"DualShock 3": "DualShock 3",
"XBox Controllers": "کنترلرهای XBox",
"Each of these tasks presents both immense interest and significant time investment. To provide context, supporting a new controller typically demands 6-12 months of full-time research, alongside a stroke of good fortune.": "هر یک از این وظایف به زمان و علاقه‌ی زیادی نیاز دارد. معمولاً پشتیبانی از یک کنترلر جدید بین ۶ تا ۱۲ ماه تحقیق تمام‌وقت زمان می‌برد.",
"Can I reset a permanent calibration to previous calibration?": "آیا می‌توان کالیبراسیون دائمی را به حالت قبلی برگرداند؟",
"No.": "خیر.",
"Can you overwrite a permanent calibration?": "آیا می‌توان کالیبراسیون دائمی را بازنویسی کرد؟",
"Yes. Simply do another permanent calibration.": "بله، کافی است دوباره کالیبراسیون دائمی انجام دهید.",
"Does this software resolve stickdrift?": "آیا این نرم‌افزار مشکل استیک دریفت را برطرف می‌کند؟",
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "استیک‌دریفت معمولاً به دلیل ایراد سخت‌افزاری مثل آلودگی، فرسودگی پتانسیومتر یا فنر داخلی است.",
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "این نرم‌افزار به‌تنهایی مشکل استیک‌دریفت را رفع نمی‌کند، اما کمک می‌کند پس از تعویض جوی‌استیک‌ها، عملکرد صحیحشان را بررسی و تنظیم کنید.",
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "برخی کنترلرها حتی در حالت کارخانه‌ای نیز کالیبراسیون ضعیفی دارند. این مورد به‌ویژه در کنترلرهای SCUF با طراحی خاص پوسته مشاهده می‌شود.",
"(Dualsense) Will updating the firmware reset calibration?": "آیا به‌روزرسانی Firmware در DualSense باعث حذف کالیبراسیون می‌شود؟",
"After range calibration, joysticks always go in corners.": "بعد از کالیبراسیون دامنه، جوی‌استیک‌ها همیشه به گوشه‌ها می‌چسبند.",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "این اتفاق زمانی رخ می‌دهد که بلافاصله پس از شروع کالیبراسیون روی «انجام شد» کلیک می‌کنید.",
"Please read the instructions.": "لطفاً دستورالعمل‌ها را با دقت بخوانید.",
"You have to rotate the joysticks before you press \"Done\".": "باید قبل از فشردن دکمه‌ی «انجام شد»، جوی‌استیک‌ها را بچرخانید.",
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "مطمئن شوید جوی‌استیک را تا لبه‌های قاب حرکت داده و در هر دو جهت ساعت‌گرد و پادساعت‌گرد به‌آرامی بچرخانید.",
"Only after you have done that, you click on \"Done\".": "فقط پس از انجام کامل این مراحل، روی «انجام شد» کلیک کنید.",
"I love this service, it helped me! How can I contribute?": "از این سرویس خیلی راضی‌ام! چطور می‌تونم کمک کنم؟",
"I'm glad to hear that you found this helpful! If you're interested in contributing, here are a few ways you can help me:": "خوشحالم که این ابزار برات مفید بوده! اگر دوست داری کمک کنی، چند روش ساده هست:",
"Consider making a": "می‌تونی با",
"donation": "حمایت مالی",
"to support my late-night caffeine-fueled reverse-engineering efforts.": "از تلاش‌های شبانه‌روزم برای توسعه این ابزار حمایت کنی.",
"Ship me a controller you would love to add (send me an email for organization).": "یک کنترلر که دوست داری به لیست پشتیبانی اضافه بشه برای من بفرست (برای هماهنگی ایمیل بزن).",
"Translate this website in your language": "این وب‌سایت را به زبان خودت ترجمه کن",
", to help more people like you!": "تا افراد بیشتری بتوانند از آن استفاده کنند!",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Center": "",
"Circularity": "",
"Clear All": "",
"Controller does not support adaptive trigger control": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
@@ -105,11 +164,14 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
@@ -117,10 +179,13 @@
"Microphone": "",
"Microphone Level:": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -134,6 +199,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
@@ -143,18 +210,32 @@
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Traduction française par <a href='https://github.com/Sadenki'>Cyrille Pugeault</a> &amp; <a href='https://github.com/TyduSubak'>Alexandre Pugeault</a>.",
"DualShock Calibration GUI": "Interface de calibrage DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Navigateur incompatible. Merci d'utiliser un navigateur supportant le WebHID (p. ex. Chrome).",
"Connect": "Connecter",
"Connected to:": "Connecté à:",
"Disconnect": "Déconnecter",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Recentrement des joysticks de la manette en cours.",
"Please do not close this window and do not disconnect your controller. ": "Veuillez ne pas fermer cette fenêtre et ne déconnectez pas votre manette. ",
"Range calibration": "Calibrage de la portée du joystick",
"<b>The controller is now sampling data!</b>": "<b>La manette est maintenant en train d'échantillonner les données !</b>",
"The controller is now sampling data!": "La manette est maintenant en train d'échantillonner les données !",
"Done": "Terminer",
"Hi, thank you for using this software.": "Salut, merci d'avoir utilisé cet outil.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Si vous le trouvez utile et que vous souhaitez soutenir mon travail, n'hésitez pas à",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Appareil non valide connecté",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Erreur",
"My handle on discord is: the_al": "Mon ID sur Discord est: the_al",
"Initializing...": "Initialisation...",
"Storing calibration...": "Sauvegarde du calibrage...",
"Sampling...": "Échantillonnage...",
"Calibration in progress": "Calibrage en cours",
"Start": "Démarrer",
"Continue": "Continuer",
"You can check the calibration with the": "Vous pouvez vérifier le calibrage avec le:",
"Have a nice day :)": "Bonne journée :)",
"Welcome to the Calibration GUI": "Bienvenue dans l'Interface de calibrage",
"Just few things to know before you can start:": "Juste quelques informations à savoir avant que vous ne puissiez commencer:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", pour aider plus de gens comme vous !",
"This website uses analytics to improve the service.": "Ce site utilise des analyses pour améliorer le service.",
"Board Model": "Modèle de carte",
"This feature is experimental.": "Cette fonctionnalité est expérimentale.",
"Please let me know if the board model of your controller is not detected correctly.": "Veuillez me faire savoir si le modèle de la carte de votre manette n'est pas détecté correctement.",
"Board model detection thanks to": "Détection du modèle de la carte grâce à",
"This DualSense controller has outdated firmware.": "Cette manette DualSense a un firmware obsolète.",
"Please update the firmware and try again.": "Veuillez mettre à jour le firmware et réessayer.",
"Joystick Info": "Infos Joystick",
@@ -143,17 +136,24 @@
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After range calibration, joysticks always go in corners.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Can I reset a permanent calibration to previous calibration?": "",
"Can you overwrite a permanent calibration?": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -164,17 +164,22 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Does this software resolve stickdrift?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Error while saving changes": "",
"FW Build Date": "",
@@ -191,6 +196,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -205,7 +211,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -220,6 +228,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"No.": "",
"Normal": "",
@@ -229,10 +238,11 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please read the instructions.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -249,6 +259,8 @@
"Reboot controller": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -273,7 +285,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "",
@@ -283,12 +299,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"Yes. Simply do another permanent calibration.": "",
"You can do this in two ways:": "",
"You have to rotate the joysticks before you press \"Done\".": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "| A magyarítást a <a href='https://pandafix.hu' target='_blank'>Pandafix</a> készítette.",
"DualShock Calibration GUI": "DualShock / DualSense kontroller kalibráló felület",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nem támogatott böngésző! Kérlek olyan böngészőt használj, ami támogatja a WebHID protokollt (pl: Chrome, Maxthon)",
"Connect": "Csatlakozás",
"Connected to:": "Csatlakoztatva:",
"Disconnect": "Lecsatlakozás",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "A kontroller hüvelykujjkar középállásának újrakalibrálása.",
"Please do not close this window and do not disconnect your controller. ": "Kérlek, ne zárd be ezt az ablakot, és ne válaszd le a kontrollert. ",
"Range calibration": "Elmozdulási tartomány kalibrálása",
"<b>The controller is now sampling data!</b>": "<b>A kontroller most az adatokat mintavételezi!</b>",
"The controller is now sampling data!": "A kontroller most az adatokat mintavételezi!</b>",
"Done": "Kész",
"Hi, thank you for using this software.": "Szia! Köszönjük, hogy ezt az alkalmazást használtad.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Ha hasznosnak találod ezt az alkalmazást, és támogatni szeretnéd a készítőt, akkor kérlek tedd meg",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Érvénytelen eszköz csatlakoztatva",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Hiba",
"My handle on discord is: the_al": "Fogjunk kezet a Discordon: the_al",
"Initializing...": "Inicializálás...",
"Storing calibration...": "Kalibrálási adatok tárolása...",
"Sampling...": "Mintavételezés...",
"Calibration in progress": "Kalibrálás folyamatban",
"Start": "Kezdés",
"Continue": "Folytatás",
"You can check the calibration with the": "Az újrakalibrálást ellenőrizheted az alábbi alkalmazással is:",
"Have a nice day :)": "További szép napot kívánunk! :)",
"Welcome to the Calibration GUI": "Üdvözöl a Dualshock/DualSense kalibrálást segítő alkalmazás!",
"Just few things to know before you can start:": "Csak néhány dolog, amit tudnod kell, mielőtt belevágnál:",
@@ -125,12 +121,9 @@
", to help more people like you!": ", hogy több hozzád hasonló embernek segítsen!",
"This website uses analytics to improve the service.": "Ez a weboldal analitikát használ a szolgáltatás javításához.",
"Board Model": "Alaplap verzió",
"This feature is experimental.": "Ez egy kisérleti funkció",
"Please let me know if the board model of your controller is not detected correctly.": "Kérlek értesítsd a fejlesztőt, ha az alaplap verziója nem egyezik meg a felimert verzióval!",
"Board model detection thanks to": "Az alaplapfelismerési funkciőért köszönet illeti:",
"This DualSense controller has outdated firmware.": "Ennek a DualSense vezérlőnek elavult a firmware-e.",
"Please update the firmware and try again.": "Kérlek frissítsd a firmware-t, és próbáld újra.",
"Joystick Info": "Analógkar Információ",
"Joystick Info": "Analógkar információ",
"Check circularity": "Körkörösség ellenőrzése",
"Can I reset a permanent calibration to previous calibration?": "Visszaállíthatok egy végleges kalibrációt az előző kalibrációra?",
"No.": "Nem",
@@ -152,7 +145,7 @@
"Save changes permanently": "A változtatások végleges mentése a kontrollerbe",
"Reboot controller": "Kontroller újraindítása",
"Controller Info": "Információk a kontrollerről",
"Debug Info": "Hibakeresési infomrációk",
"Debug Info": "Hibakeresési információk",
"Software": "Szoftver",
"Hardware": "Hardver",
"FW Build Date": "FW kiadásának dátuma",
@@ -170,10 +163,10 @@
"PCBA ID": "PCBA azonosító",
"Battery Barcode": "Akkumulátor vonalkód",
"VCM Left Barcode": "Bal VCM vonalkód",
"VCM Right Barcode": "Jobb VCM vonalód",
"VCM Right Barcode": "Jobb VCM vonalkód",
"HW Model": "HW modell",
"Touchpad ID": "Tapipad azonosító",
"Bluetooth Address": "Bluetooth címzés",
"Bluetooth Address": "Bluetooth cím",
"Show all": "Mindet megjelenít",
"Finetune stick calibration": "Karok finomkalibrálása",
"(beta)": "(béta)",
@@ -186,7 +179,6 @@
"DualSense Edge Calibration": "DualSense Edge kalibráció",
"For more info or help, feel free to reach out on Discord.": "További információért vagy segítségért nyugodtan keress fel a Discordon.",
"More details and images": "További részletek és képek",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Kérlek, csatlakoztass egy DualShock 4, DualSense vagy DualSense Edge kontrollert a számítógépedhez, és nyomd meg a Csatlakozás gombot.",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Kérlek, vedd figyelembe: a DS Edge hüvelykujjkar moduljai <b>nem kalibrálhatók kizárólag szoftveresen</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "<b>Hardveres módosítás</b> szükséges az egyedi kalibrációnak a modulok belső memóriájában történő tárolásához.",
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "A DualSense Edge hüvelykujjkar modulok kalibrálásának támogatása mostantól <b>kísérleti funkcióként</b> elérhető.",
@@ -199,7 +191,6 @@
"Cannot store data into": "Adatok tárolása nem lehetséges ide:",
"Cannot unlock": "Feloldás nem lehetséges",
"Color": "Szín",
"Color detection thanks to": "A színészlelésért köszönet illeti:",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Ha a kalibráció nem került véglegesen tárolásra, kérlek, ellenőrizd újra a hardvermódosítás vezetékezését!",
"Left Module Barcode": "Bal modul vonalkódja",
"Right Module Barcode": "Jobb modul vonalkódja",
@@ -218,96 +209,131 @@
"Sterling Silver": "Sterling Silver",
"Volcanic Red": "Volcanic Red",
"White": "Fehér",
"10x zoom": "",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibration": "",
"Center": "",
"Center (L1)": "",
"Chroma Indigo": "",
"Chroma Pearl": "",
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Controller does not support adaptive trigger control": "",
"Debug": "",
"Don't show again": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
"Failed to disable adaptive trigger": "",
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Fortnite": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"Keep rotating the sticks even if you see no progress!": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
"Long-press [circle] to skip ahead.": "",
"Microphone": "",
"Microphone Level:": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
"Press [square] to begin or [circle] to close": "",
"Press [triangle] to go back.": "",
"Press each button until they turn green.": "",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "",
"Progress": "",
"Push the stick straight up/down/left/right as far as possible.": "",
"Quick Test": "",
"Quick calibrate": "",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Show raw numbers": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
"Speaker": "",
"Spider-Man 2": "",
"Step size": "",
"Test Speaker": "",
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"USB Connector": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",
"10x zoom": "10x nagyítás",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Átlagos körkörösségi hiba:</strong> a kisebb nem mindig jobb! Célozd meg a 7-9%-ot.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "A DualSense Edge további használatához újraindítás szükséges. Kérlek, válaszd le, majd csatlakoztasd újra a kontrollert.",
"Adaptive Trigger": "Adaptív ravasz",
"Adaptive triggers are only supported on DualSense controllers": "Az adaptív ravaszok csak DualSense kontrollereken támogatottak",
"Add test": "Teszt hozzáadása",
"Be gentle to avoid damage.": "Légy óvatos, hogy elkerüld a sérülést.",
"Buttons": "Gombok",
"Calibration": "Kalibrálás",
"Center": "Közép",
"Center (L1)": "Közép (L1)",
"Chroma Indigo": "Chroma Indigó",
"Chroma Pearl": "Chroma Gyöngy",
"Chroma Teal": "Chroma Kékeszöld",
"Circularity": "Körkörösség",
"Circularity (R1)": "Körkörösség (R1)",
"Controller does not support adaptive trigger control": "A kontroller nem támogatja az adaptív ravasz vezérlését",
"Debug": "Hibakeresés",
"Don't show again": "Ne jelenjen meg újra",
"Fail": "Sikertelen",
"Failed": "Sikertelen",
"Failed to connect to device": "Nem sikerült csatlakozni az eszközhöz",
"Failed to disable adaptive trigger": "Nem sikerült letiltani az adaptív ravaszt",
"Failed to set speaker tone": "Nem sikerült beállítani a hangszóró hangját",
"Failed to set vibration": "Nem sikerült beállítani a rezgést",
"Feel for vibration in the controller.": "Érezd a rezgést a kontrollerben.",
"Fortnite": "Fortnite",
"Haptic Vibration": "Haptikus rezgés",
"Headphone Jack": "Fejhallgató-csatlakozó",
"Increase non-circularity": "Nem-körkörösség növelése",
"Info": "Infó",
"Instructions": "Utasítások",
"Keep rotating the sticks even if you see no progress!": "Forgasd tovább a karokat akkor is, ha nem látsz változást!",
"Learn more...": "Tudj meg többet...",
"Lights": "Fények",
"Listen for a tone from the controller speaker.": "Figyeld a hangjelzést a kontroller hangszórójából.",
"Long-press [circle] to skip ahead.": "Nyomd hosszan a [kör] gombot a kihagyáshoz.",
"Microphone": "Mikrofon",
"Microphone Level:": "Mikrofon szint:",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Mozgasd meg a kart a kiválasztáshoz, majd anélkül, hogy hozzáérnél, használd a D-pad (nyíl) gombokat a középpont beállításához. Pöccintsd meg, és állítsd be újra, ha nincs középen vagy ugrál.",
"No controller connected": "Nincs csatlakoztatva kontroller",
"No tests completed yet.": "Még nincsenek befejezett tesztek.",
"Normal": "Normál",
"Not tested": "Nincs tesztelve",
"Pass": "Sikeres",
"Passed": "Sikeres",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Kérlek, csatlakoztass egy DualShock 4, DualSense, DualSense Edge vagy VR2 kontrollert a számítógépedhez, és kattints a Csatlakozás gombra.",
"Please release the stick to center position before adjusting with D-pad buttons.": "Kérlek, engedd el a kart középső állásba, mielőtt a D-pad gombokkal módosítanád.",
"Plug in headphones to the 3.5mm jack": "Csatlakoztass egy fejhallgatót a 3,5 mm-es jack aljzathoz",
"Press L2 and R2 triggers to feel the trigger resistance.": "Nyomd meg az L2 és R2 ravaszokat az ellenállás érzékeléséhez.",
"Press [circle] to close, or [square] to start over": "Nyomd meg a [kör] gombot a bezáráshoz, vagy a [négyzet] gombot az újrakezdéshez",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Nyomd meg a [négyzet] gombot, ha Sikeres, a [kereszt] gombot, ha Sikertelen, vagy a [kör] gombot a kihagyáshoz.",
"Press [square] to begin or [circle] to close": "Nyomd meg a [négyzet] gombot a kezdéshez, vagy a [kör] gombot a bezáráshoz",
"Press [triangle] to go back.": "Nyomd meg a [háromszög] gombot a visszalépéshez.",
"Press each button until they turn green.": "Nyomj meg minden gombot, amíg zöldre nem váltanak.",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Nyomd a D-padot vagy az előlapi gombokat abba az irányba, amerre a kar pozícióját mozgatni szeretnéd.",
"Progress": "Folyamat",
"Push the stick straight up/down/left/right as far as possible.": "Told a kart egyenesen fel/le/balra/jobbra, ameddig csak lehet.",
"Quick Test": "Gyors teszt",
"Quick calibrate": "Gyors kalibrálás",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Úgy tűnik, a tartománykalibrálás sikertelen volt. Kérlek, próbáld újra, és győződj meg róla, hogy forgatod a karokat.",
"Repeat": "Ismétlés",
"Restart": "Újraindítás",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Forgasd a karokat lassan legalább kétszer az egyik irányba, és kétszer a másik irányba, hogy a teljes tartományt lefedd.",
"Run through these tests to verify your controller's functionality.": "Futtasd le ezeket a teszteket a kontroller működésének ellenőrzéséhez.",
"Show raw numbers": "Nyers adatok mutatása",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "A Sony kontrollerek gyárilag közel 10%-os átlagos körkörösségi hibával érkeznek, és a játékok jelenleg ezt várják el. A túl tökéletes körkörösség miatt a mozgás és a célzás merevnek és érzéketlennek tűnhet bizonyos játékokban.",
"Speaker": "Hangszóró",
"Spider-Man 2": "Spider-Man 2",
"Step size": "Lépésköz",
"Test Speaker": "Hangszóró tesztelése",
"Test Summary": "Teszt összesítése",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Teszteld az összes gombot, vagy nyomd hosszan a [négyzet] gombot, ha Sikeres, a [kereszt] gombot, ha Sikertelen, vagy a [kör] gombot a kihagyáshoz.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "A <b>Kész</b> gomb legfeljebb 15 másodperc múlva válik elérhetővé. Ha a karok forgatása nélkül nyomod meg a <b>Kész</b> gombot, a kalibrálás hiányos lesz, és meg kell ismételned.",
"The Last of Us": "The Last of Us",
"The device appears to be a clone. All calibration functionality is disabled.": "Az eszköz hamisítványnak tűnik. Minden kalibrációs funkció letiltásra került.",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Az eszköz Bluetooth-on keresztül csatlakozik. Válaszd le, és csatlakoztasd inkább USB-kábellel.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Ez a teszt az összes kontrollergombot ellenőrzi; minden gombot akár háromszor is meg kell nyomnod.",
"This test checks the headphone jack functionality.": "Ez a teszt a fejhallgató-csatlakozó működését ellenőrzi.",
"This test checks the reliability of the USB port.": "Ez a teszt az USB-port megbízhatóságát ellenőrzi.",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Ez a teszt végigmegy a piros, zöld és kék színeken a fénysávon, animálja a játékosjelző fényeket, és villogtatja a némítás gombot.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Ez a teszt erős ellenállást kapcsol be mind az L2, mind az R2 ravaszon.",
"USB Connector": "USB csatlakozó",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Figyeld, ahogy a kontroller fényei színt váltanak, a játékosjelzők animálódnak, és a némítás gomb villog.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Miközben a beállítandó kart egyenesen fel/le/balra/jobbra tartod, végezd el a módosításokat, amíg világoskék szektorokat nem látsz mind a négy irányban, miután a kart balra és jobbra is körbeforgattad. Ezután használd a",
"Wiggle the USB cable to see if the controller disconnects.": "Mozgasd meg az USB-kábelt, hogy lásd, szétkapcsol-e a kontroller.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Lehetséges, hogy az eszközöd nem eredeti Sony kontroller. Ha nem hamisítvány, kérlek, jelentsd ezt a problémát.",
"failed": "sikertelen",
"hide": "elrejtés",
"passed": "sikeres",
"skipped": "kihagyva",
"tests completed": "befejezett teszt",
"to increase the non-circularity.": "a nem-körkörösség növeléséhez.",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "A cserét követően ez az eszköz használható a kontroller kalibrálására, hogy az új karokkal megfelelően működjön.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "Célozz meg 7-9% körüli körkörösségi hibát a legjobb játékélmény érdekében.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "Az akkumulátor töltöttségi szintje alacsony. A tesztek sikertelenek lehetnek, mert a kontroller energiatakarékos módban van.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "A karok cseréje nélküli kalibrálás átmenetileg segíthet, de ronthat is a problémán, visszaállítási lehetőség nélkül.",
"Calibration History": "Kalibrálási előzmények",
"Cannot copy text to the clipboard:": "Nem sikerült a vágólapra másolni a szöveget:",
"Cannot read module barcodes": "Nem olvashatók a modul vonalkódjai",
"Clear All": "Összes törlése",
"Current": "Jelenlegi",
"Delete": "Törlés",
"Delete all calibration history for this controller? This cannot be undone.": "Törlöd a kontroller összes kalibrálási előzményét? Ez a művelet nem vonható vissza.",
"Delete this calibration entry?": "Törlöd ezt a kalibrálási bejegyzést?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "A driftet (kúszást) a joystick mechanikus alkatrészeinek kopása okozza, amelyek cserére szorulnak a hiba elhárításához.",
"Firefox is supported with the WebHID extension installed.": "A Firefox csak a WebHID kiegészítő telepítésével támogatott.",
"It appears the latest joystick calibration has not been saved.": "Úgy tűnik, a legutóbbi joystick kalibráció nem lett elmentve.",
"Last connected": "Utoljára csatlakoztatva",
"No saved calibrations found.": "Nem található mentett kalibráció.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Kérlek, használj WebHID támogatással rendelkező böngészőt (pl. Google Chrome vagy Microsoft Edge) PC-n vagy Mac-en.",
"Restore": "Visszaállítás",
"Restore calibration": "Kalibráció visszaállítása",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "A kalibráció visszaállítása sikeres volt! Ne felejtsd el menteni a változtatásokat, hogy ne vesszenek el a kontroller újraindításakor.",
"The item has been copied to the clipboard.": "Az elem a vágólapra másolva.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "A kontrolleren mentetlen változtatások vannak, amelyek elvesznek az újraindításkor.",
"This utility cannot fix stick drift.": "Ez az eszköz nem tudja kijavítani a stick driftet.",
"Unsupported browser.": "Nem támogatott böngésző.",
"Use expert mode": "Szakértő mód használata",
"Use four-step calibration": "Négy lépéses kalibrálás használata",
"Use normal mode": "Normál mód használata",
"Use quick calibration": "Gyors kalibrálás használata",
"Using this utility on a phone or tablet is not supported.": "Ennek az eszköznek a használata telefonon vagy táblagépen nem támogatott.",
"Values": "Értékek",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Mentsd el a változtatásokat, vagy indítsd újra a kontrollert az előző állapot visszaállításához.",
"serial number": "sorozatszám",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Traduzione in Italiano a cura di <a href='https://blog.the.al'>the_al</a>",
"DualShock Calibration GUI": "GUI di Calibrazione DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Browser non supportato. Visita questo sito usando un browser con supporto WebHID (es. Google Chrome).",
"Connect": "Connetti",
"Connected to:": "Connesso a:",
"Disconnect": "Disconnetti",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Ricentro gli analogici.",
"Please do not close this window and do not disconnect your controller. ": "Non chiudere questa finestra e non disconnettere il controller. ",
"Range calibration": "Calibrazione del range",
"<b>The controller is now sampling data!</b>": "<b>Il controller sta campionando i dati!</b>",
"The controller is now sampling data!": "Il controller sta campionando i dati!</b>",
"Done": "Fatto",
"Hi, thank you for using this software.": "Ciao, grazie per aver usato questo software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Se lo hai trovato utile e vuoi supportare i miei sforzi, sentiti libero di",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Connesso dispositivo non valido",
"Error": "Errore",
"My handle on discord is: the_al": "Il mio handle su discord è: the_al",
"Initializing...": "Inizializzo...",
"Storing calibration...": "Salvo la calibrazione...",
"Sampling...": "Campiono...",
"Calibration in progress": "Calibrazione in corso",
"Start": "Avvia",
"Continue": "Continua",
"You can check the calibration with the": "Puoi controllare la calibrazione con il",
"Have a nice day :)": "Buona giornata! :)",
"Welcome to the Calibration GUI": "Benvenuto alla Calibration GUI",
"Just few things to know before you can start:": "Alcune cose da sapere prima di iniziare:",
@@ -124,9 +121,6 @@
", to help more people like you!": ", per aiutare più persone come te!",
"This website uses analytics to improve the service.": "Questo sito web utilizza analytics per migliorare il servizio.",
"Board Model": "Modello scheda",
"This feature is experimental.": "Questa funzionalità è sperimentale.",
"Please let me know if the board model of your controller is not detected correctly.": "Scrivimi se il modello della scheda del tuo controller non viene riconosciuto correttamente.",
"Board model detection thanks to": "Rilevamento del modello della scheda grazie a",
"This DualSense controller has outdated firmware.": "Questo controller DualSense ha un firmware non aggiornato.",
"Please update the firmware and try again.": "Aggiorna il firmware e riprova.",
"Joystick Info": "Informazioni sui Joystick",
@@ -185,11 +179,9 @@
"DualSense Edge Calibration": "Calibrazione del DualSense Edge",
"For more info or help, feel free to reach out on Discord.": "Per ulteriori informazioni o supporto, non esitare a contattarci su Discord.",
"More details and images": "Ulteriori dettagli e immagini",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Collega un controller DualShock 4, DualSense o DualSense Edge al tuo computer e premi Connetti.",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Attenzione: i moduli degli stick del DS Edge <b>non possono essere calibrati solo tramite software</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Per salvare una calibrazione personalizzata nella memoria interna dello stick, è necessaria una <b>modifica hardware</b>.",
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "Il supporto per la calibrazione dei moduli stick del DualSense Edge è ora disponibile come <b>funzionalità sperimentale</b>.",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Questo comporta la disattivazione temporanea della protezione scrittura applicando <b>+1.8V</b> a uno specifico punto di test su ciascun modulo.",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Questa procedura è destinata solo a utenti esperti. Se non sei sicuro di ciò che stai facendo, ti preghiamo di non tentarla.",
"We are not responsible for any damage caused by attempting this modification.": "Non siamo responsabili per eventuali danni causati dal tentativo di questa modifica.",
@@ -199,7 +191,6 @@
"Cannot store data into": "Non riesco a salvare i dati nel",
"Cannot unlock": "Non riesco a sbloccare il",
"Color": "Colore",
"Color detection thanks to": "Riconoscimento colore grazie a",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Se la calibrazione non è salvata permanentemente, controlla i cablaggi della mod hardware.",
"Left Module Barcode": "Codice modulo sinistro",
"Right Module Barcode": "Codice modulo destro",
@@ -309,5 +300,40 @@
"skipped": "saltato",
"tests completed": "test completati",
"to increase the non-circularity.": "per aumentare la non-circolarità.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Connetti un controller DualShock 4, DualSense, DualSense Edge o VR2 al computer e premi Connetti.",
"Cannot copy text to the clipboard:": "Non posso copiare il testo negli appunti:",
"The device appears to be a clone. All calibration functionality is disabled.": "Il dispositivo sembra un clone. Le funzioni di calibrazione sono disattivate.",
"The item has been copied to the clipboard.": "Testo copiato negli appunti.",
"Cannot read module barcodes": "Errore nella lettura dei codici a barre dei moduli",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "Dopo essere stati sostituiti, questa utility può essere usata per calibrare il controller in modo che funzioni correttamente con i nuovi joystick.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "Mira ad un errore di circolarità del 7-9 % per avere un'ottima esperienza di gioco.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "La carica della batteria è bassa. I test potrebbero fallire poiché il controller potrebbe essere in risparmio energetico.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "Calibrare senza sostituire i joystick può aiutare temporaneamente, ma potrebbe anche peggiorare il problema senza possibilità di annullare le modifiche.",
"Calibration History": "Storico calibrazioni",
"Clear All": "Rimuovi tutti",
"Current": "Attuale",
"Delete": "Rimuovi",
"Delete all calibration history for this controller? This cannot be undone.": "Rimuovere lo storico calibrazioni per questo controller? Questa operazione non può essere annullata.",
"Delete this calibration entry?": "Rimuovere questa voce?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "Il drift è causato da parti meccaniche nel joystick che vengono usurate e devono essere sostituite per risolvere il problema.",
"Firefox is supported with the WebHID extension installed.": "Firefox è supportato con l'estensione WebHID installata.",
"It appears the latest joystick calibration has not been saved.": "Sembra che l'ultima calibrazione non è stata salvata.",
"Last connected": "Ultimo connesso",
"No saved calibrations found.": "Nessuna calibrazione salvata presente.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Si prega di usare un browser web con supporto WebHID (es. Google Chrome o Microsoft Edge) su un PC o Mac.",
"Restore": "Ripristina",
"Restore calibration": "Ripristina calibrazione",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "La calibrazione è stata ripristinata con successo! Ricordati di salvare i cambiamenti per non perderla quando il controller viene riavviato.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "Questo controller ha cambiamenti non salvati che verranno persi al riavvio.",
"This utility cannot fix stick drift.": "Questa utility non risolve il drift degli analogici.",
"Unsupported browser.": "Browser non supportato.",
"Use expert mode": "Usa modalità esperto",
"Use four-step calibration": "Usa calibrazione in quattro passi",
"Use normal mode": "Usa modalità normale",
"Use quick calibration": "Usa calibrazione veloce",
"Using this utility on a phone or tablet is not supported.": "L'utilizzo di questa utility su smartphone o tablet non è supportato.",
"Values": "Valori",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Dovresti salvare i cambiamenti oppure riavviare il controller per ritornare alla calibrazione precedente.",
"serial number": "numero di serie",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- イタリア語への翻訳: <a href='https://chat.openai.com'>ChatGPT</a>",
"DualShock Calibration GUI": "DualShock Calibration GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "サポートされていないブラウザです。WebHIDサポート付きのウェブブラウザを使用してくださいChrome。 ",
"Connect": "接続",
"Connected to:": "接続先:",
"Disconnect": "切断",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "コントローラのスティックを再センタリングしています。",
"Please do not close this window and do not disconnect your controller. ": "このウインドウを閉じたり、コントローラーを切断したりしないでください。 ",
"Range calibration": "範囲キャリブレーション",
"<b>The controller is now sampling data!</b>": "<b>コントローラは現在データをサンプリングしています!</b>",
"The controller is now sampling data!": "コントローラは現在データをサンプリングしています!",
"Done": "完了",
"Hi, thank you for using this software.": "こんにちは、このソフトウェアをご利用いただきありがとうございます。",
"If you're finding it helpful and you want to support my efforts, feel free to": "役立つと思われる場合、または私の取り組みをサポートしたい場合は、お気軽に",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "接続された無効なデバイス",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "エラー",
"My handle on discord is: the_al": "Discordでの私のハンドルはthe_al",
"Initializing...": "初期化中...",
"Storing calibration...": "キャリブレーションの保存中...",
"Sampling...": "サンプリング...",
"Calibration in progress": "キャリブレーション進行中",
"Start": "開始",
"Continue": "続行",
"You can check the calibration with the": "キャリブレーションは次で確認できます",
"Have a nice day :)": "良い1日を :)",
"Welcome to the Calibration GUI": "Calibration GUIへようこそ",
"Just few things to know before you can start:": "始める前に知っておくべきこと:",
@@ -124,9 +120,6 @@
", to help more people like you!": "、あなたのような多くの人々を助けるために!",
"This website uses analytics to improve the service.": "このウェブサイトはサービスを向上させるためにアナリティクスを使用しています。",
"Board Model": "基板モデル",
"This feature is experimental.": "この機能は実験的です。",
"Please let me know if the board model of your controller is not detected correctly.": "コントローラーの基板モデルが正しく検出されない場合はお知らせください。",
"Board model detection thanks to": "基板モデルの検出には感謝します",
"This DualSense controller has outdated firmware.": "このDualSenseコントローラーのファームウェアは古くなっています。",
"Please update the firmware and try again.": "ファームウェアを更新してから再試行してください。",
"Joystick Info": "ジョイスティック情報",
@@ -147,16 +140,23 @@
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After range calibration, joysticks always go in corners.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Can I reset a permanent calibration to previous calibration?": "",
"Can you overwrite a permanent calibration?": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -167,17 +167,22 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Does this software resolve stickdrift?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Error while saving changes": "",
"FW Build Date": "",
@@ -193,6 +198,7 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -207,7 +213,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Lights": "",
@@ -221,6 +229,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"No.": "",
"Normal": "",
@@ -230,10 +239,11 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please read the instructions.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -250,6 +260,8 @@
"Reboot controller": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
@@ -273,7 +285,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "",
@@ -283,12 +299,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"Yes. Simply do another permanent calibration.": "",
"You can do this in two ways:": "",
"You have to rotate the joysticks before you press \"Done\".": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "한국어 번역 : 제타",
"DualShock Calibration GUI": "DualShock 보정 GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "지원하지 않는 브라우저입니다. WebHID를 지원하는 웹 브라우저(예: Chrome)를 사용해주세요.",
"Connect": "연결",
"Connected to:": "연결된 기기:",
"Disconnect": "연결 끊기",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "컨트롤러 스틱 중앙을 다시 설정하는 중입니다.",
"Please do not close this window and do not disconnect your controller. ": "이 창을 닫거나 컨트롤러 연결을 해제하지 마십시오.",
"Range calibration": "범위 보정",
"<b>The controller is now sampling data!</b>": "<b>컨트롤러가 데이터 샘플링을 시작했습니다!</b>",
"The controller is now sampling data!": "컨트롤러가 데이터 샘플링을 시작했습니다!",
"Done": "완료",
"Hi, thank you for using this software.": "안녕하세요, 저희 소프트웨어를 이용해 주셔서 감사합니다.",
"If you're finding it helpful and you want to support my efforts, feel free to": "이 프로그램이 도움이 되었고, 개발자를 응원하고 싶으시다면",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "잘못된 기기가 연결되었습니다",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "오류",
"My handle on discord is: the_al": "제 Discord ID는 the_al 입니다.",
"Initializing...": "초기화 중...",
"Storing calibration...": "보정 값 저장 중...",
"Sampling...": "샘플링 중...",
"Calibration in progress": "보정 진행 중",
"Start": "시작",
"Continue": "계속",
"You can check the calibration with the": "다음을 통해 보정 상태를 확인할 수 있습니다:",
"Have a nice day :)": "좋은 하루 되세요 :)",
"Welcome to the Calibration GUI": "보정 GUI에 오신 것을 환영합니다",
"Just few things to know before you can start:": "시작하기 전에 몇 가지 알아둘 사항이 있습니다:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", 당신과 같은 더 많은 사람들을 돕기 위해!",
"This website uses analytics to improve the service.": "이 웹사이트는 서비스 개선을 위해 분석 도구를 사용합니다.",
"Board Model": "보드 모델",
"This feature is experimental.": "이 기능은 실험적인 기능입니다.",
"Please let me know if the board model of your controller is not detected correctly.": "컨트롤러의 보드 모델이 올바르게 감지되지 않으면 알려주세요.",
"Board model detection thanks to": "보드 모델 감지 도움:",
"This DualSense controller has outdated firmware.": "이 DualSense 컨트롤러의 펌웨어가 오래되었습니다.",
"Please update the firmware and try again.": "펌웨어를 업데이트한 후 다시 시도해주세요.",
"Joystick Info": "조이스틱 정보",
@@ -193,7 +186,6 @@
"Circularity (R1)": "원형성 (R1)",
"Cobalt Blue": "코발트 블루",
"Color": "색상",
"Color detection thanks to": "색상 감지 도움:",
"Cosmic Red": "코스믹 레드",
"Debug": "디버그",
"DualSense Edge Calibration": "DualSense Edge 보정",
@@ -212,7 +204,6 @@
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "스틱을 움직여 조정할 스틱을 선택한 다음, 스틱을 만지지 않은 상태에서 D-패드 버튼을 사용하여 중앙점을 조정하세요. 스틱을 튕겨보고 중앙에서 벗어나거나 흔들리면 다시 조정하세요.",
"Normal": "일반",
"Nova Pink": "노바 핑크",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "DualShock 4, DualSense 또는 DualSense Edge 컨트롤러를 컴퓨터에 연결하고 '연결'을 누르세요.",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "참고: DS Edge의 스틱 모듈은 <b>소프트웨어만으로는 보정할 수 없습니다</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "스틱 내부 메모리에 사용자 지정 보정 값을 저장하려면 <b>하드웨어 개조</b>가 필요합니다.",
"Please release the stick to center position before adjusting with D-pad buttons.": "D-패드 버튼으로 조정하기 전에 스틱을 중앙 위치에 놓아주세요.",
@@ -240,12 +231,25 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Center": "",
"Circularity": "",
"Clear All": "",
"Controller does not support adaptive trigger control": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
@@ -253,11 +257,14 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
@@ -265,10 +272,13 @@
"Microphone": "",
"Microphone Level:": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -282,6 +292,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
@@ -291,21 +303,35 @@
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"Through": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "Vertaald door <a href='https://github.com/Notedop'>Notedop</a>",
"DualShock Calibration GUI": "DualShock Kalibratie GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Niet ondersteunde browser. Gebruik een webbrowser met WebHID-ondersteuning (bijv. Chrome).",
"Connect": "Verbinden",
"Connected to:": "Verbonden met:",
"Disconnect": "Verbreken",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Her-centreer de controller sticks.",
"Please do not close this window and do not disconnect your controller. ": "Sluit dit venster niet en koppel uw controller niet los. ",
"Range calibration": "Bereik kalibratie",
"<b>The controller is now sampling data!</b>": "<b>De controller verzamelt nu gegevens!</b>",
"The controller is now sampling data!": "De controller verzamelt nu gegevens!",
"Done": "Gereed",
"Hi, thank you for using this software.": "Hallo, bedankt voor het gebruik van deze software.",
"If you're finding it helpful and you want to support my efforts, feel free to": " Als u het nuttig vindt en mijn inspanningen wilt steunen, voelt u vrij om",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Ongeldig apparaat verbonden",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Error",
"My handle on discord is: the_al": "Mijn handle voor Discord is: the_al",
"Initializing...": "Initialiseren...",
"Storing calibration...": "Kalibratie opslaan...",
"Sampling...": "Data verzamelen...",
"Calibration in progress": "Kalibratie wordt uitgevoerd",
"Start": "Start",
"Continue": "Continue",
"You can check the calibration with the": "U kunt de kalibratie controleren met",
"Have a nice day :)": "Fijne dag :)",
"Welcome to the Calibration GUI": "Welkom bij de kalibratie GUI",
"Just few things to know before you can start:": "Een paar dingen die u moet weten voordat u kunt beginnen:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", om meer mensen zoals jij te helpen!",
"This website uses analytics to improve the service.": "Deze website maakt gebruik van analyses om de service te verbeteren.",
"Board Model": "Board Model",
"This feature is experimental.": "Deze functie is experimenteel.",
"Please let me know if the board model of your controller is not detected correctly.": "Laat het me weten als het model van uw controller niet correct wordt gedetecteerd.",
"Board model detection thanks to": "Bordmodel detectie dankzij",
"This DualSense controller has outdated firmware.": "Deze DualSense-controller heeft verouderde firmware.",
"Please update the firmware and try again.": "Update de firmware en probeer het opnieuw.",
"Joystick Info": "Joystick Info",
@@ -143,17 +136,24 @@
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After range calibration, joysticks always go in corners.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Can I reset a permanent calibration to previous calibration?": "",
"Can you overwrite a permanent calibration?": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -164,17 +164,22 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Does this software resolve stickdrift?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Error while saving changes": "",
"FW Build Date": "",
@@ -191,6 +196,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -205,7 +211,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -220,6 +228,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"No.": "",
"Normal": "",
@@ -229,10 +238,11 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please read the instructions.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -249,6 +259,8 @@
"Reboot controller": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -273,7 +285,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "",
@@ -283,12 +299,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"Yes. Simply do another permanent calibration.": "",
"You can do this in two ways:": "",
"You have to rotate the joysticks before you press \"Done\".": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "Tłumaczenie na język polski wykonał <a href='https://github.com/Marekk2k'>Marekk</a> update zrobiony przez <a href='https://github.com/GoomisPL'>GoomisPL</a>",
".authorMsg": "Tłumaczenie na język polski wykonał <a href='https://github.com/Marekk2k'>Marekk</a>, oraz <a href='https://github.com/GoomisPL'>GoomisPL</a>",
"DualShock Calibration GUI": "DualShock Calibration GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nie wspierana przeglądarka! Proszę użyć przeglądarki internetowej wpierającą WebHID (np. Chrome).",
"Connect": "Połącz",
"Connected to:": "Połączono z:",
"Disconnect": "Rozłącz kontroler",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Ponowne centrowanie drążków kontrolera.",
"Please do not close this window and do not disconnect your controller. ": "Proszę nie zamykaj tego okna, ani nie odłączaj swojego kontrolera. ",
"Range calibration": "Kalibracja maksymalnego zakresu drążków",
"<b>The controller is now sampling data!</b>": "<b>Kontroler zbiera teraz dane!</b>",
"The controller is now sampling data!": "Kontroler zbiera teraz dane!",
"Done": "Gotowe",
"Hi, thank you for using this software.": "Cześć, dzięki ci za użycie tego oprogramowania.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Jeżeli uznałeś to narzędzie za pomocne, i chcesz wesprzeć mój wysiłek, nie krępuj się",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Podłączono nieznane urządzenie",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Błąd",
"My handle on discord is: the_al": "Mój Discord to: the_al",
"Initializing...": "Inicjowanie...",
"Storing calibration...": "Zapisywanie kalibracji...",
"Sampling...": "Próbowanie...",
"Calibration in progress": "Kalibracja w toku",
"Start": "Start",
"Continue": "Kontynuuj",
"You can check the calibration with the": "Możesz sprawdzić kalibrację za pomocą",
"Have a nice day :)": "Życzę ci miłego dnia! :)",
"Welcome to the Calibration GUI": "Witamy w Calibration GUI",
"Just few things to know before you can start:": "O to kilka rzeczy o których musisz wiedzieć przed rozpoczęciem",
@@ -125,9 +121,6 @@
", to help more people like you!": ", aby pomóc większej ilości osób takich jak ty!",
"This website uses analytics to improve the service.": "Ta strona korzysta z analiz w celu ulepszenia usług.",
"Board Model": "Model płytki",
"This feature is experimental.": "Ta funkcja jest eksperymentalna.",
"Please let me know if the board model of your controller is not detected correctly.": "Jeżeli model płytki został wykryty błędnie prosimy o kontakt",
"Board model detection thanks to": "Podziękowania dla osoby za funkcję wykrywania modelu płytki",
"This DualSense controller has outdated firmware.": "Ten kontroler Dualsense posiada przestarzały firmware.",
"Please update the firmware and try again.": "Proszę zaktualizuj firmware i spróbuj ponownie.",
"Joystick Info": "Informacje o drążkach",
@@ -190,7 +183,6 @@
"Cannot unlock": "Nie można odblokować",
"Cobalt Blue": "Cobalt Blue",
"Color": "Kolor",
"Color detection thanks to": "Podziękowania dla osoby za funkcję wykrywania kolorów",
"Cosmic Red": "Cosmic Red",
"DualSense Edge Calibration": "Kalibracja Dualsense Edge",
"For more info or help, feel free to reach out on Discord.": "Aby uzyskać więcej informacji lub pomoc, skontaktuj się do nas na Discordzie",
@@ -202,7 +194,6 @@
"Midnight Black": "Midnight Black",
"More details and images": "Więcej szczegółów i zdjęć",
"Nova Pink": "Nova Pink",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Podłącz kontroler Dualshock 4, Dualsense, lub Dualsense Edge do komputera, i naciśnij opcję Połącz",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Uwaga: moduły drążków w DS Edge <b>nie mogą być kalibrowane wyłącznie za pomocą oprogramowania!</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Aby zapisać niestandardową kalibrację w wewnętrznej pamięci drążka, wymagana jest ręczna <b>modyfikacja sprzętowa</b>.",
"Right Module Barcode": "Barcode prawego modułu",
@@ -230,84 +221,117 @@
"Info": "Informacje",
"Normal": "Normalne",
"Center (L1)": "Centrowanie (L1)",
"Circularity (R1)": "Kolistość (R1)",
"Circularity (R1)": "Okrężność (R1)",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Porusz drążek który chcesz wyregulować, następnie bez dotykania go użyj pada kierunkowego (d-pad/krzyżak) by wybrać punkt środkowy. Wyreguluj i wyśrodkuj ponownie jeśli nie jest na środku lub skacze.",
"Please release the stick to center position before adjusting with D-pad buttons.": "Pozostaw drążek na pozycji środkowej zanim zaczniesz centrować przy pomocy pada kierunkowego (d-pad/krzyżak).",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Naciśnij pad kierunkowy (d-pad/krzyżak) lub przyciski funkcyjne w kierynku którym chcesz ustawić pozycję drążka.",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Naciśnij pad kierunkowy (d-pad/krzyżak) lub przyciski funkcyjne w kierunku którym chcesz ustawić pozycję drążka.",
"Push the stick straight up/down/left/right as far as possible.": "Przesuń drążek prosto w górę/dół/lewo/prawo najdalej jak to możliwe.",
"Show raw numbers": "Pokaż surowe liczby",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Center": "",
"Circularity": "",
"Controller does not support adaptive trigger control": "",
"Don't show again": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
"Failed to disable adaptive trigger": "",
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"Keep rotating the sticks even if you see no progress!": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
"Long-press [circle] to skip ahead.": "",
"Microphone": "",
"Microphone Level:": "",
"No controller connected": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
"Press [square] to begin or [circle] to close": "",
"Press [triangle] to go back.": "",
"Press each button until they turn green.": "",
"Progress": "",
"Quick Test": "",
"Quick calibrate": "",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
"Speaker": "",
"Step size": "",
"Test Speaker": "",
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"USB Connector": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Błąd średniej okrężności:</strong>mniej nie znaczy lepiej! Celuj w granicach 7-9%.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "By nadal używać tego Dualsense Edge zrestartuj kontroler. Odłącz i podłącz twój kontroler",
"Adaptive Trigger": "Trigger adaptacyjny",
"Adaptive triggers are only supported on DualSense controllers": "Adaptacyjne triggery wspierane są tylko w kontrolerach DualSense",
"Add test": "Dodaj test",
"Be gentle to avoid damage.": "Bądź delikatny aby uniknąć uszkodzeń",
"Buttons": "Przyciski",
"Center": "Środek",
"Circularity": "Okrężność",
"Controller does not support adaptive trigger control": "Kontroler nie wspiera kontroli adaptacyjnych triggerów",
"Don't show again": "Nie pokazuj ponownie",
"Fail": "Niepowodzenie",
"Failed": "Nie powiodło się",
"Failed to connect to device": "Podłączenie urządzenia nie powiodło się",
"Failed to disable adaptive trigger": "Blokada adaptacyjnego triggera nie powiodła się",
"Failed to set speaker tone": "Nie udało się ustawić dźwięku głośnika",
"Failed to set vibration": "Nie udało się ustawić wibracji",
"Feel for vibration in the controller.": "Poczuj wibracje w kontrolerze",
"Haptic Vibration": "Wibracje Haptyczne",
"Headphone Jack": "Wejście słuchawkowe (mini-jack 3,5mm)",
"Increase non-circularity": "Zwiększ nie-okrężność",
"Instructions": "Instrukcje",
"Keep rotating the sticks even if you see no progress!": "Kontynuuj obracanie drążków nawet jeśli nie widzisz postępów!",
"Learn more...": "Czytaj więcej...",
"Lights": "Światła",
"Listen for a tone from the controller speaker.": "Posłuchaj dźwięku z głośnika kontrolera",
"Long-press [circle] to skip ahead.": "Przytrzymaj dłużej [circle] by przejść dalej.",
"Microphone": "Mikrofon",
"Microphone Level:": "Poziom mikrofonu",
"No controller connected": "Nie podłączono kontrolera",
"No tests completed yet.": "Nie wykonano żadnego testu",
"Not tested": "Nie testowane",
"Pass": "Przejdź",
"Passed": "Zdano",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Podłącz DualShock4, DualSense, Dualsense Edge lub kontroler V2 do komputera i naciśnij Połącz.",
"Plug in headphones to the 3.5mm jack": "Podłącz słuchawki do gniazda 3.5mm typu jack",
"Press L2 and R2 triggers to feel the trigger resistance.": "Naciskaj triggery L2 i R2 aby poczuć opór triggerów",
"Press [circle] to close, or [square] to start over": "Naciśnij [circle] by zamknąć, lub [square] by rozpocząć",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Naciśnij [square] by zakończyć, [cross] by przerwać, lub [circle] by pominać.",
"Press [square] to begin or [circle] to close": "Naciśnij [square] by zacząć lub [circle] by zamknąć",
"Press [triangle] to go back.": "Naciśnij [triangle] by powrócić",
"Press each button until they turn green.": "Naciskaj",
"Progress": "Postęp",
"Quick Test": "Szybki Test",
"Quick calibrate": "Szybka kalibracja",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Kalibracja zakresu drążków zakończona niepowodzeniem. Spróbuj ponownie i bądź pewny, że obracasz drążki.",
"Repeat": "Powtarzaj",
"Restart": "Restart",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Obracaj drążki powoli co najmniej 2 razy w jedną strone i 2 razy w inną by pokryć cały zakres.",
"Run through these tests to verify your controller's functionality.": "Przejdź przez te testy by zweryfikować funkcjonalność kontrolera.",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Kontrolery Sony po kalibracji w procesie produkcji posiadają błąd okrężności na poziomie 10%, i tego oczekują gry. Zbyt dobra okrężność może spowodować, że w niektóych grach ruchy i celowanie będą bardziej sztywne, i nie responsywne",
"Speaker": "Głośnik",
"Step size": "Wielkość pomiaru",
"Test Speaker": "Test Głośnika",
"Test Summary": "Podsumowanie testu",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Sprawdź wszystkie przyciski lub naciskaj długo [square] by zakończyć, [cross] by przerwać lub [circle] by pominać.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "Przycisk <b>Gotowe</> będzie dostępny za około 15 sekund. Jeśli naciśniesz <b>Gotowe</b> bez obracania drążków, kalibracja będzie niekompletna a proces będzie wymagał powtórzenia.",
"The device appears to be a clone. All calibration functionality is disabled.": "Urządzenie wygląda na nieoryginalne. Test fukncjonalności jest zablokowany.",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Urządzenie jest podłączone przez Bluetooth. Odłącz i podłącz je za pomocą kabla USB.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Ten test sprawdza wszystkie przyciski kontrolera przez potrójne naciśnięcie każdego z nich.",
"This test checks the headphone jack functionality.": "Ten test sprawdza działanie gniazda słuchawkowego (jack).",
"This test checks the reliability of the USB port.": "Ten test sprawdza działanie portu USB.",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Ten test przejdzie przez działanie kolorów czerwonego zielonego i niebieskiego, diod na świetlnej liście, oraz diody przycisku wyciszenia.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Ten test włączy duży opór na obu triggerach L2 i R2.",
"USB Connector": "Gniazdo USB",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Obserwuj zmianę kolorów, animację diody gracza oraz miganie przycisku wyciszenia.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Przytrzymując drążek w skrajnych pozycjach góra/dół/lewa/prawa, kalibruj (obracaj) dopóki nie zobaczysz jasnoniebieskiego wypełnienia we wszystkich czterech kierunkach po wychyleniu w lewo i prawo. Następnie użyj",
"Wiggle the USB cable to see if the controller disconnects.": "Poruszaj kablem USB by sprawdzić, czy kontroler się nie rozłączy",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Twoje urzędzenie możę być nieoryginalnym kontrolerem Sony. Jeśli masz pewność, że kontroler jest oryginalny i ze sprawdzonego źródła - poinformuj nas o tym.",
"failed": "nie zdano",
"hide": "ukryj",
"passed": "zdano",
"skipped": "pominięto",
"tests completed": "testy zakończone",
"to increase the non-circularity.": "by zwiększyć nie-okrężność",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "Po ich wymianie to narzędzie może zostać wykorzystane do skalibrowania kontrolera pod kątem pracy z nowymi drążkami.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "Dla najlepszych wrażeń z gry dąż do uzyskania błędu okrężności na poziomie około 7-9%.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "Niski poziom baterii. Testy mogą się nie powieść, ponieważ kontroler znajduje się w trybie oszczędzania energii.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "Kalibracja bez wymiany drążków może pomóc tymczasowo, ale może również pogorszyć problem, bez możliwości cofnięcia zmian.",
"Calibration History": "Historia kalibracji",
"Cannot read module barcodes": "Nie można odczytać kodów kreskowych modułów",
"Clear All": "Wyczyść wszystko",
"Current": "Aktualne",
"Delete": "Usuń",
"Delete all calibration history for this controller? This cannot be undone.": "Usunąć całą historię kalibracji dla tego kontrolera? Tej operacji nie można cofnąć.",
"Delete this calibration entry?": "Usunąć ten wpis kalibracji?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "Dryfowanie jest spowodowane zużyciem części mechanicznych wewnątrz drążka; aby naprawić ten problem, należy je wymienić.",
"Firefox is supported with the WebHID extension installed.": "Firefox jest obsługiwany po zainstalowaniu rozszerzenia WebHID.",
"It appears the latest joystick calibration has not been saved.": "Wygląda na to, że ostatnia kalibracja drążka nie została zapisana.",
"Last connected": "Ostatnie połączono z",
"No saved calibrations found.": "Nie znaleziono zapisanych kalibracji.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Proszę użyć przeglądarki obsługującej WebHID (np. Google Chrome lub Microsoft Edge) na komputerze PC lub Mac.",
"Restore": "Przywróć",
"Restore calibration": "Przywróć kalibrację",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "Kalibracja została pomyślnie przywrócona! Pamiętaj, aby zapisać zmiany, aby nie utracić ich po ponownym uruchomieniu kontrolera.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "Ten kontroler posiada niezapisane zmiany, które zostaną utracone po jego ponownym uruchomieniu.",
"This utility cannot fix stick drift.": "To narzędzie nie naprawia dryfowania drążków (stick drift).",
"Unsupported browser.": "Nieobsługiwana przeglądarka.",
"Use expert mode": "Użyj trybu eksperckiego",
"Use four-step calibration": "Użyj kalibracji 4-stopniowej",
"Use normal mode": "Użyj trybu normalnego",
"Use quick calibration": "Użyj szybkiej kalibracji",
"Using this utility on a phone or tablet is not supported.": "Korzystanie z tego narzędzia na telefonie lub tablecie nie jest obsługiwane.",
"Values": "Wartości",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Powinieneś zapisać zmiany lub ponownie uruchomić kontroler, aby powrócić do poprzedniego stanu.",
"serial number": "numer seryjny",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Tradução para o Português do Brasil realizada por Padula, Diego A, Simão M, ricardo_57 :)",
"DualShock Calibration GUI": "GUI de Calibração DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Navegador não suportado. Por favor, use um navegador da web com suporte ao WebHID (por exemplo, Chrome).",
"Connect": "Conectar",
"Connected to:": "Conectado a:",
"Disconnect": "Desconectar",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Recentrando os analógicos do controle.",
"Please do not close this window and do not disconnect your controller. ": "Por favor, não feche esta janela e não desconecte seu controle. ",
"Range calibration": "Calibração do intervalo",
"<b>The controller is now sampling data!</b>": "<b>O controlador está agora a amostrar dados!</b>",
"The controller is now sampling data!": "O controlador está agora a amostrar dados!",
"Done": "Concluído",
"Hi, thank you for using this software.": "Olá, obrigado por usar este software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Se você achar útil e quiser apoiar meus esforços, sinta-se à vontade para",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo conectado inválido",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Erro",
"My handle on discord is: the_al": "Meu nome de usuário no Discord é: the_al",
"Initializing...": "Inicializando...",
"Storing calibration...": "Salvando calibração...",
"Sampling...": "Amostragem...",
"Calibration in progress": "Calibração em progresso",
"Start": "Inicio",
"Continue": "Continuar",
"You can check the calibration with the": "Podes conferir a calibração com",
"Have a nice day :)": "Tenha um bom dia :)",
"Welcome to the Calibration GUI": "Bem vindo a interface de calibração",
"Just few things to know before you can start:": "Somente algumas coisas para saber antes de você começar:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", para ajudar mais pessoas como você!",
"This website uses analytics to improve the service.": "Este site utiliza análises para melhorar o serviço.",
"Board Model": "Modelo da Placa",
"This feature is experimental.": "Esta funcionalidade é experimental.",
"Please let me know if the board model of your controller is not detected correctly.": "Por favor, avise-me se o modelo da placa do seu controle não for detectado corretamente.",
"Board model detection thanks to": "Detecção do modelo da placa graças a",
"This DualSense controller has outdated firmware.": "Este controle DualSense possui um firmware desatualizado.",
"Please update the firmware and try again.": "Por favor, atualize o firmware e tente novamente.",
"Joystick Info": "Informações do Joystick",
@@ -160,15 +153,22 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery Barcode": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Bluetooth Address": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Cancel": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -178,16 +178,21 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller Info": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Debug Info": "",
"Debug buttons": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"FW Build Date": "",
"FW Series": "",
@@ -203,6 +208,7 @@
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Finetune stick calibration": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -216,7 +222,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Left stick": "",
@@ -230,6 +238,7 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
@@ -237,9 +246,10 @@
"PCBA ID": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -255,6 +265,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Right stick": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
@@ -277,7 +289,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
@@ -285,12 +301,20 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"Touchpad FW Version": "",
"Touchpad ID": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"VCM Left Barcode": "",
"VCM Right Barcode": "",
"Values": "",
"Venom FW Version": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
@@ -299,6 +323,7 @@
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You can do this in two ways:": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Tradução para Português de Portugal realizada por @dualsense_no_drift :)",
"DualShock Calibration GUI": "GUI Calibração de DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Navegador não suportado. Por favor, use um navegador de web com suporte ao WebHID (por exemplo, Chrome).",
"Connect": "Conectar",
"Connected to:": "Conectado a:",
"Disconnect": "Desconectar",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "A recentrar os manípulos do controlador.",
"Please do not close this window and do not disconnect your controller. ": "Por favor, não feche esta janela e não desconecte o seu controlador. ",
"Range calibration": "Calibração de alcançe",
"<b>The controller is now sampling data!</b>": "<b>O controlador está agora a recolher dados!</b>",
"The controller is now sampling data!": "O controlador está agora a recolher dados!",
"Done": "Concluído",
"Hi, thank you for using this software.": "Olá, obrigado por usar este software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Se está a achar útil e quiser suportar-me os esforços, sinta-se à vontade para",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo inválido ligado",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Erro",
"My handle on discord is: the_al": "Meu nome de utilizador no Discord é: the_al",
"Initializing...": "Iniciando...",
"Storing calibration...": "Armazenando a calibração...",
"Sampling...": "Amostragem...",
"Calibration in progress": "Calibração em progresso",
"Start": "Inicio",
"Continue": "Continuar",
"You can check the calibration with the": "Pode verificar a calibração com o",
"Have a nice day :)": "Tenha um bom dia :)",
"Welcome to the Calibration GUI": "Bem-vindo à GUI de Calibração",
"Just few things to know before you can start:": "Algumas coisas que precisa de saber antes de começar:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", para ajudar mais pessoas como você!",
"This website uses analytics to improve the service.": "Este site utiliza análises para melhorar o serviço.",
"Board Model": "Modelo da Placa",
"This feature is experimental.": "Esta funcionalidade é experimental.",
"Please let me know if the board model of your controller is not detected correctly.": "Por favor, avise-me se o modelo da placa do seu controlador não for detectado corretamente.",
"Board model detection thanks to": "Detecção do modelo da placa graças a",
"This DualSense controller has outdated firmware.": "Este controlador DualSense possui um firmware desatualizado.",
"Please update the firmware and try again.": "Por favor, atualize o firmware e tente novamente.",
"Joystick Info": "Informações do Joystick",
@@ -173,7 +166,6 @@
"Left stick": "Joystick esquerdo",
"MCU Unique ID": "ID Unico da MCU",
"More details and images": "Mais detalhes e imagens",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Ligue um comando DualShock 4, DualSense ou DualSense Edge ao seu computador e prima conectar.",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Nota: os módulos do DS Edge <b>não podem ser calibrados apenas por software</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Para armazenar uma calibração personalizada na memória interna do joystick, é necessária uma <b>modificação de hardware</b>.",
"Right stick": "joystick direito",
@@ -197,7 +189,6 @@
"Cannot store data into": "Não é possível armazenar dados em",
"Cannot unlock": "Não é possível desbloquear",
"Color": "Cor",
"Color detection thanks to": "Detecção de cor graças a",
"FW Series": "Série do FW",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Se a calibração não for armazenada permanentemente, verifique novamente os fios soldados na modificação de hardware.",
"Left Module Barcode": "Código de barras do módulo esquerdo",
@@ -206,26 +197,19 @@
"left module": "módulo esquerdo",
"right module": "módulo direito",
"10x zoom": "Ampliar 10x",
"30th Anniversary": "",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Erro médio de circularidade:</strong> menor nem sempre é melhor! Procure entre 7 e 9%.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "É necessário reiniciar o dispositivo para continuar a utilizar o DualSense Edge. Desligue e volte a ligar o controle.",
"Adaptive Trigger": "Gatilho Adaptável",
"Adaptive triggers are only supported on DualSense controllers": "Os gatilhos adaptativos são suportados apenas nos controladores DualSense",
"Add test": "adicionar teste",
"Astro Bot": "",
"Be gentle to avoid damage.": "Seja gentil para evitar danos.",
"Buttons": "Botões",
"Calibration": "Calibração",
"Center": "Centro",
"Center (L1)": "Centro (L1)",
"Chroma Indigo": "",
"Chroma Pearl": "",
"Chroma Teal": "",
"Circularity": "Circularidade",
"Circularity (R1)": "Circularidade (R1)",
"Cobalt Blue": "",
"Controller does not support adaptive trigger control": "O controlador não suporta o controlo de gatilho adaptável",
"Cosmic Red": "",
"Debug": "Depurar",
"Don't show again": "Don't show again",
"Fail": "Falha",
@@ -235,10 +219,6 @@
"Failed to set speaker tone": "Falha ao definir o tom do altifalante",
"Failed to set vibration": "Falha ao definir vibração",
"Feel for vibration in the controller.": "Sinta a vibração no controlador.",
"Fortnite": "",
"Galactic Purple": "",
"God of War Ragnarok": "",
"Grey Camouflage": "",
"Haptic Vibration": "Vibração háptica",
"Headphone Jack": "Entrada dos auscultadores",
"Increase non-circularity": "Aumentar a não circularidade",
@@ -251,13 +231,11 @@
"Long-press [circle] to skip ahead.": "Mantenha premido [círculo] para avançar.",
"Microphone": "microfone",
"Microphone Level:": "Nivel do microfone",
"Midnight Black": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Mova o analógico para selecionar a afinação e, sem tocar no analógico, utilize os botões direcionais para ajustar o ponto central. Mova-o e ajuste-o novamente se estiver descentrado ou a piscar.",
"No controller connected": "Nenhum controlador ligado",
"No tests completed yet.": "Nenhum teste concluído ainda.",
"Normal": "Normal",
"Not tested": "Não testado",
"Nova Pink": "",
"Pass": "Passar",
"Passed": "Passou",
"Please release the stick to center position before adjusting with D-pad buttons.": "Solte o joystick para a posição central antes de ajustar com os botões D-pad.",
@@ -281,15 +259,11 @@
"Show raw numbers": "Mostrar números brutos",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Os comandos da Sony saem de fábrica calibrados para terem um erro médio de circularidade de quase 10%, e é isso que os jogos esperam. Uma circulação demasiado perfeita pode fazer com que os movimentos e a mira pareçam rígidos e sem resposta em alguns jogos.",
"Speaker": "auscultadores",
"Spider-Man 2": "",
"Starlight Blue": "",
"Step size": "Tamanho do passo",
"Sterling Silver": "",
"Test Speaker": "Testar o auscultadores",
"Test Summary": "Resumo do teste",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Teste todos os botões ou mantenha premido [quadrado] para Passar e [cruz] para Reprovar, ou [círculo] para Saltar.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "O botão <b>Concluído</b> será desbloqueado após, no máximo, 15 segundos. Se premir <b>Concluído</b> sem rodar os manípulos, a calibração ficará incompleta e será necessário repeti-la.",
"The Last of Us": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "O dispositivo está ligado via Bluetooth. Desligue e volte a ligar usando um cabo USB.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Este teste verifica todos os botões do comando, exigindo que pressione cada botão até três vezes.",
"This test checks the headphone jack functionality.": "Este teste verifica a funcionalidade do conector de auscultadores.",
@@ -297,10 +271,8 @@
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Este teste irá alternar entre as cores vermelha, verde e azul na barra de luzes do comando, animar as luzes indicadoras do jogador e piscar o botão de silenciar.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Este teste irá habilitar alta resistência nos gatilhos L2 e R2.",
"USB Connector": "Conector USB",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Observe as luzes do comando a mudar de cor, as luzes do leitor a animarem-se e o botão de silêncio a piscar.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Enquanto segura o joystick a ser ajustado para cima/baixo/esquerda/direita, faça ajustes até ver setores azul-claros em todas as quatro direções, depois de rodar o joystick para a esquerda e para a direita. Em seguida, utilize o",
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "Mexa o cabo USB para ver se o comando se desliga.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "O seu dispositivo pode não ser um comando original da Sony. Se não for um clone, comunique o problema.",
"failed": "falhou",
@@ -309,5 +281,59 @@
"skipped": "ignorado",
"tests completed": "testes concluídos",
"to increase the non-circularity.": "para aumentar a não circularidade.",
"30th Anniversary": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Chroma Indigo": "",
"Chroma Pearl": "",
"Chroma Teal": "",
"Clear All": "",
"Cobalt Blue": "",
"Cosmic Red": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Fortnite": "",
"Galactic Purple": "",
"God of War Ragnarok": "",
"Grey Camouflage": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"Midnight Black": "",
"No saved calibrations found.": "",
"Nova Pink": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"Spider-Man 2": "",
"Starlight Blue": "",
"Sterling Silver": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Volcanic Red": "",
"White": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Srpski prevod: <a href='https://www.linkedin.com/in/lazar-dimitrijevic/'>Lazar Dimitrijevic</a> - <a href='https://github.com/lazardimi'>GitHub</a>.",
"DualShock Calibration GUI": "Interfejs za kalibraciju DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nepodržani pretraživač. Molimo koristite veb pretraživač sa WebHID podrškom (npr. Chrome).",
"Connect": "Poveži",
"Connected to:": "Povezano sa:",
"Disconnect": "Prekini vezu",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Ponovno centriranje džojstika kontrolera.",
"Please do not close this window and do not disconnect your controller. ": "Molimo vas da ne zatvarate ovaj prozor i da ne prekidate vezu sa kontrolerom. ",
"Range calibration": "Kalibracija opsega džojstika",
"<b>The controller is now sampling data!</b>": "<b>Kontroler sada prikuplja podatke!</b>",
"The controller is now sampling data!": "Kontroler sada prikuplja podatke!",
"Done": "Završeno",
"Hi, thank you for using this software.": "Zdravo, hvala vam što koristite ovaj softver.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Ako vam je koristan i želite da podržite moj rad, slobodno",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Povezan je nevažeći uređaj",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Greška",
"My handle on discord is: the_al": "Moj Discord ID je: the_al",
"Initializing...": "Inicijalizacija...",
"Storing calibration...": "Čuvanje kalibracije...",
"Sampling...": "Uzorak...",
"Calibration in progress": "Kalibracija u toku",
"Start": "Počni",
"Continue": "Nastavi",
"You can check the calibration with the": "Možete proveriti kalibraciju sa:",
"Have a nice day :)": "Želimo vam prijatan dan :)",
"Welcome to the Calibration GUI": "Dobrodošli u interfejs za kalibraciju",
"Just few things to know before you can start:": "Samo nekoliko stvari koje treba da znate pre nego što počnete:",
@@ -125,9 +121,6 @@
", to help more people like you!": ", da biste pomogli više ljudi poput vas!",
"This website uses analytics to improve the service.": "Ovaj sajt koristi analitiku za poboljšanje servisa.",
"Board Model": "Model ploče",
"This feature is experimental.": "Ova funkcionalnost je eksperimentalna.",
"Please let me know if the board model of your controller is not detected correctly.": "Molimo vas da mi javite ako model ploče vašeg kontrolera nije tačno detektovan.",
"Board model detection thanks to": "Detekcija modela ploče zahvaljujući",
"This DualSense controller has outdated firmware.": "Ovaj DualSense kontroler ima zastareli firmware.",
"Please update the firmware and try again.": "Molimo vas da ažurirate firmware i pokušate ponovo.",
"Joystick Info": "Informacije o džojstiku",
@@ -189,12 +182,19 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Calibration is being stored in the stick modules.": "",
"Cannot copy text to the clipboard:": "",
"Cannot lock": "",
"Cannot read module barcodes": "",
"Cannot store data into": "",
"Cannot unlock": "",
"Center": "",
@@ -204,13 +204,18 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Color": "",
"Color detection thanks to": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"DualSense Edge Calibration": "",
"Fail": "",
"Failed": "",
@@ -219,6 +224,7 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"For more info or help, feel free to reach out on Discord.": "",
"Fortnite": "",
"Galactic Purple": "",
@@ -230,7 +236,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Left Module Barcode": "",
"Lights": "",
@@ -242,15 +250,17 @@
"More details and images": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
"Nova Pink": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -266,6 +276,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Right Module Barcode": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
@@ -282,7 +294,11 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
@@ -290,8 +306,16 @@
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"We are not responsible for any damage caused by attempting this modification.": "",
@@ -299,6 +323,7 @@
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You can do this in two ways:": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"here": "",
@@ -306,6 +331,7 @@
"left module": "",
"passed": "",
"right module": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Перевод на Русский язык выполнен: <a href='https://www.youtube.com/channel/UC8pzDCIt_CUj8sa7cYgPzHQ'>Tamir-Teknik. Дополнил Amnesia44</a>",
"DualShock Calibration GUI": "Интерфейс калибровки DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Неподдерживаемый браузер. Используйте браузер с поддержкой WebHID (например, Chrome).",
"Connect": "Подключить",
"Connected to:": "Подключено к:",
"Disconnect": "Отключить",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Центрирование стиков контроллера.",
"Please do not close this window and do not disconnect your controller. ": "Пожалуйста, не закрывайте это окно и не отключайте контроллер. ",
"Range calibration": "Калибровка диапазона",
"<b>The controller is now sampling data!</b>": "<b>Контроллер в настоящее время собирает данные!</b>",
"The controller is now sampling data!": "Контроллер в настоящее время собирает данные!",
"Done": "Готово",
"Hi, thank you for using this software.": "Привет, спасибо за использование этого программного обеспечения.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Если вы находите это полезным и хотите поддержать мои усилия, не стесняйтесь",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Подключено недопустимое устройство",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Ошибка",
"My handle on discord is: the_al": "Мой ник на discord: the_al",
"Initializing...": "Инициализация...",
"Storing calibration...": "Сохранение калибровки...",
"Sampling...": "Выборка...",
"Calibration in progress": "Калибровка в процессе",
"Start": "Старт",
"Continue": "Продолжить",
"You can check the calibration with the": "Вы можете проверить калибровку с помощью",
"Have a nice day :)": "Хорошего дня! :)",
"Welcome to the Calibration GUI": "Добро пожаловать в Calibration GUI",
"Just few things to know before you can start:": "Несколько вещей, о которых нужно знать, прежде чем начать:",
@@ -124,9 +120,6 @@
", to help more people like you!": ", чтобы помочь большему числу людей, подобных вам!",
"This website uses analytics to improve the service.": "Этот сайт использует аналитику для улучшения сервиса.",
"Board Model": "Модель платы",
"This feature is experimental.": "Эта функция экспериментальная.",
"Please let me know if the board model of your controller is not detected correctly.": "Пожалуйста, дайте знать, если модель платы вашего контроллера определена неправильно.",
"Board model detection thanks to": "Определение модели платы благодаря",
"This DualSense controller has outdated firmware.": "Прошивка этого контроллера DualSense устарела.",
"Please update the firmware and try again.": "Пожалуйста, обновите прошивку и попробуйте снова.",
"Joystick Info": "Информация о джойстике",
@@ -161,7 +154,6 @@
"Cannot store data into": "Не удалось сохранить данные",
"Cannot unlock": "Не удалось разблокировать",
"Color": "Цвет",
"Color detection thanks to": "За определение цвета спасибо",
"Controller Info": "Инфо контроллера",
"Debug Info": "Дебаг-информация",
"Debug buttons": "Отладка кнопок",
@@ -182,7 +174,6 @@
"MCU Unique ID": "Уникальный MCU ID",
"More details and images": "Больше деталей и изображения",
"PCBA ID": "ID платы",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Подключите контроллер DualShock 4, DualSense или DualSense Edge к компьютеру и нажмите кнопку Подключить",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Обратите внимание: модули стиков на контроллере Dualsense Edge <b>нельзя откалибровать только с помощью программного обеспечения</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Для сохранения пользовательской калибровки во внутренней памяти джойстика требуется <b>аппаратная модификация</b>.",
"Right Module Barcode": "Штрих-код правого модуля",
@@ -212,10 +203,17 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Center": "",
"Center (L1)": "",
"Chroma Indigo": "",
@@ -223,11 +221,17 @@
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Cobalt Blue": "",
"Controller does not support adaptive trigger control": "",
"Cosmic Red": "",
"Current": "",
"Debug": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
@@ -235,6 +239,7 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Fortnite": "",
"Galactic Purple": "",
"God of War Ragnarok": "",
@@ -244,7 +249,9 @@
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
@@ -254,13 +261,16 @@
"Midnight Black": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
"Nova Pink": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -276,6 +286,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Show raw numbers": "",
@@ -290,22 +302,36 @@
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Volcanic Red": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"White": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Çeviri: <a href='https://www.youtube.com/channel/UC8pzDCIt_CUj8sa7cYgPzHQ'>Tamir-Teknik</a> ve <a href='https://share.google/hCBJV5fFMbd5gJxxZ'>CzR PlayStation&Bilgisayar Teknik Servis</a> tarafından yapılmıştır.",
"DualShock Calibration GUI": "DualShock Kalibrasyon Arayüzü",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Desteklenmeyen tarayıcı. Lütfen WebHID desteği olan bir web tarayıcısı kullanın (örneğin, Chrome).",
"Connect": "Bağlan",
"Connected to:": "Bağlanılan Cihaz:",
"Disconnect": "Bağlantıyı Kes",
@@ -10,11 +9,11 @@
"Sections below are not useful, just some debug infos or manual commands": "Aşağıdaki bölümler kullanışlı değildir, sadece bazı hata ayıklama bilgileri veya manuel komutlar içerir",
"NVS Status": "NVS Durumu",
"Unknown": "Bilinmiyor",
"Query NVS status": "NVS durumunu sorgula",
"NVS unlock": "NVS kilidini aç",
"NVS lock": "NVS kilitle",
"Query NVS status": "NVS Durumunu Sorgula",
"NVS unlock": "NVS Kilidini Aç",
"NVS lock": "NVS Kilitle",
"Stick center calibration": "Analog Merkezi Kalibrasyonu",
"Welcome": "Hoş geldiniz",
"Welcome": "Hoş Geldiniz",
"Step 1": "1.Adım",
"Step 2": "2.Adım",
"Step 3": "3.Adım",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Denetleyici analoglarını yeniden merkezleme.",
"Please do not close this window and do not disconnect your controller. ": "Lütfen bu pencereyi kapatmayın ve denetleyici bağlantısını kesmeyin. ",
"Range calibration": "Ara Mesafe Kalibrasyonu",
"<b>The controller is now sampling data!</b>": "<b>Denetleyici şu anda veri örnekleme yapıyor!</b>",
"The controller is now sampling data!": "Denetleyici şu anda veri örnekleme yapıyor!",
"Done": "Tamamlandı",
"Hi, thank you for using this software.": "Merhaba, bu yazılımı kullandığınız için teşekkür ederim.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Yararlı bulduysanız ve çabalarımı desteklemek istiyorsanız, bana destek olabilirsiniz.",
@@ -42,12 +41,12 @@
"! :)": "! :)",
"Do you have any suggestion or issue? Drop me a message via email or discord.": "Herhangi bir öneriniz veya sorunuz var mı? Bana e-posta veya discord üzerinden mesaj atabilirsiniz.",
"Cheers!": "Teşekkürler!",
"Support this project": "Bu projeyi destekle",
"Support this project": "Bu Projeyi Destekle",
"unknown": "Bilinmeyen",
"original": "Orijinal",
"clone": "Yan Sanayi",
"locked": "Kilitli",
"unlocked": "Kilidi açık",
"unlocked": "Kilidi Açık",
"error": "Hata",
"Build Date": "Derleme Tarihi",
"HW Version": "Donanım Sürümü",
@@ -67,15 +66,13 @@
"Connected invalid device": "Geçersiz bir cihaz bağlandı",
"The device appears to be a clone. All calibration functionality is disabled.": "Bağladığınız kol yan sanayi, bu nedenle tüm kalibrasyon işlevleri devre dışı bırakıldı.",
"Error": "Hata",
"My handle on discord is: the_al": "Discord'daki kullanıcı adım: the_al",
"Initializing...": "Başlatılıyor...",
"Storing calibration...": "Kalibrasyon kaydediliyor...",
"Sampling...": "Örnekleme yapılıyor...",
"Calibration in progress": "Kalibrasyon devam ediyor",
"Start": "Başlat",
"Continue": "Devam",
"You can check the calibration with the": "Kalibrasyonu şununla kontrol edebilirsiniz:",
"Have a nice day :)": "İyi günler! :)",
"Have a nice day :)": " CzR PS&PC ekibi olarak keyifli oyunlar ve iyi günler dileriz 🎮",
"Welcome to the Calibration GUI": "Kalibrasyon Arayüzü'ne hoş geldiniz",
"Just few things to know before you can start:": "Başlamadan önce bilmeniz gereken birkaç şey:",
"This website is not affiliated with Sony, PlayStation &amp; co.": "Bu web sitesi, Sony, PlayStation ve diğerleri ile ilişkili değildir.",
@@ -124,13 +121,10 @@
", to help more people like you!": ", sizin gibi daha fazla insanın faydalanması için!",
"This website uses analytics to improve the service.": "Bu web sitesi hizmeti iyileştirmek için analiz kullanıyor.",
"Board Model": "Kart Modeli",
"This feature is experimental.": "Bu özellik deneysel.",
"Please let me know if the board model of your controller is not detected correctly.": "Denetleyicinizin kart modeli doğru tespit edilmezse lütfen bana bildirin.",
"Board model detection thanks to": "Kart modeli tespiti sayesinde",
"This DualSense controller has outdated firmware.": "Bu DualSense denetleyicisinin yazılımı güncel değil.",
"Please update the firmware and try again.": "Lütfen yazılımı güncelleyin ve tekrar deneyin.",
"Joystick Info": "Joystick Bilgisi",
"Check circularity": "Daireselliği kontrol et",
"Check circularity": "Daireselliği Kontrol Et",
"Can I reset a permanent calibration to previous calibration?": "Kalıcı bir kalibrasyonu önceki kalibrasyona sıfırlayabilir miyim?",
"No.": "Hayır.",
"Can you overwrite a permanent calibration?": "Kalıcı bir kalibrasyonun üzerine yeniden yazabilir miyiz?",
@@ -148,8 +142,8 @@
"Only after you have done that, you click on \"Done\".": "Ancak bunu yaptıktan sonra \"Tamam\" butonuna basmalısınız.",
"Changes saved successfully": "Değişiklikler başarıyla kaydedildi.",
"Error while saving changes": "Değişiklikleri kaydederken hata:",
"Save changes permanently": "Değişiklikleri kalıcı olarak kaydet",
"Reboot controller": "Denetleyiciyi yeniden başlat",
"Save changes permanently": "Değişiklikleri Kalıcı Olarak Kaydet",
"Reboot controller": "Denetleyiciyi Yeniden Başlat",
"(beta)": "(beta)",
"30th Anniversary": "30. Yıl Dönümü",
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Harici olarak</b>: Denetleyiciyi açmadan görünür test noktasına doğrudan +1.8V uygulayarak",
@@ -167,7 +161,6 @@
"Chroma Teal": "Kroma Turkuaz",
"Cobalt Blue": "Kobalt Mavisi",
"Color": "Renk",
"Color detection thanks to": "Renk tespiti sayesinde",
"Controller Info": "Denetleyici Bilgisi",
"Cosmic Red": "Kozmik Kırmızı",
"Debug Info": "Hata Ayıklama Bilgisi",
@@ -189,20 +182,19 @@
"Hardware": "Donanım",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Kalibrasyon kalıcı olarak kaydedilmezse, lütfen donanım modunun kablolamasını iki kez kontrol edin.",
"Left Module Barcode": "Sol Modül Barkodu",
"Left stick": "Sol analog",
"Left stick": "Sol Analog",
"MCU Unique ID": "MCU Benzersiz Kimliği",
"Midnight Black": "Gece Yarısı Siyahı",
"More details and images": "Daha fazla detay ve görsel",
"Nova Pink": "Nova Pembe",
"PCBA ID": "PCBA Kimliği",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Lütfen bilgisayarınıza bir DualShock 4, bir DualSense veya DualSense Edge denetleyici bağlayın ve Bağlan'a basın.",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Lütfen dikkat: DS Edge üzerindeki analog modülleri <b>yalnızca yazılım aracılığıyla kalibre edilemez</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Özelleştirilmiş bir kalibrasyonu analogun dahili belleğine kaydetmek için bir <b>donanım değişikliği</b> gereklidir.",
"Right Module Barcode": "Sağ Modül Barkodu",
"Right stick": "Sağ analog",
"Right stick": "Sağ Analog",
"SBL FW Version": "SBL FW Sürümü",
"Serial Number": "Seri Numarası",
"Show all": "Tümünü göster",
"Show all": "Tümünü Göster",
"Software": "Yazılım",
"Spider FW Version": "Örümcek FW Sürümü",
"Spider-Man 2": "Örümcek-Adam 2",
@@ -233,12 +225,12 @@
"Circularity (R1)": "Dairesellik (R1)",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Analoğu ayar için seçin, ardından analoğa dokunmadan yön tuşlarını kullanarak merkez noktasını ayarlayın. Analoğu hafifçe oynatın, merkezden kaymışsa veya titreme oluyorsa tekrar ayarlayın.",
"Please release the stick to center position before adjusting with D-pad buttons.": "Lütfen yön tuşlarıyla ayarlamadan önce analoğu merkez konumuna bırakın.",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Analoğun konumunu hareket ettirmek istediğiniz yöne yön tuşlarına veya yüz tuşlarına(△, ☐, O, ✕) basın.",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Analoğun konumunu hareket ettirmek istediğiniz yöne (⬆️ ⬇️ ⬅️ ➡️) veya (△, ☐, O, ✕) tuşlarına basarak ayarlayın.",
"Push the stick straight up/down/left/right as far as possible.": "Analoğu mümkün olduğunca yukarı/aşağı/sola/sağa itin.",
"Show raw numbers": "Ham değerleri göster",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Cihaz Bluetooth üzerinden bağlı. Bunun yerine bağlantıyı kesip USB kablosu ile yeniden bağlayın.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Cihazınız orijinal Sony kolu olmayabilir. Eğer yansanayi değilse lütfen bu sorunu bildirin.",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Ortalama dairesellik hatası:</strong> daha küçük her zaman daha iyi değildir! %79 aralığını hedefleyin.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Cihazınız orijinal Sony kolu olmayabilir. Eğer yan sanayi değilse lütfen bu sorunu bildirin.",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Ortalama dairesellik hatası:</strong> %79 aralığını hedefleyin.Daha küçük olması her zaman iyi değildir!",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "Bu DualSense Edge'i kullanmaya devam etmek için yeniden başlatma gereklidir. Lütfen kontrol cihazınızı çıkarıp yeniden bağlayın.",
"Adaptive Trigger": "Uyarlanabilir Tetik",
"Adaptive triggers are only supported on DualSense controllers": "Uyarlanabilir tetikler yalnızca DualSense kontrol cihazlarında desteklenir.",
@@ -250,7 +242,7 @@
"Controller does not support adaptive trigger control": "Bu kontrol cihazı uyarlanabilir tetik kontrolünü desteklemiyor.",
"Don't show again": "Bir daha gösterme",
"Fail": "Başarısız",
"Failed": "Başarısız oldu",
"Failed": "Başarısız Oldu",
"Failed to connect to device": "Cihaza bağlanılamadı",
"Failed to disable adaptive trigger": "Uyarlanabilir tetik devre dışı bırakılamadı",
"Failed to set speaker tone": "Hoparlör sesi ayarlanamadı",
@@ -258,33 +250,33 @@
"Feel for vibration in the controller.": "Kontrol cihazındaki titreşimi hissedin.",
"Haptic Vibration": "Dokunsal Titreşim",
"Headphone Jack": "Kulaklık Girişi",
"Increase non-circularity": "Dairesellik dışılığı artır",
"Increase non-circularity": "Dairesellikten Sapmayı Artır",
"Instructions": "Talimatlar",
"Keep rotating the sticks even if you see no progress!": "İlerleme görmeseniz bile analogları döndürmeye devam edin!",
"Learn more...": "Daha fazla bilgi...",
"Lights": "Işıklar",
"Listen for a tone from the controller speaker.": "Kontrol cihazı hoparlöründen gelen sesi dinleyin.",
"Long-press [circle] to skip ahead.": "[O tuşuna uzun basarak atla.",
"Long-press [circle] to skip ahead.": "[circle] tuşuna uzun basarak atla.",
"Microphone": "Mikrofon",
"Microphone Level:": "Mikrofon Seviyesi:",
"No controller connected": "Bağlı kontrol cihazı yok",
"No tests completed yet.": "Henüz hiçbir test tamamlanmadı.",
"Not tested": "Test edilmedi",
"Not tested": "Test Edilmedi",
"Pass": "Geç",
"Passed": "Geçti",
"Plug in headphones to the 3.5mm jack": "Kulaklığı 3.5 mm girişe takın",
"Press L2 and R2 triggers to feel the trigger resistance.": "Tetik direncini hissetmek için L2 ve R2 tuşlarına basın.",
"Press [circle] to close, or [square] to start over": "[O ile kapatın veya ile yeniden başlayın",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": " ile Geç, ile Başarısız, O ile atla.",
"Press [square] to begin or [circle] to close": " ile başlatın veya O ile kapatın",
"Press [triangle] to go back.": " ile geri dönün.",
"Press [circle] to close, or [square] to start over": "[circle] ile Kapatın veya [square] ile Yeniden Başlayın",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "[square] ile Geç, [cross] ile Başarısız, [circle] ile Atla.",
"Press [square] to begin or [circle] to close": "[square] ile Başlatın veya [circle] ile Kapatın",
"Press [triangle] to go back.": "[triangle] ile Geri Dönün.",
"Press each button until they turn green.": "Her bir tuşa yeşil olana kadar basın.",
"Progress": "İlerleme",
"Quick Test": "Hızlı Test",
"Quick calibrate": "Hızlı kalibrasyon",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Aralık kalibrasyonu başarısız gibi görünüyor. Lütfen yeniden deneyin ve analogları döndürdüğünüzden emin olun.",
"Repeat": "Tekrar et",
"Restart": "Yeniden başlat",
"Quick calibrate": "Hızlı Kalibrasyon",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Analog ara mesafe kalibrasyonu başarısız gibi görünüyor. Lütfen yeniden deneyin ve analogları döndürdüğünüzden emin olun",
"Repeat": "Tekrar Et",
"Restart": "Yeniden Başlat",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Analogları yavaşça en az iki kez bir yöne ve iki kez diğer yöne çevirerek tüm aralığı kapsayın.",
"Run through these tests to verify your controller's functionality.": "Kontrol cihazınızın işlevselliğini doğrulamak için bu testleri gerçekleştirin.",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Sony kontrol cihazları fabrikadan yaklaşık %10 ortalama dairesellik hatasıyla kalibre edilmiş olarak gelir ve oyunlar artık bunu bekler. Çok mükemmel dairesellik, bazı oyunlarda hareketleri ve nişan almayı sert ve tepkisiz hissettirebilir.",
@@ -292,7 +284,7 @@
"Step size": "Adım boyutu",
"Test Speaker": "Hoparlörü Test Et",
"Test Summary": "Test Özeti",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Tüm tuşları test edin veya tuşuna uzun basarak Geçin, ✕ yuşuna uzun basarak Başarısız, O ile atlayın.",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Tüm tuşları test edin veya [square] tuşuna uzun basarak Geçin, [cross] tuşuna uzun basarak Başarısız, [circle] ile atlayın.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "<b>Bitti</b> düğmesi en fazla 15 saniye sonra etkinleşecektir. Analogları döndürmeden <b>Bitti</b>ye basarsanız kalibrasyon eksik olur ve tekrarlamanız gerekir.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Bu test, her bir tuşa en fazla üç kez basmanızı isteyerek tüm tuşları kontrol eder.",
"This test checks the headphone jack functionality.": "Bu test, kulaklık girişinin işlevselliğini kontrol eder.",
@@ -303,11 +295,45 @@
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Kontrol cihazı ışıklarının renk değiştirmesini, oyuncu ışıklarının animasyon yapmasını ve sessiz düğmesinin yanıp sönmesini izleyin.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Ayarlanacak analoğu yukarı/aşağı/sol/sağ konumda tutarken, analoğu hem sola hem sağa çevirdikten sonra dört yönde açık mavi alanlar görene kadar ayarlamalar yapın. Ardından şunu kullanın:",
"Wiggle the USB cable to see if the controller disconnects.": "Kontrol cihazının bağlantısının kopup kopmadığını görmek için USB kablosunu hafifçe oynatın.",
"failed": "başarısız",
"hide": "gizle",
"passed": "geçti",
"skipped": "atlanmış",
"tests completed": "tamamlanan testler",
"failed": "Başarısız",
"hide": "Gizle",
"passed": "Geçti",
"skipped": "Atlanmış",
"tests completed": "Tamamlanan Testler",
"to increase the non-circularity.": "Dairesellikten sapmayı artırmak için.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Lütfen bir DualShock 4, DualSense, DualSense Edge veya VR2 kontrolcüsünü bilgisayarınıza bağlayın ve Bağlan butonuna basın.",
"Cannot copy text to the clipboard:": "Metin panoya kopyalanamıyor:",
"The item has been copied to the clipboard.": "Öğe panoya kopyalandı.",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "Değiştirildikten sonra, bu araç kontrolcüyü yeni analoglarla çalışacak şekilde kalibre etmek için kullanılır.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "En iyi oyun deneyimi için yaklaşık %79 arası dairesellik hatasını hedefleyin.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "Pil seviyesi düşük. Kontrolcü güç tasarruf modunda olduğu için testler başarısız olabilir.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "Analogları değiştirmeden kalibrasyon yapmak geçici olarak yardımcı olabilir, ancak sorunu daha da kötüleştirebilir ve geri dönüşüde mümkün olmayabilir.CzR PS&PC ekibi olarak dikkate almanızı öneririz",
"Calibration History": "Kalibrasyon Geçmişi",
"Cannot read module barcodes": "Modül barkodları okunamıyor",
"Clear All": "Tümünü Temizle",
"Current": "Mevcut",
"Delete": "Sil",
"Delete all calibration history for this controller? This cannot be undone.": "Bu kontrolcüye ait tüm kalibrasyon geçmişi silinsin mi? Bu işlem geri alınamaz.",
"Delete this calibration entry?": "Bu kalibrasyon kaydı silinsin mi?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "Drift sorunu analog mekanizmasının aşınmasından kaynaklanır ve sorunun çözülmesi için analog mekanizmasının değiştirilmesi gerekir.",
"Firefox is supported with the WebHID extension installed.": "WebHID eklentisi yüklü olduğunda Firefox desteklenir.",
"It appears the latest joystick calibration has not been saved.": "En son analog kalibrasyonu kaydedilmemiş görünüyor.",
"Last connected": "Son Bağlanan Kontrolcü",
"No saved calibrations found.": "Kayıtlı kalibrasyon bulunamadı.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Lütfen PC veya Mac üzerinde WebHID destekli bir web tarayıcısı kullanın (ör. Google Chrome veya Microsoft Edge).",
"Restore": "Geri Yükle",
"Restore calibration": "Kalibrasyonu Geri Yükle",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "Kalibrasyon başarıyla geri yüklendi! Kontrolcü yeniden başlatıldığında kaybolmaması için değişiklikleri kaydetmeyi unutmayın.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "Bu kontrolcüde kaydedilmemiş değişiklikler var. Kontrolcü yeniden başlatıldığında bu değişiklikler kaybolacaktır.",
"This utility cannot fix stick drift.": "Bu araç analog drift sorununu gideremez.",
"Unsupported browser.": "Desteklenmeyen tarayıcı.",
"Use expert mode": "Uzman modunu kullan",
"Use four-step calibration": "Dört adımlı kalibrasyonu kullan",
"Use normal mode": "Normal modu kullan",
"Use quick calibration": "Hızlı kalibrasyonu kullan",
"Using this utility on a phone or tablet is not supported.": "Bu araç telefon veya tablet üzerinde kullanımı desteklenmez.",
"Values": "Değerler",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Değişiklikleri kaydetmeli ya da önceki duruma dönmek için kontrolcüyü yeniden başlatmalısınız.",
"serial number": "Kontrolcünün Seri Numarası",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Переклав солов'їною: sladk0y",
"DualShock Calibration GUI": "Майстер калібрування DualКонтролерів",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Цей браузер не підтримується. Будь ласка, використовуйте веб-браузер із підтримкою WebHID (наприклад, Chrome).",
"Connect": "Підключити",
"Connected to:": "Підключено до:",
"Disconnect": "Від'їднати",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Центрування стіків контролера.",
"Please do not close this window and do not disconnect your controller. ": "Будь ласка, не закривайте це вікно і не відключайте ваш контролер. ",
"Range calibration": "Калібрування діапазону.",
"<b>The controller is now sampling data!</b>": "<b>Контролер зараз збирає дані!</b>",
"The controller is now sampling data!": "Контролер зараз збирає дані!",
"Done": "Готово",
"Hi, thank you for using this software.": "Привіт, дякуємо за використання цього програмного забезпечення.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Якщо вважаєте, що це корисно й хочете підтримати мої зусилля - не соромтесь і",
@@ -66,16 +65,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Підключено неприпустиме пристрій",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "Помилка",
"My handle on discord is: the_al": "Мій нік у Discord: the_al",
"Initializing...": "Ініціалізація...",
"Storing calibration...": "Збереження калібрування...",
"Sampling...": "Збір даних...",
"Calibration in progress": "Калібрування триває",
"Start": "Старт",
"Continue": "Продовжити",
"You can check the calibration with the": "Ви можете перевірити калібрування за допомогою",
"Have a nice day :)": "Гарного дня! :)",
"Welcome to the Calibration GUI": "Ласкаво просимо до інтерфейсу калібрування",
"Just few things to know before you can start:": "Кілька моментів, які слід врахувати перед початком:",
@@ -125,9 +121,6 @@
", to help more people like you!": ", щоб допомогти більшій кількості людей, подібних до вас!",
"This website uses analytics to improve the service.": "Платформа застосовує аналітику для вдосконалення роботи.",
"Board Model": "Модель плати",
"This feature is experimental.": "Ця функція є експериментальною.",
"Please let me know if the board model of your controller is not detected correctly.": "Будь ласка, повідомте, якщо модель плати вашого контролера визначена неправильно.",
"Board model detection thanks to": "Визначення моделі плати завдяки",
"This DualSense controller has outdated firmware.": "Прошивка цього контролера DualSense застаріла.",
"Please update the firmware and try again.": "Будь ласка, оновіть прошивку та спробуйте знову.",
"Joystick Info": "Інформація про джойстик",
@@ -185,7 +178,6 @@
"For more info or help, feel free to reach out on Discord.": "Для додаткової інформації або допомоги звертайтесь у Discord.",
"Left stick": "Лівий стік",
"More details and images": "Більше деталей та зображень",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Будь ласка, під`єднайте контролер DualShock 4, DualSense або DualSense Edge до комп’ютера та натисніть «Підключити».",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Зверніть увагу: модулі стіків на DS Edge <b>неможливо відкалібрувати лише програмним шляхом</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Щоб зберегти власне калібрування у внутрішній памʼяті стіка, потрібна <b>апаратна модифікація</b>.",
"Right stick": "Правий стік",
@@ -202,7 +194,6 @@
"Cannot unlock": "Не вдалося розблокувати",
"Cobalt Blue": "Кобальтово-синій",
"Color": "Колір",
"Color detection thanks to": "Розпізнавання кольору завдяки",
"Cosmic Red": "Космічний червоний",
"Galactic Purple": "Галактичний пурпуровий",
"God of War Ragnarok": "Обмежена серія God of War: Ragnarok",
@@ -309,5 +300,40 @@
"skipped": "пропущено",
"tests completed": "тестів завершено",
"to increase the non-circularity.": "щоб збільшити неокруглість.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Під’єднайте контролер DualShock 4, DualSense, DualSense Edge або VR2 до комп’ютера та натисніть «Підключити».",
"The device appears to be a clone. All calibration functionality is disabled.": "Схоже, цей пристрій є підробкою. Усі функції калібрування вимкнено.",
"Cannot copy text to the clipboard:": "Не вдалося скопіювати текст до буфера обміну:",
"The item has been copied to the clipboard.": "Скопійовано до буфера обміну",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "Після заміни, утиліту можна використати для калібрування контролера з новими стіками.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "Для найкращого ігрового досвіду прагніть до похибки округлості близько 79%.",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "Рівень заряду батареї низький. Тести можуть завершитися невдало через режим енергозбереження контролера.",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "Калібрування без заміни стіків може дати тимчасовий ефект, але також здатне погіршити проблему без можливості скасування.",
"Calibration History": "Історія калібрування",
"Cannot read module barcodes": "Не вдалося зчитати штрихкоди модулів",
"Clear All": "Очистити все",
"Current": "Поточне",
"Delete": "Видалити",
"Delete all calibration history for this controller? This cannot be undone.": "Видалити всю історію калібрування цього контролера? Цю дію неможливо скасувати.",
"Delete this calibration entry?": "Видалити цей запис калібрування?",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "Дрифт виникає через зношення механічних частин, тому для його усунення необхідно замінити стіки.",
"Firefox is supported with the WebHID extension installed.": "Firefox підтримується за умови встановлення розширення WebHID.",
"It appears the latest joystick calibration has not been saved.": "Схоже, останнє калібрування стіків не було збережене.",
"Last connected": "Останнє підключення",
"No saved calibrations found.": "Збережених калібрувань не знайдено.",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "Будь ласка, використовуйте веббраузер із підтримкою WebHID (наприклад, Google Chrome або Microsoft Edge) на ПК чи Mac.",
"Restore": "Відновити",
"Restore calibration": "Відновити калібрування",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "Калібрування успішно відновлено! Не забудьте зберегти зміни, щоб вони не були втрачені після перезавантаження контролера.",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "Цей контролер має незбережені зміни, які буде втрачено після його перезавантаження.",
"This utility cannot fix stick drift.": "Ця утиліта не може усунути дрифт стіків.",
"Unsupported browser.": "Непідтримуваний браузер.",
"Use expert mode": "Використовувати експертний режим",
"Use four-step calibration": "Використовувати чотириетапне калібрування",
"Use normal mode": "Використовувати звичайний режим",
"Use quick calibration": "Використовувати швидке калібрування",
"Using this utility on a phone or tablet is not supported.": "Використання цієї утиліти на телефоні або планшеті не підтримується.",
"Values": "Значення",
"You should save your changes, or reboot the controller to revert back to the previous state.": "Вам слід зберегти зміни або перезавантажити контролер, щоб повернутися до попереднього стану",
"serial number": "серійний номер",
"": ""
}

339
lang/vi_vn.json Normal file
View File

@@ -0,0 +1,339 @@
{
".authorMsg": "- Bản dịch tiếng Việt do MeoU cung cấp",
"DualShock Calibration GUI": "Giao diện Hiệu chỉnh Tay cầm",
"Connect": "Kết nối",
"Connected to:": "Đã kết nối với:",
"Disconnect": "Ngắt kết nối",
"Calibrate stick center": "Hiệu chỉnh tâm analog",
"Calibrate stick range": "Hiệu chỉnh phạm vi ngoài analog",
"Sections below are not useful, just some debug infos or manual commands": "Các phần bên dưới không hữu ích, chỉ là thông tin gỡ lỗi hoặc lệnh thủ công",
"NVS Status": "Trạng thái NVS",
"Unknown": "Không rõ",
"Debug buttons": "Nút Gỡ lỗi",
"Query NVS status": "Truy vấn trạng thái NVS",
"NVS unlock": "Mở khóa NVS",
"NVS lock": "Khóa NVS",
"Stick center calibration": "Hiệu chỉnh tâm analog",
"Welcome": "Chào mừng",
"Step 1": "Bước 1",
"Step 2": "Bước 2",
"Step 3": "Bước 3",
"Step 4": "Bước 4",
"Completed": "Đã hoàn thành",
"Welcome to the stick center-calibration wizard!": "Chào mừng đến với trình hướng dẫn hiệu chỉnh tâm analog!",
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Công cụ này sẽ hướng dẫn mày cách định vị lại tâm analog. Gồm bốn bước: mày sẽ được yêu cầu di chuyển cả hai cần analog theo một hướng và thả ra.",
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Xin lưu ý, <i>một khi quá trình hiệu chỉnh bắt đầu, nó không thể bị hủy</i>. Đừng đóng trang này hoặc ngắt kết nối tay cầm cho đến khi hoàn tất.",
"Press <b>Start</b> to begin calibration.": "Nhấn <b>Bắt đầu</b> để tiến hành hiệu chỉnh.",
"Please move both sticks to the <b>top-left corner</b> and release them.": "Vui lòng di chuyển cả hai cần analog đến <b>góc trên bên trái</b> và thả ra.",
"When the sticks are back in the center, press <b>Continue</b>.": "Khi các cần analog trở về tâm, nhấn <b>Tiếp tục</b>.",
"Please move both sticks to the <b>top-right corner</b> and release them.": "Vui lòng di chuyển cả hai cần analog đến <b>góc trên bên phải</b> và thả ra.",
"Please move both sticks to the <b>bottom-left corner</b> and release them.": "Vui lòng di chuyển cả hai cần analog đến <b>góc dưới bên trái</b> và thả ra.",
"Please move both sticks to the <b>bottom-right corner</b> and release them.": "Vui lòng di chuyển cả hai cần analog đến <b>góc dưới bên phải</b> và thả ra.",
"Calibration completed successfully!": "Hiệu chỉnh hoàn tất thành công!",
"Next": "Tiếp theo",
"Recentering the controller sticks.": "Đang định vị lại tâm analog.",
"Please do not close this window and do not disconnect your controller. ": "Vui lòng không đóng cửa sổ này và không ngắt kết nối tay cầm.",
"Range calibration": "Hiệu chỉnh phạm vi ngoài analog",
"The controller is now sampling data!": "Tay cầm hiện đang lấy mẫu dữ liệu!",
"Done": "Hoàn thành",
"Hi, thank you for using this software.": "Chào, cảm ơn mày đã sử dụng phần mềm này.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Nếu mày thấy nó hữu ích và muốn ủng hộ công sức của tao, hãy ủng hộ nhé!",
"buy me a coffee": "mời tao một ly cà phê",
"! :)": "! :)",
"Do you have any suggestion or issue? Drop me a message via email or discord.": "Mày có đề xuất hay gặp vấn đề gì không? Gửi tin nhắn cho tao qua email hoặc Discord.",
"Cheers!": "Chúc vui vẻ!",
"Support this project": "Ủng hộ dự án này",
"unknown": "Thiết bị không rõ",
"original": "Hàng chính hãng",
"clone": "Hàng nhái/Clone",
"locked": "Đã khóa",
"unlocked": "Đã mở khóa",
"error": "Lỗi",
"Build Date": "Ngày Build",
"HW Version": "Phiên bản Phần cứng (HW)",
"SW Version": "Phiên bản Phần mềm (SW)",
"Device Type": "Loại thiết bị",
"Range calibration completed": "Hiệu chỉnh phạm vi ngoài analog đã hoàn tất",
"Range calibration failed": "Hiệu chỉnh phạm vi ngoài analog thất bại",
"Stick calibration failed": "Hiệu chỉnh analog thất bại",
"Stick calibration completed": "Hiệu chỉnh analog hoàn tất",
"NVS Lock failed": "Khóa NVS thất bại",
"NVS Unlock failed": "Mở khóa NVS thất bại",
"Please connect only one controller at time.": "Mỗi lần chỉ được kết nối một tay cầm.",
"Sony DualShock 4 V1": "Tay cầm PS4 V1 (Sony DualShock 4 V1)",
"Sony DualShock 4 V2": "Tay cầm PS4 V2 (Sony DualShock 4 V2)",
"Sony DualSense": "Tay cầm PS5 (Sony DualSense)",
"Sony DualSense Edge": "Tay cầm PS5 Elite/DSE (Sony DualSense Edge)",
"Connected invalid device": "Đã kết nối thiết bị không hợp lệ",
"The device appears to be a clone. All calibration functionality is disabled.": "Thiết bị có vẻ là hàng nhái. Tất cả chức năng hiệu chỉnh đều bị vô hiệu hóa.",
"Error": "Lỗi",
"Initializing...": "Đang khởi tạo...",
"Storing calibration...": "Đang lưu hiệu chỉnh...",
"Sampling...": "Đang lấy mẫu...",
"Calibration in progress": "Đang tiến hành hiệu chỉnh",
"Start": "Bắt đầu",
"Continue": "Tiếp tục",
"Have a nice day :)": "Chúc mày một ngày tốt lành :)",
"Welcome to the Calibration GUI": "Chào mừng đến với Giao diện Hiệu chỉnh",
"Just few things to know before you can start:": "Vài điều cần biết trước khi mày bắt đầu:",
"This website is not affiliated with Sony, PlayStation &amp; co.": "Trang web này không liên kết với Sony, PlayStation và các công ty liên quan.",
"This service is provided without warranty. Use at your own risk.": "Dịch vụ này được cung cấp mà không có bảo hành. Mày tự chịu rủi ro khi sử dụng.",
"Keep the internal battery of the controller connected and ensure it is well charged. If the battery dies during operations, the controller will be damaged and rendered unusable.": "Giữ pin bên trong tay cầm luôn được kết nối và đảm bảo pin đã được sạc đầy. Nếu pin hết trong quá trình thao tác, tay cầm sẽ bị hỏng và không thể sử dụng được.",
"Before doing the permanent calibration, try the temporary one to ensure that everything is working well.": "Trước khi thực hiện hiệu chỉnh vĩnh viễn, hãy thử hiệu chỉnh tạm thời để đảm bảo mọi thứ hoạt động tốt.",
"Understood": "Đã hiểu",
"Version": "Phiên bản",
"Frequently Asked Questions": "Câu hỏi thường gặp",
"Close": "Đóng",
"Welcome to the F.A.Q. section! Below, you'll find answers to some of the most commonly asked questions about this website. If you have any other inquiries or need further assistance, feel free to reach out to me directly. Your feedback and questions are always welcome!": "Chào mừng đến với phần Câu hỏi thường gặp! Dưới đây, mày sẽ tìm thấy câu trả lời cho những câu hỏi phổ biến nhất về trang web này. Nếu mày có bất kỳ thắc mắc nào khác hoặc cần hỗ trợ thêm, hãy liên hệ trực tiếp với tao. Phản hồi và câu hỏi của mày luôn được chào đón!",
"How does it work?": "Nó hoạt động như thế nào?",
"Behind the scenes, this website is the culmination of one year of dedicated effort in reverse-engineering DualShock controllers for fun/hobby from a random guy on the internet.": "Đằng sau, trang web này là kết quả của một năm nỗ lực đảo ngược kỹ thuật (reverse-engineering) các tay cầm DualShock vì sở thích của một người bình thường trên mạng.",
"Through": "Thông qua",
"this research": "nghiên cứu này",
", it was discovered that there exist some undocumented commands on DualShock controllers that can be sent via USB and are used during factory assembly process. If these commands are sent, the controller starts the recalibration of analog sticks.": ", đã phát hiện ra rằng có một số lệnh không được ghi lại trên các tay cầm DualShock có thể gửi qua USB và được sử dụng trong quá trình lắp ráp tại nhà máy. Các lệnh này sẽ khiến tay cầm bắt đầu hiệu chỉnh lại cần analog.",
"While the primary focus of this research wasn't initially centered on recalibration, it became apparent that a service offering this capability could greatly benefit numerous individuals. And thus, here we are.": "Mặc dù trọng tâm chính của nghiên cứu này ban đầu không phải là hiệu chỉnh lại, nhưng rõ ràng là một dịch vụ cung cấp khả năng này có thể mang lại lợi ích lớn cho nhiều người. Và thế là, nó ra đời.",
"Does the calibration remain effective during gameplay on PS4/PS5?": "Trong khi chơi game trên PS4/PS5, hiệu chỉnh có còn hiệu quả không?",
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Có, nếu mày chọn ô \"Lưu các thay đổi vĩnh viễn vào tay cầm\". Hiệu chỉnh sẽ được ghi trực tiếp vào firmware của tay cầm. Điều này đảm bảo nó được giữ nguyên bất kể tay cầm được kết nối với console nào.",
"Is this an officially endorsed service?": "Đây có phải là công cụ được chính thức xác nhận không?",
"No, this service is simply a creation by a DualShock enthusiast.": "Không, công cụ này chỉ đơn thuần là sản phẩm của một người đam mê DualShock tạo ra.",
"Does this website detect if a controller is a clone?": "Trang web này có phát hiện được tay cầm là hàng nhái không?",
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Có, hiện tại chỉ DualShock4. Tao đã vô tình mua phải hàng nhái, dành thời gian xác định sự khác biệt và thêm chức năng này để ngăn chặn lừa đảo trong tương lai. (Người dịch lưu ý: DualSense cũng có thể)",
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Thật không may, hàng nhái dù sao cũng không thể hiệu chỉnh được, vì chúng chỉ sao chép hành vi của DualShock4 trong khi chơi game bình thường, chứ không phải tất cả các chức năng không được ghi lại.",
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Nếu mày muốn mở rộng chức năng phát hiện này sang DualSense, vui lòng gửi cho tao một tay cầm DualSense giả và mày sẽ thấy nó hoạt động trong vài tuần.",
"What development is in plan?": "Có kế hoạch phát triển nào không?",
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Tao có hai danh sách việc cần làm riêng biệt cho dự án này, dù chưa biết ưu tiên cái nào.",
"The first list is about enhancing support for DualShock4 and DualSense controllers:": "Danh sách đầu tiên là về việc tăng cường hỗ trợ cho các tay cầm DualShock4 và DualSense:",
"Implement calibration of L2/R2 triggers.": "Thực hiện hiệu chỉnh cò (trigger) L2/R2.",
"Improve detection of clones, particularly beneficial for those seeking to purchase used controllers with assurance of authenticity.": "Cải thiện khả năng phát hiện hàng nhái, đặc biệt có lợi cho những người muốn mua tay cầm đã qua sử dụng với sự đảm bảo về tính xác thực.",
"Enhance user interface (e.g. provide additional controller information)": "Cải thiện giao diện người dùng (ví dụ: cung cấp thêm thông tin về tay cầm)",
"Add support for recalibrating IMUs.": "Thêm hỗ trợ hiệu chỉnh lại IMU (con quay hồi chuyển).",
"Additionally, explore the possibility of reviving non-functioning DualShock controllers (further discussion available on Discord for interested parties).": "Ngoài ra, khám phá khả năng cứu chữa các tay cầm DualShock bị hỏng (thảo luận thêm có sẵn trên Discord cho những người quan tâm).",
"The second list contains new controllers I aim to support:": "Danh sách thứ hai bao gồm các tay cầm mới mà tao dự định hỗ trợ:",
"DualSense Edge": "DualSense Edge",
"DualShock 3": "DualShock 3",
"XBox Controllers": "Tay cầm Xbox",
"Each of these tasks presents both immense interest and significant time investment. To provide context, supporting a new controller typically demands 6-12 months of full-time research, alongside a stroke of good fortune.": "Mỗi nhiệm vụ này đều có sự quan tâm lớn và đòi hỏi đầu tư thời gian đáng kể. Để mày dễ hình dung, việc hỗ trợ một tay cầm mới thường mất 6-12 tháng nghiên cứu toàn thời gian, cùng với một chút may mắn.",
"I love this service, it helped me! How can I contribute?": "Web hiệu chỉnh này đỉnh quá! Tao muốn ủng hộ nhà phát triển!",
"I'm glad to hear that you found this helpful! If you're interested in contributing, here are a few ways you can help me:": "Rất vui vì công cụ này giúp ích được cho mày! Nếu mày muốn đóng góp, đây là một vài cách mày có thể giúp tao:",
"Consider making a": "Hãy cân nhắc ",
"donation": "quyên góp",
"to support my late-night caffeine-fueled reverse-engineering efforts.": "để ủng hộ những nỗ lực đảo ngược kỹ thuật thâu đêm với cà phê của tao.",
"Ship me a controller you would love to add (send me an email for organization).": "Gửi cho tao một tay cầm mà mày muốn tao thêm vào (liên hệ qua email).",
"Translate this website in your language": "Dịch trang web này sang ngôn ngữ của mày",
", to help more people like you!": "để giúp đỡ nhiều người hơn như mày!",
"This website uses analytics to improve the service.": "Trang web này sử dụng công cụ phân tích để cải thiện chất lượng dịch vụ.",
"Board Model": "Mẫu bo mạch",
"This DualSense controller has outdated firmware.": "Tay cầm DualSense này có firmware đã lỗi thời.",
"Please update the firmware and try again.": "Vui lòng cập nhật firmware và thử lại.",
"Joystick Info": "Thông tin Joystick",
"Check circularity": "Kiểm tra độ tròn analog",
"Can I reset a permanent calibration to previous calibration?": "Tao có thể quay lại hiệu chỉnh trước đó không?",
"No.": "Không.",
"Can you overwrite a permanent calibration?": "Có thể ghi đè lên hiệu chỉnh vĩnh viễn không?",
"Yes. Simply do another permanent calibration.": "Có, chỉ cần thực hiện một hiệu chỉnh vĩnh viễn khác.",
"Does this software resolve stickdrift?": "Phần mềm này có giải quyết được lỗi stick drift (trôi analog) không?",
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "Stick drift là do lỗi vật lý, thường là bụi bẩn, chiết áp bị mòn, hoặc đôi khi là lò xo bị mòn.",
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "Nếu mày đang gặp phải stick drift, phần mềm này sẽ không tự động sửa lỗi. Nhưng nó giúp đảm bảo (các) joystick mới sẽ hoạt động chính xác sau khi thay thế (các) cái cũ. (Người dịch lưu ý: Hiệu chỉnh có thể giảm thiểu hiện tượng trôi, nhưng không thể loại bỏ hoàn toàn nếu cần analog quá tệ).",
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "Tao nhận thấy một số tay cầm mới mua có hiệu chỉnh tại nhà máy kém hơn so với việc tao hiệu chỉnh lại. Đặc biệt rõ rệt đối với độ tròn của tay cầm SCUF với vỏ độc đáo.",
"(Dualsense) Will updating the firmware reset calibration?": "(Dualsense) Việc cập nhật firmware có đặt lại hiệu chỉnh không?",
"After range calibration, joysticks always go in corners.": "Sau khi hiệu chỉnh phạm vi, analog bị trôi vào góc.",
"This issue happens because you have clicked \"Done\" immediately after starting a range calibration.": "Vấn đề này xảy ra vì mày đã nhấp \"Hoàn thành\" ngay sau khi bắt đầu hiệu chỉnh phạm vi.",
"Please read the instructions.": "Vui lòng đọc hướng dẫn.",
"You have to rotate the joysticks before you press \"Done\".": "Mày phải xoay analog trước khi nhấn \"Hoàn thành\".",
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "Đảm bảo analog chạm vào viền khung và xoay chậm, tốt nhất là theo cả hai hướng - kim đồng hồ và ngược kim đồng hồ.",
"Only after you have done that, you click on \"Done\".": "Chỉ sau khi mày làm xong, hãy nhấp vào \"Hoàn thành\".",
"Changes saved successfully": "Thay đổi đã được lưu thành công.",
"Error while saving changes": "Lỗi khi lưu thay đổi:",
"Save changes permanently": "Lưu các thay đổi vĩnh viễn",
"Reboot controller": "Khởi động lại tay cầm",
"Controller Info": "Thông tin Tay cầm",
"Debug Info": "Thông tin Gỡ lỗi",
"Software": "Phần mềm",
"Hardware": "Phần cứng",
"FW Build Date": "Ngày Build FW",
"FW Type": "Loại FW",
"FW Series": "Series FW",
"FW Version": "Phiên bản FW",
"FW Update": "Cập nhật FW",
"FW Update Info": "Thông tin Nâng cấp FW",
"SBL FW Version": "Phiên bản FW SBL",
"Venom FW Version": "Phiên bản FW Venom",
"Spider FW Version": "Phiên bản FW Spider",
"Touchpad FW Version": "Phiên bản FW Touchpad",
"Serial Number": "Số seri",
"MCU Unique ID": "ID duy nhất MCU",
"PCBA ID": "ID PCBA",
"Battery Barcode": "Mã vạch Pin",
"VCM Left Barcode": "Mã vạch VCM Trái",
"VCM Right Barcode": "Mã vạch VCM Phải",
"HW Model": "Mẫu HW",
"Touchpad ID": "ID Touchpad",
"Bluetooth Address": "Địa chỉ Bluetooth",
"Show all": "Hiển thị tất cả thông tin",
"Finetune stick calibration": "Hiệu chỉnh analog tinh chỉnh",
"(beta)": "(bản thử nghiệm)",
"Left stick": "Analog trái (mV)",
"Right stick": "Analog phải (mV)",
"Cancel": "Hủy",
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Bên ngoài</b>: Không cần mở tay cầm, cấp +1.8V trực tiếp vào điểm thử nghiệm (test point) có thể nhìn thấy.",
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Bên trong</b>: Hàn dây từ nguồn +1.8V đến TP bảo vệ ghi (write-protect TP).",
"Calibration is being stored in the stick modules.": "Dữ liệu hiệu chỉnh đang được lưu vào các mô-đun analog.",
"DualSense Edge Calibration": "Hiệu chỉnh DualSense Edge",
"For more info or help, feel free to reach out on Discord.": "Cần thêm thông tin hoặc trợ giúp, hãy liên hệ trên Discord.",
"More details and images": "Thêm chi tiết và hình ảnh",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Xin lưu ý: các mô-đun analog trên DS Edge <b>không thể được hiệu chỉnh chỉ bằng phần mềm</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Để lưu hiệu chỉnh tùy chỉnh vào bộ nhớ trong của analog, cần phải có một <b>thao tác phần cứng</b>.",
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "Hỗ trợ hiệu chỉnh các mô-đun analog của DualSense Edge hiện đã có sẵn dưới dạng <b>tính năng thử nghiệm</b>.",
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Điều này liên quan đến việc tạm thời vô hiệu hóa bảo vệ ghi bằng cách cấp <b>+1.8V</b> vào một điểm thử nghiệm cụ thể trên mỗi mô-đun.",
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Điều này chỉ dành cho người dùng nâng cao. Nếu mày không chắc chắn mình đang làm gì, vui lòng không thử.",
"We are not responsible for any damage caused by attempting this modification.": "Tao không chịu trách nhiệm cho bất kỳ thiệt hại nào do việc cố gắng thực hiện thao tác này.",
"You can do this in two ways:": "Mày có thể làm điều này bằng hai cách:",
"here": "tại đây",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Nếu hiệu chỉnh không được lưu vĩnh viễn, vui lòng kiểm tra lại dây nối của mod phần cứng.",
"Cannot lock": "Không thể khóa",
"Cannot store data into": "Không thể lưu dữ liệu vào",
"Cannot unlock": "Không thể mở khóa",
"Color": "Màu sắc",
"Left Module Barcode": "Mã vạch Mô-đun Trái",
"Right Module Barcode": "Mã vạch Mô-đun Phải",
"left module": "mô-đun trái",
"right module": "mô-đun phải",
"30th Anniversary": "Phiên bản Kỷ niệm 30 năm",
"Astro Bot": "Astro Bot",
"Cobalt Blue": "Xanh Cobalt",
"Cosmic Red": "Đỏ Vũ trụ",
"Galactic Purple": "Tím Thiên hà",
"God of War Ragnarok": "God of War Ragnarok",
"Grey Camouflage": "Rằn ri Xám",
"Midnight Black": "Đen Huyền bí",
"Nova Pink": "Hồng Nova",
"Starlight Blue": "Xanh Ánh sao",
"Sterling Silver": "Bạc Sterling",
"Volcanic Red": "Đỏ Núi lửa",
"White": "Trắng",
"Chroma Indigo": "Chroma Indigo",
"Chroma Pearl": "Chroma Pearl",
"Chroma Teal": "Chroma Teal",
"Fortnite": "Fortnite",
"Spider-Man 2": "Spider-Man 2",
"The Last of Us": "The Last of Us",
"10x zoom": "Test tốc độ 10x",
"Calibration": "Hiệu chỉnh",
"Debug": "Gỡ lỗi",
"Info": "Thông tin",
"Normal": "Bình thường",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Lỗi độ tròn trung bình của analog</strong>: Bình thường nên dưới 9%.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "Cần khởi động lại để tiếp tục sử dụng DualSense Edge này. Vui lòng ngắt kết nối và kết nối lại tay cầm.",
"Adaptive Trigger": "Cò (Trigger) thích ứng",
"Adaptive triggers are only supported on DualSense controllers": "Cò thích ứng chỉ được hỗ trợ trên tay cầm PS5",
"Add test": "Thực hiện kiểm tra",
"Be gentle to avoid damage.": "Thao tác nhẹ nhàng để tránh hư hỏng",
"Buttons": "Nút bấm",
"Center": "Tâm",
"Center (L1)": "Tâm (L1)",
"Circularity": "Độ tròn",
"Circularity (R1)": "Độ tròn (R1)",
"Controller does not support adaptive trigger control": "Tay cầm không hỗ trợ điều khiển cò thích ứng",
"Don't show again": "Không hiển thị lại",
"Fail": "Thất bại",
"Failed": "Đã thất bại",
"Failed to connect to device": "Không thể kết nối với thiết bị",
"Failed to disable adaptive trigger": "Không thể tắt cò thích ứng",
"Failed to set speaker tone": "Không thể đặt âm lượng loa",
"Failed to set vibration": "Không thể đặt độ rung",
"Feel for vibration in the controller.": "Cảm nhận độ rung của tay cầm",
"Haptic Vibration": "Rung phản hồi",
"Headphone Jack": "Jack tai nghe",
"Increase non-circularity": "Tăng độ không tròn",
"Instructions": "Hướng dẫn",
"Keep rotating the sticks even if you see no progress!": "Tiếp tục xoay analog cho đến khi thanh tiến trình đầy",
"Learn more...": "Tìm hiểu thêm...",
"Lights": "Đèn",
"Listen for a tone from the controller speaker.": "Lắng nghe âm báo từ loa tay cầm",
"Long-press [circle] to skip ahead.": "Nhấn giữ [circle] để bỏ qua.",
"Microphone": "Micrô",
"Microphone Level:": "Mức Micrô",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Di chuyển analog để chọn vị trí muốn điều chỉnh, sau đó sử dụng các nút D-pad để điều chỉnh điểm trung tâm (không cần chạm vào analog). Nếu tâm bị lệch, hãy gẩy nhẹ analog và điều chỉnh lại.",
"No controller connected": "Chưa kết nối tay cầm nào",
"No tests completed yet.": "Chưa hoàn thành bài kiểm tra nào",
"Not tested": "Chưa kiểm tra",
"Pass": "Đạt",
"Passed": "Đã đạt",
"Please release the stick to center position before adjusting with D-pad buttons.": "Vui lòng đảm bảo analog ở vị trí chính giữa trước khi điều chỉnh bằng các nút D-pad.",
"Plug in headphones to the 3.5mm jack": "Cắm tai nghe vào cổng 3.5mm",
"Press L2 and R2 triggers to feel the trigger resistance.": "Nhấn cò L2 và R2 để cảm nhận lực cản của cò",
"Press [circle] to close, or [square] to start over": "Nhấn [circle] để đóng, hoặc [square] để bắt đầu lại",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Nhấn [square] để Đạt, [cross] để Lỗi, hoặc [circle] để bỏ qua.",
"Press [square] to begin or [circle] to close": "Nhấn [square] để bắt đầu hoặc [circle] để đóng",
"Press [triangle] to go back.": "Nhấn [triangle] để quay lại.",
"Press each button until they turn green.": "Nhấn từng nút cho đến khi chúng chuyển sang màu xanh lá cây",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Nhấn D-pad hoặc các nút mặt theo hướng mày muốn vị trí analog di chuyển.",
"Progress": "Tiến trình",
"Push the stick straight up/down/left/right as far as possible.": "Đẩy analog thẳng lên/xuống/trái/phải hết mức có thể.",
"Quick Test": "Kiểm tra nhanh",
"Quick calibrate": "Hiệu chỉnh nhanh",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Hiệu chỉnh phạm vi thất bại. Vui lòng thử lại và đảm bảo đã xoay analog.",
"Repeat": "Lặp lại",
"Restart": "Khởi động lại",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Xoay analog chậm rãi ít nhất 2 lần theo một hướng và 2 lần theo hướng ngược lại để bao phủ toàn bộ phạm vi.",
"Run through these tests to verify your controller's functionality.": "Thực hiện các bài kiểm tra này để kiểm tra chức năng của tay cầm.",
"Show raw numbers": "Hiển thị dữ liệu thô",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Các tay cầm Sony xuất xưởng được hiệu chỉnh với lỗi độ tròn trung bình gần 10%, và đây là điều mà các trò chơi mong đợi. Độ tròn quá hoàn hảo có thể khiến chuyển động và ngắm bắn cảm thấy cứng và kém phản hồi trong một số trò chơi.",
"Speaker": "Loa",
"Step size": "Kích thước bước",
"Test Speaker": "Kiểm tra Loa",
"Test Summary": "Tóm tắt Kiểm tra",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Kiểm tra tất cả các nút, hoặc nhấn giữ [square] để Đạt, [cross] để Lỗi, hoặc [circle] để bỏ qua.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "Nút <b>Hoàn thành</b> sẽ mở khóa sau tối đa 15 giây. Nếu mày nhấn <b>Hoàn thành</b> mà không xoay analog, hiệu chỉnh sẽ không hoàn tất và mày cần phải lặp lại.",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Tay cầm đang được kết nối bằng Bluetooth. Vui lòng ngắt kết nối và kết nối lại bằng cáp USB.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Bài kiểm tra này kiểm tra tất cả các nút bấm của tay cầm bằng cách yêu cầu mày nhấn mỗi nút tối đa ba lần.",
"This test checks the headphone jack functionality.": "Bài kiểm tra này kiểm tra chức năng của jack tai nghe.",
"This test checks the reliability of the USB port.": "Bài kiểm tra này kiểm tra cổng USB có hoạt động bình thường không.",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Bài kiểm tra này sẽ chuyển đổi qua các màu đỏ, xanh lá, và xanh dương trên thanh đèn của tay cầm, tạo hiệu ứng đèn báo người chơi, và làm nút tắt tiếng nhấp nháy.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Bài kiểm tra này sẽ kích hoạt lực cản nặng trên cả cò L2 và R2.",
"USB Connector": "Cổng kết nối USB",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Quan sát đèn tay cầm đổi màu, đèn báo người chơi chuyển động, và nút tắt tiếng có nhấp nháy không.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Trong khi giữ analog cần điều chỉnh thẳng lên/xuống/trái/phải, thực hiện điều chỉnh cho đến khi mày thấy các khu vực màu xanh nhạt ở cả bốn hướng sau khi xoay tròn analog sang cả trái và phải. Sau đó dùng",
"Wiggle the USB cable to see if the controller disconnects.": "Lắc nhẹ cáp USB để kiểm tra tay cầm có bị ngắt kết nối không.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Tay cầm này có thể không phải là tay cầm Sony chính hãng.",
"failed": "thất bại",
"hide": "ẩn",
"passed": "đã đạt",
"skipped": "đã bỏ qua",
"tests completed": "bài kiểm tra đã hoàn thành",
"to increase the non-circularity.": "để tăng độ không tròn.",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Clear All": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"No saved calibrations found.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- 中文翻译由 <a href='https://github.com/Yyiyun'>Eythavon</a> <a href='https://space.bilibili.com/7173897'>坩埚钳特大号</a> <a href='https://space.bilibili.com/185181540'>修手柄的小丁</a> 提供",
"DualShock Calibration GUI": "手柄校准界面",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "浏览器不支持。请使用支持 WebHID 的浏览器 (例如 Chrome)。",
"Connect": "连接",
"Connected to:": "连接至:",
"Disconnect": "断开连接",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "重新定位摇杆中心。",
"Please do not close this window and do not disconnect your controller. ": "请不要关闭此窗口,也不要断开手柄的连接。 ",
"Range calibration": "摇杆外圈校准",
"<b>The controller is now sampling data!</b>": "<b>手柄现在正在采样数据!</b>",
"The controller is now sampling data!": "手柄现在正在采样数据!",
"Done": "完成",
"Hi, thank you for using this software.": "嗨,感谢您使用此软件。",
"If you're finding it helpful and you want to support my efforts, feel free to": "如果你觉得这些对你有帮助,想支持我的工作,随时欢迎!",
@@ -66,16 +65,13 @@
"Sony DualSense": "PS5手柄Sony DualSense",
"Sony DualSense Edge": "PS5精英手柄/DSE(Sony DualSense Edge)",
"Connected invalid device": "连接了无效设备",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "错误",
"My handle on discord is: the_al": "我的 Discord 用户名是: the_al",
"Initializing...": "初始化...",
"Storing calibration...": "正在存储校准...",
"Sampling...": "采样中...",
"Calibration in progress": "校准进行中",
"Start": "开始",
"Continue": "继续",
"You can check the calibration with the": "您可以通过以下方式检查校准",
"Have a nice day :)": "您慢走 :)",
"Welcome to the Calibration GUI": "欢迎使用校准 GUI",
"Just few things to know before you can start:": "在开始之前,有几件事情需要了解:",
@@ -125,9 +121,6 @@
", to help more people like you!": "来帮助更多像您一样的人!",
"This website uses analytics to improve the service.": "该网站使用分析工具来提升服务质量。",
"Board Model": "主板型号",
"This feature is experimental.": "此功能为实验性质。",
"Please let me know if the board model of your controller is not detected correctly.": "如果没有正确检测您手柄的主板型号,请告诉我。",
"Board model detection thanks to": "主板型号检测功能需要感谢",
"This DualSense controller has outdated firmware.": "该DualSense手柄的固件已过时。",
"Please update the firmware and try again.": "请更新固件后重试。",
"Joystick Info": "摇杆信息",
@@ -186,7 +179,6 @@
"DualSense Edge Calibration": "DualSense Edge校准",
"For more info or help, feel free to reach out on Discord.": "需要更多信息或帮助请随时在Discord上联系。",
"More details and images": "更多细节和图像",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "请将DualShock 4、DualSense 或 DualSense Edge 手柄连接到您的电脑,然后按下“连接”。",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "请注意DS Edge上的摇杆模块<b>无法仅通过软件进行校准</b>。",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "要在摇杆的内部存储器上存储自定义校准,需要进行<b>硬件修改</b>。",
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "现已提供校准 DualSense Edge 摇杆模块的支持,此功能为<b>实验性功能</b>。",
@@ -200,7 +192,6 @@
"Cannot store data into": "无法将数据存储到",
"Cannot unlock": "无法解锁",
"Color": "颜色",
"Color detection thanks to": "颜色检测由",
"Left Module Barcode": "左侧模块条形码",
"Right Module Barcode": "右侧模块条形码",
"left module": "左侧模块",
@@ -309,5 +300,40 @@
"skipped": "跳过",
"tests completed": "测试已完成",
"to increase the non-circularity.": "增加非圆度",
"Cannot copy text to the clipboard:": "无法将文本复制到剪贴板",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "请将DualShock 4、DualSense、DualSense Edge或VR2控制器连接到您的计算机然后按'连接'。",
"The device appears to be a clone. All calibration functionality is disabled.": "此手柄不是索尼正品手柄。所有校准功能均无法使用。",
"The item has been copied to the clipboard.": "该项目已复制到剪贴板。",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot read module barcodes": "",
"Clear All": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"No saved calibrations found.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- 中文(繁體)翻譯由 JEFF <a href='https://space.bilibili.com/185181540'>修手柄的小丁</a> 提供",
"DualShock Calibration GUI": "手把校準界面",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "不支持的瀏覽器。請使用支持 WebHID 的瀏覽器 (例如 Chrome)。",
"Connect": "連結",
"Connected to:": "連結至:",
"Disconnect": "斷開連結",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "重新定位手把摇杆。",
"Please do not close this window and do not disconnect your controller. ": "請不要關閉此窗口,也不要斷開手把的連接。 ",
"Range calibration": "摇杆外圈校準",
"<b>The controller is now sampling data!</b>": "<b>手把現在正在採樣數據!</b>",
"The controller is now sampling data!": "手把現在正在採樣數據!",
"Done": "完成",
"Hi, thank you for using this software.": "嗨,感謝您使用此軟體。",
"If you're finding it helpful and you want to support my efforts, feel free to": "如果您覺得有幫助,想支持我的努力,請隨時",
@@ -65,16 +64,13 @@
"Sony DualSense": "Sony DualSense",
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "連接了無效設備",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"Error": "錯誤",
"My handle on discord is: the_al": "我的 Discord 用戶名是: the_al",
"Initializing...": "初始化...",
"Storing calibration...": "正在儲存校準...",
"Sampling...": "採樣中...",
"Calibration in progress": "校準進行中",
"Start": "開始",
"Continue": "繼續",
"You can check the calibration with the": "您可以透過以下方式檢查校準",
"Have a nice day :)": "祝您有美好的一天! :)",
"Welcome to the Calibration GUI": "歡迎使用校準 GUI",
"Just few things to know before you can start:": "在開始之前,有幾件事情要了解:",
@@ -124,9 +120,6 @@
", to help more people like you!": "以幫助更多像您一樣的人!",
"This website uses analytics to improve the service.": "該網站使用分析工具來改善服務。",
"Board Model": "主機板型號",
"This feature is experimental.": "此功能為實驗性質。",
"Please let me know if the board model of your controller is not detected correctly.": "如果您的手把的主機板型號沒有被正確檢測,請告訴我。",
"Board model detection thanks to": "主機板型號檢測功能需要感謝",
"This DualSense controller has outdated firmware.": "該DualSense手把的韌體已過時。",
"Please update the firmware and try again.": "請更新韌體後重試。",
"Joystick Info": "搖桿資訊",
@@ -172,7 +165,6 @@
"Left stick": "左搖桿電壓(mV)",
"More details and images": "更多詳情與圖片",
"PCBA ID": "PCBA ID",
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "請將 DualShock 4、DualSense 或 DualSense Edge 手把連接到您的電腦,然後按下「連接」。",
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "請註意DS Edge上的搖桿模塊<b>無法僅通過軟件進行校準</b>。",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "要在搖桿的內部存儲器上存儲自定義校準,需要進行<b>硬件修改</b>。",
"Right stick": "右搖桿電壓(mV)",
@@ -195,7 +187,6 @@
"Cannot store data into": "無法將數據存儲到",
"Cannot unlock": "無法解鎖",
"Color": "顏色",
"Color detection thanks to": "顏色檢測由",
"Left Module Barcode": "左側模塊條形碼",
"MCU Unique ID": "MCU唯壹ID",
"Right Module Barcode": "右側模塊條形碼",
@@ -234,14 +225,27 @@
"Adaptive Trigger": "",
"Adaptive triggers are only supported on DualSense controllers": "",
"Add test": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Center": "",
"Center (L1)": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Controller does not support adaptive trigger control": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
@@ -249,11 +253,14 @@
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
@@ -262,11 +269,14 @@
"Microphone Level:": "",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
@@ -282,6 +292,8 @@
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
"Repeat": "",
"Restart": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Show raw numbers": "",
@@ -292,20 +304,34 @@
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",

View File

@@ -20,6 +20,7 @@
# Usage:
# python3 scripts/check_translations.py # Normal output
# python3 scripts/check_translations.py --verbose # Show excluded strings
# python3 scripts/check_translations.py --compact # Compact output (no language details)
# python3 scripts/check_translations.py --json # Output in JSON format
import os
@@ -31,6 +32,7 @@ from pathlib import Path
# Check for flags
VERBOSE = '--verbose' in sys.argv or '-v' in sys.argv
JSON_OUTPUT = '--json' in sys.argv
COMPACT = '--compact' in sys.argv
# Directories to scan
ROOT_DIR = Path(".")
@@ -48,7 +50,6 @@ EXCLUDE_PATTERNS = [
r'^[\w-]+\.[\w-]+$', # CSS compound selectors like circle.ds-touch
r'^path,rect,circle', # SVG element lists
r'^\\x[0-9a-fA-F]+$', # Hex escape sequences
r'^(hide|show)$', # Common CSS display values
]
# Whitelist of strings that are in language files but should be ignored by unused check
@@ -189,7 +190,7 @@ def extract_l_function_strings(js_files):
# Pattern to match l("string") or l('string') or this.l("string") or this.l('string')
# Handles both single and double quotes
# Use word boundary \b to ensure 'l' is not part of a larger word (e.g., .html)
pattern = r'(?:this\.)?\bl\s*\(\s*["\']([^"\']+)["\']\s*\)'
pattern = r'(?:this\.)?\bl\s*\(\s*["\'`]([^"\'`]+)["\'`]\s*\)'
for js_file in js_files:
try:
@@ -235,7 +236,10 @@ def extract_html_strings_from_js(js_files):
# Pattern to match elements with ds-i18n class in HTML strings
# This handles HTML within JavaScript strings (both single and double quotes)
pattern = r'<(\w+)[^>]*class=["\'][^"\']*ds-i18n[^"\']*["\'][^>]*>(.*?)</\1>'
pattern = r'<(\w+)[^>]*class=["\'`][^"\'`]*ds-i18n[^"\'`]*["\'`][^>]*>(.*?)</\1>'
# Pattern to match template literal function calls like ${l('string')} or ${l("string")}
template_literal_pattern = r'\$\{l\s*\(\s*["\'`]([^"\'`]+)["\'`]\s*\)\}'
for js_file in js_files:
try:
@@ -266,18 +270,39 @@ def extract_html_strings_from_js(js_files):
# Otherwise, keep the original text with simple formatting tags
if text:
# Calculate line and column number using original content
line_num = original_content[:match.start()].count('\n') + 1
col_num = match.start() - original_content[:match.start()].rfind('\n')
# Extract any template literal function calls like ${l('string')}
template_matches = re.finditer(template_literal_pattern, text)
for template_match in template_matches:
extracted_string = template_match.group(1)
if extracted_string:
# Calculate line and column number using original content
line_num = original_content[:match.start()].count('\n') + 1
col_num = match.start() - original_content[:match.start()].rfind('\n')
# Store location info
if text not in strings:
strings[text] = []
strings[text].append({
'file': str(js_file),
'line': line_num,
'col': col_num
})
# Store location info
if extracted_string not in strings:
strings[extracted_string] = []
strings[extracted_string].append({
'file': str(js_file),
'line': line_num,
'col': col_num
})
# Also handle text that doesn't contain template literal patterns
# (for backwards compatibility with non-template literal strings)
if not re.search(template_literal_pattern, text):
# Calculate line and column number using original content
line_num = original_content[:match.start()].count('\n') + 1
col_num = match.start() - original_content[:match.start()].rfind('\n')
# Store location info
if text not in strings:
strings[text] = []
strings[text].append({
'file': str(js_file),
'line': line_num,
'col': col_num
})
except Exception as e:
print(f"Error reading {js_file}: {e}")
@@ -456,16 +481,16 @@ def main():
print("-" * 80)
for string in sorted(missing_translations):
print(f" - \"{string}\"")
# Show first location where this string was found
if string in used_strings_with_locations:
# Show first location where this string was found (skip in compact mode)
if not COMPACT and string in used_strings_with_locations:
locations = used_strings_with_locations[string]
if locations:
loc = locations[0]
print(f"{loc['file']}:{loc['line']}:{loc['col']}")
if len(locations) > 1:
print(f" (and {len(locations) - 1} more location{'s' if len(locations) > 2 else ''})")
# Show which languages are missing this translation
if string in missing_by_language:
# Show which languages are missing this translation (skip in compact mode)
if not COMPACT and string in missing_by_language:
missing_langs = missing_by_language[string]
if len(missing_langs) == len(keys_by_language):
print(f" Missing from: ALL languages ({len(missing_langs)})")

View File

@@ -47,7 +47,6 @@
</div>
<div class="container" style="display: none;" id="list-6">
<p class="ds-i18n">Calibration completed successfully!</p>
<p><span class="ds-i18n">You can check the calibration with the</span> <a href="https://hardwaretester.com/gamepad" target="_blank">gamepad tester</a>.</p>
<p class="ds-i18n">Have a nice day :)</p>
</div>
</div>

View File

@@ -0,0 +1,19 @@
<div class="modal fade" id="calibrationHistoryModal" tabindex="-1" aria-labelledby="calibrationHistoryModalLabel" aria-hidden="true">
<div class="modal-dialog modal-lg modal-dialog-centered modal-dialog-scrollable">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5 ds-i18n" id="calibrationHistoryModalLabel">Calibration History</h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div id="historyListContainer">
<p class="text-muted ds-i18n">No saved calibrations found.</p>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary ds-i18n" data-bs-dismiss="modal">Close</button>
<button type="button" class="btn btn-danger ds-i18n" onclick="calibration_history_clear_all()" id="clearAllBtn" style="display: none;">Clear All</button>
</div>
</div>
</div>
</div>

View File

@@ -8,6 +8,10 @@
</div>
<div class="modal-body">
<p class="ds-i18n mb-3">Run through these tests to verify your controller's functionality.</p>
<div id="battery-warning-alert" style="display: none; background-color: white; color: #ff4000cb; padding: 12px 16px; border-radius: 4px; margin-bottom: 16px; border: 2px solid;">
<i class="fas fa-exclamation-triangle me-2"></i>
<span class="ds-i18n">Battery level is low. Tests may fail due to the controller being in power saving mode.</span>
</div>
<div class="alert alert-info mb-4" id="quick-test-instructions">
<i class="fas fa-gamepad me-2"></i>
<span class="ds-i18n" id="quick-test-instructions-text"></span>

View File

@@ -6,12 +6,30 @@
<h1 class="modal-title fs-5 ds-i18n" id="staticBackdropLabel">Range calibration</h1>
</div>
<div class="modal-body">
<p class="ds-i18n"><b>The controller is now sampling data!</b></p>
<p><b class="ds-i18n pulsing-text">The controller is now sampling data!</b></p>
<p class="ds-i18n">Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.</p>
<div class="progress mt-3" role="progressbar" aria-label="Range calibration progress" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div style="display: flex; justify-content: center; gap: 0px; align-items: center; font-family: monospace; font-size: 0.85em;">
<div style="text-align: left; min-width: 65px;">
<div><small>LX: <span id="range-lx-lbl">0.00</span></small></div>
<div><small>LY: <span id="range-ly-lbl">0.00</span></small></div>
</div>
<div style="text-align: center;">
<canvas id="range-left-stick-canvas" width="150" height="150"></canvas>
</div>
<div style="text-align: center;">
<canvas id="range-right-stick-canvas" width="150" height="150"></canvas>
</div>
<div style="text-align: left; min-width: 65px;">
<div id="range-rx"><small>RX: <span id="range-rx-lbl">0.00</span></small></div>
<div id="range-ry"><small>RY: <span id="range-ry-lbl">0.00</span></small></div>
</div>
</div>
<div class="progress mt-2" id="range-progress-container" role="progressbar" aria-label="Range calibration progress" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
<div id="range-progress-bar" class="progress-bar" style="width:0%"></div>
</div>
<div class="mt-2">
<div class="mt-2" id="range-progress-text-container">
<small class="text-muted">
<span class="ds-i18n">Progress</span>: <span id="range-progress-text">0%</span>
</small>