Compare commits

..

56 Commits
v2.20 ... v2.23

Author SHA1 Message Date
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
51 changed files with 2745 additions and 668 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,8 +74,23 @@
<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;">
@@ -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">
@@ -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.20</a> (2025-11-16) - <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.23</a> (2025-12-24) - <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

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

@@ -86,9 +86,10 @@ class ControllerFactory {
showInfo: false,
showFinetune: false,
showInfoTab: false,
showFourStepCalib: true,
showQuickTests: true,
showQuickCalib: false
showFourStepCalib: true,
showQuickCalib: false,
showCalibrationHistory: false
};
case 0x0ce6: // DS5
@@ -97,9 +98,10 @@ class ControllerFactory {
showInfo: true,
showFinetune: true,
showInfoTab: true,
showFourStepCalib: false,
showQuickTests: true,
showQuickCalib: true
showFourStepCalib: false,
showQuickCalib: true,
showCalibrationHistory: true
};
case 0x0e45: // VR2 Left Controller
@@ -108,8 +110,8 @@ class ControllerFactory {
showInfo: true,
showFinetune: false,
showInfoTab: true,
showFourStepCalib: true,
showQuickTests: false,
showFourStepCalib: true,
showQuickCalib: false
};
@@ -118,9 +120,10 @@ class ControllerFactory {
showInfo: false,
showFinetune: false,
showInfoTab: false,
showFourStepCalib: false,
showQuickTests: false,
showQuickCalib: false
showFourStepCalib: 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 };
}
/**

View File

@@ -266,6 +266,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 +302,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 +324,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 },
];
@@ -844,7 +848,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;
@@ -852,32 +856,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) {

View File

@@ -238,6 +238,10 @@ class VR2Controller extends BaseController {
return DS5_INPUT_CONFIG;
}
async getSerialNumber() {
return await this.getSystemInfo(1, 19, 17);
}
async getInfo() {
return this._getInfo(false);
}

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,13 +220,15 @@ async function continue_connection({data, device}) {
}
// Helper to apply basic UI visibility based on device type
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showFourStepCalib, showQuickTests, showQuickCalib }) {
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showQuickTests, showFourStepCalib, showQuickCalib, showCalibrationHistory }) {
$("#infoshowall").toggle(!!showInfo);
$("#ds5finetune").toggle(!!showFinetune);
$("#info-tab").toggle(!!showInfoTab);
$("#four-step-center-calib").toggle(!!showFourStepCalib);
$("#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;
@@ -260,14 +273,13 @@ 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 model = controllerInstance.getModel();
const numOfSticks = controllerInstance.getNumberOfSticks();
if(numOfSticks == 2) {
$("#stick-item-rx").show();
@@ -279,6 +291,29 @@ async function continue_connection({data, device}) {
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);
@@ -320,6 +355,24 @@ async function continue_connection({data, device}) {
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;
@@ -337,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();
@@ -345,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
@@ -400,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;
@@ -409,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");
}
@@ -446,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');
@@ -487,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() {
@@ -517,14 +614,14 @@ function refresh_stick_pos() {
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,
});
if(!hasSingleStick) {
// Draw right stick
draw_stick_position(ctx, w-hb, yb, sz, prx, pry, {
draw_stick_dial(ctx, w-hb, yb, sz, prx, pry, {
circularity_data: enable_circ_test ? rr_data : null,
enable_zoom_center,
});
@@ -584,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');
@@ -623,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);
}
@@ -749,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;
}
@@ -885,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) {
@@ -908,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) {
@@ -950,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;
}
@@ -964,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
@@ -1068,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 });

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,10 +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() {
@@ -55,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();
}
/**
@@ -112,14 +150,7 @@ export class CalibRangeModal {
// 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();
}
@@ -148,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
@@ -244,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) => {
@@ -265,8 +408,13 @@ 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);
}
}

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 = {
@@ -50,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);
@@ -89,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": "إذا كنت تجد ذلك مفيداً وترغب في دعم جهودي، لا تتردد في",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "الجهاز المتصل غير صالح،",
"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:": "بعض الأشياء التي يجب أن تعرفها قبل أن تبدأ",
@@ -124,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": "معلومات عصا التحكم",
@@ -184,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": "",
@@ -200,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": "",
@@ -216,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": "",
@@ -227,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": "",
@@ -240,6 +249,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": "",
@@ -249,6 +259,7 @@
"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": "",
@@ -264,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.": "",
@@ -281,8 +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": "Ако намирате, че е полезно и искате да подкрепите усилията ми, не се колебайте",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Свързан невалидно устройство",
"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:": "Просто няколко неща, които трябва да знаете, преди да започнете:",
@@ -123,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": "Информация за джойстика",
@@ -159,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": "",
@@ -177,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": "",
@@ -202,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": "",
@@ -215,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": "",
@@ -229,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": "",
@@ -239,6 +249,7 @@
"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": "",
@@ -254,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.": "",
@@ -276,8 +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",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Připojené neplatné zařízení",
"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",
@@ -123,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",
@@ -142,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": "",
@@ -163,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": "",
@@ -190,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": "",
@@ -204,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": "",
@@ -219,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": "",
@@ -232,6 +242,7 @@
"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": "",
@@ -248,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.": "",
@@ -272,8 +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",
@@ -68,14 +67,12 @@
"Connected invalid device": "Forbundet til en ugyldig enhed",
"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",
@@ -246,7 +239,6 @@
"Buttons": "Knapper",
"Center": "Centrer",
"Circularity": "Cirkularitet",
"Click \"Test Speaker\" to listen for the tone through the headphones": "Klik på \"Test Højttaler\" for at høre tonen gennem hovedtelefonerne.",
"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",
@@ -297,10 +289,8 @@
"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 activate the controller's vibration motors, first the heavy one, and then the light one.": "Denne test vil aktivere controllerens vibrationsmotorer, først den kraftige og derefter den lette.",
"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.",
"This test will play a tone through the controller's built-in speaker.": "Denne test vil afspille en tone gennem controllerens indbyggede højttaler.",
"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...",
@@ -311,6 +301,39 @@
"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.": "",
"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": "- 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",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Verbundenes ungültiges Gerät",
"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:",
@@ -124,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",
@@ -176,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": "",
@@ -192,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": "",
@@ -210,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": "",
@@ -222,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": "",
@@ -235,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": "",
@@ -245,6 +255,7 @@
"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": "",
@@ -260,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.": "",
@@ -278,8 +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",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo conectado no válido",
"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:",
@@ -123,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",
@@ -142,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": "",
@@ -163,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": "",
@@ -190,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": "",
@@ -204,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": "",
@@ -219,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": "",
@@ -232,6 +242,7 @@
"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": "",
@@ -248,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.": "",
@@ -272,8 +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",
"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": "اگر این نرم‌افزار برایتان مفید بود و می‌خواهید از تلاش‌های من حمایت کنید، می‌توانید",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "سونی DualSense Edge",
"Connected invalid device": "دستگاه متصل نامعتبر است",
"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:": "چند نکته قبل از شروع:",
@@ -141,12 +138,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": "",
@@ -154,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.": "",
@@ -166,11 +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": "",
@@ -184,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.": "",
@@ -193,19 +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 à",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Appareil non valide connecté",
"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:",
@@ -123,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",
@@ -142,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": "",
@@ -163,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": "",
@@ -190,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": "",
@@ -204,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": "",
@@ -219,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": "",
@@ -232,6 +242,7 @@
"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": "",
@@ -248,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.": "",
@@ -272,8 +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",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Érvénytelen eszköz csatlakoztatva",
"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:",
@@ -124,9 +121,6 @@
", 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ó",
@@ -197,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",
@@ -216,98 +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 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.": "",
"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 appears to be a clone. All calibration functionality is disabled.": "",
"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.": "",
"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 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": "- 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",
@@ -197,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",
@@ -308,6 +301,39 @@
"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.",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"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.": "",
"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": "",
"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": "- イタリア語への翻訳: <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": "役立つと思われる場合、または私の取り組みをサポートしたい場合は、お気軽に",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "接続された無効なデバイス",
"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:": "始める前に知っておくべきこと:",
@@ -123,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": "ジョイスティック情報",
@@ -146,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": "",
@@ -166,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": "",
@@ -192,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": "",
@@ -206,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": "",
@@ -220,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": "",
@@ -233,6 +243,7 @@
"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 +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.": "",
@@ -272,8 +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": "이 프로그램이 도움이 되었고, 개발자를 응원하고 싶으시다면",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "잘못된 기기가 연결되었습니다",
"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:": "시작하기 전에 몇 가지 알아둘 사항이 있습니다:",
@@ -123,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": "조이스틱 정보",
@@ -192,7 +186,6 @@
"Circularity (R1)": "원형성 (R1)",
"Cobalt Blue": "코발트 블루",
"Color": "색상",
"Color detection thanks to": "색상 감지 도움:",
"Cosmic Red": "코스믹 레드",
"Debug": "디버그",
"DualSense Edge Calibration": "DualSense Edge 보정",
@@ -238,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": "",
@@ -251,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.": "",
@@ -263,11 +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": "",
@@ -281,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.": "",
@@ -290,22 +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",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Ongeldig apparaat verbonden",
"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:",
@@ -123,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",
@@ -142,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": "",
@@ -163,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": "",
@@ -190,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": "",
@@ -204,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": "",
@@ -219,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": "",
@@ -232,6 +242,7 @@
"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": "",
@@ -248,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.": "",
@@ -272,8 +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ę",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Podłączono nieznane urządzenie",
"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",
@@ -124,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",
@@ -189,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",
@@ -228,86 +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": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"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 appears to be a clone. All calibration functionality is disabled.": "",
"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 (typu Jack)",
"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.": "",
"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": "- 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",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo conectado inválido",
"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:",
@@ -123,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",
@@ -159,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": "",
@@ -177,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": "",
@@ -202,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": "",
@@ -215,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": "",
@@ -229,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": "",
@@ -239,6 +249,7 @@
"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": "",
@@ -254,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.": "",
@@ -276,8 +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",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo inválido ligado",
"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:",
@@ -123,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",
@@ -195,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",
@@ -289,25 +282,58 @@
"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",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Povezan je nevažeći uređaj",
"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:",
@@ -124,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",
@@ -188,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": "",
@@ -203,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": "",
@@ -218,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": "",
@@ -229,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": "",
@@ -241,6 +250,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": "",
@@ -250,6 +260,7 @@
"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 +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.": "",
@@ -281,8 +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": "Если вы находите это полезным и хотите поддержать мои усилия, не стесняйтесь",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Подключено недопустимое устройство",
"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:": "Несколько вещей, о которых нужно знать, прежде чем начать:",
@@ -123,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,7 +154,6 @@
"Cannot store data into": "Не удалось сохранить данные",
"Cannot unlock": "Не удалось разблокировать",
"Color": "Цвет",
"Color detection thanks to": "За определение цвета спасибо",
"Controller Info": "Инфо контроллера",
"Debug Info": "Дебаг-информация",
"Debug buttons": "Отладка кнопок",
@@ -210,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": "",
@@ -221,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": "",
@@ -233,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": "",
@@ -242,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.": "",
@@ -252,6 +261,7 @@
"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": "",
@@ -260,6 +270,7 @@
"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": "",
@@ -275,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": "",
@@ -289,23 +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",
@@ -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.",
@@ -67,14 +66,12 @@
"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 :)": " 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:",
@@ -124,9 +121,6 @@
", 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",
@@ -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",
@@ -232,7 +225,7 @@
"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üzey 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.",
@@ -308,6 +301,39 @@
"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.": "",
"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.": "",
"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": "- Переклав солов'їною: 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": "Якщо вважаєте, що це корисно й хочете підтримати мої зусилля - не соромтесь і",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Підключено неприпустиме пристрій",
"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:": "Кілька моментів, які слід врахувати перед початком:",
@@ -124,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": "Інформація про джойстик",
@@ -200,7 +194,6 @@
"Cannot unlock": "Не вдалося розблокувати",
"Cobalt Blue": "Кобальтово-синій",
"Color": "Колір",
"Color detection thanks to": "Розпізнавання кольору завдяки",
"Cosmic Red": "Космічний червоний",
"Galactic Purple": "Галактичний пурпуровий",
"God of War Ragnarok": "Обмежена серія God of War: Ragnarok",
@@ -307,7 +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.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"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.": "",
"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": "- 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",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Trình duyệt không được hỗ trợ. Vui lòng sử dụng trình duyệt có hỗ trợ WebHID (ví dụ: Chrome).",
"Connect": "Kết nối",
"Connected to:": "Đã kết nối với:",
"Disconnect": "Ngắt kết nối",
@@ -35,7 +34,7 @@
"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",
"<b>The controller is now sampling data!</b>": "<b>Tay cầm hiện đang lấy mẫu dữ liệu!</b>",
"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é!",
@@ -68,14 +67,12 @@
"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",
"My handle on discord is: the_al": "Tên Discord của tao là: the_al",
"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",
"You can check the calibration with the": "Mày có thể kiểm tra hiệu chỉnh bằng",
"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:",
@@ -125,9 +122,6 @@
", 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 feature is experimental.": "Tính năng này mang tính thử nghiệm.",
"Please let me know if the board model of your controller is not detected correctly.": "Nếu mẫu bo mạch của tay cầm không được phát hiện chính xác, vui lòng cho tao biết.",
"Board model detection thanks to": "Phát hiện mẫu bo mạch nhờ",
"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",
@@ -199,7 +193,6 @@
"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",
"Color detection thanks to": "Phát hiện màu sắc nhờ",
"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",
@@ -308,6 +301,39 @@
"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": "如果你觉得这些对你有帮助,想支持我的工作,随时欢迎!",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "PS5精英手柄/DSE(Sony DualSense Edge)",
"Connected invalid device": "连接了无效设备",
"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 +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": "摇杆信息",
@@ -198,7 +192,6 @@
"Cannot store data into": "无法将数据存储到",
"Cannot unlock": "无法解锁",
"Color": "颜色",
"Color detection thanks to": "颜色检测由",
"Left Module Barcode": "左侧模块条形码",
"Right Module Barcode": "右侧模块条形码",
"left module": "左侧模块",
@@ -307,7 +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.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"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": "如果您覺得有幫助,想支持我的努力,請隨時",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "連接了無效設備",
"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:": "在開始之前,有幾件事情要了解:",
@@ -123,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 +187,6 @@
"Cannot store data into": "無法將數據存儲到",
"Cannot unlock": "無法解鎖",
"Color": "顏色",
"Color detection thanks to": "顏色檢測由",
"Left Module Barcode": "左側模塊條形碼",
"MCU Unique ID": "MCU唯壹ID",
"Right Module Barcode": "右側模塊條形碼",
@@ -232,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": "",
@@ -247,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.": "",
@@ -260,12 +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": "",
@@ -281,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": "",
@@ -291,21 +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>