Compare commits
47 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b35ae3a85f | ||
|
|
7ca515b3db | ||
|
|
86febfb699 | ||
|
|
9476d3f001 | ||
|
|
6746fb8490 | ||
|
|
23751ac893 | ||
|
|
bd69bdd3eb | ||
|
|
91869723e5 | ||
|
|
3eeffaf0c4 | ||
|
|
7909007d2c | ||
|
|
9795f6385f | ||
|
|
55c44f4216 | ||
|
|
1df52b17c4 | ||
|
|
866940616b | ||
|
|
9e5018ce08 | ||
|
|
1661b4bdaa | ||
|
|
99aa74787c | ||
|
|
570d7f6c88 | ||
|
|
22c2ad267f | ||
|
|
53e4ba84c7 | ||
|
|
d71a5e4c03 | ||
|
|
3f24c6cb72 | ||
|
|
be532db363 | ||
|
|
889ecf6b29 | ||
|
|
5efa1b5be4 | ||
|
|
63e697dd37 | ||
|
|
44b05328e6 | ||
|
|
fea0e9c3fa | ||
|
|
0e8e7fc281 | ||
|
|
28604b0e36 | ||
|
|
e4d450c1c8 | ||
|
|
6a2feab7bd | ||
|
|
25f52689e1 | ||
|
|
6073803215 | ||
|
|
68bfe1388b | ||
|
|
7a52f1eab8 | ||
|
|
72c5dfbbeb | ||
|
|
a6f1b2e503 | ||
|
|
aeb0c161ea | ||
|
|
977c522b5d | ||
|
|
e9778d44da | ||
|
|
794485c265 | ||
|
|
1252f43d23 | ||
|
|
53fd91fdb3 | ||
|
|
b3712a24c2 | ||
|
|
3bc5c0eb34 | ||
|
|
b240d1d65c |
4
.github/workflows/gulp-deploy.yml
vendored
@@ -3,9 +3,7 @@ name: Build and Deploy to GitHub Pages
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- build-dist-with-gulp
|
||||
- release-2-16
|
||||
- "**"
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
deploy:
|
||||
|
||||
|
Before Width: | Height: | Size: 449 B After Width: | Height: | Size: 449 B |
112
assets/dualsense-controller.svg
Normal file
@@ -0,0 +1,112 @@
|
||||
<svg id="controller-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 518" style="width: 80%; height: auto; max-width: 80%;" stroke-width="1">
|
||||
<g id="Button_infills">
|
||||
<g id="Mute_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path id="Mute_infill" d="M454.47,468.7c-6.47,0-12.69.04-18.75.14-.92.01-2.18.28-2.96,1.48-.56.85-.83,2.14-.8,3.81.03,2.24.41,3.3,3.67,3.32,4.47.03,8.94.02,13.41.02l5.53-.03c1.83,0,3.67,0,5.5-.01,4.41-.01,8.97-.03,13.46.04,3.68.09,4.03-1.61,4.06-3.62.02-1.47-.23-2.58-.76-3.39-.67-1.03-1.83-1.6-3.26-1.62-6.64-.08-12.98-.12-19.1-.12Z"/>
|
||||
</g>
|
||||
<g id="Down_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M177.4,357.17c-1.88,2.05-4.45,3.18-7.24,3.18h-22.91c-2.79,0-5.36-1.13-7.25-3.18-1.88-2.05-2.79-4.71-2.55-7.49l1.25-14.78c.43-5.04,2.71-9.71,6.42-13.16l9.04-8.39c1.21-1.12,2.74-1.68,4.27-1.68s2.98.54,4.18,1.61l9.44,8.45c3.87,3.47,6.24,8.23,6.68,13.4l1.23,14.55c.24,2.78-.67,5.44-2.56,7.49Z"/>
|
||||
</g>
|
||||
<g id="PS_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M455.41,437.59c11.37.03,20.87-9.06,21-20.1.14-11.24-9.39-20.97-20.61-21.05-11.23-.08-21,9.57-20.99,20.72,0,11.16,9.32,20.4,20.6,20.43Z"/>
|
||||
</g>
|
||||
<g id="Right_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M223.51,284.09v22.91c0,2.79-1.13,5.36-3.18,7.24-2.05,1.89-4.71,2.8-7.49,2.56l-14.55-1.23c-5.17-.44-9.93-2.81-13.39-6.68l-8.46-9.44c-2.17-2.43-2.14-6.06.07-8.45l8.4-9.04c3.44-3.71,8.11-5.99,13.15-6.42l14.78-1.25c2.78-.24,5.44.67,7.49,2.56,2.05,1.88,3.18,4.45,3.18,7.24Z"/>
|
||||
</g>
|
||||
<g id="Left_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M140.97,299.45l-8.46,9.44c-3.46,3.87-8.22,6.24-13.39,6.68l-14.55,1.23c-2.78.24-5.44-.67-7.49-2.56-2.05-1.88-3.18-4.45-3.18-7.24v-22.91c0-2.79,1.13-5.36,3.18-7.24,1.84-1.69,4.17-2.6,6.63-2.6.28,0,.57.01.86.04l14.78,1.25c5.04.43,9.71,2.71,13.15,6.42l8.4,9.04c2.21,2.39,2.24,6.02.07,8.45Z"/>
|
||||
</g>
|
||||
<g id="Up_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M179.96,241.41l-1.23,14.55c-.44,5.17-2.81,9.93-6.68,13.39l-9.44,8.46c-2.43,2.17-6.06,2.14-8.45-.07l-9.04-8.4c-3.71-3.44-5.99-8.11-6.42-13.15l-1.25-14.78c-.24-2.78.67-5.44,2.55-7.49,1.89-2.05,4.46-3.18,7.25-3.18h22.91c2.79,0,5.36,1.13,7.24,3.18,1.89,2.05,2.8,4.71,2.56,7.49Z"/>
|
||||
</g>
|
||||
<g id="Triangle_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M751.45,261.08c15.08-.01,26.75-11.5,26.73-26.31-.02-14.47-12.19-26.62-26.73-26.69-14.57-.07-26.65,11.99-26.66,26.63-.01,14.84,11.65,26.37,26.66,26.36Z"/>
|
||||
</g>
|
||||
<g id="Cross_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M750.93,379.05c15.44-.06,27.38-11.64,27.24-26.43-.13-14.28-12.84-26.83-26.99-26.3-14.58.55-26.43,12.2-26.39,26.91.04,14.23,11.83,25.88,26.14,25.82Z"/>
|
||||
</g>
|
||||
<g id="Circle_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M787.29,293.47c-.03,14.49,11.88,26.68,26.15,26.75,14.74.08,26.99-11.95,26.95-26.46-.04-14.51-12.12-26.34-27.04-26.48-14.04-.14-26.03,11.91-26.06,26.18Z"/>
|
||||
</g>
|
||||
<g id="Square_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M689.1,320.22c14.61.11,27.23-12.13,27.17-26.35-.06-14.09-12.36-26.44-26.54-26.66-14.42-.22-26.52,11.67-26.66,26.18-.13,14.49,11.74,26.73,26.03,26.83Z"/>
|
||||
</g>
|
||||
<g id="Options_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M691.58,199.27l-4.27,17.92c-.91,3.82-4.76,6.19-8.58,5.28-3.82-.91-6.19-4.76-5.28-8.58l4.27-17.92c.78-3.27,3.71-5.48,6.93-5.48.54,0,1.1.06,1.65.19,1.85.44,3.42,1.58,4.42,3.2s1.3,3.53.86,5.38Z"/>
|
||||
</g>
|
||||
<g id="Create_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M224.03,191.39c.55-.13,1.11-.19,1.65-.19,3.22,0,6.15,2.21,6.93,5.47l4.27,17.93c.44,1.85.13,3.76-.86,5.38-1,1.62-2.57,2.76-4.42,3.2-3.82.91-7.67-1.46-8.58-5.28l-4.27-17.92c-.91-3.82,1.46-7.67,5.28-8.58Z"/>
|
||||
</g>
|
||||
<g id="R2_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M800.14,115.88c-1.06,1.16-2.71,1.73-5.05,1.73-.01,0-.03,0-.04-.01-24.46-6.24-52.88-10.2-84.5-11.76h-.12c-4.19.08-7.09-.8-8.55-2.62-1.41-1.74-1.67-4.53-.77-8.29l.03-.15,9.87-67.57c3.29-14.17,13.23-21.12,30.28-21.12,2.57,0,5.31.16,8.22.47,13.16,1.54,22.93,6.87,29.86,16.29,2.6,3.53,4.67,7.72,6.16,12.44,7.81,24.72,11.55,46.61,15.88,71.95l.15.88c.41,3.61-.06,6.25-1.42,7.76Z"/>
|
||||
</g>
|
||||
<g id="L2_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M208.41,103.22c-1.47,1.82-4.36,2.7-8.55,2.62h-.12c-31.62,1.56-60.04,5.52-84.5,11.76-.01.01-.03.01-.04.01-2.34,0-4-.57-5.05-1.73-1.36-1.51-1.84-4.15-1.42-7.76l.15-.88c4.33-25.34,8.07-47.23,15.87-71.95,1.49-4.72,3.57-8.91,6.17-12.44,6.93-9.42,16.7-14.75,29.86-16.29,2.9-.31,5.64-.47,8.22-.47,17.05,0,26.98,6.95,30.28,21.12l9.87,67.57.03.15c.89,3.76.63,6.55-.77,8.29Z"/>
|
||||
</g>
|
||||
<g id="R1_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M805.8,173.73c-45.97-8.48-86.34-15.03-123.26-19.99,2.9-8.22,9.5-13.32,20.48-15.9,26.02-3.4,53.76,2.2,87.27,17.61.98.44,1.96.95,2.94,1.51,9.2,5.27,12.41,9.42,12.57,16.77Z"/>
|
||||
</g>
|
||||
<g id="L1_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M226.89,153.84c-42.76,6.62-84.3,13.1-123.56,19.27.76-6.19,2.09-12.15,27.86-22.29,28.7-10.58,37.26-12.24,70.44-13.64,2.49-.11,4.68,0,6.67.32,9.71,1.57,15.81,6.94,18.59,16.34Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Outline" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="Controller">
|
||||
<path id="Controller_outline" d="M804.61,172.5s.09.02.13.02c-45.03-8.29-84.58-14.71-120.82-19.6.06,0,.12.02.17.02-.09.21-.14.44-.23.66-1.95.4-4.06.27-6,.85-.01-.01-.04-.03-.06-.05-.04-.13-.09-.26-.14-.39.02,0,.04,0,.07,0-4.87-.52-9.74-1.01-14.62-1.5-4.79-.46-9.6-.91-14.4-1.34h-.01s-.37-.05-.37-.05c-9.11-.83-18.27-1.58-27.45-2.28,0,.04,0,.08,0,.11,6.85.92,13.16,2.58,18.67,6.93,0,0-.01-.01-.02-.02,1.13.1,2.24.2,3.36.3,5.18,1.42,9.39,5.36,10.93,10.49,1.6,5.35,1.3,12.24-.9,20.47l-21.05,109.2c-4.19,26.12-19.01,37.08-42.82,41.56l-143.01.03-128.89-.03c-23.72-4.39-39.07-18.19-42.83-41.64l-2.11-10.93c-.29-2.09-.65-4.23-1.12-6.43l-12.19-62.64-5.57-28.92-.04-.19c-.09-.35-.16-.68-.25-1.03l-1.25-6.42s0-.03-.01-.04c-.67-4.99-.48-9.34.61-12.98,1.44-4.81,5.22-8.56,9.95-10.19,1.68-.14,3.36-.28,5.03-.42-.01,0-.02.02-.04.03.13-.02.26-.04.39-.06,1.51-.96,3.05-1.79,4.52-2.46,4.51-2.11,9.69-3.99,14.78-4.58-8.71.66-17.56,1.37-26.29,2.11l-1.11.09c-9.48.82-18.77,1.68-27.61,2.55l-.46.05s0-.01,0-.02c-.02.03-.03.06-.04.09-1.99.06-3.94-.42-5.98-.72,0-.03,0-.06-.01-.09.03,0,.06,0,.08-.01-41.23,6.38-81.95,12.73-121.09,18.88,0-.03.01-.07.02-.1l-5.76,1.61c-1.39.76-2.77,1.68-4.11,2.75-6.4,5.15-12.04,13.69-17.24,26.11-27.39,64.19-47.54,129.24-59.9,193.34C4.64,462.34-.21,530.22,3.08,597.4c2.41,40.48,7.54,66.82,16.62,85.41,9.85,20.12,24.59,31.39,46.4,35.45l39.76,12.39.33.07h.1c.97.12,1.93.18,2.86.18,13.63,0,18.84-11.41,21.55-19.96,27.65-75.71,49.02-130.11,67.27-171.19,8.52-19.59,24.3-29.11,48.23-29.11,3.5,0,7.23.21,11.11.63h.17c60.68,2.54,123.31,3.82,186.16,3.82,70.29,0,142.26-1.6,213.94-4.76,2.31-.2,4.59-.3,6.77-.3,23.28,0,39.64,11.03,50,33.68,26.25,62.96,48.44,119.86,67.83,173.94,3.28,8.94,9.45,13.47,18.32,13.47,1.52,0,3.14-.14,4.82-.4h.06s45.5-13.11,45.5-13.11c2-.48,4.05-1.09,6.27-1.86l.13-.04.72-.25v-.02c15.47-5.75,26.84-17.21,34.75-35,7.77-17.48,12.58-41.33,15.58-77.35,4.35-57.49-1.58-134.16-16.29-210.35-15.8-81.82-40.06-154.86-68.3-205.65-2.37-4.62-4.05-7.26-5.79-9.11-2.01-2.17-4.26-3.46-7.64-4.35,0-.05-.03.03-.04-.02M654.75,157.28c1.32.12,2.27.2,2.26.19,4.84.46,9.76.95,14.92,1.48-3.75,2.27-6.89,5.18-9.51,8.8-.01-.02-.01-.04-.02-.06-.81,1.03-1.56,2.12-2.23,3.26-.18-2.07-.53-4.04-1.07-5.86-.89-2.98-2.4-5.62-4.35-7.82ZM251.1,157.47l.22-.17.34-.03c-2.05,2.16-3.62,4.8-4.53,7.83-.29.95-.5,1.95-.69,2.98-.3-.5-.5-.83-.51-.82-2.55-3.31-5.76-6.16-9.46-8.41,4.54-.44,9.37-.89,14.63-1.37ZM63.74,711.34c-1.7,0-3.53-.26-5.45-.77l-.46-.09c-15.03-4.97-25.58-14.54-33.18-30.09-8.75-17.89-13.71-43.59-16.08-83.29C2.18,466.43,27.04,334.31,82.48,204.42c5.96-14.26,12.4-22.95,19.68-26.57,36.97-5.81,77.23-12.09,119.66-18.67,12.6,2.24,22,10.48,24.57,21.52.29,2.12.73,4.32,1.3,6.61l5.63,28.91,13.52,70.16c3.04,22.28-4.43,36.44-19.51,54.89-33.86,35.52-63.96,83.16-92.02,145.65-22.57,50.27-43.21,108.54-64.97,183.45-3.79,15.91-8.97,32.96-18.74,38.81-2.41,1.45-4.98,2.16-7.85,2.16ZM804.28,725.31c-1.3.21-2.54.31-3.7.31-6.47,0-10.8-3.22-13.23-9.84-19.36-54.03-41.59-111.02-67.97-174.28-11.21-24.52-29.78-36.96-55.17-36.96-2.28,0-4.64.1-6.97.3-71.45,3.15-143.25,4.75-213.42,4.75-62.79,0-125.39-1.28-185.99-3.8-3.91-.42-7.72-.63-11.32-.63-26.2,0-44.22,10.9-53.58,32.37-18.31,41.24-39.73,95.76-67.43,171.64-3.62,11.38-8.49,16.23-16.28,16.23-.66,0-1.36-.03-2.07-.1l-34.11-10.63c.47-.24.93-.49,1.38-.76,11.51-6.9,17.19-25.2,21.22-42.14,31.82-109.48,78.28-245.56,155.72-326.77l.12-.14c10.32-12.6,15.94-21.99,18.94-31.77.01.02.02.03.03.05l.04-.29c.47-1.24.83-2.6,1.14-4.03,5.82,18.4,22.43,32.57,45.18,34.56l129.25.04,143.13-.03h.24c23.32-2.05,38.12-13.14,44.92-33.72.1.51.2,1.01.32,1.53,3.02,14.37,11.49,26.24,20.3,37l.17.19c81.44,78.96,128.1,212.33,162.99,332.38,5.91,20.1,10.54,31.1,19.1,35.05l-32.95,9.49ZM902.84,602.66c-4.81,57.88-14.43,96.11-47.36,107.83-4.19,1.09-7.37,1.59-9.99,1.59-9.87,0-14.41-6.75-22.08-32.85-22.39-77.03-43.38-136.08-66.05-185.82-29.41-64.53-61.55-113.22-98.27-148.86-16.5-20.18-23.88-35.21-18.4-61.3l20.03-98.96c4.49-15.34,12.4-22.67,27.28-25.27,35.69,4.91,74.62,11.29,119,19.5h.07c5.65,1.12,7.18,2.15,11.82,11.17,60.68,109.11,92.4,301.63,83.95,412.97Z"/>
|
||||
<g id="Speaker_grill">
|
||||
<circle cx="420.29" cy="357.71" r="4.82"/>
|
||||
<circle cx="437.84" cy="357.71" r="4.82"/>
|
||||
<circle cx="455.38" cy="357.71" r="4.82"/>
|
||||
<circle cx="472.93" cy="357.71" r="4.82"/>
|
||||
<circle cx="490.47" cy="358.68" r="4.82"/>
|
||||
</g>
|
||||
<path id="L3_surround" d="M340.92,373.72c-12.1-11.94-28.56-18.52-46.36-18.52-1.03,0-2.06.02-3.11.06-16.56.69-32.12,7.92-43.82,20.35-11.43,12.15-17.66,28.1-17.11,43.7-.63,16.4,5.79,32.86,17.63,45.16,12.39,12.87,29.14,19.96,47.17,19.96h.13c17.75-.03,34.16-6.86,46.21-19.24,12.14-12.46,18.58-29.31,18.14-47.45-.41-16.77-7.12-32.41-18.9-44.04ZM296.63,478.55c-.35,0-.7,0-1.06,0-16.24,0-31.34-6.14-42.53-17.29-11.18-11.15-17.33-26.19-17.32-42.36.02-27.96,22.56-58.15,58.94-58.15h.29c16.72.07,32,6.28,43.02,17.47,10.8,10.97,16.65,25.88,16.48,41.98-.4,36.53-29.71,58.36-57.82,58.36Z"/>
|
||||
<path id="R3_surround" d="M617.17,355.14c-1.39,0-2.81.05-4.21.13-16.38,1.04-31.68,7.93-43.07,19.39-11.63,11.71-18.09,27.2-18.18,43.63-.1,18.38,6.27,34.57,18.42,46.8,12.21,12.3,29.46,19.38,47.3,19.41h.1c16.61,0,32.4-6.7,44.48-18.88,12.21-12.3,19.13-29.12,19-46.1.29-16.6-6.42-33.11-18.41-45.31-12.1-12.31-28.23-19.09-45.43-19.09ZM675.5,419.52c-.02,32.9-25.99,58.85-59.12,59.08h-.4c-15.55,0-30.85-6.54-41.96-17.95-11.2-11.5-17.15-26.51-16.74-42.27.84-32.25,26.93-57.61,59.4-57.74h.24c16.08,0,31.03,6.27,42.11,17.65,10.89,11.19,16.89,26.21,16.48,41.23Z"/>
|
||||
</g>
|
||||
<g id="Button_outlines">
|
||||
<path id="L1" d="M131.54,151.76c28.58-10.54,37.1-12.19,70.13-13.58.62-.03,1.21-.04,1.78-.04,1.7,0,3.23.11,4.69.35,8.92,1.44,14.64,6.2,17.45,14.54-.03,0-.06,0-.08.01,0,.03,0,.06.01.09,2.04.3,3.99.78,5.98.72.02-.03.03-.06.04-.09-3.07-11.83-10.65-18.79-22.53-20.72-1.76-.27-3.6-.41-5.61-.41-.63,0-1.28,0-1.95.04-5.25.22-9.69.44-13.55.68-23.59,1.48-33.63,4.15-58.32,13.26-1.9.75-3.55,1.43-5.01,2.05l-.16.07c-23.9,10.2-24.72,17.05-25.6,24.3-.02.13-.04.25-.05.38l5.76-1.61c.79-5.14,3.38-10.75,27.02-20.05Z"/>
|
||||
<path id="R1" d="M804.81,159.88c-2.27-2.33-5.34-4.53-9.35-6.83-1.04-.6-2.15-1.17-3.28-1.69-27.77-12.77-52.08-18.98-74.31-18.98-5.21,0-10.43.34-15.56,1.02l-.23.04c-13.31,3.1-21.29,9.84-24.35,20.58-.02,0-.04,0-.07,0,.05.13.1.26.14.39.02.02.05.03.06.05.49-.18,1-.3,1.52-.33,1.52-.11,3.01-.3,4.48-.51.01-.04.03-.08.05-.12.05-.18.11-.36.18-.54-.06,0-.12-.02-.17-.02,2.98-7.21,9.14-11.7,19.28-14.1,4.8-.62,9.73-.94,14.65-.94,21.43,0,44.99,6.05,72.03,18.48.91.41,1.84.89,2.85,1.47,8.44,4.83,11.54,8.54,12.01,14.69-.05,0-.09-.02-.13-.02.06.13.12.25.16.39.02.06.05.12.07.18,1.01.07,1.98.26,2.89.58.87-.31,1.74-.34,2.57-.15-.14-5.55-1.73-9.75-5.49-13.61Z"/>
|
||||
<path id="L2_outline" d="M115.16,122.1h.4l.52-.07.06-.02c24.15-6.19,52.33-10.12,83.69-11.68h.47c5.39,0,9.3-1.44,11.61-4.29,2.31-2.88,2.86-6.94,1.67-11.99l-9.91-67.79c-3.78-16.37-15.49-24.66-34.81-24.66-2.7,0-5.6.17-8.61.49-14.28,1.66-25.37,7.75-32.97,18.08-2.9,3.94-5.2,8.57-6.83,13.75-7.91,25.05-11.67,47.06-16.02,72.55l-.18,1.03c-.57,5.06.28,8.9,2.55,11.39,1.92,2.12,4.73,3.2,8.34,3.2ZM109.72,108.29l.15-.89c4.32-25.3,8.06-47.16,15.84-71.81,1.46-4.61,3.48-8.7,6.02-12.15,6.76-9.19,16.3-14.38,29.16-15.89,2.88-.31,5.61-.46,8.11-.46,16.53,0,26.12,6.66,29.29,20.26l9.88,67.62.04.18c.81,3.44.62,5.94-.57,7.43-1.21,1.5-3.65,2.25-7.25,2.25h-.69c-31.62,1.56-60.09,5.52-84.61,11.76-1.98-.02-3.35-.48-4.19-1.4-1.15-1.27-1.55-3.69-1.18-6.92Z"/>
|
||||
<path id="R2_outline" d="M709.98,110.34h.41c31.43,1.56,59.6,5.48,83.74,11.68l.06.02.53.07h.4c3.61,0,6.42-1.08,8.34-3.2,2.27-2.5,3.13-6.33,2.54-11.45l-.17-.97c-4.35-25.49-8.11-47.5-16.02-72.55-1.63-5.18-3.93-9.81-6.83-13.75-7.61-10.33-18.71-16.42-32.99-18.08-3-.33-5.89-.49-8.6-.49-19.32,0-31.03,8.3-34.82,24.74l-9.87,67.63c-1.21,5.13-.66,9.2,1.66,12.08,2.31,2.85,6.22,4.29,11.61,4.29ZM702.09,95.12l.04-.2,9.85-67.49c3.18-13.69,12.77-20.35,29.31-20.35,2.49,0,5.22.16,8.1.46,12.87,1.51,22.41,6.7,29.17,15.89,2.53,3.43,4.55,7.52,6.01,12.15,7.79,24.65,11.52,46.51,15.85,71.82l.14.83c.37,3.3-.03,5.71-1.17,6.97-.85.93-2.22,1.39-4.19,1.4-24.52-6.25-52.99-10.21-84.66-11.77h-.64c-3.56,0-6.07-.77-7.26-2.25-1.2-1.49-1.4-3.99-.56-7.47Z"/>
|
||||
<path id="Create_outline" d="M218.64,218.94c1.25,5.26,5.9,8.93,11.31,8.93.92,0,1.83-.11,2.69-.32,3.02-.72,5.57-2.57,7.2-5.22,1.63-2.65,2.13-5.76,1.41-8.77l-4.26-17.93c-1.25-5.26-5.9-8.93-11.31-8.93-.9,0-1.81.11-2.7.32-3.02.71-5.57,2.57-7.2,5.21-1.63,2.65-2.13,5.76-1.42,8.78l4.27,17.93ZM220.47,195.11c.86-1.4,2.21-2.37,3.79-2.75.46-.11.93-.16,1.42-.16,2.85,0,5.3,1.93,5.96,4.7l4.27,17.93c.38,1.59.11,3.23-.74,4.62-.86,1.4-2.21,2.38-3.8,2.75-.47.11-.94.17-1.42.17-2.85,0-5.3-1.94-5.96-4.71l-4.27-17.93c-.38-1.59-.11-3.23.75-4.62Z"/>
|
||||
<path id="Options_outline" d="M677.7,226.85c.91.21,1.82.32,2.69.32,5.4,0,10.05-3.68,11.3-8.94l4.27-17.92c.72-3.02.22-6.15-1.41-8.79-1.63-2.64-4.18-4.5-7.2-5.22-.88-.21-1.79-.31-2.69-.31-5.41,0-10.06,3.67-11.32,8.93l-4.27,17.93c-1.49,6.23,2.38,12.51,8.62,14.01ZM674.43,214.12l4.26-17.92c.66-2.77,3.11-4.71,5.96-4.71.5,0,.96.06,1.42.17,1.59.38,2.94,1.35,3.8,2.74.85,1.38,1.12,3.03.74,4.63l-4.26,17.92c-.66,2.77-3.11,4.71-5.96,4.71-.47,0-.95-.06-1.42-.17-1.59-.38-2.94-1.35-3.8-2.75-.86-1.39-1.12-3.04-.74-4.63Z"/>
|
||||
<path id="Left_outline" d="M99.81,321.31c1.27.35,2.6.53,3.93.53.42,0,.83-.02,1.25-.06l14.55-1.23c5.53-.47,10.68-2.71,14.76-6.39.68-.6,1.32-1.25,1.94-1.94l8.45-9.44c3.91-4.36,3.85-10.88-.13-15.18l-8.39-9.04c-4.29-4.63-10.11-7.47-16.4-8l-14.78-1.25c-4.13-.36-8.24,1.05-11.29,3.85s-4.8,6.79-4.8,10.93v22.91c0,4.14,1.75,8.12,4.8,10.93,1.75,1.61,3.85,2.76,6.11,3.38ZM93.9,284.09c0-2.79,1.13-5.36,3.18-7.24,1.84-1.69,4.17-2.6,6.63-2.6.28,0,.57.01.86.04l14.78,1.25c5.04.43,9.71,2.71,13.15,6.42l8.4,9.04c2.21,2.39,2.24,6.02.07,8.45l-8.46,9.44c-3.46,3.87-8.22,6.24-13.39,6.68l-14.55,1.23c-2.78.24-5.44-.67-7.49-2.56-2.05-1.88-3.18-4.45-3.18-7.24v-22.91Z"/>
|
||||
<path id="Right_outline" d="M172.85,287.6c-3.98,4.3-4.04,10.82-.14,15.18l8.27,9.23.19.21c4.32,4.83,10.25,7.78,16.7,8.33l14.55,1.23c.42.04.83.06,1.25.06,1.4,0,2.79-.2,4.12-.58,2.18-.64,4.22-1.76,5.92-3.33,3.05-2.81,4.8-6.79,4.8-10.93v-22.91c0-4.14-1.75-8.13-4.8-10.93-3.05-2.8-7.16-4.2-11.29-3.85l-14.78,1.25c-.74.06-1.48.16-2.2.28-2.7.47-5.27,1.36-7.65,2.64-2.43,1.31-4.64,3.01-6.55,5.08l-8.39,9.04ZM198.06,275.54l14.78-1.25c2.78-.24,5.44.67,7.49,2.56,2.05,1.88,3.18,4.45,3.18,7.24v22.91c0,2.79-1.13,5.36-3.18,7.24-2.05,1.89-4.71,2.8-7.49,2.56l-14.55-1.23c-5.17-.44-9.93-2.81-13.39-6.68l-8.46-9.44c-2.17-2.43-2.14-6.06.07-8.45l8.4-9.04c3.44-3.71,8.11-5.99,13.15-6.42Z"/>
|
||||
<path id="Down_outline" d="M183.71,334.71c-.13-1.61-.42-3.18-.84-4.71-.05-.16-.1-.32-.15-.47-.22-.68-.45-1.34-.69-2-1.43-3.61-3.69-6.87-6.65-9.52l-9.44-8.46c-4.36-3.9-10.88-3.85-15.18.14l-9.04,8.39c-1.05.97-2,2.01-2.85,3.12-2.94,3.82-4.74,8.41-5.15,13.28l-1.25,14.78c-.15,1.83.03,3.65.54,5.38.62,2.18,1.75,4.21,3.31,5.91,2.8,3.05,6.79,4.8,10.93,4.8h22.91c4.14,0,8.12-1.75,10.93-4.8,2.8-3.05,4.2-7.16,3.85-11.29l-1.23-14.55ZM177.4,357.17c-1.88,2.05-4.45,3.18-7.24,3.18h-22.91c-2.79,0-5.36-1.13-7.25-3.18-1.88-2.05-2.79-4.71-2.55-7.49l1.25-14.78c.43-5.04,2.71-9.71,6.42-13.16l9.04-8.39c1.21-1.12,2.74-1.68,4.27-1.68s2.98.54,4.18,1.61l9.44,8.45c3.87,3.47,6.24,8.23,6.68,13.4l1.23,14.55c.24,2.78-.67,5.44-2.56,7.49Z"/>
|
||||
<path id="Up_outline" d="M133.72,256.61c.48,5.73,2.88,11.07,6.81,15.22.38.41.78.8,1.19,1.18l9.04,8.39c2.18,2.02,4.92,3.03,7.67,3.03s5.36-.97,7.51-2.9l9.44-8.45c1.35-1.2,2.55-2.53,3.58-3.96,2.51-3.43,4.1-7.44,4.64-11.72.05-.34.08-.68.11-1.02l1.23-14.55c.35-4.13-1.05-8.24-3.85-11.29-2.81-3.05-6.79-4.8-10.93-4.8h-22.91c-4.14,0-8.13,1.75-10.93,4.8-1.53,1.66-2.64,3.64-3.27,5.76-.54,1.77-.74,3.65-.58,5.53l1.25,14.78ZM140,233.92c1.89-2.05,4.46-3.18,7.25-3.18h22.91c2.79,0,5.36,1.13,7.24,3.18,1.89,2.05,2.8,4.71,2.56,7.49l-1.23,14.55c-.44,5.17-2.81,9.93-6.68,13.39l-9.44,8.46c-2.43,2.17-6.06,2.14-8.45-.07l-9.04-8.4c-3.71-3.44-5.99-8.11-6.42-13.15l-1.25-14.78c-.24-2.78.67-5.44,2.55-7.49Z"/>
|
||||
<path id="Cross_outline" d="M751.82,321.39h-.11c-8.53,0-16.94,3.65-23.08,10.01-5.91,6.13-9.01,13.94-8.72,21.98.63,17.53,13.54,30.1,31.38,30.57h.03c17.47,0,31.35-13.6,31.6-30.96.12-8.05-3.19-16.1-9.08-22.09-5.9-6.01-13.93-9.48-22.02-9.51ZM770.09,370.25c-4.93,5-11.74,7.77-19.16,7.8h-.1c-13.76,0-24.99-11.14-25.03-24.82-.04-13.99,11.13-25.37,25.43-25.91.28-.01.56-.02.84-.02,13.25,0,24.99,11.83,25.12,25.32.06,6.67-2.46,12.93-7.09,17.63Z"/>
|
||||
<path id="Triangle_outline" d="M751.06,266c.21,0,.41,0,.62,0,8.36,0,16.79-3.45,22.54-9.22,5.71-5.73,8.72-13.49,8.69-22.44-.05-17.11-14.19-31.03-31.52-31.03h-.19c-17.15.1-31.24,14.15-31.4,31.3-.08,8.08,3.16,15.85,9.1,21.87,5.94,6.02,14.02,9.48,22.16,9.51ZM751.32,209.08h.12c13.93.07,25.71,11.83,25.73,25.69.01,6.89-2.62,13.27-7.4,17.98-4.79,4.71-11.3,7.31-18.35,7.32-6.99,0-13.47-2.6-18.25-7.33-4.77-4.72-7.4-11.13-7.39-18.03.01-14.13,11.47-25.63,25.53-25.63Z"/>
|
||||
<path id="Circle_outline" d="M791.23,272.06c-5.72,5.82-8.79,13.5-8.65,21.62.31,17.85,13.17,30.72,31.27,31.3.3,0,.6.01.9.01,16.35,0,30.24-14.13,30.33-30.86.05-8.44-3.12-16.31-8.92-22.14-5.91-5.94-13.96-9.21-22.68-9.21-8.47,0-16.37,3.3-22.25,9.28ZM839.39,293.77c.02,6.64-2.62,12.96-7.44,17.78-4.93,4.95-11.46,7.67-18.37,7.67,0,0-.14,0-.14,0-13.66-.07-25.18-11.87-25.15-25.75.03-13.65,11.4-25.19,24.83-25.19h.23c14.33.14,26.01,11.57,26.05,25.49Z"/>
|
||||
<path id="Square_outline" d="M691.99,262.62c-.79-.06-1.6-.09-2.38-.09-8.46,0-16.39,3.35-22.34,9.45-5.74,5.88-8.93,13.76-8.74,21.58-.29,17.51,12.78,31.02,30.42,31.42.26,0,.52,0,.78,0,17.09,0,30.37-12.98,30.9-30.18.51-16.54-12.34-30.97-28.64-32.18ZM707.82,311.38c-4.97,4.99-11.72,7.85-18.53,7.85,0,0-.18,0-.18,0-6.58-.05-12.82-2.74-17.59-7.59-4.87-4.95-7.51-11.43-7.45-18.24.13-13.89,11.46-25.19,25.26-25.19h.38c13.56.21,25.5,12.2,25.56,25.67.03,6.44-2.62,12.65-7.44,17.5Z"/>
|
||||
<path id="PS_outline" d="M455.4,442.49h.21c14.28-.12,25.41-11.31,25.35-25.47-.06-14.05-11.44-25.51-25.42-25.54-13.74,0-25.39,11.7-25.44,25.55-.03,6.72,2.63,13.09,7.46,17.95,4.82,4.84,11.16,7.51,17.84,7.51ZM441.75,403.34c3.78-3.75,8.85-5.9,13.92-5.9h.13c5.08.04,10.12,2.23,13.84,6.02,3.73,3.8,5.84,8.91,5.78,14.02-.13,10.54-9.08,19.11-20,19.11h0c-10.81-.02-19.6-8.74-19.6-19.43,0-5.03,2.17-10.07,5.94-13.82Z"/>
|
||||
<path id="Mute_outline" d="M474.24,464.3c-6.6-.06-13.03-.1-19.11-.1-6.51,0-12.67.04-18.82.11-2.55.03-4.67.99-6.15,2.77-1.4,1.7-2.12,4.04-2.07,6.78.07,3.52,1.54,7.73,8.15,7.76,2.64.01,5.27.02,7.91.02h11.06s1.74-.03,1.74-.03c0,0,7.44-.02,9.31-.02,2.62,0,5.25,0,7.86.04h.17c7.21,0,8.38-5.01,8.43-8,.05-2.57-.65-4.8-2.03-6.45-1.54-1.85-3.77-2.85-6.45-2.88ZM473.79,476.4h-2.19c-2.66-.05-2.76-.04-5.42-.04-1.84,0-10.97.03-10.97.03l-5.52.04h-5.9c-2.5,0-5,0-7.5-.02-.93,0-2.31-.66-2.33-2.29-.02-1.53-.18-2.63.18-3.31.57-1.06,1.65-1.24,2.25-1.25,6.08-.11,12.21-.17,18.74-.17,6.06,0,12.48.05,19.09.15,1.14.02,2.07.53,2.55,1.42.21.4.5,1.12.47,2.82-.02,1.47-.69,2.61-3.43,2.61Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="Trackpad_infill" >
|
||||
<path d="M452.27,328.53v-.02c40.22,0,80.43.07,120.65-.07,6.47-.02,13.17.01,19.36-1.58,19.32-4.99,29.59-18.18,33.51-36.6,7.44-34.93,15.37-69.99,21.95-105.09,1.8-9.6-.91-20.7-9.35-26.91-6.53-4.8-15.07-5.38-22.94-6-15.84-1.24-31.65-1.69-47.52-2.33-25.29-1.01-52.32-3.71-77.62-4-59.86-.67-117.65,1.12-177.41,5.09-10.18.68-20.91.48-30.97,2.12-12.6,2.05-25.72,12.82-22.5,31.32,2.97,17.08,7.65,34.26,11,51.28,3.72,18.85,7.61,37.68,11.08,56.58,2.33,12.67,8.64,23.23,19.04,30.56,9.97,7.03,21.64,5.61,33.14,5.62,39.53.06,79.06.02,118.6.02Z"/>
|
||||
</g>
|
||||
<g id="Trackpad_outline" >
|
||||
<path d="M272.25,153.56c-4.52,2.07-9.76,5.6-12.42,9.85-4.66,6.89-3.71,15.95-1.11,26.9l19.74,98.37c4.52,27.51,18.61,41.63,45.84,43.95h.12l235.94.06c-4.66-.08,4.33,0,9.56,0,35.3,0,49.5-11.1,56.07-37.73l20.44-101.35c4.26-16.93,3.93-29.59-6.87-37.71-6.24-4.92-13.49-6.41-21.4-7.26-52.97-4-107.12-6.03-161.4-6.03-.3,0-.6,0-.9,0-2.3-.01-4.58-.02-6.81-.02-.36,0-.72,0-1.08,0-.33,0-.66,0-1,0-3.06.02-6.18.05-9.34.09-48.92.43-98.66,2.47-148.15,6.11-5.85.15-12,2.31-17.24,4.76ZM641.07,192.4l-20.45,101.35c-6.01,24.35-18.98,33.44-50.41,33.44-3.02,0-6.24.2-9.64,0l-235.88-.06c-24.7-2.11-36.7-14.33-40.82-39.44l-19.79-98.56c-2.23-9.46-3.46-17.08.31-22.64,4.07-6.04,11.93-10.09,23.26-12.03,13.9-1.04,27.83-1.95,41.74-2.73,35.06-1.79,70.63-3.02,101.96-3.47.19,0,.38,0,.58,0,1.55-.02,3.08-.04,4.6-.06,6.53-.06,13.04-.09,19.54-.09,46.61.2,104.83,2.34,158.55,5.8,3.45.26,7.4.89,10.36,1.77,18.01,5.87,21.08,16.85,16.09,36.73Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="L3" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="L3_infill">
|
||||
<path d="M295.63,461.03c23.36,0,41.53-17.87,41.57-40.86.03-23.53-18.65-42.27-42.16-42.27-23.09,0-41.82,18.55-41.83,41.45-.01,23.9,18.09,41.69,42.42,41.69Z"/>
|
||||
</g>
|
||||
<g id="L3_outline">
|
||||
<path d="M295.14,466.67c-26.36-.18-47.62-21.47-47.16-47.19.51-28.21,21.76-46.51,47.28-47.04,25.52-.53,47.65,22.07,47.37,47.25-.29,26.05-21.63,47.15-47.5,46.98ZM295.63,461.03c23.36,0,41.53-17.87,41.57-40.86.03-23.53-18.65-42.27-42.16-42.27-23.09,0-41.82,18.55-41.83,41.45-.01,23.9,18.09,41.69,42.42,41.69Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="R3" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="R3_infill">
|
||||
<path d="M658.23,419.7c.55-22.76-17.76-41.19-40.35-41.72-23.43-.55-42.68,18.19-43.29,40.74-.65,23.92,18.7,41.15,39.11,42.46,25.96,1.66,44.96-18.72,44.52-41.48Z"/>
|
||||
</g>
|
||||
<g id="R3_outline">
|
||||
<path d="M664.07,419.78c-.01,26.37-21.16,47.39-47.6,47.32-26.19-.06-48.19-21.58-47.62-47.5.59-26.82,21.12-47.52,48.44-47.45,26.83.08,46.79,21.47,46.78,47.62ZM658.23,419.7c.55-22.76-17.76-41.19-40.35-41.72-23.43-.55-42.68,18.19-43.29,40.74-.65,23.92,18.7,41.15,39.11,42.46,25.96,1.66,44.96-18.72,44.52-41.48Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="TriggerPercentages" transform="translate(0,0.65) scale(0.70)">
|
||||
<text id="L2_percentage" x="160" y="80" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#1a237e" text-anchor="middle" opacity="0">0 %</text>
|
||||
<text id="R2_percentage" x="750" y="80" font-family="Arial, sans-serif" font-size="24" font-weight="bold" fill="#1a237e" text-anchor="middle" opacity="0">0 %</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 23 KiB |
@@ -1,108 +1,132 @@
|
||||
<svg id="controller-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 518" style="width: 80%; height: auto; max-width: 80%;" stroke-width="1">
|
||||
<svg id="controller-svg" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 518" style="width: 80%; height: auto; max-width: 80%;" stroke-width="0">
|
||||
|
||||
<g id="Controller_infills">
|
||||
<path d="M622.95,326.87c-29.09-128.96-37.19-148.52-47.08-165.39-6.92-11.81-15.21-23.77-19.53-29.84-1.47-2.07-3.77-3.37-6.31-3.57-38.85-3.04-71.02-2.57-79.95-2.35-1.06.03-2.06.45-2.82,1.18l-2.73,2.63c-1.73,1.66-4,2.58-6.4,2.58H181.88c-2.4,0-4.67-.92-6.4-2.58l-2.73-2.63c-.76-.74-1.77-1.16-2.82-1.18-8.93-.22-41.11-.69-79.95,2.35-2.54.2-4.84,1.5-6.32,3.57-4.32,6.07-12.61,18.03-19.53,29.84-9.88,16.88-17.99,36.43-47.08,165.43-7.25,34.62-20.46,118.95,13.61,153.45,14.34,14.52,34.26,20.73,53.29,16.6,23.23-5.03,42.3-24.84,53.71-55.79,5.08-13.79,9.26-25.52,12.62-34.94,13.92-39.03,17.22-48.31,30.19-51.55l.3-.08h.31s77.55.17,77.55.17h122.75l77.86-.17.3.08c12.97,3.24,16.27,12.52,30.19,51.55,3.36,9.43,7.54,21.16,12.62,34.94,11.4,30.95,30.48,50.76,53.71,55.79,19.04,4.12,38.96-2.09,53.29-16.6,34.07-34.5,20.86-118.83,13.6-153.49Z"/>
|
||||
<path d="M274.86,314.85c0-30.28-24.63-54.91-54.92-54.91s-54.92,24.63-54.92,54.91,24.63,54.92,54.92,54.92,54.92-24.63,54.92-54.92Z"/>
|
||||
<path d="M420.06,259.93c-30.28,0-54.92,24.63-54.92,54.91s24.63,54.92,54.92,54.92,54.92-24.63,54.92-54.92-24.63-54.91-54.92-54.91Z"/>
|
||||
</g>
|
||||
<g id="Button_infills">
|
||||
<g id="Mute_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path id="Mute_infill" d="M454.47,468.7c-6.47,0-12.69.04-18.75.14-.92.01-2.18.28-2.96,1.48-.56.85-.83,2.14-.8,3.81.03,2.24.41,3.3,3.67,3.32,4.47.03,8.94.02,13.41.02l5.53-.03c1.83,0,3.67,0,5.5-.01,4.41-.01,8.97-.03,13.46.04,3.68.09,4.03-1.61,4.06-3.62.02-1.47-.23-2.58-.76-3.39-.67-1.03-1.83-1.6-3.26-1.62-6.64-.08-12.98-.12-19.1-.12Z"/>
|
||||
<g id="Down_infill">
|
||||
<path d="M104.86,265.19v-6.44c0-5.03,1.96-9.87,5.46-13.49l7.64-7.89c3-3.09,8-2.99,10.87.22l6.95,7.79c3.17,3.55,4.92,8.14,4.92,12.9v6.9c0,6.43-5.21,11.64-11.64,11.64h-12.57c-6.43,0-11.64-5.21-11.64-11.64Z"/>
|
||||
</g>
|
||||
<g id="Down_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M177.4,357.17c-1.88,2.05-4.45,3.18-7.24,3.18h-22.91c-2.79,0-5.36-1.13-7.25-3.18-1.88-2.05-2.79-4.71-2.55-7.49l1.25-14.78c.43-5.04,2.71-9.71,6.42-13.16l9.04-8.39c1.21-1.12,2.74-1.68,4.27-1.68s2.98.54,4.18,1.61l9.44,8.45c3.87,3.47,6.24,8.23,6.68,13.4l1.23,14.55c.24,2.78-.67,5.44-2.56,7.49Z"/>
|
||||
<g id="PS_infill">
|
||||
<circle cx="320.16" cy="314.85" r="13.82"/>
|
||||
</g>
|
||||
<g id="PS_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M455.41,437.59c11.37.03,20.87-9.06,21-20.1.14-11.24-9.39-20.97-20.61-21.05-11.23-.08-21,9.57-20.99,20.72,0,11.16,9.32,20.4,20.6,20.43Z"/>
|
||||
<g id="Right_infill">
|
||||
<path d="M163.28,242.61h-6.44c-5.03,0-9.87-1.96-13.49-5.46l-7.89-7.64c-3.09-3-2.99-8,.22-10.87l7.79-6.95c3.55-3.17,8.14-4.92,12.9-4.92h6.9c6.43,0,11.64,5.21,11.64,11.64v12.57c0,6.43-5.21,11.64-11.64,11.64Z"/>
|
||||
</g>
|
||||
<g id="Right_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M223.51,284.09v22.91c0,2.79-1.13,5.36-3.18,7.24-2.05,1.89-4.71,2.8-7.49,2.56l-14.55-1.23c-5.17-.44-9.93-2.81-13.39-6.68l-8.46-9.44c-2.17-2.43-2.14-6.06.07-8.45l8.4-9.04c3.44-3.71,8.11-5.99,13.15-6.42l14.78-1.25c2.78-.24,5.44.67,7.49,2.56,2.05,1.88,3.18,4.45,3.18,7.24Z"/>
|
||||
<g id="Left_infill">
|
||||
<path d="M82.28,206.77h6.44c5.03,0,9.87,1.96,13.49,5.46l7.89,7.64c3.09,3,2.99,8-.22,10.87l-7.79,6.95c-3.55,3.17-8.14,4.92-12.9,4.92h-6.9c-6.43,0-11.64-5.21-11.64-11.64v-12.57c0-6.43,5.21-11.64,11.64-11.64Z"/>
|
||||
</g>
|
||||
<g id="Left_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M140.97,299.45l-8.46,9.44c-3.46,3.87-8.22,6.24-13.39,6.68l-14.55,1.23c-2.78.24-5.44-.67-7.49-2.56-2.05-1.88-3.18-4.45-3.18-7.24v-22.91c0-2.79,1.13-5.36,3.18-7.24,1.84-1.69,4.17-2.6,6.63-2.6.28,0,.57.01.86.04l14.78,1.25c5.04.43,9.71,2.71,13.15,6.42l8.4,9.04c2.21,2.39,2.24,6.02.07,8.45Z"/>
|
||||
<g id="Up_infill">
|
||||
<path d="M140.7,184.19v6.44c0,5.03-1.96,9.87-5.46,13.49l-7.64,7.89c-3,3.09-8,2.99-10.87-.22l-6.95-7.79c-3.17-3.55-4.92-8.14-4.92-12.9v-6.9c0-6.43,5.21-11.64,11.64-11.64h12.57c6.43,0,11.64,5.21,11.64,11.64Z"/>
|
||||
</g>
|
||||
<g id="Up_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M179.96,241.41l-1.23,14.55c-.44,5.17-2.81,9.93-6.68,13.39l-9.44,8.46c-2.43,2.17-6.06,2.14-8.45-.07l-9.04-8.4c-3.71-3.44-5.99-8.11-6.42-13.15l-1.25-14.78c-.24-2.78.67-5.44,2.55-7.49,1.89-2.05,4.46-3.18,7.25-3.18h22.91c2.79,0,5.36,1.13,7.24,3.18,1.89,2.05,2.8,4.71,2.56,7.49Z"/>
|
||||
<g id="Triangle_infill">
|
||||
<circle cx="517.22" cy="178.98" r="19.67"/>
|
||||
</g>
|
||||
<g id="Triangle_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M751.45,261.08c15.08-.01,26.75-11.5,26.73-26.31-.02-14.47-12.19-26.62-26.73-26.69-14.57-.07-26.65,11.99-26.66,26.63-.01,14.84,11.65,26.37,26.66,26.36Z"/>
|
||||
<g id="Cross_infill">
|
||||
<circle cx="517.22" cy="270.62" r="19.67"/>
|
||||
</g>
|
||||
<g id="Cross_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M750.93,379.05c15.44-.06,27.38-11.64,27.24-26.43-.13-14.28-12.84-26.83-26.99-26.3-14.58.55-26.43,12.2-26.39,26.91.04,14.23,11.83,25.88,26.14,25.82Z"/>
|
||||
<g id="Circle_infill">
|
||||
<circle cx="563.04" cy="224.8" r="19.67"/>
|
||||
</g>
|
||||
<g id="Circle_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M787.29,293.47c-.03,14.49,11.88,26.68,26.15,26.75,14.74.08,26.99-11.95,26.95-26.46-.04-14.51-12.12-26.34-27.04-26.48-14.04-.14-26.03,11.91-26.06,26.18Z"/>
|
||||
<g id="Square_infill">
|
||||
<circle cx="471.4" cy="224.8" r="19.67"/>
|
||||
</g>
|
||||
<g id="Square_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M689.1,320.22c14.61.11,27.23-12.13,27.17-26.35-.06-14.09-12.36-26.44-26.54-26.66-14.42-.22-26.52,11.67-26.66,26.18-.13,14.49,11.74,26.73,26.03,26.83Z"/>
|
||||
<g id="Options_infill">
|
||||
<rect x="437.88" y="144.01" width="16.52" height="32.55" rx="8.26" ry="8.26" transform="translate(892.28 320.56) rotate(-180)"/>
|
||||
</g>
|
||||
<g id="Options_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M691.58,199.27l-4.27,17.92c-.91,3.82-4.76,6.19-8.58,5.28-3.82-.91-6.19-4.76-5.28-8.58l4.27-17.92c.78-3.27,3.71-5.48,6.93-5.48.54,0,1.1.06,1.65.19,1.85.44,3.42,1.58,4.42,3.2s1.3,3.53.86,5.38Z"/>
|
||||
<g id="Create_infill">
|
||||
<rect x="185.6" y="144.01" width="16.52" height="32.55" rx="8.26" ry="8.26"/>
|
||||
</g>
|
||||
<g id="Create_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M224.03,191.39c.55-.13,1.11-.19,1.65-.19,3.22,0,6.15,2.21,6.93,5.47l4.27,17.93c.44,1.85.13,3.76-.86,5.38-1,1.62-2.57,2.76-4.42,3.2-3.82.91-7.67-1.46-8.58-5.28l-4.27-17.92c-.91-3.82,1.46-7.67,5.28-8.58Z"/>
|
||||
<g id="R2_infill">
|
||||
<path d="M472.73,80.69l2.79-35.54c1.25-15.98,14.77-28.21,30.8-27.85h0c13.24.3,24.75,9.19,28.38,21.93l11.58,40.63c.77,2.71-1.26,5.4-4.08,5.4h-65.24c-2.47,0-4.42-2.11-4.23-4.57Z"/>
|
||||
</g>
|
||||
<g id="R2_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M800.14,115.88c-1.06,1.16-2.71,1.73-5.05,1.73-.01,0-.03,0-.04-.01-24.46-6.24-52.88-10.2-84.5-11.76h-.12c-4.19.08-7.09-.8-8.55-2.62-1.41-1.74-1.67-4.53-.77-8.29l.03-.15,9.87-67.57c3.29-14.17,13.23-21.12,30.28-21.12,2.57,0,5.31.16,8.22.47,13.16,1.54,22.93,6.87,29.86,16.29,2.6,3.53,4.67,7.72,6.16,12.44,7.81,24.72,11.55,46.61,15.88,71.95l.15.88c.41,3.61-.06,6.25-1.42,7.76Z"/>
|
||||
<g id="L2_infill">
|
||||
<path d="M167.27,80.69l-2.79-35.54c-1.25-15.98-14.77-28.21-30.8-27.85h0c-13.24.3-24.75,9.19-28.38,21.93l-11.58,40.63c-.77,2.71,1.26,5.4,4.08,5.4h65.24c2.47,0,4.42-2.11,4.23-4.57Z"/>
|
||||
</g>
|
||||
<g id="L2_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M208.41,103.22c-1.47,1.82-4.36,2.7-8.55,2.62h-.12c-31.62,1.56-60.04,5.52-84.5,11.76-.01.01-.03.01-.04.01-2.34,0-4-.57-5.05-1.73-1.36-1.51-1.84-4.15-1.42-7.76l.15-.88c4.33-25.34,8.07-47.23,15.87-71.95,1.49-4.72,3.57-8.91,6.17-12.44,6.93-9.42,16.7-14.75,29.86-16.29,2.9-.31,5.64-.47,8.22-.47,17.05,0,26.98,6.95,30.28,21.12l9.87,67.57.03.15c.89,3.76.63,6.55-.77,8.29Z"/>
|
||||
<g id="R1_infill">
|
||||
<path id="R1_infill" d="M549.16,125.5v-3.34c0-2.86-1.68-5.44-4.28-6.62-9.49-4.3-33.93-12.7-65.02-3.2-3.06.94-5.17,3.75-5.17,6.96v3.76s34.84-.67,74.48,2.44Z"/>
|
||||
</g>
|
||||
<g id="R1_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M805.8,173.73c-45.97-8.48-86.34-15.03-123.26-19.99,2.9-8.22,9.5-13.32,20.48-15.9,26.02-3.4,53.76,2.2,87.27,17.61.98.44,1.96.95,2.94,1.51,9.2,5.27,12.41,9.42,12.57,16.77Z"/>
|
||||
</g>
|
||||
<g id="L1_infill" transform="translate(0,0.65) scale(0.70)">
|
||||
<path d="M226.89,153.84c-42.76,6.62-84.3,13.1-123.56,19.27.76-6.19,2.09-12.15,27.86-22.29,28.7-10.58,37.26-12.24,70.44-13.64,2.49-.11,4.68,0,6.67.32,9.71,1.57,15.81,6.94,18.59,16.34Z"/>
|
||||
<g id="L1_infill">
|
||||
<path id="L1_infill" d="M165.32,123.06v-3.76c0-3.2-2.11-6.02-5.17-6.96-31.09-9.5-55.53-1.1-65.02,3.2-2.6,1.18-4.28,3.76-4.28,6.62v3.34s38.5-2.96,74.48-2.44Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="Outline" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="Outline">
|
||||
<g id="Button_outlines_behind">
|
||||
<path id="L1" d="M88.34,128.2v-6.04c0-3.82,2.26-7.31,5.75-8.9,9.4-4.26,34.72-13.11,66.78-3.31,4.15,1.27,6.94,5.03,6.94,9.35v6.3l-2.54-.04c-35.46-.51-73.86,2.4-74.25,2.43l-2.69.21ZM131.57,110.5c-16.83,0-29.48,4.62-35.42,7.31-1.71.77-2.81,2.48-2.81,4.34v.65c9.13-.63,39.98-2.57,69.48-2.28v-1.23c0-2.11-1.37-3.94-3.4-4.57-10.1-3.09-19.49-4.23-27.84-4.23Z"/>
|
||||
<path id="R1" d="M551.66,128.2l-2.7-.21c-39.06-3.06-73.88-2.44-74.23-2.43l-2.55.05v-6.31c0-4.32,2.79-8.08,6.94-9.35,32.06-9.8,57.38-.95,66.78,3.31,3.49,1.58,5.75,5.07,5.75,8.9v6.04ZM483.07,120.5c12.35,0,36.81.3,63.59,2.3v-.64c0-1.86-1.1-3.57-2.81-4.34-8.88-4.02-32.83-12.38-63.26-3.09-2.04.62-3.4,2.46-3.4,4.57v1.23c1.42-.01,3.41-.03,5.88-.03Z"/>
|
||||
</g>
|
||||
<g id="Controller">
|
||||
<path id="Controller_outline" d="M804.61,172.5s.09.02.13.02c-45.03-8.29-84.58-14.71-120.82-19.6.06,0,.12.02.17.02-.09.21-.14.44-.23.66-1.95.4-4.06.27-6,.85-.01-.01-.04-.03-.06-.05-.04-.13-.09-.26-.14-.39.02,0,.04,0,.07,0-4.87-.52-9.74-1.01-14.62-1.5-4.79-.46-9.6-.91-14.4-1.34h-.01s-.37-.05-.37-.05c-9.11-.83-18.27-1.58-27.45-2.28,0,.04,0,.08,0,.11,6.85.92,13.16,2.58,18.67,6.93,0,0-.01-.01-.02-.02,1.13.1,2.24.2,3.36.3,5.18,1.42,9.39,5.36,10.93,10.49,1.6,5.35,1.3,12.24-.9,20.47l-21.05,109.2c-4.19,26.12-19.01,37.08-42.82,41.56l-143.01.03-128.89-.03c-23.72-4.39-39.07-18.19-42.83-41.64l-2.11-10.93c-.29-2.09-.65-4.23-1.12-6.43l-12.19-62.64-5.57-28.92-.04-.19c-.09-.35-.16-.68-.25-1.03l-1.25-6.42s0-.03-.01-.04c-.67-4.99-.48-9.34.61-12.98,1.44-4.81,5.22-8.56,9.95-10.19,1.68-.14,3.36-.28,5.03-.42-.01,0-.02.02-.04.03.13-.02.26-.04.39-.06,1.51-.96,3.05-1.79,4.52-2.46,4.51-2.11,9.69-3.99,14.78-4.58-8.71.66-17.56,1.37-26.29,2.11l-1.11.09c-9.48.82-18.77,1.68-27.61,2.55l-.46.05s0-.01,0-.02c-.02.03-.03.06-.04.09-1.99.06-3.94-.42-5.98-.72,0-.03,0-.06-.01-.09.03,0,.06,0,.08-.01-41.23,6.38-81.95,12.73-121.09,18.88,0-.03.01-.07.02-.1l-5.76,1.61c-1.39.76-2.77,1.68-4.11,2.75-6.4,5.15-12.04,13.69-17.24,26.11-27.39,64.19-47.54,129.24-59.9,193.34C4.64,462.34-.21,530.22,3.08,597.4c2.41,40.48,7.54,66.82,16.62,85.41,9.85,20.12,24.59,31.39,46.4,35.45l39.76,12.39.33.07h.1c.97.12,1.93.18,2.86.18,13.63,0,18.84-11.41,21.55-19.96,27.65-75.71,49.02-130.11,67.27-171.19,8.52-19.59,24.3-29.11,48.23-29.11,3.5,0,7.23.21,11.11.63h.17c60.68,2.54,123.31,3.82,186.16,3.82,70.29,0,142.26-1.6,213.94-4.76,2.31-.2,4.59-.3,6.77-.3,23.28,0,39.64,11.03,50,33.68,26.25,62.96,48.44,119.86,67.83,173.94,3.28,8.94,9.45,13.47,18.32,13.47,1.52,0,3.14-.14,4.82-.4h.06s45.5-13.11,45.5-13.11c2-.48,4.05-1.09,6.27-1.86l.13-.04.72-.25v-.02c15.47-5.75,26.84-17.21,34.75-35,7.77-17.48,12.58-41.33,15.58-77.35,4.35-57.49-1.58-134.16-16.29-210.35-15.8-81.82-40.06-154.86-68.3-205.65-2.37-4.62-4.05-7.26-5.79-9.11-2.01-2.17-4.26-3.46-7.64-4.35,0-.05-.03.03-.04-.02M654.75,157.28c1.32.12,2.27.2,2.26.19,4.84.46,9.76.95,14.92,1.48-3.75,2.27-6.89,5.18-9.51,8.8-.01-.02-.01-.04-.02-.06-.81,1.03-1.56,2.12-2.23,3.26-.18-2.07-.53-4.04-1.07-5.86-.89-2.98-2.4-5.62-4.35-7.82ZM251.1,157.47l.22-.17.34-.03c-2.05,2.16-3.62,4.8-4.53,7.83-.29.95-.5,1.95-.69,2.98-.3-.5-.5-.83-.51-.82-2.55-3.31-5.76-6.16-9.46-8.41,4.54-.44,9.37-.89,14.63-1.37ZM63.74,711.34c-1.7,0-3.53-.26-5.45-.77l-.46-.09c-15.03-4.97-25.58-14.54-33.18-30.09-8.75-17.89-13.71-43.59-16.08-83.29C2.18,466.43,27.04,334.31,82.48,204.42c5.96-14.26,12.4-22.95,19.68-26.57,36.97-5.81,77.23-12.09,119.66-18.67,12.6,2.24,22,10.48,24.57,21.52.29,2.12.73,4.32,1.3,6.61l5.63,28.91,13.52,70.16c3.04,22.28-4.43,36.44-19.51,54.89-33.86,35.52-63.96,83.16-92.02,145.65-22.57,50.27-43.21,108.54-64.97,183.45-3.79,15.91-8.97,32.96-18.74,38.81-2.41,1.45-4.98,2.16-7.85,2.16ZM804.28,725.31c-1.3.21-2.54.31-3.7.31-6.47,0-10.8-3.22-13.23-9.84-19.36-54.03-41.59-111.02-67.97-174.28-11.21-24.52-29.78-36.96-55.17-36.96-2.28,0-4.64.1-6.97.3-71.45,3.15-143.25,4.75-213.42,4.75-62.79,0-125.39-1.28-185.99-3.8-3.91-.42-7.72-.63-11.32-.63-26.2,0-44.22,10.9-53.58,32.37-18.31,41.24-39.73,95.76-67.43,171.64-3.62,11.38-8.49,16.23-16.28,16.23-.66,0-1.36-.03-2.07-.1l-34.11-10.63c.47-.24.93-.49,1.38-.76,11.51-6.9,17.19-25.2,21.22-42.14,31.82-109.48,78.28-245.56,155.72-326.77l.12-.14c10.32-12.6,15.94-21.99,18.94-31.77.01.02.02.03.03.05l.04-.29c.47-1.24.83-2.6,1.14-4.03,5.82,18.4,22.43,32.57,45.18,34.56l129.25.04,143.13-.03h.24c23.32-2.05,38.12-13.14,44.92-33.72.1.51.2,1.01.32,1.53,3.02,14.37,11.49,26.24,20.3,37l.17.19c81.44,78.96,128.1,212.33,162.99,332.38,5.91,20.1,10.54,31.1,19.1,35.05l-32.95,9.49ZM902.84,602.66c-4.81,57.88-14.43,96.11-47.36,107.83-4.19,1.09-7.37,1.59-9.99,1.59-9.87,0-14.41-6.75-22.08-32.85-22.39-77.03-43.38-136.08-66.05-185.82-29.41-64.53-61.55-113.22-98.27-148.86-16.5-20.18-23.88-35.21-18.4-61.3l20.03-98.96c4.49-15.34,12.4-22.67,27.28-25.27,35.69,4.91,74.62,11.29,119,19.5h.07c5.65,1.12,7.18,2.15,11.82,11.17,60.68,109.11,92.4,301.63,83.95,412.97Z"/>
|
||||
<path d="M72.26,503.22c-16.56,0-32.79-6.81-45.17-19.34-35.77-36.22-22.36-122.58-14.94-158.03,29.26-129.74,37.53-149.6,47.65-166.89,7.02-11.98,15.4-24.07,19.78-30.22,2.33-3.28,5.98-5.34,10-5.65,39.08-3.06,71.47-2.58,80.46-2.37,2.31.06,4.5.97,6.17,2.58l2.73,2.63c.79.76,1.83,1.18,2.93,1.18h36.97v5h-36.97c-2.4,0-4.67-.92-6.4-2.58l-2.73-2.63c-.76-.74-1.77-1.16-2.82-1.18-8.93-.21-41.11-.69-79.95,2.35-2.54.2-4.84,1.5-6.32,3.57-4.32,6.07-12.61,18.03-19.53,29.84-9.88,16.88-17.99,36.43-47.08,165.43-7.25,34.62-20.46,118.95,13.61,153.45,14.34,14.52,34.26,20.73,53.29,16.6,23.23-5.03,42.3-24.84,53.71-55.79,5.08-13.79,9.26-25.52,12.62-34.94,13.92-39.03,17.22-48.31,30.19-51.55l1.21,4.85c-10.08,2.52-12.69,9.11-26.69,48.38-3.36,9.44-7.55,21.18-12.64,34.99-12.01,32.61-32.38,53.55-57.34,58.95-4.23.91-8.5,1.36-12.74,1.36Z"/>
|
||||
<path d="M98.46,460.5c-10.71,0-23.53-1.31-38.69-4.41-28.57-5.83-42.38-20.36-48.94-31.52-7.15-12.17-7.45-22.9-7.46-23.35l5-.1-2.5.05,2.5-.06c0,.1.32,10.07,6.9,21.15,8.81,14.83,24.12,24.57,45.5,28.93,53.9,11,73.86-1.74,76.88-10.01l4.7,1.72c-3.38,9.23-16.88,17.6-43.89,17.6Z"/>
|
||||
<path d="M567.74,503.22c-4.25,0-8.51-.45-12.74-1.36-24.96-5.4-45.33-26.34-57.34-58.95-5.09-13.81-9.28-25.56-12.64-34.99-14-39.27-16.61-45.86-26.69-48.38l1.21-4.85c12.97,3.24,16.27,12.52,30.19,51.55,3.36,9.43,7.54,21.16,12.62,34.94,11.4,30.95,30.48,50.76,53.71,55.79,19.03,4.12,38.96-2.09,53.29-16.6,34.07-34.5,20.86-118.83,13.6-153.49-29.09-128.96-37.19-148.52-47.08-165.39-6.92-11.81-15.21-23.77-19.53-29.84-1.47-2.07-3.77-3.37-6.31-3.57-38.85-3.04-71.02-2.57-79.95-2.35-1.06.03-2.06.45-2.82,1.18l-2.73,2.63c-1.73,1.66-4,2.58-6.4,2.58h-36.97v-5h36.97c1.1,0,2.14-.42,2.93-1.18l2.73-2.63c1.67-1.61,3.86-2.52,6.17-2.58,8.99-.22,41.38-.69,80.46,2.37,4.02.31,7.66,2.37,10,5.65,4.37,6.14,12.76,18.23,19.78,30.22,10.13,17.29,18.39,37.15,47.65,166.86,7.43,35.48,20.84,121.84-14.93,158.06-12.37,12.53-28.61,19.34-45.17,19.34Z"/>
|
||||
<path d="M541.54,460.5c-27.01,0-40.51-8.36-43.89-17.6l4.7-1.72c3.03,8.27,22.99,21.01,76.88,10.01,21.38-4.36,36.68-14.1,45.5-28.93,6.58-11.08,6.9-21.05,6.9-21.15l5,.11c0,.45-.3,11.18-7.46,23.35-6.56,11.16-20.37,25.69-48.94,31.52-15.16,3.09-27.99,4.41-38.69,4.41Z"/> -->
|
||||
<rect x="258.62" y="354.78" width="122.75" height="5"/>
|
||||
<path d="M219.94,374.77c-33.04,0-59.92-26.88-59.92-59.92s26.88-59.91,59.92-59.91,59.92,26.88,59.92,59.91-26.88,59.92-59.92,59.92ZM219.94,259.94c-30.28,0-54.92,24.63-54.92,54.91s24.63,54.92,54.92,54.92,54.92-24.63,54.92-54.92-24.63-54.91-54.92-54.91Z"/>
|
||||
<path d="M122.78,301.15c-42.16,0-76.46-34.3-76.46-76.46s34.3-76.46,76.46-76.46,76.46,34.3,76.46,76.46-34.3,76.46-76.46,76.46ZM122.78,153.23c-39.4,0-71.46,32.06-71.46,71.46s32.06,71.46,71.46,71.46,71.46-32.06,71.46-71.46-32.06-71.46-71.46-71.46Z"/>
|
||||
<path d="M420.06,374.77c-33.04,0-59.92-26.88-59.92-59.92s26.88-59.91,59.92-59.91,59.92,26.88,59.92,59.91-26.88,59.92-59.92,59.92ZM420.06,259.94c-30.28,0-54.92,24.63-54.92,54.91s24.63,54.92,54.92,54.92,54.92-24.63,54.92-54.92-24.63-54.91-54.92-54.91Z"/>
|
||||
<path d="M517.22,301.15c-42.16,0-76.46-34.3-76.46-76.46s34.3-76.46,76.46-76.46,76.46,34.3,76.46,76.46-34.3,76.46-76.46,76.46ZM517.22,153.23c-39.4,0-71.46,32.06-71.46,71.46s32.06,71.46,71.46,71.46,71.46-32.06,71.46-71.46-32.06-71.46-71.46-71.46Z"/>
|
||||
<path id="L3_outline_" d="M219.94,354.21c-21.7,0-39.36-17.66-39.36-39.36s17.66-39.36,39.36-39.36,39.36,17.66,39.36,39.36-17.66,39.36-39.36,39.36ZM219.94,280.49c-18.95,0-34.36,15.41-34.36,34.36s15.41,34.36,34.36,34.36,34.36-15.41,34.36-34.36-15.41-34.36-34.36-34.36Z"/>
|
||||
<path id="R3_outline_" d="M420.06,354.21c-21.7,0-39.36-17.66-39.36-39.36s17.66-39.36,39.36-39.36,39.36,17.66,39.36,39.36-17.66,39.36-39.36,39.36ZM420.06,280.49c-18.95,0-34.36,15.41-34.36,34.36s15.41,34.36,34.36,34.36,34.36-15.41,34.36-34.36-15.41-34.36-34.36-34.36Z"/>
|
||||
<g id="Speaker_grill">
|
||||
<circle cx="420.29" cy="357.71" r="4.82"/>
|
||||
<circle cx="437.84" cy="357.71" r="4.82"/>
|
||||
<circle cx="455.38" cy="357.71" r="4.82"/>
|
||||
<circle cx="472.93" cy="357.71" r="4.82"/>
|
||||
<circle cx="490.47" cy="358.68" r="4.82"/>
|
||||
<circle class="st2" cx="297.85" cy="262.87" r="2.73"/>
|
||||
<circle class="st2" cx="309.07" cy="262.87" r="2.73"/>
|
||||
<circle class="st2" cx="320.29" cy="262.87" r="2.73"/>
|
||||
<circle class="st2" cx="331.51" cy="262.87" r="2.73"/>
|
||||
<circle class="st2" cx="303.46" cy="270.62" r="2.73"/>
|
||||
<circle class="st2" cx="314.68" cy="270.62" r="2.73"/>
|
||||
<circle class="st2" cx="325.9" cy="270.62" r="2.73"/>
|
||||
<!-- <circle class="st2" cx="308.78" cy="279" r="2.73"/> -->
|
||||
<!-- <circle class="st2" cx="320" cy="279" r="2.73"/> -->
|
||||
<!-- <circle class="st2" cx="331.22" cy="279" r="2.73"/> -->
|
||||
<circle class="st2" cx="337.12" cy="270.62" r="2.73"/>
|
||||
<circle class="st2" cx="342.73" cy="262.87" r="2.73"/>
|
||||
</g>
|
||||
<path id="L3_surround" d="M340.92,373.72c-12.1-11.94-28.56-18.52-46.36-18.52-1.03,0-2.06.02-3.11.06-16.56.69-32.12,7.92-43.82,20.35-11.43,12.15-17.66,28.1-17.11,43.7-.63,16.4,5.79,32.86,17.63,45.16,12.39,12.87,29.14,19.96,47.17,19.96h.13c17.75-.03,34.16-6.86,46.21-19.24,12.14-12.46,18.58-29.31,18.14-47.45-.41-16.77-7.12-32.41-18.9-44.04ZM296.63,478.55c-.35,0-.7,0-1.06,0-16.24,0-31.34-6.14-42.53-17.29-11.18-11.15-17.33-26.19-17.32-42.36.02-27.96,22.56-58.15,58.94-58.15h.29c16.72.07,32,6.28,43.02,17.47,10.8,10.97,16.65,25.88,16.48,41.98-.4,36.53-29.71,58.36-57.82,58.36Z"/>
|
||||
<path id="R3_surround" d="M617.17,355.14c-1.39,0-2.81.05-4.21.13-16.38,1.04-31.68,7.93-43.07,19.39-11.63,11.71-18.09,27.2-18.18,43.63-.1,18.38,6.27,34.57,18.42,46.8,12.21,12.3,29.46,19.38,47.3,19.41h.1c16.61,0,32.4-6.7,44.48-18.88,12.21-12.3,19.13-29.12,19-46.1.29-16.6-6.42-33.11-18.41-45.31-12.1-12.31-28.23-19.09-45.43-19.09ZM675.5,419.52c-.02,32.9-25.99,58.85-59.12,59.08h-.4c-15.55,0-30.85-6.54-41.96-17.95-11.2-11.5-17.15-26.51-16.74-42.27.84-32.25,26.93-57.61,59.4-57.74h.24c16.08,0,31.03,6.27,42.11,17.65,10.89,11.19,16.89,26.21,16.48,41.23Z"/>
|
||||
</g>
|
||||
<g id="Button_outlines">
|
||||
<path id="L1" d="M131.54,151.76c28.58-10.54,37.1-12.19,70.13-13.58.62-.03,1.21-.04,1.78-.04,1.7,0,3.23.11,4.69.35,8.92,1.44,14.64,6.2,17.45,14.54-.03,0-.06,0-.08.01,0,.03,0,.06.01.09,2.04.3,3.99.78,5.98.72.02-.03.03-.06.04-.09-3.07-11.83-10.65-18.79-22.53-20.72-1.76-.27-3.6-.41-5.61-.41-.63,0-1.28,0-1.95.04-5.25.22-9.69.44-13.55.68-23.59,1.48-33.63,4.15-58.32,13.26-1.9.75-3.55,1.43-5.01,2.05l-.16.07c-23.9,10.2-24.72,17.05-25.6,24.3-.02.13-.04.25-.05.38l5.76-1.61c.79-5.14,3.38-10.75,27.02-20.05Z"/>
|
||||
<path id="R1" d="M804.81,159.88c-2.27-2.33-5.34-4.53-9.35-6.83-1.04-.6-2.15-1.17-3.28-1.69-27.77-12.77-52.08-18.98-74.31-18.98-5.21,0-10.43.34-15.56,1.02l-.23.04c-13.31,3.1-21.29,9.84-24.35,20.58-.02,0-.04,0-.07,0,.05.13.1.26.14.39.02.02.05.03.06.05.49-.18,1-.3,1.52-.33,1.52-.11,3.01-.3,4.48-.51.01-.04.03-.08.05-.12.05-.18.11-.36.18-.54-.06,0-.12-.02-.17-.02,2.98-7.21,9.14-11.7,19.28-14.1,4.8-.62,9.73-.94,14.65-.94,21.43,0,44.99,6.05,72.03,18.48.91.41,1.84.89,2.85,1.47,8.44,4.83,11.54,8.54,12.01,14.69-.05,0-.09-.02-.13-.02.06.13.12.25.16.39.02.06.05.12.07.18,1.01.07,1.98.26,2.89.58.87-.31,1.74-.34,2.57-.15-.14-5.55-1.73-9.75-5.49-13.61Z"/>
|
||||
<path id="L2_outline" d="M115.16,122.1h.4l.52-.07.06-.02c24.15-6.19,52.33-10.12,83.69-11.68h.47c5.39,0,9.3-1.44,11.61-4.29,2.31-2.88,2.86-6.94,1.67-11.99l-9.91-67.79c-3.78-16.37-15.49-24.66-34.81-24.66-2.7,0-5.6.17-8.61.49-14.28,1.66-25.37,7.75-32.97,18.08-2.9,3.94-5.2,8.57-6.83,13.75-7.91,25.05-11.67,47.06-16.02,72.55l-.18,1.03c-.57,5.06.28,8.9,2.55,11.39,1.92,2.12,4.73,3.2,8.34,3.2ZM109.72,108.29l.15-.89c4.32-25.3,8.06-47.16,15.84-71.81,1.46-4.61,3.48-8.7,6.02-12.15,6.76-9.19,16.3-14.38,29.16-15.89,2.88-.31,5.61-.46,8.11-.46,16.53,0,26.12,6.66,29.29,20.26l9.88,67.62.04.18c.81,3.44.62,5.94-.57,7.43-1.21,1.5-3.65,2.25-7.25,2.25h-.69c-31.62,1.56-60.09,5.52-84.61,11.76-1.98-.02-3.35-.48-4.19-1.4-1.15-1.27-1.55-3.69-1.18-6.92Z"/>
|
||||
<path id="R2_outline" d="M709.98,110.34h.41c31.43,1.56,59.6,5.48,83.74,11.68l.06.02.53.07h.4c3.61,0,6.42-1.08,8.34-3.2,2.27-2.5,3.13-6.33,2.54-11.45l-.17-.97c-4.35-25.49-8.11-47.5-16.02-72.55-1.63-5.18-3.93-9.81-6.83-13.75-7.61-10.33-18.71-16.42-32.99-18.08-3-.33-5.89-.49-8.6-.49-19.32,0-31.03,8.3-34.82,24.74l-9.87,67.63c-1.21,5.13-.66,9.2,1.66,12.08,2.31,2.85,6.22,4.29,11.61,4.29ZM702.09,95.12l.04-.2,9.85-67.49c3.18-13.69,12.77-20.35,29.31-20.35,2.49,0,5.22.16,8.1.46,12.87,1.51,22.41,6.7,29.17,15.89,2.53,3.43,4.55,7.52,6.01,12.15,7.79,24.65,11.52,46.51,15.85,71.82l.14.83c.37,3.3-.03,5.71-1.17,6.97-.85.93-2.22,1.39-4.19,1.4-24.52-6.25-52.99-10.21-84.66-11.77h-.64c-3.56,0-6.07-.77-7.26-2.25-1.2-1.49-1.4-3.99-.56-7.47Z"/>
|
||||
<path id="Create_outline" d="M218.64,218.94c1.25,5.26,5.9,8.93,11.31,8.93.92,0,1.83-.11,2.69-.32,3.02-.72,5.57-2.57,7.2-5.22,1.63-2.65,2.13-5.76,1.41-8.77l-4.26-17.93c-1.25-5.26-5.9-8.93-11.31-8.93-.9,0-1.81.11-2.7.32-3.02.71-5.57,2.57-7.2,5.21-1.63,2.65-2.13,5.76-1.42,8.78l4.27,17.93ZM220.47,195.11c.86-1.4,2.21-2.37,3.79-2.75.46-.11.93-.16,1.42-.16,2.85,0,5.3,1.93,5.96,4.7l4.27,17.93c.38,1.59.11,3.23-.74,4.62-.86,1.4-2.21,2.38-3.8,2.75-.47.11-.94.17-1.42.17-2.85,0-5.3-1.94-5.96-4.71l-4.27-17.93c-.38-1.59-.11-3.23.75-4.62Z"/>
|
||||
<path id="Options_outline" d="M677.7,226.85c.91.21,1.82.32,2.69.32,5.4,0,10.05-3.68,11.3-8.94l4.27-17.92c.72-3.02.22-6.15-1.41-8.79-1.63-2.64-4.18-4.5-7.2-5.22-.88-.21-1.79-.31-2.69-.31-5.41,0-10.06,3.67-11.32,8.93l-4.27,17.93c-1.49,6.23,2.38,12.51,8.62,14.01ZM674.43,214.12l4.26-17.92c.66-2.77,3.11-4.71,5.96-4.71.5,0,.96.06,1.42.17,1.59.38,2.94,1.35,3.8,2.74.85,1.38,1.12,3.03.74,4.63l-4.26,17.92c-.66,2.77-3.11,4.71-5.96,4.71-.47,0-.95-.06-1.42-.17-1.59-.38-2.94-1.35-3.8-2.75-.86-1.39-1.12-3.04-.74-4.63Z"/>
|
||||
<path id="Left_outline" d="M99.81,321.31c1.27.35,2.6.53,3.93.53.42,0,.83-.02,1.25-.06l14.55-1.23c5.53-.47,10.68-2.71,14.76-6.39.68-.6,1.32-1.25,1.94-1.94l8.45-9.44c3.91-4.36,3.85-10.88-.13-15.18l-8.39-9.04c-4.29-4.63-10.11-7.47-16.4-8l-14.78-1.25c-4.13-.36-8.24,1.05-11.29,3.85s-4.8,6.79-4.8,10.93v22.91c0,4.14,1.75,8.12,4.8,10.93,1.75,1.61,3.85,2.76,6.11,3.38ZM93.9,284.09c0-2.79,1.13-5.36,3.18-7.24,1.84-1.69,4.17-2.6,6.63-2.6.28,0,.57.01.86.04l14.78,1.25c5.04.43,9.71,2.71,13.15,6.42l8.4,9.04c2.21,2.39,2.24,6.02.07,8.45l-8.46,9.44c-3.46,3.87-8.22,6.24-13.39,6.68l-14.55,1.23c-2.78.24-5.44-.67-7.49-2.56-2.05-1.88-3.18-4.45-3.18-7.24v-22.91Z"/>
|
||||
<path id="Right_outline" d="M172.85,287.6c-3.98,4.3-4.04,10.82-.14,15.18l8.27,9.23.19.21c4.32,4.83,10.25,7.78,16.7,8.33l14.55,1.23c.42.04.83.06,1.25.06,1.4,0,2.79-.2,4.12-.58,2.18-.64,4.22-1.76,5.92-3.33,3.05-2.81,4.8-6.79,4.8-10.93v-22.91c0-4.14-1.75-8.13-4.8-10.93-3.05-2.8-7.16-4.2-11.29-3.85l-14.78,1.25c-.74.06-1.48.16-2.2.28-2.7.47-5.27,1.36-7.65,2.64-2.43,1.31-4.64,3.01-6.55,5.08l-8.39,9.04ZM198.06,275.54l14.78-1.25c2.78-.24,5.44.67,7.49,2.56,2.05,1.88,3.18,4.45,3.18,7.24v22.91c0,2.79-1.13,5.36-3.18,7.24-2.05,1.89-4.71,2.8-7.49,2.56l-14.55-1.23c-5.17-.44-9.93-2.81-13.39-6.68l-8.46-9.44c-2.17-2.43-2.14-6.06.07-8.45l8.4-9.04c3.44-3.71,8.11-5.99,13.15-6.42Z"/>
|
||||
<path id="Down_outline" d="M183.71,334.71c-.13-1.61-.42-3.18-.84-4.71-.05-.16-.1-.32-.15-.47-.22-.68-.45-1.34-.69-2-1.43-3.61-3.69-6.87-6.65-9.52l-9.44-8.46c-4.36-3.9-10.88-3.85-15.18.14l-9.04,8.39c-1.05.97-2,2.01-2.85,3.12-2.94,3.82-4.74,8.41-5.15,13.28l-1.25,14.78c-.15,1.83.03,3.65.54,5.38.62,2.18,1.75,4.21,3.31,5.91,2.8,3.05,6.79,4.8,10.93,4.8h22.91c4.14,0,8.12-1.75,10.93-4.8,2.8-3.05,4.2-7.16,3.85-11.29l-1.23-14.55ZM177.4,357.17c-1.88,2.05-4.45,3.18-7.24,3.18h-22.91c-2.79,0-5.36-1.13-7.25-3.18-1.88-2.05-2.79-4.71-2.55-7.49l1.25-14.78c.43-5.04,2.71-9.71,6.42-13.16l9.04-8.39c1.21-1.12,2.74-1.68,4.27-1.68s2.98.54,4.18,1.61l9.44,8.45c3.87,3.47,6.24,8.23,6.68,13.4l1.23,14.55c.24,2.78-.67,5.44-2.56,7.49Z"/>
|
||||
<path id="Up_outline" d="M133.72,256.61c.48,5.73,2.88,11.07,6.81,15.22.38.41.78.8,1.19,1.18l9.04,8.39c2.18,2.02,4.92,3.03,7.67,3.03s5.36-.97,7.51-2.9l9.44-8.45c1.35-1.2,2.55-2.53,3.58-3.96,2.51-3.43,4.1-7.44,4.64-11.72.05-.34.08-.68.11-1.02l1.23-14.55c.35-4.13-1.05-8.24-3.85-11.29-2.81-3.05-6.79-4.8-10.93-4.8h-22.91c-4.14,0-8.13,1.75-10.93,4.8-1.53,1.66-2.64,3.64-3.27,5.76-.54,1.77-.74,3.65-.58,5.53l1.25,14.78ZM140,233.92c1.89-2.05,4.46-3.18,7.25-3.18h22.91c2.79,0,5.36,1.13,7.24,3.18,1.89,2.05,2.8,4.71,2.56,7.49l-1.23,14.55c-.44,5.17-2.81,9.93-6.68,13.39l-9.44,8.46c-2.43,2.17-6.06,2.14-8.45-.07l-9.04-8.4c-3.71-3.44-5.99-8.11-6.42-13.15l-1.25-14.78c-.24-2.78.67-5.44,2.55-7.49Z"/>
|
||||
<path id="Cross_outline" d="M751.82,321.39h-.11c-8.53,0-16.94,3.65-23.08,10.01-5.91,6.13-9.01,13.94-8.72,21.98.63,17.53,13.54,30.1,31.38,30.57h.03c17.47,0,31.35-13.6,31.6-30.96.12-8.05-3.19-16.1-9.08-22.09-5.9-6.01-13.93-9.48-22.02-9.51ZM770.09,370.25c-4.93,5-11.74,7.77-19.16,7.8h-.1c-13.76,0-24.99-11.14-25.03-24.82-.04-13.99,11.13-25.37,25.43-25.91.28-.01.56-.02.84-.02,13.25,0,24.99,11.83,25.12,25.32.06,6.67-2.46,12.93-7.09,17.63Z"/>
|
||||
<path id="Triangle_outline" d="M751.06,266c.21,0,.41,0,.62,0,8.36,0,16.79-3.45,22.54-9.22,5.71-5.73,8.72-13.49,8.69-22.44-.05-17.11-14.19-31.03-31.52-31.03h-.19c-17.15.1-31.24,14.15-31.4,31.3-.08,8.08,3.16,15.85,9.1,21.87,5.94,6.02,14.02,9.48,22.16,9.51ZM751.32,209.08h.12c13.93.07,25.71,11.83,25.73,25.69.01,6.89-2.62,13.27-7.4,17.98-4.79,4.71-11.3,7.31-18.35,7.32-6.99,0-13.47-2.6-18.25-7.33-4.77-4.72-7.4-11.13-7.39-18.03.01-14.13,11.47-25.63,25.53-25.63Z"/>
|
||||
<path id="Circle_outline" d="M791.23,272.06c-5.72,5.82-8.79,13.5-8.65,21.62.31,17.85,13.17,30.72,31.27,31.3.3,0,.6.01.9.01,16.35,0,30.24-14.13,30.33-30.86.05-8.44-3.12-16.31-8.92-22.14-5.91-5.94-13.96-9.21-22.68-9.21-8.47,0-16.37,3.3-22.25,9.28ZM839.39,293.77c.02,6.64-2.62,12.96-7.44,17.78-4.93,4.95-11.46,7.67-18.37,7.67,0,0-.14,0-.14,0-13.66-.07-25.18-11.87-25.15-25.75.03-13.65,11.4-25.19,24.83-25.19h.23c14.33.14,26.01,11.57,26.05,25.49Z"/>
|
||||
<path id="Square_outline" d="M691.99,262.62c-.79-.06-1.6-.09-2.38-.09-8.46,0-16.39,3.35-22.34,9.45-5.74,5.88-8.93,13.76-8.74,21.58-.29,17.51,12.78,31.02,30.42,31.42.26,0,.52,0,.78,0,17.09,0,30.37-12.98,30.9-30.18.51-16.54-12.34-30.97-28.64-32.18ZM707.82,311.38c-4.97,4.99-11.72,7.85-18.53,7.85,0,0-.18,0-.18,0-6.58-.05-12.82-2.74-17.59-7.59-4.87-4.95-7.51-11.43-7.45-18.24.13-13.89,11.46-25.19,25.26-25.19h.38c13.56.21,25.5,12.2,25.56,25.67.03,6.44-2.62,12.65-7.44,17.5Z"/>
|
||||
<path id="PS_outline" d="M455.4,442.49h.21c14.28-.12,25.41-11.31,25.35-25.47-.06-14.05-11.44-25.51-25.42-25.54-13.74,0-25.39,11.7-25.44,25.55-.03,6.72,2.63,13.09,7.46,17.95,4.82,4.84,11.16,7.51,17.84,7.51ZM441.75,403.34c3.78-3.75,8.85-5.9,13.92-5.9h.13c5.08.04,10.12,2.23,13.84,6.02,3.73,3.8,5.84,8.91,5.78,14.02-.13,10.54-9.08,19.11-20,19.11h0c-10.81-.02-19.6-8.74-19.6-19.43,0-5.03,2.17-10.07,5.94-13.82Z"/>
|
||||
<path id="Mute_outline" d="M474.24,464.3c-6.6-.06-13.03-.1-19.11-.1-6.51,0-12.67.04-18.82.11-2.55.03-4.67.99-6.15,2.77-1.4,1.7-2.12,4.04-2.07,6.78.07,3.52,1.54,7.73,8.15,7.76,2.64.01,5.27.02,7.91.02h11.06s1.74-.03,1.74-.03c0,0,7.44-.02,9.31-.02,2.62,0,5.25,0,7.86.04h.17c7.21,0,8.38-5.01,8.43-8,.05-2.57-.65-4.8-2.03-6.45-1.54-1.85-3.77-2.85-6.45-2.88ZM473.79,476.4h-2.19c-2.66-.05-2.76-.04-5.42-.04-1.84,0-10.97.03-10.97.03l-5.52.04h-5.9c-2.5,0-5,0-7.5-.02-.93,0-2.31-.66-2.33-2.29-.02-1.53-.18-2.63.18-3.31.57-1.06,1.65-1.24,2.25-1.25,6.08-.11,12.21-.17,18.74-.17,6.06,0,12.48.05,19.09.15,1.14.02,2.07.53,2.55,1.42.21.4.5,1.12.47,2.82-.02,1.47-.69,2.61-3.43,2.61Z"/>
|
||||
<path id="L2_outline" d="M163.04,87.76h-65.24c-2.13,0-4.09-.98-5.38-2.68s-1.69-3.86-1.1-5.91l11.58-40.63c3.95-13.88,16.3-23.42,30.73-23.74,17.35-.38,31.99,12.85,33.35,30.15l2.79,35.54c.15,1.87-.5,3.73-1.77,5.1-1.27,1.38-3.08,2.16-4.95,2.16ZM134.37,19.8c-.21,0-.42,0-.63,0-12.22.27-22.68,8.36-26.03,20.11l-11.58,40.63c-.15.53-.05,1.09.28,1.53.33.44.84.69,1.39.69h65.24c.49,0,.94-.2,1.28-.56s.5-.83.46-1.32l-2.79-35.54c-1.13-14.44-13.21-25.55-27.62-25.55Z"/>
|
||||
<path id="R2_outline" d="M542.2,87.76h-65.24c-1.87,0-3.68-.79-4.95-2.16-1.27-1.38-1.92-3.24-1.77-5.1l2.79-35.54c1.36-17.3,16.01-30.5,33.35-30.15,14.42.32,26.77,9.86,30.73,23.74l11.58,40.63c.58,2.05.18,4.21-1.1,5.91s-3.25,2.68-5.38,2.68ZM505.63,19.8c-14.42,0-26.49,11.11-27.62,25.55l-2.79,35.54c-.04.49.12.96.46,1.32s.79.56,1.28.56h65.24c.55,0,1.06-.25,1.39-.69.33-.44.44-1,.28-1.53l-11.58-40.63c-3.35-11.75-13.81-19.84-26.03-20.11-.21,0-.42,0-.63,0Z"/>
|
||||
<path id="Create_outline" d="M193.86,179.05c-5.93,0-10.76-4.83-10.76-10.76v-16.03c0-5.93,4.83-10.76,10.76-10.76s10.76,4.83,10.76,10.76v16.03c0,5.93-4.83,10.76-10.76,10.76ZM193.86,146.51c-3.18,0-5.76,2.58-5.76,5.76v16.03c0,3.18,2.58,5.76,5.76,5.76s5.76-2.58,5.76-5.76v-16.03c0-3.18-2.58-5.76-5.76-5.76Z"/>
|
||||
<path id="Options_outline" d="M446.14,179.05c-5.93,0-10.76-4.83-10.76-10.76v-16.03c0-5.93,4.83-10.76,10.76-10.76s10.76,4.83,10.76,10.76v16.03c0,5.93-4.83,10.76-10.76,10.76ZM446.14,146.51c-3.18,0-5.76,2.58-5.76,5.76v16.03c0,3.18,2.58,5.76,5.76,5.76s5.76-2.58,5.76-5.76v-16.03c0-3.18-2.58-5.76-5.76-5.76Z"/>
|
||||
<path id="Left_outline" d="M89.18,245.11h-6.9c-7.8,0-14.14-6.34-14.14-14.14v-12.57c0-7.8,6.34-14.14,14.14-14.14h6.44c5.71,0,11.12,2.19,15.23,6.17l7.89,7.64c1.97,1.92,3.07,4.59,3.01,7.34-.06,2.75-1.26,5.37-3.31,7.2l-7.79,6.95c-4.01,3.58-9.19,5.55-14.57,5.55ZM82.28,209.27c-5.04,0-9.14,4.1-9.14,9.14v12.57c0,5.04,4.1,9.14,9.14,9.14h6.9c4.15,0,8.14-1.52,11.24-4.28l7.79-6.95c1.03-.92,1.61-2.19,1.64-3.57.03-1.39-.5-2.68-1.5-3.64l-7.89-7.64c-3.17-3.07-7.34-4.76-11.75-4.76h-6.44Z"/>
|
||||
<path id="Right_outline" d="M163.28,245.11h-6.44c-5.71,0-11.12-2.19-15.23-6.17l-7.89-7.64c-1.97-1.92-3.07-4.59-3.01-7.34.06-2.75,1.26-5.37,3.31-7.2l7.79-6.95c4.01-3.58,9.19-5.55,14.57-5.55h6.9c7.8,0,14.14,6.34,14.14,14.14v12.57c0,7.8-6.34,14.14-14.14,14.14ZM156.38,209.27c-4.15,0-8.14,1.52-11.24,4.28l-7.79,6.95c-1.03.92-1.61,2.19-1.64,3.57-.03,1.39.5,2.68,1.5,3.64l7.89,7.64c3.17,3.07,7.34,4.76,11.75,4.76h6.44c5.04,0,9.14-4.1,9.14-9.14v-12.57c0-5.04-4.1-9.14-9.14-9.14h-6.9Z"/>
|
||||
<path id="Down_outline" d="M129.07,279.32h-12.57c-7.8,0-14.14-6.34-14.14-14.14v-6.44c0-5.71,2.19-11.12,6.17-15.23l7.64-7.89c1.92-1.97,4.59-3.05,7.34-3.01,2.75.06,5.37,1.26,7.2,3.31l6.95,7.79c3.58,4.01,5.55,9.19,5.55,14.57v6.9c0,7.8-6.34,14.14-14.14,14.14ZM123.29,237.62c-1.35,0-2.6.53-3.54,1.5l-7.64,7.89c-3.07,3.17-4.76,7.34-4.76,11.75v6.44c0,5.04,4.1,9.14,9.14,9.14h12.57c5.04,0,9.14-4.1,9.14-9.14v-6.9c0-4.15-1.52-8.14-4.28-11.24l-6.95-7.79c-.92-1.03-2.19-1.61-3.57-1.64-.04,0-.07,0-.11,0Z"/>
|
||||
<path id="Up_outline" d="M122.26,216.76c-.07,0-.13,0-.2,0-2.75-.06-5.37-1.26-7.2-3.31l-6.95-7.79c-3.58-4.01-5.55-9.19-5.55-14.57v-6.9c0-7.8,6.34-14.14,14.14-14.14h12.57c7.8,0,14.14,6.34,14.14,14.14v6.44c0,5.71-2.19,11.12-6.17,15.23l-7.64,7.89c-1.87,1.92-4.46,3.02-7.13,3.02ZM116.49,175.06c-5.04,0-9.14,4.1-9.14,9.14v6.9c0,4.15,1.52,8.14,4.28,11.24l6.95,7.79c.92,1.03,2.19,1.61,3.57,1.64,1.38.02,2.68-.5,3.64-1.5l7.64-7.89c3.07-3.17,4.76-7.34,4.76-11.75v-6.44c0-5.04-4.1-9.14-9.14-9.14h-12.57Z"/>
|
||||
<path id="Cross_outline" d="M517.22,292.79c-12.23,0-22.17-9.95-22.17-22.17s9.95-22.17,22.17-22.17,22.17,9.95,22.17,22.17-9.95,22.17-22.17,22.17ZM517.22,253.44c-9.47,0-17.17,7.7-17.17,17.17s7.7,17.17,17.17,17.17,17.17-7.7,17.17-17.17-7.7-17.17-17.17-17.17Z"/>
|
||||
<path id="Triangle_outline" d="M517.22,201.15c-12.23,0-22.17-9.95-22.17-22.17s9.95-22.17,22.17-22.17,22.17,9.95,22.17,22.17-9.95,22.17-22.17,22.17ZM517.22,161.81c-9.47,0-17.17,7.7-17.17,17.17s7.7,17.17,17.17,17.17,17.17-7.7,17.17-17.17-7.7-17.17-17.17-17.17Z"/>
|
||||
<path id="Circle_outline" d="M563.04,246.97c-12.23,0-22.17-9.95-22.17-22.17s9.95-22.17,22.17-22.17,22.17,9.95,22.17,22.17-9.95,22.17-22.17,22.17ZM563.04,207.63c-9.47,0-17.17,7.7-17.17,17.17s7.7,17.17,17.17,17.17,17.17-7.7,17.17-17.17-7.7-17.17-17.17-17.17Z"/>
|
||||
<path id="Square_outline" d="M471.4,246.97c-12.23,0-22.17-9.95-22.17-22.17s9.95-22.17,22.17-22.17,22.17,9.95,22.17,22.17-9.95,22.17-22.17,22.17ZM471.4,207.63c-9.47,0-17.17,7.7-17.17,17.17s7.7,17.17,17.17,17.17,17.17-7.7,17.17-17.17-7.7-17.17-17.17-17.17Z"/>
|
||||
<path id="PS_outline" d="M320.16,331.18c-9,0-16.32-7.32-16.32-16.32s7.32-16.32,16.32-16.32,16.32,7.32,16.32,16.32-7.32,16.32-16.32,16.32ZM320.16,303.53c-6.24,0-11.32,5.08-11.32,11.32s5.08,11.32,11.32,11.32,11.32-5.08,11.32-11.32-5.08-11.32-11.32-11.32Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="translate(0,0.65) scale(0.70)">
|
||||
<g>
|
||||
<g id="Trackpad_infill" >
|
||||
<path d="M452.27,328.53v-.02c40.22,0,80.43.07,120.65-.07,6.47-.02,13.17.01,19.36-1.58,19.32-4.99,29.59-18.18,33.51-36.6,7.44-34.93,15.37-69.99,21.95-105.09,1.8-9.6-.91-20.7-9.35-26.91-6.53-4.8-15.07-5.38-22.94-6-15.84-1.24-31.65-1.69-47.52-2.33-25.29-1.01-52.32-3.71-77.62-4-59.86-.67-117.65,1.12-177.41,5.09-10.18.68-20.91.48-30.97,2.12-12.6,2.05-25.72,12.82-22.5,31.32,2.97,17.08,7.65,34.26,11,51.28,3.72,18.85,7.61,37.68,11.08,56.58,2.33,12.67,8.64,23.23,19.04,30.56,9.97,7.03,21.64,5.61,33.14,5.62,39.53.06,79.06.02,118.6.02Z"/>
|
||||
<!-- smaller infill <path d="M224.42,133.65h-191.01c2.47h191.15v102.42c0,1.92-1.56,3.48-3.48,3.48h-184.19c-1.92,0-3.48-1.56-3.48-3.48v-102.42h0Z"/> -->
|
||||
<path d="M419.35,234.87v-102.38c0-2.12-1.73-3.85-3.85-3.85h-191.01c-2.12,0-3.85,1.73-3.85,3.85v102.38c0,4.13,3.36,7.5,7.5,7.5h183.71c4.13,0,7.5-3.36,7.5-7.5Z"/>
|
||||
</g>
|
||||
<g id="Trackpad_outline" >
|
||||
<path d="M272.25,153.56c-4.52,2.07-9.76,5.6-12.42,9.85-4.66,6.89-3.71,15.95-1.11,26.9l19.74,98.37c4.52,27.51,18.61,41.63,45.84,43.95h.12l235.94.06c-4.66-.08,4.33,0,9.56,0,35.3,0,49.5-11.1,56.07-37.73l20.44-101.35c4.26-16.93,3.93-29.59-6.87-37.71-6.24-4.92-13.49-6.41-21.4-7.26-52.97-4-107.12-6.03-161.4-6.03-.3,0-.6,0-.9,0-2.3-.01-4.58-.02-6.81-.02-.36,0-.72,0-1.08,0-.33,0-.66,0-1,0-3.06.02-6.18.05-9.34.09-48.92.43-98.66,2.47-148.15,6.11-5.85.15-12,2.31-17.24,4.76ZM641.07,192.4l-20.45,101.35c-6.01,24.35-18.98,33.44-50.41,33.44-3.02,0-6.24.2-9.64,0l-235.88-.06c-24.7-2.11-36.7-14.33-40.82-39.44l-19.79-98.56c-2.23-9.46-3.46-17.08.31-22.64,4.07-6.04,11.93-10.09,23.26-12.03,13.9-1.04,27.83-1.95,41.74-2.73,35.06-1.79,70.63-3.02,101.96-3.47.19,0,.38,0,.58,0,1.55-.02,3.08-.04,4.6-.06,6.53-.06,13.04-.09,19.54-.09,46.61.2,104.83,2.34,158.55,5.8,3.45.26,7.4.89,10.36,1.77,18.01,5.87,21.08,16.85,16.09,36.73Z"/>
|
||||
<path d="M415.51,123.65h-191.01c-4.88,0-8.85,3.97-8.85,8.85v102.38c0,6.89,5.61,12.5,12.5,12.5h183.71c6.89,0,12.5-5.61,12.5-12.5v-102.38c0-4.88-3.97-8.85-8.85-8.85ZM228.14,242.36c-4.13,0-7.5-3.36-7.5-7.5v-102.38c0-2.12,1.73-3.85,3.85-3.85h191.01c2.12,0,3.85,1.73,3.85,3.85v102.38c0,4.13-3.36,7.5-7.5,7.5h-183.71Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="L3" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="L3">
|
||||
<g id="L3_infill">
|
||||
<path d="M295.63,461.03c23.36,0,41.53-17.87,41.57-40.86.03-23.53-18.65-42.27-42.16-42.27-23.09,0-41.82,18.55-41.83,41.45-.01,23.9,18.09,41.69,42.42,41.69Z"/>
|
||||
<circle cx="219.94" cy="314.85" r="36.86"/>
|
||||
</g>
|
||||
<g id="L3_outline">
|
||||
<path d="M295.14,466.67c-26.36-.18-47.62-21.47-47.16-47.19.51-28.21,21.76-46.51,47.28-47.04,25.52-.53,47.65,22.07,47.37,47.25-.29,26.05-21.63,47.15-47.5,46.98ZM295.63,461.03c23.36,0,41.53-17.87,41.57-40.86.03-23.53-18.65-42.27-42.16-42.27-23.09,0-41.82,18.55-41.83,41.45-.01,23.9,18.09,41.69,42.42,41.69Z"/>
|
||||
<path d="M219.94,354.21c-21.7,0-39.36-17.66-39.36-39.36s17.66-39.36,39.36-39.36,39.36,17.66,39.36,39.36-17.66,39.36-39.36,39.36ZM219.94,280.49c-18.95,0-34.36,15.41-34.36,34.36s15.41,34.36,34.36,34.36,34.36-15.41,34.36-34.36-15.41-34.36-34.36-34.36Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="R3" transform="translate(0,0.65) scale(0.70)">
|
||||
<g id="R3">
|
||||
<g id="R3_infill">
|
||||
<path d="M658.23,419.7c.55-22.76-17.76-41.19-40.35-41.72-23.43-.55-42.68,18.19-43.29,40.74-.65,23.92,18.7,41.15,39.11,42.46,25.96,1.66,44.96-18.72,44.52-41.48Z"/>
|
||||
<circle cx="420.06" cy="314.85" r="36.86"/>
|
||||
</g>
|
||||
<g id="R3_outline">
|
||||
<path d="M664.07,419.78c-.01,26.37-21.16,47.39-47.6,47.32-26.19-.06-48.19-21.58-47.62-47.5.59-26.82,21.12-47.52,48.44-47.45,26.83.08,46.79,21.47,46.78,47.62ZM658.23,419.7c.55-22.76-17.76-41.19-40.35-41.72-23.43-.55-42.68,18.19-43.29,40.74-.65,23.92,18.7,41.15,39.11,42.46,25.96,1.66,44.96-18.72,44.52-41.48Z"/>
|
||||
<path d="M420.06,354.21c-21.7,0-39.36-17.66-39.36-39.36s17.66-39.36,39.36-39.36,39.36,17.66,39.36,39.36-17.66,39.36-39.36,39.36ZM420.06,280.49c-18.95,0-34.36,15.41-34.36,34.36s15.41,34.36,34.36,34.36,34.36-15.41,34.36-34.36-15.41-34.36-34.36-34.36Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g id="TriggerPercentages">
|
||||
<text id="L2_percentage" x="133" y="70" font-family="Arial, sans-serif" font-size="19" font-weight="bold" fill="#1a237e" text-anchor="middle" opacity="0">0 %</text>
|
||||
<text id="R2_percentage" x="507" y="70" font-family="Arial, sans-serif" font-size="19" font-weight="bold" fill="#1a237e" text-anchor="middle" opacity="0">0 %</text>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 16 KiB |
@@ -24,4 +24,23 @@
|
||||
<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"/>
|
||||
</symbol>
|
||||
<symbol id="arrows-alt" viewBox="-8.5 0 32 32">
|
||||
<path fill="currentColor" d="M13.76 18.48v0c-0.48 0-0.84 0.36-0.84 0.84v1.12l-4.4-4.4 4.4-4.4v1.12c0 0.48 0.36 0.84 0.84 0.84s0.84-0.36 0.84-0.84v-3.16c0-0.48-0.36-0.84-0.88-0.84v0h-3.16c-0.48 0-0.84 0.36-0.84 0.84s0.36 0.84 0.84 0.84h1.12l-4.4 4.4-4.4-4.4h1.16c0.48 0 0.84-0.36 0.84-0.84s-0.36-0.84-0.84-0.84h-3.16c-0.52 0-0.88 0.4-0.88 0.88v3.16c0 0.48 0.36 0.8 0.84 0.8v0c0.48 0 0.84-0.36 0.84-0.84v-1.12l4.4 4.4-4.4 4.4v-1.12c0-0.48-0.36-0.84-0.84-0.84-0.44-0.040-0.8 0.32-0.8 0.8v3.16c0 0.44 0.24 0.8 0.84 0.8h3.16c0.48 0 0.84-0.36 0.84-0.84s-0.36-0.8-0.84-0.8h-1.12l4.4-4.4 4.4 4.4h-1.12c-0.48 0-0.84 0.36-0.84 0.84s0.36 0.84 0.84 0.84h3.16c0.56 0 0.88-0.32 0.88-0.8v0-3.16c-0.040-0.48-0.44-0.84-0.88-0.84z"></path>
|
||||
</symbol>
|
||||
<symbol id="ps-square" viewBox="0 0 32 32">
|
||||
<circle cx="16" cy="16" r="16" fill="currentColor"/>
|
||||
<rect x="9" y="9" width="14" height="14" fill="none" stroke="#ffffff" stroke-width="3"/>
|
||||
</symbol>
|
||||
<symbol id="ps-circle" viewBox="0 0 32 32">
|
||||
<circle cx="16" cy="16" r="16" fill="currentColor"/>
|
||||
<circle cx="16" cy="16" r="7" fill="none" stroke="#ffffff" stroke-width="3"/>
|
||||
</symbol>
|
||||
<symbol id="ps-cross" viewBox="0 0 32 32">
|
||||
<circle cx="16" cy="16" r="16" fill="currentColor"/>
|
||||
<path fill="none" stroke="#ffffff" stroke-width="3" stroke-linecap="round" d="M10 10 L22 22 M22 10 L10 22"/>
|
||||
</symbol>
|
||||
<symbol id="ps-triangle" viewBox="0 0 32 32">
|
||||
<circle cx="16" cy="16" r="16" fill="currentColor"/>
|
||||
<path fill="none" stroke="#ffffff" stroke-width="3" stroke-linejoin="miter" d="M16 8 L24 22 L8 22 Z"/>
|
||||
</symbol>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 5.9 KiB After Width: | Height: | Size: 7.5 KiB |
@@ -89,6 +89,11 @@ input[id^="finetune"] {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Hide spacers when raw numbers are hidden */
|
||||
#finetuneModal.hide-raw-numbers .spacer.hide-raw-numbers {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Adjust grid layout when raw numbers are hidden - center the canvas */
|
||||
#finetuneModal.hide-raw-numbers .finetune-grid {
|
||||
grid-template-columns: 1fr;
|
||||
@@ -113,4 +118,33 @@ input[id^="finetune"] {
|
||||
#finetuneModal:not(.hide-raw-numbers) #finetuneStickCanvasL_large,
|
||||
#finetuneModal:not(.hide-raw-numbers) #finetuneStickCanvasR_large {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* Error slack button toggle states */
|
||||
.left-stick-values,
|
||||
.right-stick-values {
|
||||
display: block;
|
||||
}
|
||||
|
||||
.left-stick-slider,
|
||||
.right-stick-slider {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* When left stick is in slider mode (only in circularity mode) */
|
||||
#finetuneModal.circularity-mode #left-stick-card.show-slider .left-stick-values {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#finetuneModal.circularity-mode #left-stick-card.show-slider .left-stick-slider.finetune-circularity-mode {
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
/* When right stick is in slider mode (only in circularity mode) */
|
||||
#finetuneModal.circularity-mode #right-stick-card.show-slider .right-stick-values {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
#finetuneModal.circularity-mode #right-stick-card.show-slider .right-stick-slider.finetune-circularity-mode {
|
||||
display: block !important;
|
||||
}
|
||||
91
css/main.css
@@ -26,3 +26,94 @@ dl.row dd {
|
||||
background-color: #0d6efd !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
/* Quick Test Icon Animations */
|
||||
@keyframes shake {
|
||||
0%, 100% { transform: translateX(0); }
|
||||
10%, 30%, 50%, 70%, 90% { transform: translateX(-2px); }
|
||||
20%, 40%, 60%, 80% { transform: translateX(2px); }
|
||||
}
|
||||
|
||||
@keyframes pulse {
|
||||
0%, 100% { transform: scale(1); opacity: 1; }
|
||||
50% { transform: scale(1.1); opacity: 0.8; }
|
||||
}
|
||||
|
||||
@keyframes bounce {
|
||||
0%, 20%, 50%, 80%, 100% { transform: translateY(0); }
|
||||
40% { transform: translateY(-3px); }
|
||||
60% { transform: translateY(-2px); }
|
||||
}
|
||||
|
||||
@keyframes glow {
|
||||
0%, 100% { text-shadow: 0 0 5px rgba(13, 110, 253, 0.5); }
|
||||
50% { text-shadow: 0 0 15px rgba(13, 110, 253, 0.8), 0 0 25px rgba(13, 110, 253, 0.6); }
|
||||
}
|
||||
|
||||
/* Animation classes for different test types - only animate when accordion is expanded */
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-usb {
|
||||
animation: pulse 1s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-buttons {
|
||||
animation: bounce 0.6s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-haptic {
|
||||
animation: shake 0.5s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-adaptive {
|
||||
animation: pulse 1s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-speaker {
|
||||
animation: bounce 0.6s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-microphone {
|
||||
animation: glow 1.5s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-lights {
|
||||
animation: glow 1.2s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
.accordion-item:has(.accordion-collapse.show) i.fas.test-icon-headphone {
|
||||
animation: pulse 1s ease-in-out infinite !important;
|
||||
}
|
||||
|
||||
/* Quick Test accordion button height reduction */
|
||||
#quickTestAccordion .accordion-button {
|
||||
padding: 0.5rem 1rem;
|
||||
}
|
||||
|
||||
/* Quick Test accordion body tint */
|
||||
#quickTestAccordion .accordion-collapse .accordion-body {
|
||||
background-color: rgba(13, 125, 253, 0.05);
|
||||
}
|
||||
|
||||
/* Skip button hover behavior */
|
||||
.skip-btn {
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease-in-out;
|
||||
}
|
||||
|
||||
.accordion-header:hover .skip-btn {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
/* Blinking animation for range calibration alert */
|
||||
@keyframes blink {
|
||||
0%, 50% { opacity: 1; }
|
||||
51%, 100% { opacity: 0.3; }
|
||||
}
|
||||
|
||||
.blink-text {
|
||||
animation: blink 1s infinite;
|
||||
}
|
||||
|
||||
/* Set text color to red for internationalized elements */
|
||||
/* .ds-i18n {
|
||||
color: red;
|
||||
} */
|
||||
|
||||
@@ -45,7 +45,7 @@ const paths = {
|
||||
'web-app-manifest-192x192.png',
|
||||
'web-app-manifest-512x512.png',
|
||||
'site.webmanifest',
|
||||
'donate.png',
|
||||
'assets/donate.png',
|
||||
'googlec4c2e36a49e62fa3.html',
|
||||
'fa.min.css'
|
||||
],
|
||||
@@ -282,11 +282,11 @@ function languages() {
|
||||
function assets() {
|
||||
if (isProduction) {
|
||||
// In production, SVGs are bundled into the HTML file, so only copy other assets
|
||||
return gulp.src(paths.src.assets, { base: '.' })
|
||||
return gulp.src(paths.src.assets, { base: '.', encoding: false })
|
||||
.pipe(gulp.dest(paths.dist));
|
||||
}
|
||||
|
||||
return gulp.src([...paths.src.assets, paths.src.svg], { base: '.' })
|
||||
return gulp.src([...paths.src.assets, paths.src.svg], { base: '.', encoding: false })
|
||||
.pipe(gulp.dest(paths.dist));
|
||||
}
|
||||
|
||||
|
||||
32
index.html
@@ -137,19 +137,33 @@
|
||||
</div>
|
||||
<br>
|
||||
|
||||
<div class="my-3 text-center mx-3" id="controller-svg-container">
|
||||
<div class="d-flex justify-content-end">
|
||||
<button type="button" class="btn btn-outline-primary ds-btn mb-3" onclick="show_quick_test_modal()" id="quick-test-btn">
|
||||
<i class="fas fa-vial" id="quick-test-icon"></i>
|
||||
<span id="quick-test-text" class="ds-i18n">Quick Test</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div class="text-center mx-3" id="controller-svg-container">
|
||||
<!-- DualSense 5 Controller SVG loaded from template -->
|
||||
<div id="controller-svg-placeholder"></div>
|
||||
</div>
|
||||
<br>
|
||||
</div>
|
||||
|
||||
<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 ds-i18n" onclick="calibrate_stick_centers()">Calibrate stick center</button>
|
||||
<button type="button" class="btn btn-primary ds-btn ds-i18n" onclick="calibrate_range()">Calibrate stick range</button>
|
||||
<button type="button" class="btn btn-primary ds-btn" onclick="ds5_finetune()" id="ds5finetune"><span class="ds-i18n">Finetune stick calibration</span> <i id="ds-i18n">(beta)</i></button>
|
||||
<button id="btnmcs" type="button" class="btn btn-outline-secondary ds-btn ds-i18n" onclick="auto_calibrate_stick_centers()">Fast calibrate stick center (OLD)</button>
|
||||
<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>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary ds-btn" onclick="ds5_finetune()" id="ds5finetune">
|
||||
3. <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 type="button" class="btn btn-danger ds-btn ds-i18n" onclick="reboot_controller()" id="resetBtn">Reboot controller</button>
|
||||
@@ -237,7 +251,7 @@
|
||||
<div class="row">
|
||||
<div class="col-lg-12 col-xl-6 py-3">
|
||||
<div class="card">
|
||||
<h5 class="card-header"><i class="fas fa-code"></i> Software</h5>
|
||||
<h5 class="card-header"><i class="fas fa-code"></i> <span class="ds-i18n">Software</span></h5>
|
||||
<div class="card-body">
|
||||
<dl class="row" id="fwinfoextra-fw"></dl>
|
||||
</div>
|
||||
@@ -245,7 +259,7 @@
|
||||
</div>
|
||||
<div class="col-lg-12 col-xl-6 py-3">
|
||||
<div class="card">
|
||||
<h5 class="card-header"><i class="fas fa-microchip"></i> Hardware</h5>
|
||||
<h5 class="card-header"><i class="fas fa-microchip"></i> <span class="ds-i18n">Hardware</span></h5>
|
||||
<div class="card-body">
|
||||
<dl class="row" id="fwinfoextra-hw"></dl>
|
||||
</div>
|
||||
@@ -304,7 +318,7 @@
|
||||
<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.17</a> (2025-09-28) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a> <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.19</a> (2025-10-18) - <a href="#" class="ds-i18n" onclick="show_donate_modal();">Support this project</a> <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>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
'use strict';
|
||||
|
||||
import { sleep, la } from './utils.js';
|
||||
import { l } from './translations.js'
|
||||
|
||||
/**
|
||||
* Controller Manager - Manages the current controller instance and provides unified interface
|
||||
@@ -8,7 +9,6 @@ import { sleep, la } from './utils.js';
|
||||
class ControllerManager {
|
||||
constructor(uiDependencies = {}) {
|
||||
this.currentController = null;
|
||||
this.l = uiDependencies.l;
|
||||
this.handleNvStatusUpdate = uiDependencies.handleNvStatusUpdate;
|
||||
this.has_changes_to_write = null;
|
||||
this.inputHandler = null; // Callback function for input processing
|
||||
@@ -64,10 +64,12 @@ class ControllerManager {
|
||||
}
|
||||
|
||||
async getDeviceInfo() {
|
||||
if (!this.currentController) return null;
|
||||
return await this.currentController.getInfo();
|
||||
}
|
||||
|
||||
getFinetuneMaxValue() {
|
||||
if (!this.currentController) return null;
|
||||
return this.currentController.getFinetuneMaxValue();
|
||||
}
|
||||
|
||||
@@ -76,6 +78,7 @@ class ControllerManager {
|
||||
* @param {Function|null} handler Input report handler function or null to clear
|
||||
*/
|
||||
setInputReportHandler(handler) {
|
||||
if (!this.currentController) return;
|
||||
this.currentController.device.oninputreport = handler;
|
||||
}
|
||||
|
||||
@@ -106,9 +109,21 @@ class ControllerManager {
|
||||
}
|
||||
|
||||
getModel() {
|
||||
if (!this.currentController) return null;
|
||||
return this.currentController.getModel();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of supported quick tests for the current controller
|
||||
* @returns {Array<string>} Array of supported test types
|
||||
*/
|
||||
getSupportedQuickTests() {
|
||||
if (!this.currentController) {
|
||||
return [];
|
||||
}
|
||||
return this.currentController.getSupportedQuickTests();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a controller is connected
|
||||
* @returns {boolean} True if controller is connected
|
||||
@@ -183,7 +198,7 @@ class ControllerManager {
|
||||
async nvsLock() {
|
||||
const res = await this.currentController.nvsLock();
|
||||
if (!res.ok) {
|
||||
throw new Error(this.l("NVS Lock failed"), { cause: res.error });
|
||||
throw new Error(l("NVS Lock failed"), { cause: res.error });
|
||||
}
|
||||
|
||||
await this.queryNvStatus(); // Refresh NVS status
|
||||
@@ -196,7 +211,7 @@ class ControllerManager {
|
||||
async calibrateSticksBegin() {
|
||||
const res = await this.currentController.calibrateSticksBegin();
|
||||
if (!res.ok) {
|
||||
throw new Error(`${this.l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
|
||||
throw new Error(`${l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -207,7 +222,7 @@ class ControllerManager {
|
||||
const res = await this.currentController.calibrateSticksSample();
|
||||
if (!res.ok) {
|
||||
await sleep(500);
|
||||
throw new Error(this.l("Stick calibration failed"), { cause: res.error });
|
||||
throw new Error(l("Stick calibration failed"), { cause: res.error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,7 +233,7 @@ class ControllerManager {
|
||||
const res = await this.currentController.calibrateSticksEnd();
|
||||
if (!res.ok) {
|
||||
await sleep(500);
|
||||
throw new Error(this.l("Stick calibration failed"), { cause: res.error });
|
||||
throw new Error(l("Stick calibration failed"), { cause: res.error });
|
||||
}
|
||||
|
||||
this.setHasChangesToWrite(true);
|
||||
@@ -230,7 +245,7 @@ class ControllerManager {
|
||||
async calibrateRangeBegin() {
|
||||
const res = await this.currentController.calibrateRangeBegin();
|
||||
if (!res.ok) {
|
||||
throw new Error(`${this.l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
|
||||
throw new Error(`${l("Stick calibration failed")}. ${res.error?.message}`, { cause: res.error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -241,7 +256,7 @@ class ControllerManager {
|
||||
const res = await this.currentController.calibrateRangeEnd();
|
||||
if(res?.ok) {
|
||||
this.setHasChangesToWrite(true);
|
||||
return { success: true, message: this.l("Range calibration completed") };
|
||||
return { success: true, message: l("Range calibration completed") };
|
||||
} else {
|
||||
// Check if the error is code 3 (DS4/DS5) or codes 4/5 (DS5 Edge), which typically means
|
||||
// the calibration was already ended or the controller is not in range calibration mode
|
||||
@@ -249,12 +264,12 @@ class ControllerManager {
|
||||
console.log("Range calibration end returned expected error code", res.code, "- treating as successful completion");
|
||||
// This is likely not an error - the calibration may have already been completed
|
||||
// or the user closed the window without starting calibration
|
||||
return { success: true, message: this.l("Range calibration window closed") };
|
||||
return { success: true };
|
||||
}
|
||||
|
||||
console.log("Range calibration end failed with unexpected error:", res);
|
||||
await sleep(500);
|
||||
const msg = res?.code ? (this.l("Range calibration failed") + this.l("Error ") + String(res.code)) : (this.l("Range calibration failed") + String(res?.error || ""));
|
||||
const msg = res?.code ? (`${l("Range calibration failed")}. ${l("Error")} ${res.code}`) : (`${l("Range calibration failed")}. ${res?.error || ""}`);
|
||||
return { success: false, message: msg, error: res?.error };
|
||||
}
|
||||
}
|
||||
@@ -286,13 +301,131 @@ class ControllerManager {
|
||||
await this.calibrateSticksEnd();
|
||||
progressCallback(100);
|
||||
|
||||
return { success: true, message: this.l("Stick calibration completed") };
|
||||
return { success: true, message: l("Stick calibration completed") };
|
||||
} catch (e) {
|
||||
la("multi_calibrate_sticks_failed", {"r": e});
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Disable left adaptive trigger effects (DS5 only)
|
||||
* @returns {Promise<Object>} Result object with success status and message
|
||||
*/
|
||||
async disableLeftAdaptiveTrigger() {
|
||||
if (!this.currentController) {
|
||||
throw new Error(l("No controller connected"));
|
||||
}
|
||||
|
||||
// Check if the controller supports adaptive triggers (DS5 only)
|
||||
if (this.getModel() !== "DS5") {
|
||||
throw new Error(l("Adaptive triggers are only supported on DualSense controllers"));
|
||||
}
|
||||
|
||||
// Check if the controller has the disableLeftAdaptiveTrigger method
|
||||
if (typeof this.currentController.disableLeftAdaptiveTrigger !== 'function') {
|
||||
throw new Error(l("Controller does not support adaptive trigger control"));
|
||||
}
|
||||
|
||||
try {
|
||||
const result = await this.currentController.disableLeftAdaptiveTrigger();
|
||||
return result;
|
||||
} catch (error) {
|
||||
throw new Error(l("Failed to disable adaptive trigger"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set left adaptive trigger with preset configurations (DS5 only)
|
||||
* @param {string} preset - Preset name: 'light', 'medium', 'heavy', 'custom'
|
||||
* @param {Object} customParams - Custom parameters for 'custom' preset {start, end, force}
|
||||
* @returns {Promise<Object>} Result object with success status and message
|
||||
*/
|
||||
async setAdaptiveTriggerPreset({left, right}/* , customParams = {} */) {
|
||||
const presets = {
|
||||
'off': { start: 0, end: 0, force: 0, mode: 'off' },
|
||||
'light': { start: 10, end: 80, force: 150, mode: 'single'},
|
||||
'medium': { start: 15, end: 100, force: 200, mode: 'single' },
|
||||
'heavy': { start: 20, end: 120, force: 255, mode: 'single' },
|
||||
// 'custom': customParams
|
||||
};
|
||||
|
||||
if (!presets[left] || !presets[right]) {
|
||||
throw new Error(`Invalid preset. Available presets: light, medium, heavy, custom. Got "${left}" and "${right}".`);
|
||||
}
|
||||
|
||||
const leftPreset = presets[left];
|
||||
const rightPreset = presets[right];
|
||||
|
||||
// if (preset === 'custom') {
|
||||
// // Validate custom parameters
|
||||
// if (typeof start !== 'number' || typeof end !== 'number' || typeof force !== 'number') {
|
||||
// throw new Error(l("Custom preset requires start, end, and force parameters"));
|
||||
// }
|
||||
// }
|
||||
|
||||
return await this.currentController?.setAdaptiveTrigger(leftPreset, rightPreset);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set vibration motors for haptic feedback (DS5 only)
|
||||
* @param {Object} options - Vibration options
|
||||
* @param {number} options.heavyLeft - Left motor intensity (0-255)
|
||||
* @param {number} options.lightRight - Right motor intensity (0-255)
|
||||
* @param {number} options.duration - Duration in milliseconds (optional)
|
||||
* @param {Function} doneCb - Callback function called when vibration ends (optional)
|
||||
*/
|
||||
async setVibration({heavyLeft, lightRight, duration = 0}, doneCb = ({success}) => {}) {
|
||||
try {
|
||||
await this.currentController.setVibration(heavyLeft, lightRight);
|
||||
|
||||
// If duration is specified, automatically turn off vibration after the duration
|
||||
if (duration > 0) {
|
||||
setTimeout(async () => {
|
||||
if(!this.currentController) return doneCb({success: true});
|
||||
await this.currentController.setVibration(0, 0); // Turn off vibration
|
||||
doneCb({success: true});
|
||||
}, duration);
|
||||
}
|
||||
} catch (error) {
|
||||
if(!this.currentController) return; // the controller was unplugged
|
||||
if(duration) doneCb({ success: false});
|
||||
throw new Error(l("Failed to set vibration"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test speaker tone (DS5 only)
|
||||
* @param {number} duration - Duration in milliseconds (optional)
|
||||
* @param {Function} doneCb - Callback function called when tone ends (optional)
|
||||
* @param {string} output - Audio output destination: "speaker" (default) or "headphones" (optional)
|
||||
*/
|
||||
async setSpeakerTone(duration = 1000, doneCb = ({success}) => {}, output = "speaker") {
|
||||
try {
|
||||
await this.currentController.setSpeakerTone(output);
|
||||
|
||||
// If duration is specified, automatically reset speaker after the duration
|
||||
if (duration > 0) {
|
||||
setTimeout(async () => {
|
||||
if(!this.currentController) return doneCb({success: true});
|
||||
// Reset speaker settings to default by calling setSpeakerTone with reset parameters
|
||||
try {
|
||||
if (this.currentController.resetSpeakerSettings) {
|
||||
await this.currentController.resetSpeakerSettings();
|
||||
}
|
||||
} catch (resetError) {
|
||||
console.warn("Failed to reset speaker settings:", resetError);
|
||||
}
|
||||
doneCb({success: true});
|
||||
}, duration);
|
||||
}
|
||||
} catch (error) {
|
||||
if(!this.currentController) return; // the controller was unplugged
|
||||
if(duration) doneCb({ success: false});
|
||||
throw new Error(l("Failed to set speaker tone"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to check if stick positions have changed
|
||||
*/
|
||||
@@ -444,7 +577,7 @@ class ControllerManager {
|
||||
*/
|
||||
_batteryPercentToText({bat_capacity, is_charging, is_error}) {
|
||||
if (is_error) {
|
||||
return '<font color="red">' + this.l("error") + '</font>';
|
||||
return '<font color="red">' + l("error") + '</font>';
|
||||
}
|
||||
|
||||
const batteryIcons = [
|
||||
|
||||
@@ -4,13 +4,10 @@
|
||||
* Base Controller class that provides common functionality for all controller types
|
||||
*/
|
||||
class BaseController {
|
||||
constructor(device, uiDependencies = {}) {
|
||||
constructor(device) {
|
||||
this.device = device;
|
||||
this.model = "undefined"; // to be set by subclasses
|
||||
this.finetuneMaxValue; // to be set by subclasses
|
||||
|
||||
// UI dependencies injected from core
|
||||
this.l = uiDependencies.l;
|
||||
}
|
||||
|
||||
getModel() {
|
||||
@@ -143,6 +140,56 @@ class BaseController {
|
||||
parseBatteryStatus(data) {
|
||||
throw new Error('parseBatteryStatus() must be implemented by subclass');
|
||||
}
|
||||
|
||||
async setAdaptiveTrigger(left, right) {
|
||||
// Default no-op implementation for controllers that don't support adaptive triggers
|
||||
return { success: true, message: "This controller does not support adaptive triggers" };
|
||||
}
|
||||
|
||||
async setVibration(heavyLeft = 0, lightRight = 0) {
|
||||
// Default no-op implementation for controllers that don't support vibration
|
||||
return { success: true, message: "This controller does not support vibration" };
|
||||
}
|
||||
|
||||
async setAdaptiveTriggerPreset(config) {
|
||||
// Default no-op implementation for controllers that don't support adaptive trigger presets
|
||||
return { success: true, message: "This controller does not support adaptive trigger presets" };
|
||||
}
|
||||
|
||||
async setSpeakerTone(output = 'speaker') {
|
||||
// Default no-op implementation for controllers that don't support speaker audio
|
||||
if (callback) callback({ success: true, message: "This controller does not support speaker audio" });
|
||||
return { success: true, message: "This controller does not support speaker audio" };
|
||||
}
|
||||
|
||||
async resetLights() {
|
||||
// Default no-op implementation for controllers that don't support controllable lights
|
||||
return { success: true, message: "This controller does not support controllable lights" };
|
||||
}
|
||||
|
||||
async setMuteLed(mode) {
|
||||
// Default no-op implementation for controllers that don't support mute LED
|
||||
return { success: true, message: "This controller does not support mute LED" };
|
||||
}
|
||||
|
||||
async setLightbarColor(r, g, b) {
|
||||
// Default no-op implementation for controllers that don't support lightbar colors
|
||||
return { success: true, message: "This controller does not support lightbar colors" };
|
||||
}
|
||||
|
||||
async setPlayerIndicator(pattern) {
|
||||
// Default no-op implementation for controllers that don't support player indicators
|
||||
return { success: true, message: "This controller does not support player indicators" };
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of supported quick tests for this controller
|
||||
* @returns {Array<string>} Array of supported test types
|
||||
*/
|
||||
getSupportedQuickTests() {
|
||||
// Default implementation - supports all tests
|
||||
return ['usb', 'buttons', 'adaptive', 'haptic', 'lights', 'speaker', 'headphone', 'microphone'];
|
||||
}
|
||||
}
|
||||
|
||||
export default BaseController;
|
||||
|
||||
@@ -21,20 +21,19 @@ class ControllerFactory {
|
||||
/**
|
||||
* Create a controller instance based on the HID device product ID
|
||||
* @param {HIDDevice} device The HID device
|
||||
* @param {Object} uiDependencies Optional UI dependencies (l function, etc.)
|
||||
* @returns {BaseController} The appropriate controller instance
|
||||
*/
|
||||
static createControllerInstance(device, uiDependencies = {}) {
|
||||
static createControllerInstance(device) {
|
||||
switch (device.productId) {
|
||||
case 0x05c4: // DS4 v1
|
||||
case 0x09cc: // DS4 v2
|
||||
return new DS4Controller(device, uiDependencies);
|
||||
return new DS4Controller(device);
|
||||
|
||||
case 0x0ce6: // DS5
|
||||
return new DS5Controller(device, uiDependencies);
|
||||
return new DS5Controller(device);
|
||||
|
||||
case 0x0df2: // DS5 Edge
|
||||
return new DS5EdgeController(device, uiDependencies);
|
||||
return new DS5EdgeController(device);
|
||||
|
||||
default:
|
||||
throw new Error(`Unsupported device: ${dec2hex(device.vendorId)}:${dec2hex(device.productId)}`);
|
||||
@@ -73,8 +72,9 @@ class ControllerFactory {
|
||||
return {
|
||||
showInfo: false,
|
||||
showFinetune: false,
|
||||
showMute: false,
|
||||
showInfoTab: false
|
||||
showInfoTab: false,
|
||||
showFourStepCalib: true,
|
||||
showQuickCalib: false
|
||||
};
|
||||
|
||||
case 0x0ce6: // DS5
|
||||
@@ -82,16 +82,18 @@ class ControllerFactory {
|
||||
return {
|
||||
showInfo: true,
|
||||
showFinetune: true,
|
||||
showMute: true,
|
||||
showInfoTab: true
|
||||
showInfoTab: true,
|
||||
showFourStepCalib: false,
|
||||
showQuickCalib: true
|
||||
};
|
||||
|
||||
default:
|
||||
return {
|
||||
showInfo: false,
|
||||
showFinetune: false,
|
||||
showMute: false,
|
||||
showInfoTab: false
|
||||
showInfoTab: false,
|
||||
showFourStepCalib: false,
|
||||
showQuickCalib: false
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,14 +1,15 @@
|
||||
'use strict';
|
||||
|
||||
import BaseController from './base-controller.js';
|
||||
import {
|
||||
sleep,
|
||||
dec2hex,
|
||||
dec2hex32,
|
||||
format_mac_from_view,
|
||||
lf,
|
||||
la
|
||||
import {
|
||||
sleep,
|
||||
buf2hex,
|
||||
dec2hex,
|
||||
dec2hex32,
|
||||
format_mac_from_view,
|
||||
la
|
||||
} 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.";
|
||||
|
||||
@@ -26,7 +27,7 @@ const DS4_BUTTON_MAP = [
|
||||
{ name: 'l2', byte: 5, mask: 0x04, svg: 'L2' }, // analog handled separately
|
||||
{ name: 'r1', byte: 5, mask: 0x02, svg: 'R1' },
|
||||
{ name: 'r2', byte: 5, mask: 0x08, svg: 'R2' }, // analog handled separately
|
||||
{ name: 'share', byte: 5, mask: 0x10, svg: 'Create' },
|
||||
{ name: 'create', byte: 5, mask: 0x10, svg: 'Create' },
|
||||
{ name: 'options', byte: 5, mask: 0x20, svg: 'Options' },
|
||||
{ name: 'l3', byte: 5, mask: 0x40, svg: 'L3' },
|
||||
{ name: 'r3', byte: 5, mask: 0x80, svg: 'R3' },
|
||||
@@ -44,13 +45,88 @@ const DS4_INPUT_CONFIG = {
|
||||
touchpadOffset: 34,
|
||||
};
|
||||
|
||||
// DS4 Output Report Constants
|
||||
const DS4_OUTPUT_REPORT = {
|
||||
USB_REPORT_ID: 0x05,
|
||||
BT_REPORT_ID: 0x11,
|
||||
};
|
||||
|
||||
const DS4_VALID_FLAG0 = {
|
||||
RUMBLE: 0x01, // Bit 0 for rumble motors
|
||||
LED: 0x02, // Bit 1 for LED control
|
||||
LED_BLINK: 0x04, // Bit 2 for LED blink control
|
||||
};
|
||||
|
||||
// Basic DS4 Output Structure for vibration and LED control
|
||||
class DS4OutputStruct {
|
||||
constructor(currentState = null) {
|
||||
// Create a 32-byte buffer for DS4 output report (USB)
|
||||
this.buffer = new ArrayBuffer(31);
|
||||
this.view = new DataView(this.buffer);
|
||||
|
||||
// Control flags
|
||||
this.validFlag0 = currentState?.validFlag0 || 0;
|
||||
this.validFlag1 = currentState?.validFlag1 || 0;
|
||||
|
||||
// Vibration motors
|
||||
this.rumbleRight = currentState?.rumbleRight || 0;
|
||||
this.rumbleLeft = currentState?.rumbleLeft || 0;
|
||||
|
||||
// LED control
|
||||
this.ledRed = currentState?.ledRed || 0;
|
||||
this.ledGreen = currentState?.ledGreen || 0;
|
||||
this.ledBlue = currentState?.ledBlue || 0;
|
||||
|
||||
// LED timing
|
||||
this.ledFlashOn = currentState?.ledFlashOn || 0;
|
||||
this.ledFlashOff = currentState?.ledFlashOff || 0;
|
||||
}
|
||||
|
||||
// Pack the data into the output buffer
|
||||
pack() {
|
||||
// Based on DS4 output report structure
|
||||
// Byte 0-2: Valid flags and padding
|
||||
this.view.setUint8(0, this.validFlag0);
|
||||
this.view.setUint8(1, this.validFlag1);
|
||||
this.view.setUint8(2, 0x00);
|
||||
|
||||
// Byte 3-4: Rumble motors
|
||||
this.view.setUint8(3, this.rumbleRight);
|
||||
this.view.setUint8(4, this.rumbleLeft);
|
||||
|
||||
// Bytes 5-7: LED RGB
|
||||
this.view.setUint8(5, this.ledRed);
|
||||
this.view.setUint8(6, this.ledGreen);
|
||||
this.view.setUint8(7, this.ledBlue);
|
||||
|
||||
// Bytes 8-9: LED flash timing
|
||||
this.view.setUint8(8, this.ledFlashOn);
|
||||
this.view.setUint8(9, this.ledFlashOff);
|
||||
|
||||
return this.buffer;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* DualShock 4 Controller implementation
|
||||
*/
|
||||
class DS4Controller extends BaseController {
|
||||
constructor(device, uiDependencies = {}) {
|
||||
super(device, uiDependencies);
|
||||
constructor(device) {
|
||||
super(device);
|
||||
this.model = "DS4";
|
||||
|
||||
// Initialize current output state to track controller settings
|
||||
this.currentOutputState = {
|
||||
validFlag0: 0,
|
||||
validFlag1: 0,
|
||||
rumbleRight: 0,
|
||||
rumbleLeft: 0,
|
||||
ledRed: 0,
|
||||
ledGreen: 0,
|
||||
ledBlue: 0,
|
||||
ledFlashOn: 0,
|
||||
ledFlashOff: 0,
|
||||
};
|
||||
}
|
||||
|
||||
getInputConfig() {
|
||||
@@ -58,14 +134,12 @@ class DS4Controller extends BaseController {
|
||||
}
|
||||
|
||||
async getInfo() {
|
||||
const { l } = this;
|
||||
|
||||
// Device-only: collect info and return a common structure; do not touch the DOM
|
||||
try {
|
||||
let deviceTypeText = l("unknown");
|
||||
let is_clone = false;
|
||||
|
||||
const view = lf("ds4_info", await this.receiveFeatureReport(0xa3));
|
||||
const view = await this.receiveFeatureReport(0xa3);
|
||||
|
||||
const cmd = view.getUint8(0, true);
|
||||
|
||||
@@ -128,9 +202,9 @@ class DS4Controller extends BaseController {
|
||||
const lockRes = await this.nvsLock();
|
||||
if(!lockRes.ok) throw (lockRes.error || new Error("NVS lock failed"));
|
||||
|
||||
return { success: true, message: this.l("Changes saved successfully") };
|
||||
return { success: true, message: l("Changes saved successfully") };
|
||||
} catch(error) {
|
||||
throw new Error(this.l("Error while saving changes"), { cause: error });
|
||||
throw new Error(l("Error while saving changes"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -143,7 +217,7 @@ class DS4Controller extends BaseController {
|
||||
}
|
||||
|
||||
async nvsLock() {
|
||||
la("ds4_nvlock");
|
||||
// la("ds4_nvlock");
|
||||
try {
|
||||
await this.sendFeatureReport(0xa0, [10,1,0]);
|
||||
return { ok: true };
|
||||
@@ -153,17 +227,17 @@ class DS4Controller extends BaseController {
|
||||
}
|
||||
|
||||
async nvsUnlock() {
|
||||
la("ds4_nvunlock");
|
||||
// la("ds4_nvunlock");
|
||||
try {
|
||||
await this.sendFeatureReport(0xa0, [10,2,0x3e,0x71,0x7f,0x89]);
|
||||
return { ok: true };
|
||||
} catch(error) {
|
||||
return { ok: false, error };
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async getBdAddr() {
|
||||
const view = lf("ds4_getbdaddr", await this.receiveFeatureReport(0x12));
|
||||
const view = await this.receiveFeatureReport(0x12);
|
||||
return format_mac_from_view(view, 1);
|
||||
}
|
||||
|
||||
@@ -182,7 +256,7 @@ class DS4Controller extends BaseController {
|
||||
la("ds4_calibrate_range_begin_failed", {"d1": d1, "d2": d2});
|
||||
return {
|
||||
ok: false,
|
||||
error: new Error(this.l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
|
||||
error: new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
|
||||
code: 1, d1, d2
|
||||
};
|
||||
}
|
||||
@@ -230,7 +304,7 @@ class DS4Controller extends BaseController {
|
||||
la("ds4_calibrate_sticks_begin_failed", {"d1": d1, "d2": d2});
|
||||
return {
|
||||
ok: false,
|
||||
error: new Error(this.l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
|
||||
error: new Error(l(NOT_GENUINE_SONY_CONTROLLER_MSG)),
|
||||
code: 1, d1, d2,
|
||||
};
|
||||
}
|
||||
@@ -288,7 +362,7 @@ class DS4Controller extends BaseController {
|
||||
async queryNvStatus() {
|
||||
try {
|
||||
await this.sendFeatureReport(0x08, [0xff,0, 12]);
|
||||
const data = lf("ds4_nvstatus", await this.receiveFeatureReport(0x11));
|
||||
const data = await this.receiveFeatureReport(0x11);
|
||||
const ret = data.getUint8(1, false);
|
||||
const res = { device: 'ds4', code: ret }
|
||||
switch(ret) {
|
||||
@@ -325,7 +399,7 @@ class DS4Controller extends BaseController {
|
||||
} else {
|
||||
if(this.isRare(hw_ver))
|
||||
return "WOW!";
|
||||
return this.l("Unknown");
|
||||
return l("Unknown");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -370,6 +444,261 @@ class DS4Controller extends BaseController {
|
||||
|
||||
return { bat_capacity, cable_connected, is_charging, is_error };
|
||||
}
|
||||
|
||||
/**
|
||||
* Send output report to the DS4 controller
|
||||
* @param {ArrayBuffer} data - The output report data
|
||||
*/
|
||||
async sendOutputReport(data, reason = "") {
|
||||
if (!this.device?.opened) {
|
||||
throw new Error('Device is not opened');
|
||||
}
|
||||
try {
|
||||
console.log(`Sending output report${ reason ? ` to ${reason}` : '' }:`, DS4_OUTPUT_REPORT.USB_REPORT_ID, buf2hex(data));
|
||||
await this.device.sendReport(DS4_OUTPUT_REPORT.USB_REPORT_ID, new Uint8Array(data));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to send output report: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the current output state with values from an OutputStruct
|
||||
* @param {DS4OutputStruct} outputStruct - The output structure to copy state from
|
||||
*/
|
||||
updateCurrentOutputState(outputStruct) {
|
||||
this.currentOutputState = { ...outputStruct };
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a copy of the current output state
|
||||
* @returns {Object} A copy of the current output state
|
||||
*/
|
||||
getCurrentOutputState() {
|
||||
return { ...this.currentOutputState };
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current output state when the controller is first connected.
|
||||
* This method sets up reasonable defaults for the DS4 controller.
|
||||
*/
|
||||
async initializeCurrentOutputState() {
|
||||
try {
|
||||
// Reset all output state to known defaults
|
||||
this.currentOutputState = {
|
||||
...this.getCurrentOutputState(),
|
||||
validFlag0: DS4_VALID_FLAG0.RUMBLE | DS4_VALID_FLAG0.LED,
|
||||
ledRed: 0,
|
||||
ledGreen: 0,
|
||||
ledBlue: 255, // Default to blue
|
||||
ledFlashOn: 0,
|
||||
ledFlashOff: 0
|
||||
};
|
||||
|
||||
// Send a "reset" output report to ensure the controller is in a known state
|
||||
const resetOutputStruct = new DS4OutputStruct(this.currentOutputState);
|
||||
await this.sendOutputReport(resetOutputStruct.pack(), 'init default states');
|
||||
|
||||
// Update our state to reflect what we just sent
|
||||
this.updateCurrentOutputState(resetOutputStruct);
|
||||
} catch (error) {
|
||||
console.warn("Failed to initialize DS4 output state:", error);
|
||||
// Even if the reset fails, we still have the default state initialized
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set vibration motors for haptic feedback
|
||||
* @param {number} heavyLeft - Left motor intensity (0-255)
|
||||
* @param {number} lightRight - Right motor intensity (0-255)
|
||||
*/
|
||||
async setVibration(heavyLeft = 0, lightRight = 0) {
|
||||
try {
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS4OutputStruct({
|
||||
...this.currentOutputState,
|
||||
rumbleLeft: Math.max(0, Math.min(255, heavyLeft)),
|
||||
rumbleRight: Math.max(0, Math.min(255, lightRight)),
|
||||
validFlag0: validFlag0 | DS4_VALID_FLAG0.RUMBLE,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set vibration');
|
||||
outputStruct.validFlag0 &= ~DS4_VALID_FLAG0.RUMBLE;
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
|
||||
return { success: true, message: "Vibration set successfully" };
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set vibration", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set lightbar color
|
||||
* @param {number} red - Red component (0-255)
|
||||
* @param {number} green - Green component (0-255)
|
||||
* @param {number} blue - Blue component (0-255)
|
||||
*/
|
||||
async setLightbarColor(red = 0, green = 0, blue = 0) {
|
||||
try {
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS4OutputStruct({
|
||||
...this.currentOutputState,
|
||||
ledRed: Math.max(0, Math.min(255, red)),
|
||||
ledGreen: Math.max(0, Math.min(255, green)),
|
||||
ledBlue: Math.max(0, Math.min(255, blue)),
|
||||
validFlag0: validFlag0 | DS4_VALID_FLAG0.LED,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set lightbar color');
|
||||
outputStruct.validFlag0 &= ~DS4_VALID_FLAG0.LED;
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set lightbar color", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set lightbar blink pattern
|
||||
* @param {number} red - Red component (0-255)
|
||||
* @param {number} green - Green component (0-255)
|
||||
* @param {number} blue - Blue component (0-255)
|
||||
* @param {number} flashOn - On duration in deciseconds (0-255)
|
||||
* @param {number} flashOff - Off duration in deciseconds (0-255)
|
||||
*/
|
||||
async setLightbarBlink(red = 0, green = 0, blue = 0, flashOn = 0, flashOff = 0) {
|
||||
try {
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS4OutputStruct({
|
||||
...this.currentOutputState,
|
||||
ledRed: Math.max(0, Math.min(255, red)),
|
||||
ledGreen: Math.max(0, Math.min(255, green)),
|
||||
ledBlue: Math.max(0, Math.min(255, blue)),
|
||||
ledFlashOn: Math.max(0, Math.min(255, flashOn)),
|
||||
ledFlashOff: Math.max(0, Math.min(255, flashOff)),
|
||||
validFlag0: validFlag0 | DS4_VALID_FLAG0.LED | DS4_VALID_FLAG0.LED_BLINK,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set lightbar blink');
|
||||
outputStruct.validFlag0 &= ~(DS4_VALID_FLAG0.LED | DS4_VALID_FLAG0.LED_BLINK);
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set lightbar blink", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set speaker tone for audio output through the controller's headphone jack
|
||||
* Note: DS4 only supports playing sound through headphones connected to the controller.
|
||||
* The built-in speaker is not supported. DS4 audio is a standard USB audio device,
|
||||
* not controlled via HID output reports.
|
||||
* @param {string} output - Audio output destination: "headphones" only (throws error if "speaker")
|
||||
* @throws {Error} If output is set to "speaker" (not supported on DS4)
|
||||
*/
|
||||
async setSpeakerTone(output = "speaker") {
|
||||
// Throw error if trying to use the built-in speaker
|
||||
if (output === "speaker") {
|
||||
throw new Error("DS4 does not support playing sound through the built-in speaker. Only 'headphones' output is supported.");
|
||||
}
|
||||
|
||||
// DS4 speaker works as a standard USB audio device (class-compliant)
|
||||
// It cannot be controlled through HID output reports like DS5
|
||||
|
||||
// Create Web Audio Context
|
||||
const audioContext = new (window.AudioContext || window.webkitAudioContext)();
|
||||
if (audioContext.state === 'suspended') {
|
||||
await audioContext.resume();
|
||||
}
|
||||
|
||||
// Try to get microphone permission to see device labels
|
||||
let hasPermission = false;
|
||||
try {
|
||||
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
||||
stream.getTracks().forEach(track => track.stop());
|
||||
hasPermission = true;
|
||||
} catch (error) {
|
||||
throw new Error('Microphone permission required to enumerate audio devices', { cause: error });
|
||||
}
|
||||
|
||||
// Check if we have access to audio devices and setSinkId support
|
||||
if (navigator.mediaDevices && navigator.mediaDevices.enumerateDevices) {
|
||||
const devices = await navigator.mediaDevices.enumerateDevices();
|
||||
const audioOutputs = devices.filter(device => device.kind === 'audiooutput');
|
||||
|
||||
// Look for DualShock 4 audio device
|
||||
const ds4AudioDevice = audioOutputs.find(device =>
|
||||
device.label && /wireless controller|dualshock|sony/i.test(device.label)
|
||||
);
|
||||
|
||||
// Create audio elements for tone generation
|
||||
const oscillator = audioContext.createOscillator();
|
||||
oscillator.type = 'sine';
|
||||
oscillator.frequency.setValueAtTime(880, audioContext.currentTime);
|
||||
|
||||
// Configure volume envelope (fade in/out to avoid clicks)
|
||||
// Use max volume for better audibility
|
||||
const gainNode = audioContext.createGain();
|
||||
gainNode.gain.setValueAtTime(0, audioContext.currentTime);
|
||||
gainNode.gain.linearRampToValueAtTime(1, audioContext.currentTime + 0.05);
|
||||
gainNode.gain.linearRampToValueAtTime(1, audioContext.currentTime + 0.5);
|
||||
gainNode.gain.linearRampToValueAtTime(0, audioContext.currentTime + 0.25);
|
||||
|
||||
// Connect audio graph
|
||||
oscillator.connect(gainNode);
|
||||
|
||||
let audioElement = null;
|
||||
|
||||
// If DS4 audio device is found and setSinkId is supported, route to it
|
||||
if (ds4AudioDevice && typeof HTMLMediaElement !== 'undefined' && HTMLMediaElement.prototype.setSinkId) {
|
||||
try {
|
||||
// Create a MediaStreamDestination to capture the audio
|
||||
const streamDestination = audioContext.createMediaStreamDestination();
|
||||
gainNode.connect(streamDestination);
|
||||
|
||||
// Create an audio element to play the stream
|
||||
audioElement = new Audio();
|
||||
audioElement.autoplay = false;
|
||||
audioElement.volume = 1.0; // Max volume
|
||||
|
||||
// Set the audio output to the DS4 speaker BEFORE setting srcObject
|
||||
await audioElement.setSinkId(ds4AudioDevice.deviceId);
|
||||
audioElement.srcObject = streamDestination.stream;
|
||||
|
||||
// Play the audio element FIRST
|
||||
await audioElement.play();
|
||||
|
||||
// THEN start the oscillator (so the stream is already being consumed)
|
||||
oscillator.start();
|
||||
oscillator.stop(audioContext.currentTime + 0.8);
|
||||
} catch (error) {
|
||||
throw new Error('Could not set DS4 as audio sink', { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
// Clean up audio context and element after tone completes
|
||||
setTimeout(() => {
|
||||
if (audioElement) {
|
||||
audioElement.pause();
|
||||
audioElement.srcObject = null;
|
||||
}
|
||||
if (audioContext.state !== 'closed') {
|
||||
audioContext.close();
|
||||
}
|
||||
}, 1000);
|
||||
} else {
|
||||
throw new Error('WebRTC getUserMedia API or mediaDevices enumeration not available.');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the list of supported quick tests for DS4 controller
|
||||
* DS4 does not support adaptive triggers, speaker, or microphone
|
||||
* @returns {Array<string>} Array of supported test types
|
||||
*/
|
||||
getSupportedQuickTests() {
|
||||
return ['usb', 'buttons', 'haptic', 'lights', 'headphone'];
|
||||
}
|
||||
}
|
||||
|
||||
export default DS4Controller;
|
||||
|
||||
@@ -10,8 +10,8 @@ import {
|
||||
format_mac_from_view,
|
||||
reverse_str,
|
||||
la,
|
||||
lf
|
||||
} from '../utils.js';
|
||||
import { l } from '../translations.js';
|
||||
|
||||
// DS5 Button mapping configuration
|
||||
const DS5_BUTTON_MAP = [
|
||||
@@ -45,6 +45,154 @@ const DS5_INPUT_CONFIG = {
|
||||
touchpadOffset: 32,
|
||||
};
|
||||
|
||||
// DS5 Adaptive Trigger Effect Modes
|
||||
const DS5_TRIGGER_EFFECT_MODE = {
|
||||
OFF: 0x00, // No effect
|
||||
RESISTANCE: 0x01, // Constant resistance
|
||||
TRIGGER: 0x02, // Single-trigger effect with release
|
||||
AUTO_TRIGGER: 0x06, // Automatic trigger with vibration
|
||||
};
|
||||
|
||||
// DS5 Output Report Constants
|
||||
const DS5_OUTPUT_REPORT = {
|
||||
USB_REPORT_ID: 0x02,
|
||||
BT_REPORT_ID: 0x31,
|
||||
}
|
||||
|
||||
const DS5_VALID_FLAG0 = {
|
||||
RIGHT_VIBRATION: 0x01, // Bit 0 for right vibration motor
|
||||
LEFT_VIBRATION: 0x02, // Bit 1 for left vibration motor
|
||||
LEFT_TRIGGER: 0x04, // Bit 2 for left adaptive trigger
|
||||
RIGHT_TRIGGER: 0x08, // Bit 3 for right adaptive trigger
|
||||
HEADPHONE_VOLUME: 0x10, // Bit 4 for headphone volume control
|
||||
SPEAKER_VOLUME: 0x20, // Bit 5 for speaker volume control
|
||||
MIC_VOLUME: 0x40, // Bit 6 for microphone volume control
|
||||
AUDIO_CONTROL: 0x80, // Bit 7 for audio control
|
||||
};
|
||||
|
||||
const DS5_VALID_FLAG1 = {
|
||||
MUTE_LED: 0x01, // Bit 0 for mute LED control
|
||||
POWER_SAVE_MUTE: 0x02, // Bit 1 for power-save mute control
|
||||
LIGHTBAR_COLOR: 0x04, // Bit 2 for lightbar color control
|
||||
RESERVED_BIT_3: 0x08, // Bit 3 (reserved)
|
||||
PLAYER_INDICATOR: 0x10, // Bit 4 for player indicator LED control
|
||||
LED_BRIGHTNESS: 0x20, // Bit 6 for LED brightness control
|
||||
LIGHTBAR_SETUP: 0x40, // Bit 6 for lightbar setup control
|
||||
RESERVED_BIT_7: 0x80, // Bit 7 (reserved)
|
||||
}
|
||||
|
||||
const DS5_VALID_FLAG2 = {
|
||||
LED_BRIGHTNESS: 0x01, // Bit 0 for LED brightness control
|
||||
LIGHTBAR_SETUP: 0x02, // Bit 1 for lightbar setup control
|
||||
};
|
||||
|
||||
// Basic DS5 Output Structure for adaptive trigger control
|
||||
class DS5OutputStruct {
|
||||
constructor(currentState = null) {
|
||||
// Create a 47-byte buffer for DS5 output report (USB)
|
||||
this.buffer = new ArrayBuffer(47);
|
||||
this.view = new DataView(this.buffer);
|
||||
|
||||
// Control flags
|
||||
this.validFlag0 = currentState.validFlag0 || 0;
|
||||
this.validFlag1 = currentState.validFlag1 || 0;
|
||||
this.validFlag2 = currentState.validFlag2 || 0;
|
||||
|
||||
// Vibration motors
|
||||
this.bcVibrationRight = currentState.bcVibrationRight || 0;
|
||||
this.bcVibrationLeft = currentState.bcVibrationLeft || 0;
|
||||
|
||||
// Audio control
|
||||
this.headphoneVolume = currentState.headphoneVolume || 0;
|
||||
this.speakerVolume = currentState.speakerVolume || 0;
|
||||
this.micVolume = currentState.micVolume || 0;
|
||||
this.audioControl = currentState.audioControl || 0;
|
||||
this.audioControl2 = currentState.audioControl2 || 0;
|
||||
|
||||
// LED and indicator control
|
||||
this.muteLedControl = currentState.muteLedControl || 0;
|
||||
this.powerSaveMuteControl = currentState.powerSaveMuteControl || 0;
|
||||
this.lightbarSetup = currentState.lightbarSetup || 0;
|
||||
this.ledBrightness = currentState.ledBrightness || 0;
|
||||
this.playerIndicator = currentState.playerIndicator || 0;
|
||||
this.ledCRed = currentState.ledCRed || 0;
|
||||
this.ledCGreen = currentState.ledCGreen || 0;
|
||||
this.ledCBlue = currentState.ledCBlue || 0;
|
||||
|
||||
// Adaptive trigger parameters
|
||||
this.adaptiveTriggerLeftMode = currentState.adaptiveTriggerLeftMode || 0;
|
||||
this.adaptiveTriggerLeftParam0 = currentState.adaptiveTriggerLeftParam0 || 0;
|
||||
this.adaptiveTriggerLeftParam1 = currentState.adaptiveTriggerLeftParam1 || 0;
|
||||
this.adaptiveTriggerLeftParam2 = currentState.adaptiveTriggerLeftParam2 || 0;
|
||||
|
||||
this.adaptiveTriggerRightMode = currentState.adaptiveTriggerRightMode || 0;
|
||||
this.adaptiveTriggerRightParam0 = currentState.adaptiveTriggerRightParam0 || 0;
|
||||
this.adaptiveTriggerRightParam1 = currentState.adaptiveTriggerRightParam1 || 0;
|
||||
this.adaptiveTriggerRightParam2 = currentState.adaptiveTriggerRightParam2 || 0;
|
||||
|
||||
// Haptic feedback
|
||||
this.hapticVolume = currentState.hapticVolume || 0;
|
||||
}
|
||||
|
||||
// Pack the data into the output buffer
|
||||
pack() {
|
||||
// Based on DS5 output report structure from HID descriptor
|
||||
// Byte 0-1: Control flags (16-bit little endian)
|
||||
this.view.setUint16(0, (this.validFlag1 << 8) | this.validFlag0, true);
|
||||
|
||||
// Byte 2-3: Vibration motors
|
||||
this.view.setUint8(2, this.bcVibrationRight);
|
||||
this.view.setUint8(3, this.bcVibrationLeft);
|
||||
|
||||
// Bytes 4-7: Audio control (reserved for now)
|
||||
this.view.setUint8(4, this.headphoneVolume);
|
||||
this.view.setUint8(5, this.speakerVolume);
|
||||
this.view.setUint8(6, this.micVolume);
|
||||
this.view.setUint8(7, this.audioControl);
|
||||
|
||||
// Byte 8: Mute LED control
|
||||
this.view.setUint8(8, this.muteLedControl);
|
||||
|
||||
// Byte 9: Reserved
|
||||
this.view.setUint8(9, 0);
|
||||
|
||||
// Bytes 10-20: Right adaptive trigger
|
||||
this.view.setUint8(10, this.adaptiveTriggerRightMode);
|
||||
this.view.setUint8(11, this.adaptiveTriggerRightParam0);
|
||||
this.view.setUint8(12, this.adaptiveTriggerRightParam1);
|
||||
this.view.setUint8(13, this.adaptiveTriggerRightParam2);
|
||||
// Additional trigger parameters (bytes 14-20 reserved for extended params)
|
||||
for (let i = 14; i <= 20; i++) {
|
||||
this.view.setUint8(i, 0);
|
||||
}
|
||||
|
||||
// Bytes 21-31: Left adaptive trigger
|
||||
this.view.setUint8(21, this.adaptiveTriggerLeftMode);
|
||||
this.view.setUint8(22, this.adaptiveTriggerLeftParam0);
|
||||
this.view.setUint8(23, this.adaptiveTriggerLeftParam1);
|
||||
this.view.setUint8(24, this.adaptiveTriggerLeftParam2);
|
||||
// Additional trigger parameters (bytes 25-31 reserved for extended params)
|
||||
for (let i = 25; i <= 31; i++) {
|
||||
this.view.setUint8(i, 0);
|
||||
}
|
||||
|
||||
// Bytes 32-42: Reserved
|
||||
for (let i = 32; i <= 42; i++) {
|
||||
this.view.setUint8(i, 0);
|
||||
}
|
||||
|
||||
// Byte 43: Player LED indicator
|
||||
this.view.setUint8(43, this.playerIndicator);
|
||||
|
||||
// Bytes 44-46: Lightbar RGB
|
||||
this.view.setUint8(44, this.ledCRed);
|
||||
this.view.setUint8(45, this.ledCGreen);
|
||||
this.view.setUint8(46, this.ledCBlue);
|
||||
|
||||
return this.buffer;
|
||||
}
|
||||
}
|
||||
|
||||
function ds5_color(x) {
|
||||
const colorMap = {
|
||||
'00': 'White',
|
||||
@@ -77,10 +225,41 @@ function ds5_color(x) {
|
||||
* DualSense (DS5) Controller implementation
|
||||
*/
|
||||
class DS5Controller extends BaseController {
|
||||
constructor(device, uiDependencies = {}) {
|
||||
super(device, uiDependencies);
|
||||
constructor(device) {
|
||||
super(device);
|
||||
this.model = "DS5";
|
||||
this.finetuneMaxValue = 65535; // 16-bit max value for DS5
|
||||
|
||||
// Initialize current output state to track controller settings
|
||||
this.currentOutputState = {
|
||||
validFlag0: 0,
|
||||
validFlag1: 0,
|
||||
validFlag2: 0,
|
||||
bcVibrationRight: 0,
|
||||
bcVibrationLeft: 0,
|
||||
headphoneVolume: 0,
|
||||
speakerVolume: 0,
|
||||
micVolume: 0,
|
||||
audioControl: 0,
|
||||
audioControl2: 0,
|
||||
muteLedControl: 0,
|
||||
powerSaveMuteControl: 0,
|
||||
lightbarSetup: 0,
|
||||
ledBrightness: 0,
|
||||
playerIndicator: 0,
|
||||
ledCRed: 0,
|
||||
ledCGreen: 0,
|
||||
ledCBlue: 0,
|
||||
adaptiveTriggerLeftMode: 0,
|
||||
adaptiveTriggerLeftParam0: 0,
|
||||
adaptiveTriggerLeftParam1: 0,
|
||||
adaptiveTriggerLeftParam2: 0,
|
||||
adaptiveTriggerRightMode: 0,
|
||||
adaptiveTriggerRightParam0: 0,
|
||||
adaptiveTriggerRightParam1: 0,
|
||||
adaptiveTriggerRightParam2: 0,
|
||||
hapticVolume: 0
|
||||
};
|
||||
}
|
||||
|
||||
getInputConfig() {
|
||||
@@ -92,11 +271,10 @@ class DS5Controller extends BaseController {
|
||||
}
|
||||
|
||||
async _getInfo(is_edge) {
|
||||
const { l } = this;
|
||||
// Device-only: collect info and return a common structure; do not touch the DOM
|
||||
try {
|
||||
console.log("Fetching DS5 info...");
|
||||
const view = lf("ds5_info", await this.receiveFeatureReport(0x20));
|
||||
const view = await this.receiveFeatureReport(0x20);
|
||||
console.log("Got DS5 info report:", buf2hex(view.buffer));
|
||||
const cmd = view.getUint8(0, true);
|
||||
if(cmd != 0x20 || view.buffer.byteLength != 64)
|
||||
@@ -135,8 +313,8 @@ class DS5Controller extends BaseController {
|
||||
{ key: l("FW Type"), value: "0x" + dec2hex(fwtype), cat: "fw", isExtra: true },
|
||||
{ key: l("FW Series"), value: "0x" + dec2hex(swseries), cat: "fw", isExtra: true },
|
||||
{ key: l("HW Model"), value: "0x" + dec2hex32(hwinfo), cat: "hw", isExtra: true },
|
||||
{ key: l("FW Version"), value: "0x" + dec2hex32(fwversion), cat: "fw" },
|
||||
{ key: l("FW Update"), value: "0x" + dec2hex(updversion), cat: "fw" },
|
||||
{ key: l("FW Version"), value: "0x" + dec2hex32(fwversion), cat: "fw", isExtra: true },
|
||||
{ key: l("FW Update"), value: "0x" + dec2hex(updversion), cat: "fw", isExtra: true },
|
||||
{ key: l("FW Update Info"), value: "0x" + dec2hex8(unk), cat: "fw", isExtra: true },
|
||||
{ key: l("SBL FW Version"), value: "0x" + dec2hex32(fwversion1), cat: "fw", isExtra: true },
|
||||
{ key: l("Venom FW Version"), value: "0x" + dec2hex32(fwversion2), cat: "fw", isExtra: true },
|
||||
@@ -155,7 +333,7 @@ class DS5Controller extends BaseController {
|
||||
|
||||
const nv = await this.queryNvStatus();
|
||||
const bd_addr = await this.getBdAddr();
|
||||
infoItems.push({ key: l("Bluetooth Address"), value: bd_addr, cat: "hw" });
|
||||
infoItems.push({ key: l("Bluetooth Address"), value: bd_addr, cat: "hw", isExtra: true });
|
||||
|
||||
const pending_reboot = (nv?.status === 'pending_reboot');
|
||||
|
||||
@@ -173,9 +351,9 @@ class DS5Controller extends BaseController {
|
||||
const lockRes = await this.nvsLock();
|
||||
if(!lockRes.ok) throw (lockRes.error || new Error("NVS lock failed"));
|
||||
|
||||
return { success: true, message: this.l("Changes saved successfully") };
|
||||
return { success: true, message: l("Changes saved successfully") };
|
||||
} catch(error) {
|
||||
throw new Error(this.l("Error while saving changes"), { cause: error });
|
||||
throw new Error(l("Error while saving changes"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -188,7 +366,7 @@ class DS5Controller extends BaseController {
|
||||
}
|
||||
|
||||
async nvsLock() {
|
||||
la("ds5_nvlock");
|
||||
// la("ds5_nvlock");
|
||||
try {
|
||||
await this.sendFeatureReport(0x80, [3,1]);
|
||||
await this.receiveFeatureReport(0x81);
|
||||
@@ -199,27 +377,27 @@ class DS5Controller extends BaseController {
|
||||
}
|
||||
|
||||
async nvsUnlock() {
|
||||
la("ds5_nvunlock");
|
||||
// la("ds5_nvunlock");
|
||||
try {
|
||||
await this.sendFeatureReport(0x80, [3,2, 101, 50, 64, 12]);
|
||||
const data = await this.receiveFeatureReport(0x81);
|
||||
} catch(error) {
|
||||
await sleep(500);
|
||||
throw new Error(this.l("NVS Unlock failed"), { cause: error });
|
||||
throw new Error(l("NVS Unlock failed"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
async getBdAddr() {
|
||||
await this.sendFeatureReport(0x80, [9,2]);
|
||||
const data = lf("ds5_getbdaddr", await this.receiveFeatureReport(0x81));
|
||||
const data = await this.receiveFeatureReport(0x81);
|
||||
return format_mac_from_view(data, 4);
|
||||
}
|
||||
|
||||
async getSystemInfo(base, num, length, decode = true) {
|
||||
await this.sendFeatureReport(128, [base,num])
|
||||
const pcba_id = lf("ds5_pcba_id", await this.receiveFeatureReport(129));
|
||||
const pcba_id = await this.receiveFeatureReport(129);
|
||||
if(pcba_id.getUint8(1) != base || pcba_id.getUint8(2) != num || pcba_id.getUint8(3) != 2) {
|
||||
return this.l("error");
|
||||
return l("error");
|
||||
}
|
||||
if(decode)
|
||||
return new TextDecoder().decode(pcba_id.buffer.slice(4, 4+length));
|
||||
@@ -333,7 +511,7 @@ class DS5Controller extends BaseController {
|
||||
async queryNvStatus() {
|
||||
try {
|
||||
await this.sendFeatureReport(0x80, [3,3]);
|
||||
const data = lf("ds5_nvstatus", await this.receiveFeatureReport(0x81));
|
||||
const data = await this.receiveFeatureReport(0x81);
|
||||
const ret = data.getUint32(1, false);
|
||||
if (ret === 0x15010100) {
|
||||
return { device: 'ds5', status: 'pending_reboot', locked: null, code: 4, raw: ret };
|
||||
@@ -355,19 +533,12 @@ class DS5Controller extends BaseController {
|
||||
|
||||
hwToBoardModel(hw_ver) {
|
||||
const a = (hw_ver >> 8) & 0xff;
|
||||
if(a == 0x03) {
|
||||
return "BDM-010";
|
||||
} else if(a == 0x04) {
|
||||
return "BDM-020";
|
||||
} else if(a == 0x05) {
|
||||
return "BDM-030";
|
||||
} else if(a == 0x06) {
|
||||
return "BDM-040";
|
||||
} else if(a == 0x07 || a == 0x08) {
|
||||
return "BDM-050";
|
||||
} else {
|
||||
return this.l("Unknown");
|
||||
}
|
||||
if(a == 0x03) return "BDM-010";
|
||||
if(a == 0x04) return "BDM-020";
|
||||
if(a == 0x05) return "BDM-030";
|
||||
if(a == 0x06) return "BDM-040";
|
||||
if(a == 0x07 || a == 0x08) return "BDM-050";
|
||||
return l("Unknown");
|
||||
}
|
||||
|
||||
async getInMemoryModuleData() {
|
||||
@@ -389,6 +560,276 @@ class DS5Controller extends BaseController {
|
||||
await this.sendFeatureReport(0x80, pkg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Send output report to the DS5 controller
|
||||
* @param {ArrayBuffer} data - The output report data
|
||||
*/
|
||||
async sendOutputReport(data, reason = "") {
|
||||
if (!this.device?.opened) {
|
||||
throw new Error('Device is not opened');
|
||||
}
|
||||
try {
|
||||
console.log(`Sending output report${ reason ? ` to ${reason}` : '' }:`, DS5_OUTPUT_REPORT.USB_REPORT_ID, buf2hex(data));
|
||||
await this.device.sendReport(DS5_OUTPUT_REPORT.USB_REPORT_ID, new Uint8Array(data));
|
||||
} catch (error) {
|
||||
throw new Error(`Failed to send output report: ${error.message}`);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the current output state with values from an OutputStruct
|
||||
* @param {DS5OutputStruct} outputStruct - The output structure to copy state from
|
||||
*/
|
||||
updateCurrentOutputState(outputStruct) {
|
||||
this.currentOutputState = { ...outputStruct };
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a copy of the current output state
|
||||
* @returns {Object} A copy of the current output state
|
||||
*/
|
||||
getCurrentOutputState() {
|
||||
return { ...this.currentOutputState };
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the current output state when the controller is first connected.
|
||||
* Since DS5 controllers don't provide a way to read the current output state,
|
||||
* this method sets up reasonable defaults and attempts to detect any current settings.
|
||||
*/
|
||||
async initializeCurrentOutputState() {
|
||||
try {
|
||||
// Reset all output state to known defaults
|
||||
this.currentOutputState = {
|
||||
...this.getCurrentOutputState(),
|
||||
validFlag1: 0b1111_0111,
|
||||
ledCRed: 0,
|
||||
ledCGreen: 0,
|
||||
ledCBlue: 255,
|
||||
};
|
||||
|
||||
// Send a "reset" output report to ensure the controller is in a known state
|
||||
// This will turn off any existing effects and set the controller to defaults
|
||||
const resetOutputStruct = new DS5OutputStruct(this.currentOutputState);
|
||||
await this.sendOutputReport(resetOutputStruct.pack(), 'init default states');
|
||||
|
||||
// Update our state to reflect what we just sent
|
||||
this.updateCurrentOutputState(resetOutputStruct);
|
||||
} catch (error) {
|
||||
console.warn("Failed to initialize DS5 output state:", error);
|
||||
// Even if the reset fails, we still have the default state initialized
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set left adaptive trigger to single-trigger mode
|
||||
*/
|
||||
async setAdaptiveTrigger(left, right) {
|
||||
try {
|
||||
const modeMap = {
|
||||
'off': DS5_TRIGGER_EFFECT_MODE.OFF,
|
||||
'single': DS5_TRIGGER_EFFECT_MODE.TRIGGER,
|
||||
'auto': DS5_TRIGGER_EFFECT_MODE.AUTO_TRIGGER,
|
||||
'resistance': DS5_TRIGGER_EFFECT_MODE.RESISTANCE,
|
||||
}
|
||||
|
||||
// Create output structure with current controller state
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
adaptiveTriggerLeftMode: modeMap[left.mode],
|
||||
adaptiveTriggerLeftParam0: left.start,
|
||||
adaptiveTriggerLeftParam1: left.end,
|
||||
adaptiveTriggerLeftParam2: left.force,
|
||||
|
||||
adaptiveTriggerRightMode: modeMap[right.mode],
|
||||
adaptiveTriggerRightParam0: right.start,
|
||||
adaptiveTriggerRightParam1: right.end,
|
||||
adaptiveTriggerRightParam2: right.force,
|
||||
|
||||
validFlag0: validFlag0 | DS5_VALID_FLAG0.LEFT_TRIGGER | DS5_VALID_FLAG0.RIGHT_TRIGGER,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set adaptive trigger mode');
|
||||
outputStruct.validFlag0 &= ~(DS5_VALID_FLAG0.LEFT_TRIGGER | DS5_VALID_FLAG0.RIGHT_TRIGGER);
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
|
||||
return { success: true };
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set left adaptive trigger mode", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set vibration motors for haptic feedback
|
||||
* @param {number} heavyLeft - Left motor intensity (0-255)
|
||||
* @param {number} lightRight - Right motor intensity (0-255)
|
||||
*/
|
||||
async setVibration(heavyLeft = 0, lightRight = 0) {
|
||||
try {
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
bcVibrationLeft: Math.max(0, Math.min(255, heavyLeft)),
|
||||
bcVibrationRight: Math.max(0, Math.min(255, lightRight)),
|
||||
validFlag0: validFlag0 | DS5_VALID_FLAG0.LEFT_VIBRATION | DS5_VALID_FLAG0.RIGHT_VIBRATION, // Update both vibration motors
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set vibration');
|
||||
outputStruct.validFlag0 &= ~(DS5_VALID_FLAG0.LEFT_VIBRATION | DS5_VALID_FLAG0.RIGHT_VIBRATION);
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set vibration", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test speaker tone by controlling speaker volume and audio settings
|
||||
* This creates a brief audio feedback through the controller's speaker or headphones
|
||||
* @param {string} output - Audio output destination: "speaker" (default) or "headphones"
|
||||
*/
|
||||
async setSpeakerTone(output = "speaker") {
|
||||
try {
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
speakerVolume: 85,
|
||||
headphoneVolume: 55,
|
||||
validFlag0: validFlag0 | DS5_VALID_FLAG0.HEADPHONE_VOLUME | DS5_VALID_FLAG0.SPEAKER_VOLUME | DS5_VALID_FLAG0.AUDIO_CONTROL,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), output === "headphones" ? 'play headphone tone' : 'play speaker tone');
|
||||
outputStruct.validFlag0 &= ~(DS5_VALID_FLAG0.HEADPHONE_VOLUME | DS5_VALID_FLAG0.SPEAKER_VOLUME | DS5_VALID_FLAG0.AUDIO_CONTROL);
|
||||
|
||||
// Send feature reports to enable audio
|
||||
if (output === "headphones") {
|
||||
// Audio configuration command for headphones
|
||||
await this.sendFeatureReport(128, [6, 4, 0, 0, 0, 0, 4, 0, 6]);
|
||||
// Enable headphone tone
|
||||
await this.sendFeatureReport(128, [6, 2, 1, 1, 0]);
|
||||
} else {
|
||||
// Audio configuration command for speakers
|
||||
await this.sendFeatureReport(128, [6, 4, 0, 0, 8]);
|
||||
// Enable speaker tone
|
||||
await this.sendFeatureReport(128, [6, 2, 1, 1, 0]);
|
||||
}
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set speaker tone", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset speaker settings to default (turn off speaker)
|
||||
*/
|
||||
async resetSpeakerSettings() {
|
||||
try {
|
||||
// Disable speaker tone first via feature report
|
||||
await this.sendFeatureReport(128, [6, 2, 0, 1, 0]);
|
||||
|
||||
const { validFlag0 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
speakerVolume: 0,
|
||||
validFlag0: validFlag0 | DS5_VALID_FLAG0.SPEAKER_VOLUME | DS5_VALID_FLAG0.AUDIO_CONTROL,
|
||||
});
|
||||
// outputStruct.audioControl = 0x00;
|
||||
await this.sendOutputReport(outputStruct.pack(), 'stop speaker tone');
|
||||
outputStruct.validFlag0 &= ~(DS5_VALID_FLAG0.SPEAKER_VOLUME | DS5_VALID_FLAG0.AUDIO_CONTROL);
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to reset speaker settings", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set lightbar color
|
||||
* @param {number} red - Red component (0-255)
|
||||
* @param {number} green - Green component (0-255)
|
||||
* @param {number} blue - Blue component (0-255)
|
||||
*/
|
||||
async setLightbarColor(red = 0, green = 0, blue = 0) {
|
||||
try {
|
||||
const { validFlag1 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
ledCRed: Math.max(0, Math.min(255, red)),
|
||||
ledCGreen: Math.max(0, Math.min(255, green)),
|
||||
ledCBlue: Math.max(0, Math.min(255, blue)),
|
||||
validFlag1: validFlag1 | DS5_VALID_FLAG1.LIGHTBAR_COLOR,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set lightbar color');
|
||||
outputStruct.validFlag1 &= ~DS5_VALID_FLAG1.LIGHTBAR_COLOR;
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set lightbar color", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set player indicator lights
|
||||
* @param {number} pattern - Player indicator pattern (0-31, each bit represents a light)
|
||||
*/
|
||||
async setPlayerIndicator(pattern = 0) {
|
||||
try {
|
||||
const { validFlag1 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
playerIndicator: Math.max(0, Math.min(31, pattern)),
|
||||
validFlag1: validFlag1 | DS5_VALID_FLAG1.PLAYER_INDICATOR,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set player indicator');
|
||||
outputStruct.validFlag1 &= ~DS5_VALID_FLAG1.PLAYER_INDICATOR;
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set player indicator", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset lights to default state (turn off)
|
||||
*/
|
||||
async resetLights() {
|
||||
try {
|
||||
await this.setLightbarColor(0, 0, 0);
|
||||
await this.setPlayerIndicator(0);
|
||||
await this.setMuteLed(0);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to reset lights", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set mute button LED state
|
||||
* @param {number} state - Mute LED state (0 = off, 1 = solid, 2 = pulsing)
|
||||
*/
|
||||
async setMuteLed(state = 0) {
|
||||
try {
|
||||
const { validFlag1 } = this.currentOutputState;
|
||||
const outputStruct = new DS5OutputStruct({
|
||||
...this.currentOutputState,
|
||||
muteLedControl: Math.max(0, Math.min(2, state)),
|
||||
validFlag1: validFlag1 | DS5_VALID_FLAG1.MUTE_LED,
|
||||
});
|
||||
await this.sendOutputReport(outputStruct.pack(), 'set mute LED');
|
||||
outputStruct.validFlag1 &= ~DS5_VALID_FLAG1.MUTE_LED;
|
||||
|
||||
// Update current state to reflect the changes
|
||||
this.updateCurrentOutputState(outputStruct);
|
||||
} catch (error) {
|
||||
throw new Error("Failed to set mute LED", { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse DS5 battery status from input data
|
||||
*/
|
||||
@@ -420,6 +861,12 @@ class DS5Controller extends BaseController {
|
||||
bat_capacity = 100;
|
||||
cable_connected = true;
|
||||
break;
|
||||
case 15:
|
||||
// Battery is flat
|
||||
bat_capacity = 0;
|
||||
is_charging = true;
|
||||
cable_connected = true;
|
||||
break;
|
||||
default:
|
||||
// Error state
|
||||
is_error = true;
|
||||
|
||||
@@ -2,20 +2,19 @@
|
||||
|
||||
import DS5Controller from './ds5-controller.js';
|
||||
import { sleep, dec2hex32, la, lf } from '../utils.js';
|
||||
import { l } from "../translations.js";
|
||||
|
||||
/**
|
||||
* DualSense Edge (DS5 Edge) Controller implementation
|
||||
*/
|
||||
class DS5EdgeController extends DS5Controller {
|
||||
constructor(device, uiDependencies = {}) {
|
||||
super(device, uiDependencies);
|
||||
constructor(device) {
|
||||
super(device);
|
||||
this.model = "DS5_Edge";
|
||||
this.finetuneMaxValue = 4095; // 12-bit max value for DS5 Edge
|
||||
}
|
||||
|
||||
async getInfo() {
|
||||
const { l } = this;
|
||||
|
||||
// DS5 Edge uses the same info structure as DS5 but with is_edge=true
|
||||
const result = await this._getInfo(true);
|
||||
|
||||
@@ -41,12 +40,12 @@ class DS5EdgeController extends DS5Controller {
|
||||
if(ret) {
|
||||
return {
|
||||
success: true,
|
||||
message: "<b>" + this.l("Changes saved successfully") + "</b>.<br><br>" + this.l("If the calibration is not stored permanently, please double-check the wirings of the hardware mod."),
|
||||
message: "<b>" + l("Changes saved successfully") + "</b>.<br><br>" + l("If the calibration is not stored permanently, please double-check the wirings of the hardware mod."),
|
||||
isHtml: true
|
||||
};
|
||||
}
|
||||
} catch(error) {
|
||||
throw new Error(this.l("Error while saving changes"), { cause: error });
|
||||
throw new Error(l("Error while saving changes"), { cause: error });
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +53,7 @@ class DS5EdgeController extends DS5Controller {
|
||||
await this.sendFeatureReport(0x80, [21,34]);
|
||||
await sleep(100);
|
||||
|
||||
const data = lf("ds5_edge_get_barcode", await this.receiveFeatureReport(0x81));
|
||||
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));
|
||||
@@ -68,7 +67,7 @@ class DS5EdgeController extends DS5Controller {
|
||||
await sleep(200);
|
||||
const ret = await this.waitUntilWritten([21, 6, 2]);
|
||||
if(!ret) {
|
||||
throw new Error(this.l("Cannot unlock") + " " + this.l(m_name));
|
||||
throw new Error(l("Cannot unlock") + " " + l(m_name));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -79,7 +78,7 @@ class DS5EdgeController extends DS5Controller {
|
||||
await sleep(200);
|
||||
const ret = await this.waitUntilWritten([21, 4, 2]);
|
||||
if(!ret) {
|
||||
throw new Error(this.l("Cannot lock") + " " + this.l(m_name));
|
||||
throw new Error(l("Cannot lock") + " " + l(m_name));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -90,7 +89,7 @@ class DS5EdgeController extends DS5Controller {
|
||||
await sleep(200);
|
||||
const ret = await this.waitUntilWritten([21, 3, 2]);
|
||||
if(!ret) {
|
||||
throw new Error(this.l("Cannot store data into") + " " + this.l(m_name));
|
||||
throw new Error(l("Cannot store data into") + " " + l(m_name));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
360
js/core.js
@@ -9,6 +9,11 @@ import { draw_stick_position, CIRCULARITY_DATA_SIZE } 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 {
|
||||
show_quick_test_modal,
|
||||
isQuickTestVisible,
|
||||
quicktest_handle_controller_input
|
||||
} from './modals/quick-test-modal.js';
|
||||
|
||||
// Application State - manages app-wide state and UI
|
||||
const app = {
|
||||
@@ -16,6 +21,8 @@ const app = {
|
||||
disable_btn: 0,
|
||||
last_disable_btn: 0,
|
||||
|
||||
shownRangeCalibrationWarning: false,
|
||||
|
||||
// Language and UI state
|
||||
lang_orig_text: {},
|
||||
lang_orig_text: {},
|
||||
@@ -96,13 +103,17 @@ function gboot() {
|
||||
});
|
||||
|
||||
await loadAllTemplates();
|
||||
await init_svg_controller();
|
||||
|
||||
initAnalyticsApi(app); // init just with gu for now
|
||||
lang_init(app, handleLanguageChange, show_welcome_modal);
|
||||
show_welcome_modal();
|
||||
|
||||
$("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());
|
||||
});
|
||||
}
|
||||
|
||||
// Since modules are deferred, DOM might already be loaded
|
||||
@@ -129,7 +140,7 @@ async function connect() {
|
||||
initAnalyticsApi(app); // init with gu and jg
|
||||
|
||||
// Initialize controller manager with translation function
|
||||
controller = initControllerManager({ l, handleNvStatusUpdate });
|
||||
controller = initControllerManager({ handleNvStatusUpdate });
|
||||
controller.setInputHandler(handleControllerInput);
|
||||
|
||||
la("begin");
|
||||
@@ -198,11 +209,12 @@ async function continue_connection({data, device}) {
|
||||
}
|
||||
|
||||
// Helper to apply basic UI visibility based on device type
|
||||
function applyDeviceUI({ showInfo, showFinetune, showMute, showInfoTab }) {
|
||||
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showFourStepCalib, showQuickCalib }) {
|
||||
$("#infoshowall").toggle(!!showInfo);
|
||||
$("#ds5finetune").toggle(!!showFinetune);
|
||||
$("#info-tab").toggle(!!showInfoTab);
|
||||
set_mute_visibility(!!showMute);
|
||||
$("#four-step-center-calib").toggle(!!showFourStepCalib);
|
||||
$("#quick-center-calib").toggle(!!showQuickCalib);
|
||||
}
|
||||
|
||||
let controllerInstance = null;
|
||||
@@ -210,13 +222,18 @@ async function continue_connection({data, device}) {
|
||||
|
||||
try {
|
||||
// Create controller instance using factory
|
||||
controllerInstance = ControllerFactory.createControllerInstance(device, { l });
|
||||
controllerInstance = ControllerFactory.createControllerInstance(device);
|
||||
controller.setControllerInstance(controllerInstance);
|
||||
|
||||
info = await controllerInstance.getInfo();
|
||||
|
||||
// Initialize output state for DS5 controllers
|
||||
if (controllerInstance.initializeCurrentOutputState) {
|
||||
await controllerInstance.initializeCurrentOutputState();
|
||||
}
|
||||
} catch (error) {
|
||||
const contextMessage = device
|
||||
? l("Connected invalid device: ") + dec2hex(device.vendorId) + ":" + dec2hex(device.productId)
|
||||
? `${l("Connected invalid device")}: ${dec2hex(device.vendorId)}:${dec2hex(device.productId)}`
|
||||
: l("Failed to connect to device");
|
||||
throw new Error(contextMessage, { cause: error });
|
||||
}
|
||||
@@ -224,7 +241,7 @@ async function continue_connection({data, device}) {
|
||||
if(!info?.ok) {
|
||||
// Not connected/failed to fetch info
|
||||
if(info) console.error(JSON.stringify(info, null, 2));
|
||||
throw new Error(l("Connected invalid device: ") + l("Error 1"), { cause: info?.error });
|
||||
throw new Error(`${l("Connected invalid device")}: ${l("Error")} 1`, { cause: info?.error });
|
||||
}
|
||||
|
||||
// Get UI configuration and device name
|
||||
@@ -250,6 +267,9 @@ async function continue_connection({data, device}) {
|
||||
|
||||
const model = controllerInstance.getModel();
|
||||
|
||||
// Initialize SVG controller based on model
|
||||
await init_svg_controller(model);
|
||||
|
||||
// Edge-specific: pending reboot check (from nv)
|
||||
if (model == "DS5_Edge" && info?.pending_reboot) {
|
||||
infoAlert(l("A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller."));
|
||||
@@ -377,23 +397,33 @@ function welcome_accepted() {
|
||||
$("#welcomeModal").modal("hide");
|
||||
}
|
||||
|
||||
async function init_svg_controller() {
|
||||
async function init_svg_controller(model) {
|
||||
const svgContainer = document.getElementById('controller-svg-placeholder');
|
||||
|
||||
// Determine which SVG to load based on controller model
|
||||
let svgFileName;
|
||||
if (model === 'DS4') {
|
||||
svgFileName = 'dualshock-controller.svg';
|
||||
} else if (model === 'DS5' || model === 'DS5_Edge') {
|
||||
svgFileName = 'dualsense-controller.svg';
|
||||
} else {
|
||||
throw new Error(`Unknown controller model: ${model}`);
|
||||
}
|
||||
|
||||
let svgContent;
|
||||
|
||||
|
||||
// Check if we have bundled assets (production mode)
|
||||
if (window.BUNDLED_ASSETS && window.BUNDLED_ASSETS.svg && window.BUNDLED_ASSETS.svg['dualshock-controller.svg']) {
|
||||
svgContent = window.BUNDLED_ASSETS.svg['dualshock-controller.svg'];
|
||||
if (window.BUNDLED_ASSETS && window.BUNDLED_ASSETS.svg && window.BUNDLED_ASSETS.svg[svgFileName]) {
|
||||
svgContent = window.BUNDLED_ASSETS.svg[svgFileName];
|
||||
} else {
|
||||
// Fallback to fetching from server (development mode)
|
||||
const response = await fetch('assets/dualshock-controller.svg');
|
||||
const response = await fetch(`assets/${svgFileName}`);
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to load controller SVG');
|
||||
throw new Error(`Failed to load controller SVG: ${svgFileName}`);
|
||||
}
|
||||
svgContent = await response.text();
|
||||
}
|
||||
|
||||
|
||||
svgContainer.innerHTML = svgContent;
|
||||
|
||||
const lightBlue = '#7ecbff';
|
||||
@@ -401,24 +431,17 @@ async function init_svg_controller() {
|
||||
const dualshock = document.getElementById('Controller');
|
||||
set_svg_group_color(dualshock, lightBlue);
|
||||
|
||||
['Button_outlines', 'L3_outline', 'R3_outline', 'Trackpad_outline'].forEach(id => {
|
||||
['Button_outlines', 'Button_outlines_behind', 'L3_outline', 'R3_outline', 'Trackpad_outline'].forEach(id => {
|
||||
const group = document.getElementById(id);
|
||||
set_svg_group_color(group, midBlue);
|
||||
});
|
||||
|
||||
['Button_infills', 'L3_infill', 'R3_infill', 'Trackpad_infill'].forEach(id => {
|
||||
['Controller_infills', 'Button_infills', 'L3_infill', 'R3_infill', 'Trackpad_infill'].forEach(id => {
|
||||
const group = document.getElementById(id);
|
||||
set_svg_group_color(group, 'white');
|
||||
});
|
||||
}
|
||||
|
||||
function set_mute_visibility(show) {
|
||||
const muteOutline = document.getElementById('Mute_outline');
|
||||
const muteInfill = document.getElementById('Mute_infill');
|
||||
if (muteOutline) muteOutline.style.display = show ? '' : 'none';
|
||||
if (muteInfill) muteInfill.style.display = show ? '' : 'none';
|
||||
}
|
||||
|
||||
/**
|
||||
* Collects circularity data for both analog sticks during testing mode.
|
||||
* This function tracks the maximum distance reached at each angular position
|
||||
@@ -490,22 +513,47 @@ function refresh_stick_pos() {
|
||||
|
||||
// Move L3 and R3 SVG elements according to stick position
|
||||
try {
|
||||
// These values are tuned for the SVG's coordinate system and visual effect
|
||||
const max_stick_offset = 25;
|
||||
// L3 center in SVG coordinates (from path: cx=295.63, cy=461.03)
|
||||
const l3_cx = 295.63, l3_cy = 461.03;
|
||||
// R3 center in SVG coordinates (from path: cx=662.06, cy=419.78)
|
||||
const r3_cx = 662.06, r3_cy = 419.78;
|
||||
switch(controller.getModel()) {
|
||||
case "DS4":
|
||||
// These values are tuned for the SVG's coordinate system and visual effect
|
||||
const ds4_max_stick_offset = 25;
|
||||
// L3 center in SVG coordinates (from path: cx=295.63, cy=461.03)
|
||||
const ds4_l3_cx = 295.63, ds4_l3_cy = 461.03;
|
||||
// R3 center in SVG coordinates (from path: cx=662.06, cy=419.78)
|
||||
const ds4_r3_cx = 662.06, ds4_r3_cy = 419.78;
|
||||
|
||||
const l3_x = l3_cx + plx * max_stick_offset;
|
||||
const l3_y = l3_cy + ply * max_stick_offset;
|
||||
const l3_group = document.querySelector('g#L3');
|
||||
l3_group?.setAttribute('transform', `translate(${l3_x - l3_cx},${l3_y - l3_cy}) scale(0.70)`);
|
||||
const ds4_l3_x = ds4_l3_cx + plx * ds4_max_stick_offset;
|
||||
const ds4_l3_y = ds4_l3_cy + ply * ds4_max_stick_offset;
|
||||
const ds4_l3_group = document.querySelector('g#L3');
|
||||
ds4_l3_group?.setAttribute('transform', `translate(${ds4_l3_x - ds4_l3_cx},${ds4_l3_y - ds4_l3_cy})`);
|
||||
|
||||
const r3_x = r3_cx + prx * max_stick_offset;
|
||||
const r3_y = r3_cy + pry * max_stick_offset;
|
||||
const r3_group = document.querySelector('g#R3');
|
||||
r3_group?.setAttribute('transform', `translate(${r3_x - r3_cx},${r3_y - r3_cy}) scale(0.70)`);
|
||||
const ds4_r3_x = ds4_r3_cx + prx * ds4_max_stick_offset;
|
||||
const ds4_r3_y = ds4_r3_cy + pry * ds4_max_stick_offset;
|
||||
const ds4_r3_group = document.querySelector('g#R3');
|
||||
ds4_r3_group?.setAttribute('transform', `translate(${ds4_r3_x - ds4_r3_cx},${ds4_r3_y - ds4_r3_cy})`);
|
||||
break;
|
||||
case "DS5":
|
||||
case "DS5_Edge":
|
||||
// These values are tuned for the SVG's coordinate system and visual effect
|
||||
const ds5_max_stick_offset = 25;
|
||||
// L3 center in SVG coordinates (from path: cx=295.63, cy=461.03)
|
||||
const ds5_l3_cx = 295.63, ds5_l3_cy = 461.03;
|
||||
// R3 center in SVG coordinates (from path: cx=662.06, cy=419.78)
|
||||
const ds5_r3_cx = 662.06, ds5_r3_cy = 419.78;
|
||||
|
||||
const ds5_l3_x = ds5_l3_cx + plx * ds5_max_stick_offset;
|
||||
const ds5_l3_y = ds5_l3_cy + ply * ds5_max_stick_offset;
|
||||
const ds5_l3_group = document.querySelector('g#L3');
|
||||
ds5_l3_group?.setAttribute('transform', `translate(${ds5_l3_x - ds5_l3_cx},${ds5_l3_y - ds5_l3_cy}) scale(0.70)`);
|
||||
|
||||
const ds5_r3_x = ds5_r3_cx + prx * ds5_max_stick_offset;
|
||||
const ds5_r3_y = ds5_r3_cy + pry * ds5_max_stick_offset;
|
||||
const ds5_r3_group = document.querySelector('g#R3');
|
||||
ds5_r3_group?.setAttribute('transform', `translate(${ds5_r3_x - ds5_r3_cx},${ds5_r3_y - ds5_r3_cy}) scale(0.70)`);
|
||||
break;
|
||||
default:
|
||||
return; // Unsupported model, skip
|
||||
}
|
||||
} catch (e) {
|
||||
// Fail silently if SVG not present
|
||||
}
|
||||
@@ -519,6 +567,17 @@ function resetStickDiagrams() {
|
||||
refresh_stick_pos();
|
||||
}
|
||||
|
||||
// Helper functions to switch display modes
|
||||
function switchTo10xZoomMode() {
|
||||
$("#centerZoomMode").prop('checked', true);
|
||||
resetStickDiagrams();
|
||||
}
|
||||
|
||||
function switchToRangeMode() {
|
||||
$("#checkCircularityMode").prop('checked', true);
|
||||
resetStickDiagrams();
|
||||
}
|
||||
|
||||
const on_stick_mode_change = () => resetStickDiagrams();
|
||||
|
||||
const throttled_refresh_sticks = (() => {
|
||||
@@ -558,6 +617,15 @@ function update_ds_button_svg(changes, BUTTON_MAP) {
|
||||
const svg = trigger.toUpperCase() + '_infill';
|
||||
const infill = document.getElementById(svg);
|
||||
set_svg_group_color(infill, color);
|
||||
|
||||
// Update percentage text
|
||||
const percentage = Math.round((val / 255) * 100);
|
||||
const percentageText = document.getElementById(trigger.toUpperCase() + '_percentage');
|
||||
if (percentageText) {
|
||||
percentageText.textContent = `${percentage} %`;
|
||||
percentageText.setAttribute('opacity', percentage > 0 ? '1' : '0');
|
||||
percentageText.setAttribute('fill', percentage < 35 ? pressedColor : 'white');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -646,10 +714,29 @@ function get_current_test_tab() {
|
||||
return activeBtn?.id || 'haptic-test-tab';
|
||||
}
|
||||
|
||||
function detectFailedRangeCalibration(changes) {
|
||||
if (!changes.sticks || app.shownRangeCalibrationWarning) return;
|
||||
|
||||
const { left, right } = changes.sticks;
|
||||
const failedCalibration = [left, right].some(({x, y}) => Math.abs(x) + Math.abs(y) == 2);
|
||||
const hasOpenModals = document.querySelectorAll('.modal.show').length > 0;
|
||||
|
||||
if (failedCalibration && !app.shownRangeCalibrationWarning && !hasOpenModals) {
|
||||
app.shownRangeCalibrationWarning = true;
|
||||
show_popup(l("Range calibration appears to have failed. Please try again and make sure you rotate the sticks."));
|
||||
}
|
||||
}
|
||||
|
||||
// Callback function to handle UI updates after controller input processing
|
||||
function handleControllerInput({ changes, inputConfig, touchPoints, batteryStatus }) {
|
||||
const { buttonMap } = inputConfig;
|
||||
|
||||
// Handle Quick Test Modal input (can be open from any tab)
|
||||
if (isQuickTestVisible()) {
|
||||
quicktest_handle_controller_input(changes);
|
||||
return;
|
||||
}
|
||||
|
||||
const current_active_tab = get_current_main_tab();
|
||||
switch (current_active_tab) {
|
||||
case 'controller-tab': // Main controller tab
|
||||
@@ -660,6 +747,7 @@ function handleControllerInput({ changes, inputConfig, touchPoints, batteryStatu
|
||||
update_stick_graphics(changes);
|
||||
update_ds_button_svg(changes, buttonMap);
|
||||
update_touchpad_circles(touchPoints);
|
||||
detectFailedRangeCalibration(changes);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -681,7 +769,7 @@ function handle_test_input(/* changes */) {
|
||||
const l2 = controller.button_states.l2_analog || 0;
|
||||
const r2 = controller.button_states.r2_analog || 0;
|
||||
if (l2 || r2) {
|
||||
trigger_haptic_motors(l2, r2);
|
||||
// trigger_haptic_motors(l2, r2);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -703,15 +791,14 @@ function update_disable_btn() {
|
||||
return;
|
||||
}
|
||||
|
||||
$(".ds-btn").prop("disabled", true);
|
||||
// Disable all buttons except Quick Test
|
||||
$(".ds-btn").not("#quick-test-btn").prop("disabled", true);
|
||||
|
||||
// show only one popup
|
||||
if(disable_btn & 1 && !(last_disable_btn & 1)) {
|
||||
show_popup(l("The device appears to be a DS4 clone. All functionalities are disabled."));
|
||||
show_popup(l("The device appears to be a clone. All calibration functionality is disabled."));
|
||||
} else if(disable_btn & 2 && !(last_disable_btn & 2)) {
|
||||
show_popup(l("This DualSense controller has outdated firmware.") + "<br>" + l("Please update the firmware and try again."), true);
|
||||
} else if(disable_btn & 4 && !(last_disable_btn & 4)) {
|
||||
show_popup(l("Please charge controller battery over 30% to use this tool."));
|
||||
}
|
||||
app.last_disable_btn = disable_btn;
|
||||
}
|
||||
@@ -762,10 +849,6 @@ function close_all_modals() {
|
||||
$('.modal.show').modal('hide'); // Close any open modals
|
||||
}
|
||||
|
||||
function set_progress(i) {
|
||||
$(".progress-bar").css('width', '' + i + '%')
|
||||
}
|
||||
|
||||
function render_info_to_dom(infoItems) {
|
||||
// Clear all info sections
|
||||
$("#fwinfo").html("");
|
||||
@@ -839,6 +922,12 @@ 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') {
|
||||
return;
|
||||
}
|
||||
|
||||
la("edge_modal");
|
||||
bootstrap.Modal.getOrCreateInstance('#edgeModal').show();
|
||||
}
|
||||
@@ -867,59 +956,6 @@ function board_model_info() {
|
||||
show_popup(l3 + "<br><br>" + l1 + " " + l2, true);
|
||||
}
|
||||
|
||||
|
||||
const trigger_haptic_motors = (() => {
|
||||
let haptic_timeout = undefined;
|
||||
let haptic_last_trigger = 0;
|
||||
|
||||
return async function(strong_motor /*left*/, weak_motor /*right*/) {
|
||||
// The DS4 contoller has a strong (left) and a weak (right) motor.
|
||||
// The DS5 emulates the same behavior, but the left and right motors are the same.
|
||||
|
||||
const now = Date.now();
|
||||
if (now - haptic_last_trigger < 200) {
|
||||
return; // Rate limited - ignore calls within 200ms
|
||||
}
|
||||
|
||||
haptic_last_trigger = now;
|
||||
|
||||
try {
|
||||
if (!controller.isConnected()) return;
|
||||
|
||||
const model = controller.getModel();
|
||||
const device = controller.getDevice();
|
||||
if (model == "DS4") {
|
||||
const data = new Uint8Array([0x05, 0x00, 0, weak_motor, strong_motor]);
|
||||
await device.sendReport(0x05, data);
|
||||
} else if (model.startsWith("DS5")) {
|
||||
const data = new Uint8Array([0x02, 0x00, weak_motor, strong_motor]);
|
||||
await device.sendReport(0x02, data);
|
||||
}
|
||||
|
||||
// Stop rumble after duration
|
||||
clearTimeout(haptic_timeout);
|
||||
haptic_timeout = setTimeout(stop_haptic_motors, 250);
|
||||
} catch(error) {
|
||||
throw new Error(l("Error triggering rumble"), { cause: error });
|
||||
}
|
||||
};
|
||||
})();
|
||||
|
||||
async function stop_haptic_motors() {
|
||||
if (!controller.isConnected()) return;
|
||||
|
||||
const model = controller.getModel();
|
||||
const device = controller.getDevice();
|
||||
if (model == "DS4") {
|
||||
const data = new Uint8Array([0x05, 0x00, 0, 0, 0]);
|
||||
await device.sendReport(0x05, data);
|
||||
} else if (model.startsWith("DS5")) {
|
||||
const data = new Uint8Array([0x02, 0x00, 0, 0]);
|
||||
await device.sendReport(0x02, data);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Alert Management Functions
|
||||
let alertCounter = 0;
|
||||
|
||||
@@ -932,79 +968,116 @@ let alertCounter = 0;
|
||||
* @returns {string} - The ID of the created alert element
|
||||
*/
|
||||
function pushAlert(message, type = 'info', duration = 0, dismissible = true) {
|
||||
const alertContainer = document.getElementById('alert-container');
|
||||
if (!alertContainer) {
|
||||
console.error('Alert container not found');
|
||||
return null;
|
||||
}
|
||||
const alertContainer = document.getElementById('alert-container');
|
||||
if (!alertContainer) {
|
||||
console.error('Alert container not found');
|
||||
return null;
|
||||
}
|
||||
|
||||
const alertId = `alert-${++alertCounter}`;
|
||||
const alertDiv = document.createElement('div');
|
||||
alertDiv.id = alertId;
|
||||
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
|
||||
alertDiv.setAttribute('role', 'alert');
|
||||
alertDiv.innerHTML = `
|
||||
${message}
|
||||
${dismissible ? '<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>' : ''}
|
||||
`;
|
||||
const alertId = `alert-${++alertCounter}`;
|
||||
const alertDiv = document.createElement('div');
|
||||
alertDiv.id = alertId;
|
||||
alertDiv.className = `alert alert-${type} alert-dismissible fade show`;
|
||||
alertDiv.setAttribute('role', 'alert');
|
||||
alertDiv.innerHTML = `
|
||||
${message}
|
||||
${dismissible ? '<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>' : ''}
|
||||
`;
|
||||
|
||||
alertContainer.appendChild(alertDiv);
|
||||
alertContainer.appendChild(alertDiv);
|
||||
|
||||
if (duration > 0) {
|
||||
setTimeout(() => {
|
||||
dismissAlert(alertId);
|
||||
}, duration);
|
||||
}
|
||||
if (duration > 0) {
|
||||
setTimeout(() => {
|
||||
dismissAlert(alertId);
|
||||
}, duration);
|
||||
}
|
||||
|
||||
return alertId;
|
||||
return alertId;
|
||||
}
|
||||
|
||||
function dismissAlert(alertId) {
|
||||
const alertElement = document.getElementById(alertId);
|
||||
if (alertElement) {
|
||||
const bsAlert = new bootstrap.Alert(alertElement);
|
||||
bsAlert.close();
|
||||
}
|
||||
const alertElement = document.getElementById(alertId);
|
||||
if (alertElement) {
|
||||
const bsAlert = new bootstrap.Alert(alertElement);
|
||||
bsAlert.close();
|
||||
}
|
||||
}
|
||||
|
||||
function clearAllAlerts() {
|
||||
const alertContainer = document.getElementById('alert-container');
|
||||
if (alertContainer) {
|
||||
const alerts = alertContainer.querySelectorAll('.alert');
|
||||
alerts.forEach(alert => {
|
||||
const bsAlert = new bootstrap.Alert(alert);
|
||||
bsAlert.close();
|
||||
});
|
||||
}
|
||||
const alertContainer = document.getElementById('alert-container');
|
||||
if (alertContainer) {
|
||||
const alerts = alertContainer.querySelectorAll('.alert');
|
||||
alerts.forEach(alert => {
|
||||
const bsAlert = new bootstrap.Alert(alert);
|
||||
bsAlert.close();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function successAlert(message, duration = 1_500) {
|
||||
return pushAlert(message, 'success', duration, false);
|
||||
return pushAlert(message, 'success', duration, false);
|
||||
}
|
||||
|
||||
function errorAlert(message, duration = 15_000) {
|
||||
return pushAlert(message, 'danger', /* duration */);
|
||||
return pushAlert(message, 'danger', /* duration */);
|
||||
}
|
||||
|
||||
function warningAlert(message, duration = 8_000) {
|
||||
return pushAlert(message, 'warning', duration);
|
||||
return pushAlert(message, 'warning', duration);
|
||||
}
|
||||
|
||||
function infoAlert(message, duration = 5_000) {
|
||||
return pushAlert(message, 'info', duration, false);
|
||||
return pushAlert(message, 'info', duration, false);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Export functions to global scope for HTML onclick handlers
|
||||
window.gboot = gboot;
|
||||
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, { resetStickDiagrams, successAlert });
|
||||
window.calibrate_stick_centers = () => calibrate_stick_centers(controller, { resetStickDiagrams, show_popup, set_progress });
|
||||
window.auto_calibrate_stick_centers = () => auto_calibrate_stick_centers(controller, { resetStickDiagrams, successAlert, set_progress });
|
||||
window.ds5_finetune = () => ds5_finetune(controller, { ll_data, rr_data, clear_circularity });
|
||||
window.calibrate_range = () => calibrate_range(
|
||||
controller,
|
||||
{ ll_data, rr_data },
|
||||
(success, message) => {
|
||||
if (success) {
|
||||
resetStickDiagrams();
|
||||
successAlert(message);
|
||||
switchToRangeMode();
|
||||
app.shownRangeCalibrationWarning = false
|
||||
}
|
||||
}
|
||||
);
|
||||
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);
|
||||
switchTo10xZoomMode();
|
||||
}
|
||||
}
|
||||
);
|
||||
window.ds5_finetune = () => ds5_finetune(
|
||||
controller,
|
||||
{ ll_data, rr_data, clear_circularity },
|
||||
(success) => success && switchToRangeMode()
|
||||
);
|
||||
window.flash_all_changes = flash_all_changes;
|
||||
window.reboot_controller = reboot_controller;
|
||||
window.refresh_nvstatus = refresh_nvstatus;
|
||||
@@ -1014,6 +1087,11 @@ 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_quick_test_modal = () => {
|
||||
show_quick_test_modal(controller).catch(error => {
|
||||
throw new Error("Failed to show quick test modal", { cause: error });
|
||||
});
|
||||
};
|
||||
|
||||
// Auto-initialize the application when the module loads
|
||||
gboot();
|
||||
@@ -8,11 +8,9 @@ import { l } from '../translations.js';
|
||||
* Handles step-by-step manual stick center calibration
|
||||
*/
|
||||
export class CalibCenterModal {
|
||||
constructor(controllerInstance, { resetStickDiagrams, successAlert, set_progress }) {
|
||||
constructor(controllerInstance, doneCallback = null) {
|
||||
this.controller = controllerInstance;
|
||||
this.resetStickDiagrams = resetStickDiagrams;
|
||||
this.successAlert = successAlert;
|
||||
this.set_progress = set_progress;
|
||||
this.doneCallback = doneCallback;
|
||||
|
||||
this._initEventListeners();
|
||||
|
||||
@@ -31,6 +29,14 @@ export class CalibCenterModal {
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Set progress bar width
|
||||
* @param {number} i - Progress percentage (0-100)
|
||||
*/
|
||||
setProgress(i) {
|
||||
$("#calib-center-progress").css('width', '' + i + '%')
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove event listeners
|
||||
*/
|
||||
@@ -103,7 +109,7 @@ export class CalibCenterModal {
|
||||
this._updateUI(6, "Stick center calibration", "Done", true);
|
||||
yield 6;
|
||||
|
||||
this._close();
|
||||
this._close(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -113,25 +119,20 @@ export class CalibCenterModal {
|
||||
if(!this.controller.isConnected())
|
||||
return;
|
||||
|
||||
this.set_progress(0);
|
||||
new bootstrap.Modal(document.getElementById('calibrateModal'), {}).show();
|
||||
this.setProgress(0);
|
||||
new bootstrap.Modal(document.getElementById('autoCalibCenterModal'), {}).show();
|
||||
|
||||
await sleep(1000);
|
||||
|
||||
// Use the controller manager's calibrateSticks method with UI progress updates
|
||||
this.set_progress(10);
|
||||
this.setProgress(10);
|
||||
|
||||
const result = await this.controller.calibrateSticks((progress) => {
|
||||
this.set_progress(progress);
|
||||
this.setProgress(progress);
|
||||
});
|
||||
|
||||
await sleep(500);
|
||||
this._close();
|
||||
this.resetStickDiagrams();
|
||||
|
||||
if (result?.message) {
|
||||
this.successAlert(result.message);
|
||||
}
|
||||
this._close(true, result?.message);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -152,7 +153,12 @@ export class CalibCenterModal {
|
||||
/**
|
||||
* Close the calibration modal
|
||||
*/
|
||||
_close() {
|
||||
_close(success = false, message = null) {
|
||||
// Call the done callback if provided
|
||||
if (this.doneCallback && typeof this.doneCallback === 'function') {
|
||||
this.doneCallback(success, message);
|
||||
}
|
||||
|
||||
$(".modal.show").modal("hide");
|
||||
}
|
||||
|
||||
@@ -180,6 +186,9 @@ export class CalibCenterModal {
|
||||
} else {
|
||||
$("#calibCross").hide();
|
||||
}
|
||||
|
||||
// Show/hide Quick calibrate button - only show on step 1 (welcome screen)
|
||||
$("#quickCalibBtn").toggle(step === 1);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,8 +225,8 @@ function destroyCurrentInstance() {
|
||||
}
|
||||
|
||||
// Legacy function exports for backward compatibility
|
||||
export async function calibrate_stick_centers(controller, dependencies) {
|
||||
currentCalibCenterInstance = new CalibCenterModal(controller, dependencies);
|
||||
export async function calibrate_stick_centers(controller, doneCallback = null) {
|
||||
currentCalibCenterInstance = new CalibCenterModal(controller, doneCallback);
|
||||
await currentCalibCenterInstance.open();
|
||||
}
|
||||
|
||||
@@ -227,11 +236,33 @@ async function calib_next() {
|
||||
}
|
||||
}
|
||||
|
||||
// Function to close current manual calibration and start auto calibration instead
|
||||
async function quick_calibrate_instead() {
|
||||
if (currentCalibCenterInstance) {
|
||||
// Get the callback from the current instance before closing
|
||||
const doneCallback = currentCalibCenterInstance.doneCallback;
|
||||
|
||||
// Close the current manual calibration modal (without calling callback)
|
||||
currentCalibCenterInstance.doneCallback = null; // Temporarily remove callback to avoid double-calling
|
||||
currentCalibCenterInstance._close();
|
||||
|
||||
// Get the controller from the current instance
|
||||
const { controller } = currentCalibCenterInstance;
|
||||
|
||||
// Destroy the current instance
|
||||
destroyCurrentInstance();
|
||||
|
||||
// Start auto calibration with the original callback
|
||||
await auto_calibrate_stick_centers(controller, {}, doneCallback);
|
||||
}
|
||||
}
|
||||
|
||||
// "Old" fully automatic stick center calibration
|
||||
export async function auto_calibrate_stick_centers(controller, dependencies) {
|
||||
currentCalibCenterInstance = new CalibCenterModal(controller, dependencies);
|
||||
export async function auto_calibrate_stick_centers(controller, doneCallback = null) {
|
||||
currentCalibCenterInstance = new CalibCenterModal(controller, doneCallback);
|
||||
await currentCalibCenterInstance.multiCalibrateSticks();
|
||||
}
|
||||
|
||||
// Legacy compatibility - expose functions to window for HTML onclick handlers
|
||||
window.calib_next = calib_next;
|
||||
window.quick_calibrate_instead = quick_calibrate_instead;
|
||||
|
||||
@@ -1,62 +1,253 @@
|
||||
'use strict';
|
||||
|
||||
import { sleep } from '../utils.js';
|
||||
import { l } from '../translations.js';
|
||||
import { CIRCULARITY_DATA_SIZE } from '../stick-renderer.js';
|
||||
|
||||
const SECONDS_UNTIL_UNLOCK = 15;
|
||||
|
||||
/**
|
||||
* Calibrate Stick Range Modal Class
|
||||
* Handles stick range calibration
|
||||
*/
|
||||
export class CalibRangeModal {
|
||||
constructor(controllerInstance, { resetStickDiagrams, successAlert }) {
|
||||
constructor(controllerInstance, { ll_data, rr_data }, doneCallback = null) {
|
||||
// Dependencies
|
||||
this.controller = controllerInstance;
|
||||
this.resetStickDiagrams = resetStickDiagrams;
|
||||
this.successAlert = successAlert;
|
||||
this.ll_data = ll_data;
|
||||
this.rr_data = rr_data;
|
||||
|
||||
// Progress tracking
|
||||
this.buttonText = l("Done");
|
||||
this.leftNonZeroCount = 0;
|
||||
this.rightNonZeroCount = 0;
|
||||
this.leftFullCycles = 0;
|
||||
this.rightFullCycles = 0;
|
||||
this.requiredFullCycles = 4;
|
||||
this.progressUpdateInterval = null;
|
||||
|
||||
// Countdown timer
|
||||
this.countdownSeconds = 0;
|
||||
this.countdownInterval = null;
|
||||
|
||||
// Progress alert enhancement
|
||||
this.leftCycleProgress = 0;
|
||||
this.rightCycleProgress = 0;
|
||||
|
||||
this.allDonePromiseResolve = undefined;
|
||||
this.doneCallback = doneCallback;
|
||||
}
|
||||
|
||||
async open() {
|
||||
if(!this.controller.isConnected())
|
||||
return;
|
||||
|
||||
$('#range-calibration-alert').hide();
|
||||
$('#keep-rotating-alert').removeClass('blink-text');
|
||||
$('#range-done-btn')
|
||||
.prop('disabled', true)
|
||||
.toggleClass('btn-primary', false)
|
||||
.toggleClass('btn-outline-primary', true);
|
||||
bootstrap.Modal.getOrCreateInstance('#rangeModal').show();
|
||||
|
||||
this.ll_data.fill(0);
|
||||
this.rr_data.fill(0);
|
||||
|
||||
this.updateProgress(); // reset progress bar
|
||||
this.startProgressMonitoring();
|
||||
|
||||
this.resetAlertEnhancement();
|
||||
this.startCountdown();
|
||||
|
||||
await sleep(1000);
|
||||
await this.controller.calibrateRangeBegin();
|
||||
}
|
||||
|
||||
async onClose() {
|
||||
async onClose() {
|
||||
this.stopProgressMonitoring();
|
||||
this.stopCountdown();
|
||||
|
||||
bootstrap.Modal.getOrCreateInstance('#rangeModal').hide();
|
||||
this.resetStickDiagrams();
|
||||
|
||||
|
||||
const result = await this.controller.calibrateRangeOnClose();
|
||||
if (result?.message) {
|
||||
this.successAlert(result.message);
|
||||
|
||||
// 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);
|
||||
}
|
||||
this.allDonePromiseResolve();
|
||||
}
|
||||
|
||||
/**
|
||||
* Start monitoring progress by checking ll_data and rr_data arrays
|
||||
*/
|
||||
startProgressMonitoring() {
|
||||
this.progressUpdateInterval = setInterval(() => {
|
||||
this.checkDataProgress();
|
||||
}, 100); // Check every 100ms
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop progress monitoring
|
||||
*/
|
||||
stopProgressMonitoring() {
|
||||
if (this.progressUpdateInterval) {
|
||||
clearInterval(this.progressUpdateInterval);
|
||||
this.progressUpdateInterval = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Start countdown timer for Done button
|
||||
*/
|
||||
startCountdown() {
|
||||
this.countdownSeconds = SECONDS_UNTIL_UNLOCK;
|
||||
this.updateCountdownButton();
|
||||
|
||||
// Every second, update countdown
|
||||
this.countdownInterval = setInterval(() => {
|
||||
this.countdownSeconds--;
|
||||
if (this.countdownSeconds <= 0 || 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();
|
||||
} else {
|
||||
this.checkAndEnhanceAlert();
|
||||
}
|
||||
this.updateCountdownButton();
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stop countdown timer
|
||||
*/
|
||||
stopCountdown() {
|
||||
if (!this.countdownInterval) return;
|
||||
|
||||
clearInterval(this.countdownInterval);
|
||||
this.countdownInterval = null;
|
||||
this.countdownSeconds = 0;
|
||||
this.updateCountdownButton();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update countdown button text and state
|
||||
*/
|
||||
updateCountdownButton() {
|
||||
const seconds = this.countdownSeconds;
|
||||
const text = this.buttonText + (seconds > 0 ? ` (${seconds})` : "");
|
||||
$('#range-done-btn').text(text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if ll_data and rr_data have received data
|
||||
*/
|
||||
checkDataProgress() {
|
||||
const JOYSTICK_EXTREME_THRESHOLD = 0.95;
|
||||
const CIRCLE_FILL_THRESHOLD = 0.95;
|
||||
|
||||
// Count the number of times the joysticks have been rotated full circle
|
||||
const leftNonZeroCount = this.ll_data.filter(v => v > JOYSTICK_EXTREME_THRESHOLD).length
|
||||
const leftFillRatio = leftNonZeroCount / CIRCULARITY_DATA_SIZE;
|
||||
if (leftFillRatio >= CIRCLE_FILL_THRESHOLD) {
|
||||
this.leftFullCycles++;
|
||||
this.ll_data.fill(0);
|
||||
}
|
||||
|
||||
const rightNonZeroCount = this.rr_data.filter(v => v > JOYSTICK_EXTREME_THRESHOLD).length;
|
||||
const rightFillRatio = rightNonZeroCount / CIRCULARITY_DATA_SIZE;
|
||||
if (rightFillRatio >= CIRCLE_FILL_THRESHOLD) {
|
||||
this.rightFullCycles++;
|
||||
this.rr_data.fill(0);
|
||||
}
|
||||
|
||||
// Update progress if counts changed
|
||||
if (leftNonZeroCount !== this.leftNonZeroCount || rightNonZeroCount !== this.rightNonZeroCount) {
|
||||
this.leftNonZeroCount = leftNonZeroCount;
|
||||
this.rightNonZeroCount = rightNonZeroCount;
|
||||
this.updateProgress();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the progress bar and enable/disable Done button
|
||||
*/
|
||||
updateProgress() {
|
||||
// Calculate progress based on full cycles completed
|
||||
// Each stick needs to complete 4 full cycles to contribute 50% to total progress
|
||||
const leftCycleProgress = Math.min(1, this.leftFullCycles / this.requiredFullCycles) * 50;
|
||||
const rightCycleProgress = Math.min(1, this.rightFullCycles / this.requiredFullCycles) * 50;
|
||||
this.leftCycleProgress = leftCycleProgress;
|
||||
this.rightCycleProgress = rightCycleProgress;
|
||||
|
||||
// Add current partial progress for visual feedback
|
||||
const leftCurrentProgress = (this.leftNonZeroCount / CIRCULARITY_DATA_SIZE) * (50 / this.requiredFullCycles);
|
||||
const rightCurrentProgress = (this.rightNonZeroCount / CIRCULARITY_DATA_SIZE) * (50 / this.requiredFullCycles);
|
||||
|
||||
const totalProgress = Math.round(
|
||||
Math.min(50, leftCycleProgress + leftCurrentProgress) +
|
||||
Math.min(50, rightCycleProgress + rightCurrentProgress)
|
||||
);
|
||||
|
||||
const $progressBar = $('#range-progress-bar');
|
||||
const $progressText = $('#range-progress-text');
|
||||
|
||||
$progressBar
|
||||
.css('width', `${totalProgress}%`)
|
||||
.attr('aria-valuenow', totalProgress);
|
||||
|
||||
$progressText.text(`${totalProgress}% (L:${this.leftFullCycles}/${this.requiredFullCycles}, R:${this.rightFullCycles}/${this.requiredFullCycles})`);
|
||||
}
|
||||
|
||||
checkAndEnhanceAlert() {
|
||||
const secondsElapsed = SECONDS_UNTIL_UNLOCK - this.countdownSeconds;
|
||||
|
||||
const alertIsVisible = $('#range-calibration-alert').is(":visible")
|
||||
const progressBelowThreshold = this.leftCycleProgress < 10 || this.rightCycleProgress < 10;
|
||||
if (secondsElapsed >= 5 && progressBelowThreshold && !alertIsVisible) {
|
||||
$('#range-calibration-alert').show();
|
||||
}
|
||||
|
||||
const isBlinking = $('#keep-rotating-alert').hasClass('blink-text');
|
||||
if (secondsElapsed >= 7 && progressBelowThreshold && !isBlinking) {
|
||||
$('#keep-rotating-alert').addClass('blink-text');
|
||||
}
|
||||
}
|
||||
|
||||
resetAlertEnhancement() {
|
||||
$('#keep-rotating-alert').removeClass('blink-text');
|
||||
}
|
||||
}
|
||||
|
||||
// Global reference to the current range calibration instance
|
||||
let currentCalibRangeInstance = null;
|
||||
|
||||
/**
|
||||
* Helper function to safely clear the current calibration instance
|
||||
*/
|
||||
function destroyCurrentInstance() {
|
||||
currentCalibRangeInstance = null;
|
||||
}
|
||||
|
||||
// Legacy function exports for backward compatibility
|
||||
export async function calibrate_range(controller, dependencies) {
|
||||
export async function calibrate_range(controller, dependencies, doneCallback = null) {
|
||||
destroyCurrentInstance(); // Clean up any existing instance
|
||||
currentCalibRangeInstance = new CalibRangeModal(controller, dependencies);
|
||||
currentCalibRangeInstance = new CalibRangeModal(controller, dependencies, doneCallback);
|
||||
|
||||
await currentCalibRangeInstance.open();
|
||||
return new Promise((resolve) => {
|
||||
currentCalibRangeInstance.allDonePromiseResolve = resolve;
|
||||
});
|
||||
}
|
||||
|
||||
async function calibrate_range_on_close() {
|
||||
if (currentCalibRangeInstance) {
|
||||
await currentCalibRangeInstance.onClose();
|
||||
destroyCurrentInstance();
|
||||
}
|
||||
}
|
||||
|
||||
// Legacy compatibility - expose functions to window for HTML onclick handlers
|
||||
// Expose functions to window for HTML onclick handlers
|
||||
window.calibrate_range_on_close = calibrate_range_on_close;
|
||||
@@ -1,9 +1,45 @@
|
||||
'use strict';
|
||||
|
||||
import { draw_stick_position } from '../stick-renderer.js';
|
||||
import { dec2hex32, float_to_str } from '../utils.js';
|
||||
import { dec2hex32, float_to_str, la } from '../utils.js';
|
||||
import { auto_calibrate_stick_centers } from './calib-center-modal.js';
|
||||
import { calibrate_range } from './calib-range-modal.js';
|
||||
|
||||
const FINETUNE_INPUT_SUFFIXES = ["LL", "LT", "RL", "RT", "LR", "LB", "RR", "RB", "LX", "LY", "RX", "RY"];
|
||||
const LEFT_AND_RIGHT = ['left', 'right'];
|
||||
|
||||
// Configuration for stick-specific operations
|
||||
const STICK_CONFIG = {
|
||||
left: {
|
||||
suffixes: ['LL', 'LT', 'LR', 'LB'],
|
||||
axisX: 'LX',
|
||||
axisY: 'LY',
|
||||
circDataName: 'll_data',
|
||||
canvasName: 'finetuneStickCanvasL'
|
||||
},
|
||||
right: {
|
||||
suffixes: ['RL', 'RT', 'RR', 'RB'],
|
||||
axisX: 'RX',
|
||||
axisY: 'RY',
|
||||
circDataName: 'rr_data',
|
||||
canvasName: 'finetuneStickCanvasR'
|
||||
}
|
||||
};
|
||||
|
||||
// Event listener configurations
|
||||
const EVENT_CONFIGS = [
|
||||
// Mode toggles
|
||||
{ selector: '#finetuneModeCenter', event: 'change', handler: (instance, e) => e.target.checked && instance.setMode('center') },
|
||||
{ selector: '#finetuneModeCircularity', event: 'change', handler: (instance, e) => e.target.checked && instance.setMode('circularity') },
|
||||
|
||||
// General controls
|
||||
{ selector: '#showRawNumbersCheckbox', event: 'change', handler: (instance) => instance._showRawNumbersChanged() },
|
||||
{ selector: '#learn-more-link', event: 'click', handler: (instance, e) => { e.preventDefault(); $('#learn-more-link').hide(); $('#learn-more-text').show(); } },
|
||||
{ selector: '.dropdown-item[data-step]', event: 'click', handler: (instance, e) => { e.preventDefault(); instance.stepSize = parseInt($(e.target).data('step')); } },
|
||||
|
||||
// Modal events
|
||||
{ selector: '#finetuneModal', event: 'hidden.bs.modal', handler: (instance) => instance._onModalHidden() }
|
||||
];
|
||||
|
||||
/**
|
||||
* DS5 Finetuning Class
|
||||
@@ -13,27 +49,52 @@ export class Finetune {
|
||||
constructor() {
|
||||
this._mode = 'center'; // 'center' or 'circularity'
|
||||
this.original_data = [];
|
||||
this.last_written_data = [];
|
||||
this.active_stick = null; // 'left', 'right', or null
|
||||
this._centerStepSize = 5; // Default step size for center mode
|
||||
this._circularityStepSize = 5; // Default step size for circularity mode
|
||||
|
||||
this.isQuickCalibrating = false; // Prevents dialog destruction during quick calibration
|
||||
|
||||
// Dependencies
|
||||
this.controller = null;
|
||||
this.ll_data = null;
|
||||
this.rr_data = null;
|
||||
this.clearCircularity = null;
|
||||
|
||||
this.doneCallback = null;
|
||||
|
||||
// Closure functions
|
||||
this.refresh_finetune_sticks = this._createRefreshSticksThrottled();
|
||||
this.update_finetune_warning_messages = this._createUpdateWarningMessagesClosure();
|
||||
this.flash_finetune_warning = this._createFlashWarningClosure();
|
||||
|
||||
|
||||
// Continuous adjustment state
|
||||
this.continuous_adjustment = {
|
||||
initial_delay: null,
|
||||
repeat_delay: null,
|
||||
};
|
||||
|
||||
// Track previous slider values for incremental adjustments
|
||||
this._previousSliderValues = {
|
||||
left: 0,
|
||||
right: 0
|
||||
};
|
||||
|
||||
// Store the values of the input fields when slider adjustment starts
|
||||
this._inputStartValuesForSlider = {
|
||||
left: null,
|
||||
right: null
|
||||
};
|
||||
|
||||
// Track slider usage state for undo functionality
|
||||
this._sliderUsed = {
|
||||
left: false,
|
||||
right: false
|
||||
};
|
||||
|
||||
// Track previous axis values for stopping continuous adjustment
|
||||
this._previousAxisValues = {
|
||||
left: { x: 0, y: 0 },
|
||||
right: { x: 0, y: 0 }
|
||||
};
|
||||
}
|
||||
|
||||
get mode() {
|
||||
@@ -62,16 +123,19 @@ export class Finetune {
|
||||
this._saveStepSizeToLocalStorage();
|
||||
}
|
||||
|
||||
async init(controllerInstance, { ll_data, rr_data, clear_circularity }) {
|
||||
async init(controllerInstance, { ll_data, rr_data, clear_circularity }, doneCallback = null) {
|
||||
la("finetune_modal_open");
|
||||
|
||||
this.controller = controllerInstance;
|
||||
this.ll_data = ll_data;
|
||||
this.rr_data = rr_data;
|
||||
this.clearCircularity = clear_circularity;
|
||||
this.doneCallback = doneCallback;
|
||||
|
||||
this._initEventListeners();
|
||||
this._restoreShowRawNumbersCheckbox();
|
||||
this._restoreStepSizeFromLocalStorage();
|
||||
|
||||
|
||||
// Lock NVS before
|
||||
const nv = await this.controller.queryNvStatus();
|
||||
if(!nv.locked) {
|
||||
@@ -94,12 +158,7 @@ export class Finetune {
|
||||
const modal = new bootstrap.Modal(document.getElementById('finetuneModal'), {})
|
||||
modal.show();
|
||||
|
||||
const maxValue = this.controller.getFinetuneMaxValue();
|
||||
FINETUNE_INPUT_SUFFIXES.forEach((suffix, i) => {
|
||||
const el = $("#finetune" + suffix);
|
||||
el.attr('max', maxValue);
|
||||
el.val(data[i]);
|
||||
});
|
||||
this._initializeFinetuneInputs(data);
|
||||
|
||||
// Start in center mode
|
||||
this.setMode('center');
|
||||
@@ -110,6 +169,13 @@ export class Finetune {
|
||||
|
||||
this.original_data = data;
|
||||
|
||||
// Update error slack button states
|
||||
this._updateErrorSlackButtonStates();
|
||||
|
||||
// Reset the Learn More link
|
||||
$('#learn-more-link').show();
|
||||
$('#learn-more-text').hide();
|
||||
|
||||
this.refresh_finetune_sticks();
|
||||
}
|
||||
|
||||
@@ -117,46 +183,70 @@ export class Finetune {
|
||||
* Initialize event listeners for the finetune modal
|
||||
*/
|
||||
_initEventListeners() {
|
||||
// Initialize finetune input listeners
|
||||
FINETUNE_INPUT_SUFFIXES.forEach((suffix) => {
|
||||
$("#finetune" + suffix).on('change', () => this._onFinetuneChange());
|
||||
});
|
||||
|
||||
// Set up mode toggle event listeners
|
||||
$("#finetuneModeCenter").on('change', (e) => {
|
||||
if (e.target.checked) {
|
||||
this.setMode('center');
|
||||
}
|
||||
// Initialize general event listeners
|
||||
EVENT_CONFIGS.forEach(config => {
|
||||
$(config.selector).on(config.event, (e) => config.handler(this, e));
|
||||
});
|
||||
|
||||
$("#finetuneModeCircularity").on('change', (e) => {
|
||||
if (e.target.checked) {
|
||||
this.setMode('circularity');
|
||||
}
|
||||
// Initialize stick-specific event listeners
|
||||
this._initStickEventListeners();
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize stick-specific event listeners (left and right)
|
||||
*/
|
||||
_initStickEventListeners() {
|
||||
LEFT_AND_RIGHT.forEach(lOrR => {
|
||||
$(`#${lOrR}-stick-card`).on('click', () => {
|
||||
this.setStickToFinetune(lOrR);
|
||||
});
|
||||
|
||||
this._initSliderListeners(lOrR);
|
||||
this._initButtonListeners(lOrR);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize slider event listeners for a specific stick
|
||||
*/
|
||||
_initSliderListeners(lOrR) {
|
||||
const sliderId = `#${lOrR}CircularitySlider`;
|
||||
|
||||
$(sliderId).on('input', (e) => {
|
||||
this._onCircularitySliderChange(lOrR, parseInt(e.target.value));
|
||||
});
|
||||
|
||||
$("#showRawNumbersCheckbox").on('change', () => {
|
||||
this._showRawNumbersChanged();
|
||||
$(sliderId).on('mousedown touchstart', (e) => {
|
||||
this._onCircularitySliderStart(lOrR, parseInt(e.target.value));
|
||||
});
|
||||
|
||||
$("#left-stick-card").on('click', () => {
|
||||
console.log("Left stick card clicked");
|
||||
this.setStickToFinetune('left');
|
||||
$(sliderId).on('change', (e) => {
|
||||
this._onCircularitySliderRelease(lOrR);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize button event listeners for a specific stick
|
||||
*/
|
||||
_initButtonListeners(lOrR) {
|
||||
// Reset button
|
||||
$(`#${lOrR}CircularityResetBtn`).on('click', () => {
|
||||
this._resetCircularitySlider(lOrR);
|
||||
});
|
||||
|
||||
$("#right-stick-card").on('click', () => {
|
||||
this.setStickToFinetune('right');
|
||||
// Error slack button
|
||||
$(`#${lOrR}ErrorSlackBtn`).on('click', () => {
|
||||
this._onErrorSlackButtonClick(lOrR);
|
||||
});
|
||||
|
||||
$('#finetuneModal').on('hidden.bs.modal', () => {
|
||||
console.log("Finetune modal hidden event triggered");
|
||||
destroyCurrentInstance();
|
||||
});
|
||||
|
||||
// Step size dropdown event listeners
|
||||
$('.dropdown-item[data-step]').on('click', (e) => {
|
||||
e.preventDefault();
|
||||
const stepSize = parseInt($(e.target).data('step'));
|
||||
this.stepSize = stepSize;
|
||||
// Error slack undo button
|
||||
$(`#${lOrR}ErrorSlackUndoBtn`).on('click', () => {
|
||||
this._onErrorSlackUndoButtonClick(lOrR);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -164,21 +254,58 @@ export class Finetune {
|
||||
* Clean up event listeners for the finetune modal
|
||||
*/
|
||||
removeEventListeners() {
|
||||
// Remove finetune input listeners
|
||||
FINETUNE_INPUT_SUFFIXES.forEach((suffix) => {
|
||||
$("#finetune" + suffix).off('change');
|
||||
});
|
||||
|
||||
// Remove mode toggle event listeners
|
||||
$("#finetuneModeCenter").off('change');
|
||||
$("#finetuneModeCircularity").off('change');
|
||||
// Remove general event listeners
|
||||
EVENT_CONFIGS.forEach(config => {
|
||||
$(config.selector).off(config.event);
|
||||
});
|
||||
|
||||
// Remove other event listeners
|
||||
$("#showRawNumbersCheckbox").off('change');
|
||||
$("#left-stick-card").off('click');
|
||||
$("#right-stick-card").off('click');
|
||||
// Remove stick-specific event listeners
|
||||
this._removeStickEventListeners();
|
||||
}
|
||||
|
||||
$('#finetuneModal').off('hidden.bs.modal');
|
||||
$('.dropdown-item[data-step]').off('click');
|
||||
/**
|
||||
* Remove stick-specific event listeners
|
||||
*/
|
||||
_removeStickEventListeners() {
|
||||
LEFT_AND_RIGHT.forEach(lOrR => {
|
||||
// Remove stick card listeners
|
||||
$(`#${lOrR}-stick-card`).off('click');
|
||||
|
||||
// Remove slider listeners
|
||||
const sliderId = `#${lOrR}CircularitySlider`;
|
||||
$(sliderId).off('input mousedown touchstart change');
|
||||
|
||||
// Remove button listeners
|
||||
$(`#${lOrR}CircularityResetBtn`).off('click');
|
||||
$(`#${lOrR}ErrorSlackBtn`).off('click');
|
||||
$(`#${lOrR}ErrorSlackUndoBtn`).off('click');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle modal hidden event
|
||||
*/
|
||||
_onModalHidden() {
|
||||
console.log("Finetune modal hidden event triggered");
|
||||
|
||||
// Don't destroy the instance if quick calibration is in progress
|
||||
if (this.isQuickCalibrating) {
|
||||
console.log("Quick calibration in progress, preventing dialog destruction");
|
||||
return;
|
||||
}
|
||||
|
||||
// Reset circularity sliders to zero when modal closes
|
||||
LEFT_AND_RIGHT.forEach(lOrR => {
|
||||
$(`#${lOrR}CircularitySlider`).val(0);
|
||||
this._sliderUsed[lOrR] = false;
|
||||
});
|
||||
|
||||
destroyCurrentInstance();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -216,6 +343,26 @@ export class Finetune {
|
||||
}
|
||||
}
|
||||
|
||||
/* Set the quick calibrating state to prevent dialog destruction
|
||||
* @param {boolean} isCalibrating - Whether quick calibration is in progress
|
||||
*/
|
||||
setQuickCalibrating(isCalibrating) {
|
||||
this.isQuickCalibrating = isCalibrating;
|
||||
const finetuneModal = bootstrap.Modal.getInstance('#finetuneModal');
|
||||
finetuneModal.toggle(!isCalibrating);
|
||||
|
||||
if(!isCalibrating) {
|
||||
this.clearCircularity();
|
||||
|
||||
// Refresh the finetune data after calibration
|
||||
this._readFinetuneData().then((data) => {
|
||||
this._initializeFinetuneInputs(data);
|
||||
this.refresh_finetune_sticks();
|
||||
console.log('Finetune modal refreshed');
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Save finetune changes
|
||||
*/
|
||||
@@ -223,7 +370,7 @@ export class Finetune {
|
||||
// Unlock save button
|
||||
this.controller.setHasChangesToWrite(true);
|
||||
|
||||
this._close();
|
||||
this._close(true);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -233,21 +380,31 @@ export class Finetune {
|
||||
if(this.original_data.length == 12)
|
||||
await this._writeFinetuneData(this.original_data)
|
||||
|
||||
this._close();
|
||||
this._close(false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the finetune mode
|
||||
*/
|
||||
setMode(mode) {
|
||||
this.mode = mode;
|
||||
this._mode = mode;
|
||||
this._updateUI();
|
||||
|
||||
// Reset toggle states when switching modes
|
||||
if (mode === 'center') {
|
||||
LEFT_AND_RIGHT.forEach(lOrR => {
|
||||
$(`#${lOrR}-stick-card`).removeClass('show-slider');
|
||||
this._sliderUsed[lOrR] = false;
|
||||
this._showErrorSlackButton(lOrR);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set which stick to finetune
|
||||
*/
|
||||
setStickToFinetune(stick) {
|
||||
if(this.active_stick === stick) {
|
||||
setStickToFinetune(lOrR) {
|
||||
if(this.active_stick === lOrR) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -255,9 +412,15 @@ export class Finetune {
|
||||
this.stopContinuousDpadAdjustment();
|
||||
this._clearFinetuneAxisHighlights();
|
||||
|
||||
this.active_stick = stick;
|
||||
// Hide slider on the previously active stick (when it becomes inactive)
|
||||
if (this.active_stick && this._mode === 'circularity') {
|
||||
const previousStickCard = $(`#${this.active_stick}-stick-card`);
|
||||
previousStickCard.removeClass('show-slider');
|
||||
}
|
||||
|
||||
const other_stick = stick === 'left' ? 'right' : 'left';
|
||||
this.active_stick = lOrR;
|
||||
|
||||
const other_stick = lOrR === 'left' ? 'right' : 'left';
|
||||
$(`#${this.active_stick}-stick-card`).addClass("stick-card-active");
|
||||
$(`#${other_stick}-stick-card`).removeClass("stick-card-active");
|
||||
}
|
||||
@@ -275,6 +438,19 @@ export class Finetune {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize finetune input fields with data and max values
|
||||
* @param {Array} data - Array of finetune values
|
||||
*/
|
||||
_initializeFinetuneInputs(data) {
|
||||
const maxValue = this.controller.getFinetuneMaxValue();
|
||||
FINETUNE_INPUT_SUFFIXES.forEach((suffix, i) => {
|
||||
$("#finetune" + suffix)
|
||||
.attr('max', maxValue)
|
||||
.val(data[i]);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if stick is in extreme position (close to edges)
|
||||
* @param {Object} stick - Stick object with x and y properties
|
||||
@@ -301,6 +477,9 @@ export class Finetune {
|
||||
|
||||
// Update step size UI when mode changes
|
||||
this._updateStepSizeUI();
|
||||
|
||||
// Update error slack button states when mode changes
|
||||
this._updateErrorSlackButtonStates();
|
||||
}
|
||||
|
||||
async _onFinetuneChange() {
|
||||
@@ -318,7 +497,6 @@ export class Finetune {
|
||||
throw new Error("ERROR: Cannot read calibration data");
|
||||
}
|
||||
|
||||
this.last_written_data = data;
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -327,13 +505,6 @@ export class Finetune {
|
||||
return;
|
||||
}
|
||||
|
||||
// const deepEqual = (a, b) => JSON.stringify(a) === JSON.stringify(b);
|
||||
// if (deepEqual(data, this.last_written_data)) {
|
||||
// if (data == this.last_written_data) { //mm this will never be true, but fixing it (per above) breaks Edge writes
|
||||
// return;
|
||||
// }
|
||||
|
||||
this.last_written_data = data
|
||||
if (this.controller.isConnected()) {
|
||||
await this.controller.writeFinetuneData(data);
|
||||
}
|
||||
@@ -346,12 +517,17 @@ export class Finetune {
|
||||
if (timeout) return;
|
||||
|
||||
timeout = setTimeout(() => {
|
||||
const { left, right } = this.controller.button_states.sticks;
|
||||
this._ds5FinetuneUpdate("finetuneStickCanvasL", left.x, left.y);
|
||||
this._ds5FinetuneUpdate("finetuneStickCanvasR", right.x, right.y);
|
||||
const sticks = this.controller.button_states.sticks;
|
||||
|
||||
// Update both stick displays using configuration
|
||||
Object.entries(STICK_CONFIG).forEach(([stick, config]) => {
|
||||
const stickData = sticks[stick];
|
||||
this._ds5FinetuneUpdate(config.canvasName, stickData.x, stickData.y);
|
||||
});
|
||||
|
||||
this.update_finetune_warning_messages();
|
||||
this._highlightActiveFinetuneAxis();
|
||||
this._updateErrorSlackButtonStates();
|
||||
|
||||
timeout = null;
|
||||
}, 10);
|
||||
@@ -359,7 +535,7 @@ export class Finetune {
|
||||
}
|
||||
|
||||
_createUpdateWarningMessagesClosure() {
|
||||
let timeout = null; // to stop unnecessary flicker in center mode
|
||||
let timeout = null; // to prevent unnecessary flicker
|
||||
|
||||
return () => {
|
||||
if(!this.active_stick) return;
|
||||
@@ -380,10 +556,18 @@ export class Finetune {
|
||||
}
|
||||
|
||||
if (this._mode === 'circularity') {
|
||||
// Check if stick is in extreme position (close to edges)
|
||||
const isInExtremePosition = this._isStickInExtremePosition(currentStick);
|
||||
$('#finetuneCircularitySuccess').toggle(isInExtremePosition);
|
||||
$('#finetuneCircularityWarning').toggle(!isInExtremePosition);
|
||||
if(!isInExtremePosition && timeout) return;
|
||||
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(() => {
|
||||
timeout = null;
|
||||
if(this._mode !== 'circularity') return; // in case it changed during timeout
|
||||
|
||||
// Check if stick is in extreme position (close to edges)
|
||||
$('#finetuneCircularitySuccess').toggle(isInExtremePosition);
|
||||
$('#finetuneCircularityWarning').toggle(!isInExtremePosition);
|
||||
}, isInExtremePosition ? 0 : 200);
|
||||
}
|
||||
};
|
||||
}
|
||||
@@ -445,19 +629,22 @@ export class Finetune {
|
||||
|
||||
const ctx = c.getContext("2d");
|
||||
|
||||
const margins = showRawNumbers ? 15 : 5;
|
||||
const margins = 5;
|
||||
const radius = c.width / 2 - margins;
|
||||
const sz = c.width/2 - margins;
|
||||
const hb = radius + margins;
|
||||
const yb = radius + margins;
|
||||
ctx.clearRect(0, 0, c.width, c.height);
|
||||
|
||||
const isLeftStick = name === "finetuneStickCanvasL";
|
||||
const highlight = this.active_stick == (isLeftStick ? 'left' : 'right') && this._isDpadAdjustmentActive();
|
||||
// Determine which stick this is using configuration
|
||||
const lOrR = this._getStickFromCanvasName(name);
|
||||
const highlight = this.active_stick === lOrR && this._isDpadAdjustmentActive();
|
||||
|
||||
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, {
|
||||
circularity_data: isLeftStick ? this.ll_data : this.rr_data,
|
||||
circularity_data: circularityData,
|
||||
highlight
|
||||
});
|
||||
} else {
|
||||
@@ -472,6 +659,15 @@ export class Finetune {
|
||||
$("#"+ name + "y-lbl").text(float_to_str(ply, 3));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get lOrR from canvas name using configuration
|
||||
*/
|
||||
_getStickFromCanvasName(canvasName) {
|
||||
return LEFT_AND_RIGHT.find(lOrR =>
|
||||
STICK_CONFIG[lOrR].canvasName === canvasName
|
||||
);
|
||||
}
|
||||
|
||||
_showRawNumbersChanged() {
|
||||
const showRawNumbers = $("#showRawNumbersCheckbox").is(":checked");
|
||||
const modal = $("#finetuneModal");
|
||||
@@ -481,8 +677,14 @@ export class Finetune {
|
||||
this.refresh_finetune_sticks();
|
||||
}
|
||||
|
||||
_close() {
|
||||
_close(success = false, message = null) {
|
||||
console.log("Closing finetune modal");
|
||||
|
||||
// Call the done callback if provided
|
||||
if (this.doneCallback && typeof this.doneCallback === 'function') {
|
||||
this.doneCallback(success, message);
|
||||
}
|
||||
|
||||
$("#finetuneModal").modal("hide");
|
||||
}
|
||||
|
||||
@@ -538,23 +740,19 @@ export class Finetune {
|
||||
return null;
|
||||
}
|
||||
|
||||
// Circularity mode: map quadrants to specific calibration points
|
||||
if (stick === 'left') {
|
||||
switch (quadrant) {
|
||||
case 'left': return "LL";
|
||||
case 'up': return "LT";
|
||||
case 'right': return "LR";
|
||||
case 'down': return "LB";
|
||||
}
|
||||
} else if (stick === 'right') {
|
||||
switch (quadrant) {
|
||||
case 'left': return "RL";
|
||||
case 'up': return "RT";
|
||||
case 'right': return "RR";
|
||||
case 'down': return "RB";
|
||||
}
|
||||
}
|
||||
return null; // Invalid
|
||||
// Circularity mode: map quadrants to specific calibration points using configuration
|
||||
const config = STICK_CONFIG[stick];
|
||||
if (!config) return null;
|
||||
|
||||
const quadrantMap = {
|
||||
'left': 0, // LL, RL
|
||||
'up': 1, // LT, RT
|
||||
'right': 2, // LR, RR
|
||||
'down': 3 // LB, RB
|
||||
};
|
||||
|
||||
const index = quadrantMap[quadrant];
|
||||
return index !== undefined ? config.suffixes[index] : null;
|
||||
}
|
||||
|
||||
_handleCenterModeAdjustment(changes) {
|
||||
@@ -680,10 +878,9 @@ export class Finetune {
|
||||
}
|
||||
|
||||
_startContinuousDpadAdjustmentCenterMode(stick, targetAxis, adjustment) {
|
||||
// In center mode, directly map to X/Y axes
|
||||
const inputSuffix = stick === 'left' ?
|
||||
(targetAxis === 'X' ? 'LX' : 'LY') :
|
||||
(targetAxis === 'X' ? 'RX' : 'RY');
|
||||
// In center mode, directly map to X/Y axes using configuration
|
||||
const config = STICK_CONFIG[stick];
|
||||
const inputSuffix = targetAxis === 'X' ? config.axisX : config.axisY;
|
||||
this._startContinuousAdjustmentWithSuffix(inputSuffix, adjustment);
|
||||
}
|
||||
|
||||
@@ -693,6 +890,13 @@ 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;
|
||||
}
|
||||
|
||||
// Perform initial adjustment immediately...
|
||||
this._performDpadAdjustment(element, adjustment);
|
||||
this.clearCircularity();
|
||||
@@ -727,6 +931,34 @@ export class Finetune {
|
||||
|
||||
// Trigger the change event to update the finetune data
|
||||
await this._onFinetuneChange();
|
||||
|
||||
// Check if axis values have dropped from 1.00 to below 1.00 and stop adjustment if so
|
||||
this._checkAxisValuesForStopCondition();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if axis values have dropped from 1.00 to below 1.00 and stop adjustment
|
||||
*/
|
||||
_checkAxisValuesForStopCondition() {
|
||||
if (!this.active_stick || !this.continuous_adjustment.repeat_delay) {
|
||||
return; // No continuous adjustment active
|
||||
}
|
||||
|
||||
const currentStick = this.controller.button_states.sticks[this.active_stick];
|
||||
const previousStick = this._previousAxisValues[this.active_stick];
|
||||
|
||||
// Check if X axis dropped from 1.00+ to below 1.00
|
||||
const xDropped = Math.abs(previousStick.x) >= 1.00 && Math.abs(currentStick.x) < 1.00;
|
||||
// Check if Y axis dropped from 1.00+ to below 1.00
|
||||
const yDropped = Math.abs(previousStick.y) >= 1.00 && Math.abs(currentStick.y) < 1.00;
|
||||
|
||||
if (xDropped || yDropped) {
|
||||
console.log(`Stopping continuous adjustment: ${this.active_stick} axis dropped below 1.00`);
|
||||
this.stopContinuousDpadAdjustment();
|
||||
}
|
||||
|
||||
// Update previous values for next check
|
||||
this._previousAxisValues[this.active_stick] = currentStick;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -763,6 +995,281 @@ 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
|
||||
*/
|
||||
_onCircularitySliderStart(lOrR, value) {
|
||||
console.log(`Slider start for ${lOrR} stick, value: ${value}`);
|
||||
|
||||
const config = STICK_CONFIG[lOrR];
|
||||
const baseValues = {};
|
||||
|
||||
// Store the base values when slider adjustment starts
|
||||
config.suffixes.forEach(suffix => {
|
||||
const element = $(`#finetune${suffix}`);
|
||||
baseValues[suffix] = parseInt(element.val()) || 0;
|
||||
});
|
||||
|
||||
this._inputStartValuesForSlider[lOrR] = baseValues;
|
||||
this._previousSliderValues[lOrR] = value;
|
||||
|
||||
// Store base values for circularity data arrays
|
||||
const circData = this[config.circDataName];
|
||||
if (circData && Array.isArray(circData)) {
|
||||
this._inputStartValuesForSlider[lOrR][config.circDataName] = [...circData]; // Create a copy
|
||||
}
|
||||
|
||||
console.log(`Base values stored for ${lOrR}:`, baseValues);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle circularity slider changes with incremental adjustments
|
||||
*/
|
||||
_onCircularitySliderChange(lOrR, value) {
|
||||
// Debug: Log the data structure
|
||||
console.log(`Slider change for ${lOrR} stick, value: ${value}`);
|
||||
|
||||
// If we don't have base values, treat this as the start
|
||||
if (!this._inputStartValuesForSlider[lOrR]) {
|
||||
this._onCircularitySliderStart(lOrR, value);
|
||||
return;
|
||||
}
|
||||
|
||||
// Calculate the incremental change from the previous slider position
|
||||
const previousValue = this._previousSliderValues[lOrR];
|
||||
const deltaValue = value - previousValue;
|
||||
|
||||
// If no change, return early
|
||||
if (deltaValue === 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Get the start values and suffixes for the current stick
|
||||
const config = STICK_CONFIG[lOrR];
|
||||
const startValues = this._inputStartValuesForSlider[lOrR];
|
||||
|
||||
// Calculate the total adjustment based on slider value from 0
|
||||
// Value 0-100 maps to adjustment range (we'll use a reasonable range)
|
||||
const maxAdjustment = 175; // Adjust this value as needed
|
||||
const totalAdjustment = (value / 100) * maxAdjustment;
|
||||
|
||||
config.suffixes.forEach(suffix => {
|
||||
const element = $(`#finetune${suffix}`);
|
||||
let newValue;
|
||||
|
||||
if (suffix.endsWith('L') || suffix.endsWith('T')) {
|
||||
newValue = Math.min(65535, startValues[suffix] + totalAdjustment);
|
||||
} else if (suffix.endsWith('R') || suffix.endsWith('B')) {
|
||||
newValue = Math.max(0, startValues[suffix] - totalAdjustment);
|
||||
}
|
||||
|
||||
element.val(Math.round(newValue));
|
||||
});
|
||||
|
||||
// Update circularity data with incremental changes proportional to slider movement
|
||||
const adjustmentConstant = 0.00085; // Small constant for incremental adjustments
|
||||
const totalAdjustmentFromBase = totalAdjustment * adjustmentConstant; // Total adjustment from slider position 0
|
||||
|
||||
const startingData = this._inputStartValuesForSlider[lOrR][config.circDataName];
|
||||
const circData = this[config.circDataName];
|
||||
|
||||
// Apply total adjustment from base values to maintain relative differences
|
||||
startingData.forEach((value, i) => circData[i] = Math.max(0, value + totalAdjustmentFromBase));
|
||||
|
||||
// Convert polar coordinates to cartesian, trim to square, and convert back
|
||||
this._trimCircularityDataToSquare(circData);
|
||||
|
||||
// Update previous slider value
|
||||
this._previousSliderValues[lOrR] = value;
|
||||
|
||||
// Refresh the stick displays to show updated circularity data
|
||||
this.refresh_finetune_sticks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle slider release - clear circularity data
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_onCircularitySliderRelease(lOrR) {
|
||||
console.log(`Circularity slider released for ${lOrR} stick`);
|
||||
|
||||
// Mark that this slider has been used
|
||||
this._sliderUsed[lOrR] = true;
|
||||
|
||||
// Clear the circularity data - zero out the array while maintaining its size
|
||||
const config = STICK_CONFIG[lOrR];
|
||||
const circData = this[config.circDataName];
|
||||
circData.fill(0);
|
||||
|
||||
// Call the clearCircularity function to update the display
|
||||
this.clearCircularity();
|
||||
|
||||
// Trigger the change event to update the finetune data once when slider is released
|
||||
this._onFinetuneChange();
|
||||
|
||||
// Toggle the slider off and change button to undo
|
||||
const stickCard = $(`#${lOrR}-stick-card`);
|
||||
stickCard.removeClass('show-slider');
|
||||
this._showErrorSlackUndoButton(lOrR);
|
||||
|
||||
// Refresh the stick displays to show cleared circularity data
|
||||
this.refresh_finetune_sticks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert circularity data (polar radii) to cartesian coordinates,
|
||||
* trim to a -1,-1 to 1,1 square, then convert back to polar radii
|
||||
* @param {Array} data - Array of radius values representing sectors around a circle
|
||||
*/
|
||||
_trimCircularityDataToSquare(data) {
|
||||
const numSectors = data.length;
|
||||
data.forEach((radius, i) => {
|
||||
// Calculate angle for this sector
|
||||
const angle = (i * 2 * Math.PI) / numSectors;
|
||||
|
||||
// Convert polar to cartesian coordinates
|
||||
const x = radius * Math.cos(angle);
|
||||
const y = radius * Math.sin(angle);
|
||||
|
||||
// Trim to -1,-1 to 1,1 square
|
||||
const trimmedX = Math.max(-1, Math.min(1, x));
|
||||
const trimmedY = Math.max(-1, Math.min(1, y));
|
||||
|
||||
// Convert back to polar coordinates
|
||||
const trimmedRadius = Math.sqrt(trimmedX * trimmedX + trimmedY * trimmedY);
|
||||
data[i] = trimmedRadius;
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset circularity slider to zero and restore input values to their base state
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_resetCircularitySlider(lOrR) {
|
||||
console.log(`Resetting circularity slider for ${lOrR} stick`);
|
||||
|
||||
// If we have starting values stored, use them to reset properly
|
||||
// Reset the slider to zero first
|
||||
$(`#${lOrR}CircularitySlider`).val(0);
|
||||
|
||||
// Trigger the slider change with value 0 to recalculate input values
|
||||
this._onCircularitySliderChange(lOrR, 0);
|
||||
|
||||
// Reset the slider used state and update button back to slack
|
||||
this._sliderUsed[lOrR] = false;
|
||||
this._showErrorSlackButton(lOrR);
|
||||
|
||||
// Clear the circularity data display
|
||||
this.clearCircularity();
|
||||
|
||||
// Trigger the change event to update the finetune data
|
||||
this._onFinetuneChange();
|
||||
|
||||
// Refresh the stick displays
|
||||
this.refresh_finetune_sticks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if data array contains only non-zero values
|
||||
* @param {Array} data - The data array to check
|
||||
* @returns {boolean} True if all values are non-zero, false otherwise
|
||||
*/
|
||||
_hasOnlyNonZeroValues(data) {
|
||||
if (!data || !Array.isArray(data)) {
|
||||
return false;
|
||||
}
|
||||
return data.every(value => value !== 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the state of error slack buttons based on data content
|
||||
*/
|
||||
_updateErrorSlackButtonStates() {
|
||||
Object.entries(STICK_CONFIG).forEach(([lOrR, config]) => {
|
||||
if (this._sliderUsed[lOrR]) {
|
||||
// Show undo button, hide slack button
|
||||
this._showErrorSlackUndoButton(lOrR);
|
||||
} else {
|
||||
// Show slack button, hide undo button
|
||||
this._showErrorSlackButton(lOrR);
|
||||
|
||||
const hasData = this._hasOnlyNonZeroValues(this[config.circDataName]);
|
||||
const slackBtn = $(`#${lOrR}ErrorSlackBtn`);
|
||||
slackBtn
|
||||
.prop('disabled', !hasData)
|
||||
.toggleClass('btn-secondary', hasData)
|
||||
.toggleClass('btn-outline-secondary', !hasData);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle error slack button click
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_onErrorSlackButtonClick(lOrR) {
|
||||
console.log(`Error slack button clicked for ${lOrR} stick`);
|
||||
|
||||
// Only allow toggle in circularity mode
|
||||
if (this._mode !== 'circularity') {
|
||||
console.log('Error slack button only works in circularity mode');
|
||||
return;
|
||||
}
|
||||
|
||||
// Toggle between showing LX/LY values and circularity slider
|
||||
const stickCard = $(`#${lOrR}-stick-card`);
|
||||
const isShowingSlider = stickCard.hasClass('show-slider');
|
||||
stickCard.toggleClass('show-slider', !isShowingSlider);
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle error slack undo button click
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_onErrorSlackUndoButtonClick(lOrR) {
|
||||
console.log(`Error slack undo button clicked for ${lOrR} stick`);
|
||||
|
||||
this._resetCircularitySlider(lOrR);
|
||||
}
|
||||
|
||||
/**
|
||||
* Toggle button visibility between slack and undo buttons
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
* @param {boolean} showUndo - true to show undo button, false to show slack button
|
||||
*/
|
||||
_toggleErrorSlackButtons(lOrR, showUndo) {
|
||||
const undoBtn = $(`#${lOrR}ErrorSlackUndoBtn`);
|
||||
const slackBtn = $(`#${lOrR}ErrorSlackBtn`);
|
||||
|
||||
undoBtn.toggleClass('d-none', !showUndo);
|
||||
slackBtn.toggleClass('d-none', showUndo);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show undo button and hide slack button
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_showErrorSlackUndoButton(lOrR) {
|
||||
this._toggleErrorSlackButtons(lOrR, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show slack button and hide undo button
|
||||
* @param {string} lOrR - 'left' or 'right'
|
||||
*/
|
||||
_showErrorSlackButton(lOrR) {
|
||||
this._toggleErrorSlackButtons(lOrR, false);
|
||||
}
|
||||
}
|
||||
|
||||
// Global reference to the current finetune instance
|
||||
@@ -780,10 +1287,10 @@ function destroyCurrentInstance() {
|
||||
}
|
||||
|
||||
// Function to create and initialize finetune instance
|
||||
export async function ds5_finetune(controller, dependencies) {
|
||||
export async function ds5_finetune(controller, dependencies, doneCallback = null) {
|
||||
// Create new instance
|
||||
currentFinetuneInstance = new Finetune();
|
||||
await currentFinetuneInstance.init(controller, dependencies);
|
||||
await currentFinetuneInstance.init(controller, dependencies, doneCallback);
|
||||
}
|
||||
|
||||
export function finetune_handle_controller_input(changes) {
|
||||
@@ -813,5 +1320,28 @@ export function isFinetuneVisible() {
|
||||
return !!currentFinetuneInstance;
|
||||
}
|
||||
|
||||
// Quick calibrate functions
|
||||
async function finetune_quick_calibrate_center() {
|
||||
// Hide the finetune modal
|
||||
currentFinetuneInstance.setQuickCalibrating(true);
|
||||
|
||||
const { controller } = currentFinetuneInstance;
|
||||
await auto_calibrate_stick_centers(controller, (success, message) => {
|
||||
currentFinetuneInstance.setQuickCalibrating(false);
|
||||
});
|
||||
}
|
||||
|
||||
async function finetune_quick_calibrate_range() {
|
||||
// Hide the finetune modal
|
||||
currentFinetuneInstance.setQuickCalibrating(true);
|
||||
|
||||
const { controller, ll_data, rr_data } = currentFinetuneInstance;
|
||||
await calibrate_range(controller, { ll_data, rr_data }, (success, message) => {
|
||||
currentFinetuneInstance.setQuickCalibrating(false);
|
||||
});
|
||||
}
|
||||
|
||||
window.finetune_cancel = finetune_cancel;
|
||||
window.finetune_save = finetune_save;
|
||||
window.finetune_quick_calibrate_center = finetune_quick_calibrate_center;
|
||||
window.finetune_quick_calibrate_range = finetune_quick_calibrate_range;
|
||||
|
||||
1642
js/modals/quick-test-modal.js
Normal file
@@ -158,11 +158,8 @@ export function draw_stick_position(ctx, center_x, center_y, sz, stick_x, stick_
|
||||
|
||||
// Draw filled circle at stick position
|
||||
ctx.beginPath();
|
||||
ctx.arc(center_x+display_x*sz, center_y+display_y*sz, 3, 0, 2*Math.PI);
|
||||
|
||||
if (typeof highlight === 'boolean') {
|
||||
ctx.fillStyle = highlight ? '#2989f7ff' : '#030b84ff';
|
||||
}
|
||||
ctx.arc(center_x+display_x*sz, center_y+display_y*sz, highlight ? 4 : 3, 0, 2*Math.PI);
|
||||
ctx.fillStyle = highlight ? '#2989f7ff' : '#030b84ff';
|
||||
ctx.fill();
|
||||
}
|
||||
|
||||
|
||||
@@ -77,15 +77,16 @@ export async function loadAllTemplates() {
|
||||
const finetuneModalHtml = await loadTemplate('finetune-modal');
|
||||
const calibCenterModalHtml = await loadTemplate('calib-center-modal');
|
||||
const welcomeModalHtml = await loadTemplate('welcome-modal');
|
||||
const calibrateModalHtml = await loadTemplate('calibrate-modal');
|
||||
const autoCalibCenterModalHtml = await loadTemplate('auto-calib-center-modal');
|
||||
const rangeModalHtml = await loadTemplate('range-modal');
|
||||
const edgeProgressModalHtml = await loadTemplate('edge-progress-modal');
|
||||
const edgeModalHtml = await loadTemplate('edge-modal');
|
||||
const donateModalHtml = await loadTemplate('donate-modal');
|
||||
const quickTestModalHtml = await loadTemplate('quick-test-modal');
|
||||
|
||||
// Create modals container
|
||||
const modalsContainer = document.createElement('div');
|
||||
modalsContainer.id = 'modals-container';
|
||||
modalsContainer.innerHTML = faqModalHtml + popupModalHtml + finetuneModalHtml + calibCenterModalHtml + welcomeModalHtml + calibrateModalHtml + rangeModalHtml + edgeProgressModalHtml + edgeModalHtml + donateModalHtml;
|
||||
modalsContainer.innerHTML = faqModalHtml + popupModalHtml + finetuneModalHtml + calibCenterModalHtml + welcomeModalHtml + autoCalibCenterModalHtml + rangeModalHtml + edgeProgressModalHtml + edgeModalHtml + donateModalHtml + quickTestModalHtml;
|
||||
document.body.appendChild(modalsContainer);
|
||||
}
|
||||
|
||||
@@ -137,7 +137,7 @@ export function l(text) {
|
||||
const [out] = translationState.lang_cur[text] || [];
|
||||
if(out) return out;
|
||||
|
||||
console.log("Missing translation for: '" + text + "'");
|
||||
console.log(`Missing translation for "${text}"`);
|
||||
return text;
|
||||
}
|
||||
|
||||
@@ -167,7 +167,7 @@ function lang_translate(target_file, target_lang, target_direction) {
|
||||
if (translatedText) {
|
||||
$(item).html(translatedText);
|
||||
} else {
|
||||
console.log("Cannot find mapping for " + originalText);
|
||||
console.log(`Cannot find mapping for "${originalText}"`);
|
||||
$(item).html(originalText);
|
||||
}
|
||||
}
|
||||
|
||||
111
lang/ar_ar.json
@@ -7,7 +7,6 @@
|
||||
"Disconnect": "قطع الاتصال",
|
||||
"Calibrate stick center": "معايرة تمركز العصا",
|
||||
"Calibrate stick range": "معايرة مدى العصا",
|
||||
"Reset controller": "إعادة ضبط يد التحكم",
|
||||
"Sections below are not useful, just some debug infos or manual commands": "الأقسام أدناه ليست مفيدة، فقط بعض معلومات التصحيح أو أوامر يدوية",
|
||||
"NVS Status": "حالة الـNVS",
|
||||
"Unknown": "غير معلوم",
|
||||
@@ -15,7 +14,6 @@
|
||||
"Query NVS status": "حالة إستعلام NVS",
|
||||
"NVS unlock": "فتح قفل الـNVS",
|
||||
"NVS lock": "قفل الـNVS",
|
||||
"Fast calibrate stick center (OLD)": "معايرة سريعة لتمركز العصا (الطريقة القديمة)",
|
||||
"Stick center calibration": "معايرة تمركز العصا",
|
||||
"Welcome": "مرحبًا",
|
||||
"Step 1": "الخطوة الأولى",
|
||||
@@ -24,8 +22,8 @@
|
||||
"Step 4": "الخطوة الرابعة",
|
||||
"Completed": "اكتملت",
|
||||
"Welcome to the stick center-calibration wizard!": "مرحباً بك في معالج ومصحح تمركز العصا!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "هذه الأداة ستوجهك في إعادة تمركز العصي ليد التحكم. تتكون من أربع خطوات، سيطلب منك تحريك كلا العصي إلى اتجاه معين وتركهما.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "المرجو الانتباه، <i>عند بدء المعايرة لا يمكنك إلغائها</i>. لا تغلق هذه الصفحة أو تقطع اتصال يد التحكم حتى الاكتمال.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "هذه الأداة ستوجهك في إعادة تمركز العصي ليد التحكم. تتكون من أربع خطوات، سيطلب منك تحريك كلا العصي إلى اتجاه معين وتركهما.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "المرجو الانتباه، <i>عند بدء المعايرة لا يمكنك إلغائها</i>. لا تغلق هذه الصفحة أو تقطع اتصال يد التحكم حتى الاكتمال.",
|
||||
"Press <b>Start</b> to begin calibration.": "اضغط <b>بدء</b> لبدء المعايرة.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "الرجاء حرك كلا العصي إلى <b>إعلى اليسار</b> وتركهما.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "عند عودة كلا العصي إلى المركز، اضغط <b>متابعة</b>.",
|
||||
@@ -38,7 +36,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "الرجاء عدم إغلاق هذه النافذة وعدم قطع اتصال يد التحكم. ",
|
||||
"Range calibration": "معايرة المدى",
|
||||
"<b>The controller is now sampling data!</b>": "<b>يد التحكم تقوم الآن بأخذ عينات من البيانات!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "ادر كلا العصي ببطء لتغطية المدى كُلََّه. اضغط على \"تمّ\" عند الانتهاء.",
|
||||
"Done": "تمّ",
|
||||
"Hi, thank you for using this software.": "مرحباً، شكراً لك على استخدام هذا البرنامج.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "إذا كنت تجد ذلك مفيداً وترغب في دعم جهودي، لا تتردد في",
|
||||
@@ -59,11 +56,6 @@
|
||||
"Device Type": "نوع الجهاز",
|
||||
"Range calibration completed": "أكملت معايرة المدى",
|
||||
"Range calibration failed": "فشل في معايرة المدى،",
|
||||
"Cannot unlock NVS": "لا يمكن فتح قفل NVS",
|
||||
"Cannot relock NVS": "لا يمكن إعادة قفل NVS",
|
||||
"Error 1": "خطأ 1",
|
||||
"Error 2": "خطأ 2",
|
||||
"Error 3": "خطأ 3",
|
||||
"Stick calibration failed": "فشل في معايرة العصا،",
|
||||
"Stick calibration completed": "أكملت معايرة العصا",
|
||||
"NVS Lock failed": "فشل في قفل NVS",
|
||||
@@ -73,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 الإصدار الثاني",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "الجهاز المتصل غير صالح،",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "يبدو أن يد التحكم هذه مقلدة. عطلت جميع الوظائف.",
|
||||
"Error: ": "خطأ،",
|
||||
"Connected invalid device": "الجهاز المتصل غير صالح،",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "خطأ،",
|
||||
"My handle on discord is: the_al": "معرفي على ديسكورد هو، the_al",
|
||||
"Initializing...": "تتم التهيئة...",
|
||||
"Storing calibration...": "خزن المعايرة...",
|
||||
@@ -106,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "نعم، إذا قمت بوضع علامة في مربع الاختيار \"أبقاء الكتابة بشكل دائم على يد التحكم\". في هذه الحالة، يتم تمرير المعايرة مباشرة في برمجيات يد التحكم. وهذا يضمن حفظ المعلومات في يد التحكم بغض النظر عن أي جهاز مرتبطة بها.",
|
||||
"Is this an officially endorsed service?": "هل هذه الخدمة معتمدة رسمياً؟",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "لا، هذه الخدمة ببساطة تعبر عن شغفي وحماسي ليد التحكم.",
|
||||
"Does this website detects if a controller is a clone?": "هل يكتشف هذا الموقع ما إذا كانت يد التحكم نسخة مقلدة؟",
|
||||
"Does this website detect if a controller is a clone?": "هل يكتشف هذا الموقع ما إذا كانت يد التحكم نسخة مقلدة؟",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "نعم، فقط DualShock4 في الوقت الراهن. حدث ذلك لأنني اشتريت بعض النسخ المقلدة، وقضيت الوقت لتحديد الاختلافات وأضفت هذه الوظيفة لمنع الغِشّ في المستقبل.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "لسوء الحظ، لا يمكن معايرة النسخ المقلدة على أي حال، لأنها تقلد فقط سلوك DualShock4 في أثناء اللعب العادي، وليس كل وظائفها.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "لسوء الحظ، لا يمكن معايرة النسخ المقلدة على أي حال، لأنها تقلد فقط سلوك DualShock4 في أثناء اللعب العادي، وليس كل وظائفها.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "إذا كنت ترغب في أضافة وظيفة الكشف هذه إلى DualSense، فيرجى شحن نسخ DualSense مقلدة ألي وستراها في غضون بضعة أسابيع.",
|
||||
"What development is in plan?": "ما هي التطورات في الخِطَّة؟",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "وأحتفظ بخطتين منفصلتين لهذا المشروع، على الرغْم أنه لم يتم بعد تحديد الأولوية.",
|
||||
@@ -188,77 +180,134 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Cancel": "",
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"Right Module Barcode": "",
|
||||
"Right stick": "",
|
||||
"Save": "",
|
||||
"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": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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 screen allows to finetune raw calibration data on your controller": "",
|
||||
"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.": "",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"USB Connector": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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 can do this in two ways:": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/bg_bg.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Заявка за статус на NVS",
|
||||
"NVS unlock": "Отключване на NVS",
|
||||
"NVS lock": "Заключване на NVS",
|
||||
"Fast calibrate stick center (OLD)": "Бързо калибриране на центъра на джойстиците (СТАРО)",
|
||||
"Stick center calibration": "Калибриране на центъра на джойстиците",
|
||||
"Welcome": "Добре дошли",
|
||||
"Step 1": "Стъпка 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Стъпка 4",
|
||||
"Completed": "Завършено",
|
||||
"Welcome to the stick center-calibration wizard!": "Добре дошли в магьосника за калибриране на центъра на джойстиците!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Този инструмент ще ви насочи към центриране на аналоговите джойстици на вашия контролер. Той се състои от четири стъпки: ще ви бъде поискано да преместите двата джойстика в една посока и да ги освободите.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Моля, имайте предвид, че, <i>веднъж като калибрацията е стартирана, не може да бъде отменена</i>. Не затваряйте тази страница или не изключвайте контролера си, докато не приключи.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Този инструмент ще ви насочи към центриране на аналоговите джойстици на вашия контролер. Той се състои от четири стъпки: ще ви бъде поискано да преместите двата джойстика в една посока и да ги освободите.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Моля, имайте предвид, че, <i>веднъж като калибрацията е стартирана, не може да бъде отменена</i>. Не затваряйте тази страница или не изключвайте контролера си, докато не приключи.",
|
||||
"Press <b>Start</b> to begin calibration.": "Натиснете <b>Стартирайте</b>, за да започнете калибрирането",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Моля, преместете двата джойстика в <b>горния ляв ъгъл</b> и ги освободете.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Когато джойстиците се върнат в центъра, натиснете <b>Продължи</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "Моля, не затваряйте този прозорец и не изключвайте контролера си. ",
|
||||
"Range calibration": "Калибриране на обхвата",
|
||||
"<b>The controller is now sampling data!</b>": "<b>Контролерът в момента примерява данни!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Завъртете джойстиците бавно, за да покриете целия обхват. Натиснете \"Готово\", когато приключите.",
|
||||
"Done": "Готово",
|
||||
"Hi, thank you for using this software.": "Здравейте, благодарим ви, че използвате този софтуер.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "Ако намирате, че е полезно и искате да подкрепите усилията ми, не се колебайте",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Тип устройство",
|
||||
"Range calibration completed": "Калибрация на обхвата завършена",
|
||||
"Range calibration failed": "Калибрация на обхвата неуспешна",
|
||||
"Cannot unlock NVS": "Не може да се отключи NVS",
|
||||
"Cannot relock NVS": "Не може да се затвори NVS",
|
||||
"Error 1": "Грешка 1",
|
||||
"Error 2": "Грешка 2",
|
||||
"Error 3": "Грешка 3",
|
||||
"Stick calibration failed": "Калибрация на джойстиците неуспешна",
|
||||
"Stick calibration completed": "Калибрация на джойстиците завършена",
|
||||
"NVS Lock failed": "Заключване на NVS неуспешно",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Свързан невалидно устройство: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Устройството изглежда като DS4 клон. Всички функционалности са деактивирани.",
|
||||
"Error: ": "Грешка: ",
|
||||
"Connected invalid device": "Свързан невалидно устройство",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Грешка",
|
||||
"My handle on discord is: the_al": "Моят ник в discord е: the_al",
|
||||
"Initializing...": "Инициализация...",
|
||||
"Storing calibration...": "Запазване на калибрацията...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Да, ако отметнете квадратчето \"Запиши промените постоянно в контролера\". В този случай калибрацията се записва директно във фърмуера на контролера. Това гарантира, че тя остава на място, независимо от конзолата, към която е свързана.",
|
||||
"Is this an officially endorsed service?": "Това ли е официално подкрепена услуга?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Не, тази услуга просто е създадена от ентусиаст на DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Този уебсайт ли открива дали контролерът е копие?",
|
||||
"Does this website detect if a controller is a clone?": "Този уебсайт ли открива дали контролерът е копие?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Да, само DualShock4 в момента. Това се случи, защото случайно закупих някои копия, изразходвах време за идентифициране на разликите и добавих тази функционалност, за да предотвратя бъдеща измама.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "За съжаление, копията все пак не могат да бъдат калибрирани, защото те само клонират поведението на DualShock4 по време на нормална игра, не всички недокументирани функционалности.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "За съжаление, копията все пак не могат да бъдат калибрирани, защото те само клонират поведението на DualShock4 по време на нормална игра, не всички недокументирани функционалности.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Ако искате да разширите тази функционалност за откриване и за DualSense, моля, пратете ми фалшив DualSense и ще я видите след няколко седмици.",
|
||||
"What development is in plan?": "Какво развитие е планирано?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "За този проект поддържам два отделни списъка с неща за направление, въпреки че приоритетът все още не е установен.",
|
||||
@@ -162,38 +155,53 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Cancel": "",
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
"FW Type": "",
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -201,63 +209,105 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"Headphone Jack": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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 screen allows to finetune raw calibration data on your controller": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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 can do this in two ways:": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/cz_cz.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Dotaz na stav NVS",
|
||||
"NVS unlock": "Odblokuj NVS",
|
||||
"NVS lock": "Zablokuj NVS",
|
||||
"Fast calibrate stick center (OLD)": "Rychlá kalibrace středu páčky (OLD)",
|
||||
"Stick center calibration": "Kalibrace středu páčky",
|
||||
"Welcome": "Vítej",
|
||||
"Step 1": "Krok 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Krok 4",
|
||||
"Completed": "Zakończono",
|
||||
"Welcome to the stick center-calibration wizard!": "Vítejte v průvodci kalibrací středu páček!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Tento nástroj vás provede opětovným vycentrováním analogových pák vašeho ovladače. Skládá se ze čtyř kroků: budete požádáni, abyste pohnuli oběma pákami ve směru a uvolnili je.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Mějte prosím na paměti, že <i>jakmile je kalibrace spuštěna, nelze ji zrušit</i>. Nezavírejte tuto stránku ani neodpojujte ovladač, dokud nebude dokončena.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Tento nástroj vás provede opětovným vycentrováním analogových pák vašeho ovladače. Skládá se ze čtyř kroků: budete požádáni, abyste pohnuli oběma pákami ve směru a uvolnili je.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Mějte prosím na paměti, že <i>jakmile je kalibrace spuštěna, nelze ji zrušit</i>. Nezavírejte tuto stránku ani neodpojujte ovladač, dokud nebude dokončena.",
|
||||
"Press <b>Start</b> to begin calibration.": "Stisknutím tlačítka <b>Start</b> zahájíte kalibraci.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Přesuňte prosím obě páčky do <b>levého horního rohu</b> a uvolněte je.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Když jsou tyče zpět ve středu, stiskněte <b>Pokračovat</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Pomalu otáčejte páčkami, abyste pokryli celý rozsah. Po dokončení stiskněte \"Hotovo\".",
|
||||
"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",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Typ zařízení",
|
||||
"Range calibration completed": "Kalibrace rozsahu dokončena",
|
||||
"Range calibration failed": "Kalibrace rozsahu se nezdařila",
|
||||
"Cannot unlock NVS": "Nelze odemknout NVS",
|
||||
"Cannot relock NVS": "Nelze znovu zamknout NVS",
|
||||
"Error 1": "Chyba 1",
|
||||
"Error 2": "Chyba 2",
|
||||
"Error 3": "Chyba 3",
|
||||
"Stick calibration failed": "Kalibrace páček se nezdařila",
|
||||
"Stick calibration completed": "Kalibrace páček dokončena",
|
||||
"NVS Lock failed": "Zámek NVS se nezdařil",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Připojené neplatné zařízení: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Zdá se, že zařízení je klon DS4. Všechny funkce jsou deaktivovány.",
|
||||
"Error: ": "Chyba: ",
|
||||
"Connected invalid device": "Připojené neplatné zařízení",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Chyba",
|
||||
"My handle on discord is: the_al": "Můj Discord to: the_al",
|
||||
"Initializing...": "Inicializace...",
|
||||
"Storing calibration...": "Uložení kalibrace...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Ano, pokud zaškrtnete políčko \"Zapsat změny trvale do ovladače\". V takovém případě se kalibrace zobrazí přímo ve firmwaru regulátoru. To zajišťuje, že zůstane na svém místě bez ohledu na konzolu, ke které je připojen.",
|
||||
"Is this an officially endorsed service?": "Je to oficiálně schválená služba?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Ne, tato služba je jednoduše výtvorem nadšence pro DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Detekuje tento web, zda je ovladač klon?",
|
||||
"Does this website detect if a controller is a clone?": "Detekuje tento web, zda je ovladač klon?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Ano, momentálně pouze DualShock4. Stalo se to proto, že jsem omylem zakoupil nějaké klony, strávil čas identifikací rozdílů a přidal tuto funkci, abych zabránil budoucímu podvodu.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Bohužel klony stejně nelze zkalibrovat, protože klonují pouze chování DualShocku4 při běžném hraní, ne všechny nezdokumentované funkce.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Bohužel klony stejně nelze zkalibrovat, protože klonují pouze chování DualShocku4 při běžném hraní, ne všechny nezdokumentované funkce.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Pokud chcete rozšířit tuto funkci detekce na DualSense, pošlete mi prosím falešný DualSense a uvidíte ho za několik týdnů.",
|
||||
"What development is in plan?": "Jaký vývoj je v plánu?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Pro tento projekt udržuji dva samostatné seznamy úkolů, ačkoli priorita ještě nebyla stanovena.",
|
||||
@@ -144,10 +137,17 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"After range calibration, joysticks always go in corners.": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Can I reset a permanent calibration to previous calibration?": "",
|
||||
@@ -156,25 +156,26 @@
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Changes saved successfully": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Does this software resolve stickdrift?": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"Error while saving changes": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
@@ -182,6 +183,13 @@
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -189,75 +197,117 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"Headphone Jack": "",
|
||||
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"No.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Only after you have done that, you click on \"Done\".": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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.": "",
|
||||
"Reboot controller": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Save changes permanently": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"This screen allows to finetune raw calibration data on your controller": "",
|
||||
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"Yes. Simply do another permanent calibration.": "",
|
||||
"You can do this in two ways:": "",
|
||||
"You have to rotate the joysticks before you press \"Done\".": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
108
lang/da_dk.json
@@ -14,8 +14,6 @@
|
||||
"Query NVS status": "Forespørg NVS status",
|
||||
"NVS unlock": "lås NVS op",
|
||||
"NVS lock": "lås NVS",
|
||||
"Get BDAddr": "Hent BDAddr",
|
||||
"Fast calibrate stick center (OLD)": "Hurtig kalibrering af styrepindens centrum (GAMMEL)",
|
||||
"Stick center calibration": "Kalibrering af styrepindens centrum",
|
||||
"Welcome": "Velkommen",
|
||||
"Step 1": "Trin 1",
|
||||
@@ -24,8 +22,8 @@
|
||||
"Step 4": "Trin 4",
|
||||
"Completed": "Fuldført",
|
||||
"Welcome to the stick center-calibration wizard!": "Velkommen til guiden til kalibrering af styrepindens centrum!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Dette værktøj vil guide dig i at centrere de analoge styrepinde på din controller igen. Det består af fire trin: Du vil blive bedt om at bevæge begge styrepinde i én retning og derefter slippe dem.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Vær venligst opmærksom på, at <i>når kalibreringen først er i gang, kan den ikke annulleres</i>. Luk ikke denne side, og frakobl ikke din controller, før processen er afsluttet.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Dette værktøj vil guide dig i at centrere de analoge styrepinde på din controller igen. Det består af fire trin: Du vil blive bedt om at bevæge begge styrepinde i én retning og derefter slippe dem.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Vær venligst opmærksom på, at <i>når kalibreringen først er i gang, kan den ikke annulleres</i>. Luk ikke denne side, og frakobl ikke din controller, før processen er afsluttet.",
|
||||
"Press <b>Start</b> to begin calibration.": "Tryk på <b>\"Start\"</b> for at begynde kalibreringen.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Flyt begge styrepinde til det <b>øverste venstre hjørne</b>, og slip dem.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Når styrepindene er tilbage i centrum, skak du trykke på <b>\"Fortsæt\"</b>.",
|
||||
@@ -38,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Rotér styrepindene langsomt for at dække hele rækkevidden. Tryk på \"Færdig\", når du er færdig.",
|
||||
"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",
|
||||
@@ -59,11 +56,6 @@
|
||||
"Device Type": "Enhedstype",
|
||||
"Range calibration completed": "Rækkeviddekalibrering gennemført",
|
||||
"Range calibration failed": "Rækkeviddekalibrering mislykkedes",
|
||||
"Cannot unlock NVS": "Kan ikke låse NVS op",
|
||||
"Cannot relock NVS": "Kan ikke låse NVS igen",
|
||||
"Error 1": "Fejl 1",
|
||||
"Error 2": "Fejl 2",
|
||||
"Error 3": "Fejl 3",
|
||||
"Stick calibration failed": "Kalibrering af styrepinde mislykkedes",
|
||||
"Stick calibration completed": "Kalibrering af styrepinde gennemført",
|
||||
"NVS Lock failed": "NVS låsning mislykkedes",
|
||||
@@ -73,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Forbundet til en ugyldig enhed: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Enheden ser ud til at være en DS4-klon. Alle funktioner er deaktiveret.",
|
||||
"Error: ": "Fejl: ",
|
||||
"Connected invalid device": "Forbundet til en ugyldig enhed",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Fejl",
|
||||
"My handle on discord is: the_al": "Mit brugernavn på Discord er: the_al",
|
||||
"Initializing...": "Initialiserer...",
|
||||
"Storing calibration...": "Gemmer kalibrering...",
|
||||
@@ -106,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Ja, hvis du sætter kryds i boksen \"Skriv ændringer permanent i controlleren\", bliver kalibreringen skrevet direkte ind i controllerens firmware. Det sikrer, at den forbliver aktiv, uanset hvilken konsol controlleren tilsluttes.",
|
||||
"Is this an officially endorsed service?": "Er dette en officielt godkendt service?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Nej, denne service er blot skabt af en DualShock-entusiast.",
|
||||
"Does this website detects if a controller is a clone?": "Kan denne hjemmeside registrere, om en controller er en klon?",
|
||||
"Does this website detect if a controller is a clone?": "Kan denne hjemmeside registrere, om en controller er en klon?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Ja, kun DualShock4 i øjeblikket. Det skete, fordi jeg ved en fejl købte nogle kloner, brugte tid på at identificere forskellene og tilføjede denne funktionalitet for at forhindre fremtidigt bedrag.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Desværre kan klonerne ikke kalibreres, fordi de kun efterligner DualShock4’s adfærd under almindeligt gameplay og ikke alle de udokumenterede funktioner.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Desværre kan klonerne ikke kalibreres, fordi de kun efterligner DualShock4’s adfærd under almindeligt gameplay og ikke alle de udokumenterede funktioner.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Hvis du ønsker at udvide denne detektionsfunktionalitet til DualSense, så send mig en falsk DualSense, og du vil kunne se resultaterne om et par uger.",
|
||||
"What development is in plan?": "Hvilke forbedringer er planlagt?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Jeg vedligeholder to separate to-do-lister for dette projekt, selvom prioriteringen endnu ikke er fastlagt.",
|
||||
@@ -173,17 +165,9 @@
|
||||
"Show all": "Vis alt",
|
||||
"Finetune stick calibration": "Finjuster styrepindskalibrering",
|
||||
"(beta)": "(beta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Denne skærm giver mulighed for at finjustere de rå kalibreringsdata på din controller.",
|
||||
"Left stick": "Venstre styrepind",
|
||||
"Right stick": "Højre styrepind",
|
||||
"Center X": "Centrér X",
|
||||
"Center Y": "Centrér Y",
|
||||
"Save": "Gem",
|
||||
"Cancel": "Afbryd",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock Kalibrerings GUI understøtter i øjeblikket ikke DualSense Edge.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Jeg arbejder aktivt på at tilføje kompatibilitet, den primære udfordring ligger i at gemme data i stick modulerne.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Hvis dette værktøj har været nyttigt for dig, eller du gerne vil se DualSense Edge understøttelse komme hurtigere, så overvej venligst at støtte projektet med en",
|
||||
"Thank you for your generosity and support!": "Tak for din gavmildhed og støtte!",
|
||||
"30th Anniversary": "30th Anniversary",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Eksternt</b>: ved at påføre +1,8V direkte på det synlige testpunkt uden at åbne controlleren.",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Intern</b>: ved at lodde en ledning fra en +1,8V kilde til skrivebeskyttelses-testpunktet (TP).",
|
||||
@@ -241,16 +225,10 @@
|
||||
"10x zoom": "10x zoom",
|
||||
"Calibration": "Kalibrering",
|
||||
"Debug": "Fejlfinding",
|
||||
"Error triggering rumble": "Fejl ved aktivering af vibration",
|
||||
"Info": "Info",
|
||||
"Normal": "Normal",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Bemærk venligst: Styrepindmodulerne på DS Edge <b>kan ikke kalibreres udelukkende via software</b>.",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "For at gemme en brugerdefineret kalibrering i styrepindens interne hukommelse kræves der en <b>hardwaremodifikation</b>.",
|
||||
"Press L2 to test the strong (left) haptic motor": "Tryk på L2 for at teste den stærke (venstre) haptiske motor",
|
||||
"Press R2 to test the weak (right) haptic motor": "Tryk på R2 for at teste den svage (højre) haptiske motor",
|
||||
"Test the Haptic Motors": "Test de haptiske motorer",
|
||||
"Tests": "Test",
|
||||
"The motor strength will match how hard you press the trigger": "Motorstyrken vil matche, hvor hårdt du trykker på aftrækkeren",
|
||||
"Center (L1)": "Center (L1)",
|
||||
"Circularity (R1)": "Cirkularitet (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.": "Flyt styrepinden for at vælge den til justering, og brug derefter D-pad til at justere centerpunktet uden at røre ved styrepinden. Bevæg den hurtigt og juster igen, hvis den ikke står i centrum eller flimrer.",
|
||||
@@ -259,7 +237,77 @@
|
||||
"Push the stick straight up/down/left/right as far as possible.": "Skub styrepinden så langt som muligt op/ned/til venstre/til højre.",
|
||||
"Show raw numbers": "Vis faktiske tal",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Enheden er forbundet via Bluetooth. Afbryd forbindelsen, og tilslut den igen med et USB-kabel i stedet.",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "Mens du holder styrepinden, der skal justeres, helt op/ned/til venstre/til højre, <em>observer den markerede værdi under cirklen</em>, og brug derefter D-pad til at justere værdien til ±0,99 (lige under ±1,00).",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Din enhed er muligvis ikke en ægte Sony-controller. Hvis det ikke er en kopi, bedes du rapportere dette problem.",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Center": "",
|
||||
"Circularity": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Don't show again": "",
|
||||
"Fail": "",
|
||||
"Failed": "",
|
||||
"Failed to connect to device": "",
|
||||
"Failed to disable adaptive trigger": "",
|
||||
"Failed to set speaker tone": "",
|
||||
"Failed to set vibration": "",
|
||||
"Feel for vibration in the controller.": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"Increase non-circularity": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"No controller connected": "",
|
||||
"No tests completed yet.": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Plug in headphones to the 3.5mm jack": "",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "",
|
||||
"Press [circle] to close, or [square] to start over": "",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
|
||||
"Press [square] to begin or [circle] to close": "",
|
||||
"Press [triangle] to go back.": "",
|
||||
"Press each button until they turn green.": "",
|
||||
"Progress": "",
|
||||
"Quick Test": "",
|
||||
"Quick calibrate": "",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
|
||||
"Speaker": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
|
||||
"This test checks the headphone jack functionality.": "",
|
||||
"This test checks the reliability of the USB port.": "",
|
||||
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
|
||||
"USB Connector": "",
|
||||
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
|
||||
"Wiggle the USB cable to see if the controller disconnects.": "",
|
||||
"failed": "",
|
||||
"hide": "",
|
||||
"passed": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
111
lang/de_de.json
@@ -14,8 +14,6 @@
|
||||
"Query NVS status": "NVS-Status abfragen",
|
||||
"NVS unlock": "NVS entsperren",
|
||||
"NVS lock": "NVS sperren",
|
||||
"Get BDAddr": "BDAddr abrufen",
|
||||
"Fast calibrate stick center (OLD)": "Schnelle Kalibrierung der Stick-Mitte (ALT)",
|
||||
"Stick center calibration": "Kalibrierung der Stickmitte",
|
||||
"Welcome": "Willkommen",
|
||||
"Step 1": "Schritt 1",
|
||||
@@ -24,8 +22,8 @@
|
||||
"Step 4": "Schritt 4",
|
||||
"Completed": "Abgeschlossen",
|
||||
"Welcome to the stick center-calibration wizard!": "Willkommen im Stickmitten-Kalibrierungsassistenten!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Dieses Tool wird dich durch das Zurücksetzen der Analog-Stickmitte führen. Es besteht aus vier Schritten: Du wirst aufgefordert, beide Sticks in eine Richtung zu bewegen und loszulassen.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Bitte beachte, <i>dass die Kalibrierung, sobald sie läuft, nicht abgebrochen werden kann</i>. Schließe diese Seite nicht und trennen deinen Controller nicht, bis die Kalibrierung abgeschlossen ist.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Dieses Tool wird dich durch das Zurücksetzen der Analog-Stickmitte führen. Es besteht aus vier Schritten: Du wirst aufgefordert, beide Sticks in eine Richtung zu bewegen und loszulassen.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Bitte beachte, <i>dass die Kalibrierung, sobald sie läuft, nicht abgebrochen werden kann</i>. Schließe diese Seite nicht und trennen deinen Controller nicht, bis die Kalibrierung abgeschlossen ist.",
|
||||
"Press <b>Start</b> to begin calibration.": "Drücke <b>Start</b>, um mit der Kalibrierung zu beginnen.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Bewege bitte beide Sticks in die <b>obere linke Ecke</b> und lasse sie los.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Wenn die Sticks wieder in der Mitte sind, drücke <b>Weiter</b>.",
|
||||
@@ -38,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Drehe die Sticks langsam, um den gesamten Bereich abzudecken. Drücken \"Fertig\", wenn du fertig bist.",
|
||||
"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",
|
||||
@@ -59,11 +56,6 @@
|
||||
"Device Type": "Gerätetyp",
|
||||
"Range calibration completed": "Bereichskalibrierung abgeschlossen",
|
||||
"Range calibration failed": "Bereichskalibrierung fehlgeschlagen",
|
||||
"Cannot unlock NVS": "NVS kann nicht entsperrt werden",
|
||||
"Cannot relock NVS": "NVS kann nicht wieder gesperrt werden",
|
||||
"Error 1": "Fehler 1",
|
||||
"Error 2": "Fehler 2",
|
||||
"Error 3": "Fehler 3",
|
||||
"Stick calibration failed": "Stick-Kalibrierung fehlgeschlagen",
|
||||
"Stick calibration completed": "Stick-Kalibrierung abgeschlossen",
|
||||
"NVS Lock failed": "NVS-Sperrung fehlgeschlagen",
|
||||
@@ -73,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Verbundenes ungültiges Gerät: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Das Gerät scheint ein DS4-Klon zu sein. Alle Funktionen sind deaktiviert.",
|
||||
"Error: ": "Fehler: ",
|
||||
"Connected invalid device": "Verbundenes ungültiges Gerät",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Fehler",
|
||||
"My handle on discord is: the_al": "Mein Handle auf Discord ist: the_al",
|
||||
"Initializing...": "Initialisierung...",
|
||||
"Storing calibration...": "Kalibrierung speichern...",
|
||||
@@ -106,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Ja, wenn du das Kontrollkästchen \"Änderungen dauerhaft im Controller speichern\" aktivieren. In diesem Fall wird die Kalibrierung direkt in der Controller-Firmware gespeichert. Dies stellt sicher, dass sie unabhängig von der angeschlossenen Konsole an Ort und Stelle bleibt.",
|
||||
"Is this an officially endorsed service?": "Ist dies ein offiziell unterstützter Service?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Nein, dieser Service ist einfach eine Schöpfung eines DualShock-Enthusiasten.",
|
||||
"Does this website detects if a controller is a clone?": "Erkennt diese Website, ob ein Controller ein Klon ist?",
|
||||
"Does this website detect if a controller is a clone?": "Erkennt diese Website, ob ein Controller ein Klon ist?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Ja, derzeit nur DualShock4. Dies geschah, weil ich versehentlich einige Klone gekauft habe, Zeit damit verbracht habe, die Unterschiede zu identifizieren und diese Funktionalität hinzugefügt habe, um zukünftige Täuschungen zu verhindern.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Leider können die Klone sowieso nicht kalibriert werden, weil sie nur das Verhalten eines DualShock4 während eines normalen Gameplays klonen, nicht alle undokumentierten Funktionen.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Leider können die Klone sowieso nicht kalibriert werden, weil sie nur das Verhalten eines DualShock4 während eines normalen Gameplays klonen, nicht alle undokumentierten Funktionen.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Wenn du diese Erkennungsfunktionalität auf DualSense erweitern möchten, sende mir bitte einen gefälschten DualSense und du wirst die Funktion in wenigen Wochen sehen.",
|
||||
"What development is in plan?": "Was ist in der Planung?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Ich führe für dieses Projekt zwei separate To-Do-Listen, obwohl die Priorität noch nicht festgelegt wurde.",
|
||||
@@ -173,92 +165,149 @@
|
||||
"Show all": "Alles anzeigen",
|
||||
"Finetune stick calibration": "Feinabstimmung der Stick-Kalibrierung",
|
||||
"(beta)": "(beta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Dieser Bildschirm ermöglicht die Feinabstimmung der Rohkalibrierungsdaten Ihres Controllers.",
|
||||
"Left stick": "Linker Stick",
|
||||
"Right stick": "Rechter Stick",
|
||||
"Center X": "Zentrum X",
|
||||
"Center Y": "Zentrum Y",
|
||||
"Save": "Speichern",
|
||||
"Cancel": "Abbrechen",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "Das DualShock-Kalibrierungstool unterstützt derzeit nicht den DualSense Edge.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Ich arbeite aktiv daran, die Kompatibilität hinzuzufügen. Die größte Herausforderung besteht darin, Daten in die Stick-Module zu speichern.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Wenn Ihnen dieses Tool geholfen hat oder Sie möchten, dass die DualSense-Edge-Unterstützung schneller verfügbar ist, ziehen Sie bitte in Betracht, das Projekt mit einem Beitrag zu unterstützen",
|
||||
"Thank you for your generosity and support!": "Vielen Dank für Ihre Großzügigkeit und Unterstützung!",
|
||||
"10x zoom": "",
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"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.": "",
|
||||
"SBL FW Version": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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 can do this in two ways:": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/es_es.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Consultar estado NVS",
|
||||
"NVS unlock": "Desbloqueo NVS",
|
||||
"NVS lock": "Bloqueo NVS",
|
||||
"Fast calibrate stick center (OLD)": "Calibración rápida de centro de los análogos (Antiguo)",
|
||||
"Stick center calibration": "Calibración de centro de los análogos",
|
||||
"Welcome": "Bienvenido",
|
||||
"Step 1": "Paso 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Paso 4",
|
||||
"Completed": "Completado",
|
||||
"Welcome to the stick center-calibration wizard!": "Bienvenido al asistente de calibración de centro de los análogos!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Esta herramienta le guiará a re-centrar los sticks análogos. Consiste en cuatro pasos: Se le pedirá que mueva los análogos en una dirección y que luego los suelte.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Atención: <i>la calibración NO se puede interrumpir</i>. No cierre esta página, ni desconecte el mando hasta que sea completada.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Esta herramienta le guiará a re-centrar los sticks análogos. Consiste en cuatro pasos: Se le pedirá que mueva los análogos en una dirección y que luego los suelte.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Atención: <i>la calibración NO se puede interrumpir</i>. No cierre esta página, ni desconecte el mando hasta que sea completada.",
|
||||
"Press <b>Start</b> to begin calibration.": "Pulse <b>Empezar</b> para iniciar calibración",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Mueva ambos análogos hacia la esquina <b>superior-izquierda</b> y luego suéltelos.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Cuando los análogos estén de vuelta en su centro, pulse <b>Continuar</b>",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Gire los análogos despacio para cubrir todo rango. Pulse \"Listo\" cuando haya terminado.",
|
||||
"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",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Tipo de dispositivo",
|
||||
"Range calibration completed": "Calibración de Rango completada",
|
||||
"Range calibration failed": "Calibración de Rango fallida",
|
||||
"Cannot unlock NVS": "No fue posible desbloquear la NVS",
|
||||
"Cannot relock NVS": "No fue posible re-bloquear la NVS",
|
||||
"Error 1": "Error 1",
|
||||
"Error 2": "Error 2",
|
||||
"Error 3": "Error 3",
|
||||
"Stick calibration failed": "Calibración de análogos fallida",
|
||||
"Stick calibration completed": "Calibración de análogos completada",
|
||||
"NVS Lock failed": "Bloqueo NVS Fallido",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Dispositivo conectado no válido: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "El dispositivo parece ser un clón del DS4. Todas las funcionalidades se han desactivado",
|
||||
"Error: ": "Error: ",
|
||||
"Connected invalid device": "Dispositivo conectado no válido",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Error",
|
||||
"My handle on discord is: the_al": "Mi usuario de discord es: the_al",
|
||||
"Initializing...": "Inicializando...",
|
||||
"Storing calibration...": "Guardando Calibración...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Si, si seleccionas la casilla \"Guardar cambios de forma permanente en el mando\". En ese caso, la calibración será flasheada en el firmware del mando. Esto asegurará que esta permanezca funcionando sin importar la consola a las que sea conectado.",
|
||||
"Is this an officially endorsed service?": "Es esto un servicio oficial?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "No, este servicio simplemente nació de un amante del control DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Esta web detecta si el mando es un clón?",
|
||||
"Does this website detect if a controller is a clone?": "Esta web detecta si el mando es un clón?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Si, solo DualShock4 de momento. Esto sucedió ya que acidentalmente compré algunos clones y le dediqué un tiempo en identificar las diferencias, y añadí la función para prevenir futuras decepciones.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Desafortunadamente, los clones no se pueden calibrar de ninguna manera, debido a que ellos clonan el comportamiento de un DualShock4 durante una partida normal, no todas las funciones indocumentadas.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Desafortunadamente, los clones no se pueden calibrar de ninguna manera, debido a que ellos clonan el comportamiento de un DualShock4 durante una partida normal, no todas las funciones indocumentadas.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Si quieres que se amplíe la función de detección enviame un Dualsense falso y lo varás en unas cuantas semanas.",
|
||||
"What development is in plan?": "Que desarrollos se tienen planeados?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Mantengo dos listas de tareas separadas para este proyecto, aún así la prioridad aún esta por establecerse.",
|
||||
@@ -144,10 +137,17 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"After range calibration, joysticks always go in corners.": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Can I reset a permanent calibration to previous calibration?": "",
|
||||
@@ -156,25 +156,26 @@
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Changes saved successfully": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Does this software resolve stickdrift?": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"Error while saving changes": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
@@ -182,6 +183,13 @@
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -189,75 +197,117 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"Headphone Jack": "",
|
||||
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"No.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Only after you have done that, you click on \"Done\".": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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.": "",
|
||||
"Reboot controller": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Save changes permanently": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"This screen allows to finetune raw calibration data on your controller": "",
|
||||
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"Yes. Simply do another permanent calibration.": "",
|
||||
"You can do this in two ways:": "",
|
||||
"You have to rotate the joysticks before you press \"Done\".": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
@@ -7,7 +7,6 @@
|
||||
"Disconnect": "قطع اتصال",
|
||||
"Calibrate stick center": "کالیبراسیون مرکز استیک",
|
||||
"Calibrate stick range": "کالیبراسیون محدوده استیک",
|
||||
"Reset controller": "بازنشانی کنترلر",
|
||||
"Sections below are not useful, just some debug infos or manual commands": "بخشهای زیر برای کاربران عادی مفید نیست، فقط اطلاعات اشکالزدایی یا دستورات دستی هستند",
|
||||
"NVS Status": "وضعیت NVS",
|
||||
"Unknown": "نامشخص",
|
||||
@@ -15,7 +14,6 @@
|
||||
"Query NVS status": "استعلام وضعیت NVS",
|
||||
"NVS unlock": "باز کردن قفل NVS",
|
||||
"NVS lock": "قفل کردن NVS",
|
||||
"Fast calibrate stick center (OLD)": "کالیبراسیون سریع مرکز استیک (قدیمی)",
|
||||
"Stick center calibration": "کالیبراسیون مرکز استیک",
|
||||
"Welcome": "خوش آمدید",
|
||||
"Step 1": "مرحله ۱",
|
||||
@@ -24,8 +22,8 @@
|
||||
"Step 4": "مرحله ۴",
|
||||
"Completed": "تکمیل شد",
|
||||
"Welcome to the stick center-calibration wizard!": "به راهنمای کالیبراسیون مرکز استیک خوش آمدید!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "این ابزار شما را در بازتنظیم مرکز استیکهای آنالوگ کنترلر راهنمایی میکند. این فرآیند شامل چهار مرحله است که در هر مرحله باید استیکها را در یک جهت حرکت داده و رها کنید.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "لطفاً توجه داشته باشید، <i>پس از شروع کالیبراسیون، نمیتوان آن را لغو کرد</i>. تا پایان فرآیند، صفحه را نبندید و کنترلر را قطع نکنید.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "این ابزار شما را در بازتنظیم مرکز استیکهای آنالوگ کنترلر راهنمایی میکند. این فرآیند شامل چهار مرحله است که در هر مرحله باید استیکها را در یک جهت حرکت داده و رها کنید.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "لطفاً توجه داشته باشید، <i>پس از شروع کالیبراسیون، نمیتوان آن را لغو کرد</i>. تا پایان فرآیند، صفحه را نبندید و کنترلر را قطع نکنید.",
|
||||
"Press <b>Start</b> to begin calibration.": "برای شروع کالیبراسیون روی <b>شروع</b> کلیک کنید.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "لطفاً هر دو استیک را به <b>بالا سمت چپ</b> حرکت داده و رها کنید.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "پس از بازگشت استیکها به مرکز، روی <b>ادامه</b> کلیک کنید.",
|
||||
@@ -38,7 +36,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "لطفاً این پنجره را نبندید و کنترلر را قطع نکنید.",
|
||||
"Range calibration": "کالیبراسیون محدوده",
|
||||
"<b>The controller is now sampling data!</b>": "<b>کنترلر اکنون در حال نمونهبرداری از دادههاست!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "استیکها را به آرامی حرکت دهید تا کل محدوده پوشش داده شود. پس از اتمام، روی \"تکمیل\" کلیک کنید.",
|
||||
"Done": "تکمیل",
|
||||
"Hi, thank you for using this software.": "سلام، از استفاده شما از این نرمافزار متشکرم.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "اگر این نرمافزار برایتان مفید بود و میخواهید از تلاشهای من حمایت کنید، میتوانید",
|
||||
@@ -59,11 +56,6 @@
|
||||
"Device Type": "نوع دستگاه",
|
||||
"Range calibration completed": "کالیبراسیون محدوده تکمیل شد",
|
||||
"Range calibration failed": "کالیبراسیون محدوده ناموفق بود",
|
||||
"Cannot unlock NVS": "باز کردن قفل NVS ممکن نیست",
|
||||
"Cannot relock NVS": "قفل مجدد NVS ممکن نیست",
|
||||
"Error 1": "خطا ۱",
|
||||
"Error 2": "خطا ۲",
|
||||
"Error 3": "خطا ۳",
|
||||
"Stick calibration failed": "کالیبراسیون استیک ناموفق بود",
|
||||
"Stick calibration completed": "کالیبراسیون استیک تکمیل شد",
|
||||
"NVS Lock failed": "قفل NVS ناموفق بود",
|
||||
@@ -73,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "سونی DualShock 4 نسخه ۲",
|
||||
"Sony DualSense": "سونی DualSense",
|
||||
"Sony DualSense Edge": "سونی DualSense Edge",
|
||||
"Connected invalid device: ": "دستگاه متصل نامعتبر است: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "به نظر میرسد این کنترلر یک کپی از DS4 است. تمام عملکردها غیرفعال هستند.",
|
||||
"Error: ": "خطا: ",
|
||||
"Connected invalid device": "دستگاه متصل نامعتبر است",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "خطا",
|
||||
"My handle on discord is: the_al": "شناسه من در دیسکورد: the_al",
|
||||
"Initializing...": "در حال راهاندازی...",
|
||||
"Storing calibration...": "در حال ذخیرهسازی کالیبراسیون...",
|
||||
@@ -94,5 +86,77 @@
|
||||
"Understood": "متوجه شدم",
|
||||
"Version": "نسخه",
|
||||
"Frequently Asked Questions": "سؤالات متداول",
|
||||
"Close": "بستن"
|
||||
}
|
||||
"Close": "بستن",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Center": "",
|
||||
"Circularity": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Don't show again": "",
|
||||
"Fail": "",
|
||||
"Failed": "",
|
||||
"Failed to connect to device": "",
|
||||
"Failed to disable adaptive trigger": "",
|
||||
"Failed to set speaker tone": "",
|
||||
"Failed to set vibration": "",
|
||||
"Feel for vibration in the controller.": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"Increase non-circularity": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"No controller connected": "",
|
||||
"No tests completed yet.": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Plug in headphones to the 3.5mm jack": "",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "",
|
||||
"Press [circle] to close, or [square] to start over": "",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
|
||||
"Press [square] to begin or [circle] to close": "",
|
||||
"Press [triangle] to go back.": "",
|
||||
"Press each button until they turn green.": "",
|
||||
"Progress": "",
|
||||
"Quick Test": "",
|
||||
"Quick calibrate": "",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
|
||||
"Speaker": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
|
||||
"This test checks the headphone jack functionality.": "",
|
||||
"This test checks the reliability of the USB port.": "",
|
||||
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
|
||||
"USB Connector": "",
|
||||
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
|
||||
"Wiggle the USB cable to see if the controller disconnects.": "",
|
||||
"failed": "",
|
||||
"hide": "",
|
||||
"passed": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/fr_fr.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Status de la requête NVS",
|
||||
"NVS unlock": "Déverrouiller le NVS",
|
||||
"NVS lock": "Vérouiller le NVS",
|
||||
"Fast calibrate stick center (OLD)": "Calibrer rapidement le centrage du joystick (Ancienne méthode)",
|
||||
"Stick center calibration": "Calibrage du centrage du joystick",
|
||||
"Welcome": "Bienvenue",
|
||||
"Step 1": "Étape 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Étape 4",
|
||||
"Completed": "Terminé",
|
||||
"Welcome to the stick center-calibration wizard!": "Bienvenue dans l'assistant de calibrage de centrage du joystick !",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Cet outil va vous guider afin de recentrer les joysticks analogiques de votre manette. Il consiste en quatres étapes: il vous sera demandé de bouger les deux joysticks dans une direction puis de les relacher.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Veuillez noter <i>qu'une fois le calibrage lancée, il n'est pas possible de l'annuler</i>. Ne fermez pas cette page ou ne déconnectez pas la manette tant que le calibrage n'est pas terminée.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Cet outil va vous guider afin de recentrer les joysticks analogiques de votre manette. Il consiste en quatres étapes: il vous sera demandé de bouger les deux joysticks dans une direction puis de les relacher.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Veuillez noter <i>qu'une fois le calibrage lancée, il n'est pas possible de l'annuler</i>. Ne fermez pas cette page ou ne déconnectez pas la manette tant que le calibrage n'est pas terminée.",
|
||||
"Press <b>Start</b> to begin calibration.": "Appuyez sur <b>Démarrer</b> pour commencer le calibrage.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Veuillez déplacer les deux joysticks <b>en haut à gauche</b> puis relachez-les.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Une fois les deux joysticks recentrés, appuyez sur <b>Continuer</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Faites tourner doucement les joysticks afin de couvrir toute leur portée. Appuyez sur \"Terminer\" une fois terminé.",
|
||||
"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 à",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Type d'appareil",
|
||||
"Range calibration completed": "Calibrage de la portée terminé",
|
||||
"Range calibration failed": "Échec du calibrage de la portée",
|
||||
"Cannot unlock NVS": "Impossible de dévérouiller le NVS",
|
||||
"Cannot relock NVS": "Impossible de vérouiller le NVS",
|
||||
"Error 1": "Erreur 1",
|
||||
"Error 2": "Erreur 2",
|
||||
"Error 3": "Erreur 3",
|
||||
"Stick calibration failed": "Échec du calibrage des joysticks",
|
||||
"Stick calibration completed": "Calibrage des joysticks terminé",
|
||||
"NVS Lock failed": "Échec du vérouillage du NVS",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Appareil non valide connecté: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Cet appareil semble être une contre-façon de DS4. Toutes les fonctionnalités sont désactivés",
|
||||
"Error: ": "Erreur: ",
|
||||
"Connected invalid device": "Appareil non valide connecté",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Erreur",
|
||||
"My handle on discord is: the_al": "Mon ID sur Discord est: the_al",
|
||||
"Initializing...": "Initialisation...",
|
||||
"Storing calibration...": "Sauvegarde du calibrage...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Oui, si vous cochez la case \"Écrire les modifications de manière permanente dans la manette\". Dans ce cas, la calibration est directement enregistrée dans le firmware de la manette. Cela garantit qu'elle reste en place, quelle que soit la console à laquelle elle est connectée.",
|
||||
"Is this an officially endorsed service?": "S'agit-il d'un service officiellement approuvé ?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Non, ce service est simplement une création d'un passionné de DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Ce site détecte-t-il si une manette est un clone ?",
|
||||
"Does this website detect if a controller is a clone?": "Ce site détecte-t-il si une manette est un clone ?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Oui, uniquement la DualShock4 pour le moment. Cela est arrivé parce que j'ai accidentellement acheté des clones, j'ai passé du temps à identifier les différences et j'ai ajouté cette fonctionnalité pour éviter les futures déceptions.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Malheureusement, les clones ne peuvent pas être calibrés de toute façon, car ils ne copient que le comportement d'une DualShock4 pendant un jeu normal, pas toutes les fonctionnalités non documentées.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Malheureusement, les clones ne peuvent pas être calibrés de toute façon, car ils ne copient que le comportement d'une DualShock4 pendant un jeu normal, pas toutes les fonctionnalités non documentées.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Si vous souhaitez étendre cette fonctionnalité de détection à la DualSense, veuillez m'envoyer une fausse DualSense et vous la verrez dans quelques semaines.",
|
||||
"What development is in plan?": "Quels développements sont prévus?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Je maintiens deux listes de tâches séparées pour ce projet, bien que la priorité n'ait pas encore été établie.",
|
||||
@@ -144,10 +137,17 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"After range calibration, joysticks always go in corners.": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Can I reset a permanent calibration to previous calibration?": "",
|
||||
@@ -156,25 +156,26 @@
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Changes saved successfully": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Does this software resolve stickdrift?": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"Error while saving changes": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
@@ -182,6 +183,13 @@
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -189,75 +197,117 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"Headphone Jack": "",
|
||||
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"No.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Only after you have done that, you click on \"Done\".": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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.": "",
|
||||
"Reboot controller": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Save changes permanently": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"This screen allows to finetune raw calibration data on your controller": "",
|
||||
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"Yes. Simply do another permanent calibration.": "",
|
||||
"You can do this in two ways:": "",
|
||||
"You have to rotate the joysticks before you press \"Done\".": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
107
lang/hu_hu.json
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "Az NVS állapotának lekérdezése",
|
||||
"NVS unlock": "NVS feloldása",
|
||||
"NVS lock": "NVS zárolása",
|
||||
"Fast calibrate stick center (OLD)": "Hüvelykujjkar középállásának gyors újrakalibrálása (elavult)",
|
||||
"Stick center calibration": "Hüvelykujjkar középállásának újrakalibrálása",
|
||||
"Welcome": "Használati utasítások",
|
||||
"Step 1": "Lépés: 1",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "Lépés: 4",
|
||||
"Completed": "Befejezés",
|
||||
"Welcome to the stick center-calibration wizard!": "Üdvözöl a hüvelykujjkar középállásának kalibrálását végző alkalmazás!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Ez az eszköz segít a kontroller analóg karjainak újraközpontosításában. Négy lépésből áll: mindkét hüvelykujjkart mozgasd a megadott irányba, majd engedd el.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Kérlek, vedd figyelembe, hogy <i>miután a kalibrálás elindul, azt nem lehet megszakítani</i>. Ne zárd be ezt az oldalt, és ne válaszd le a kontrollert, amíg be nem fejeződött a kalibrálási procedúra.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Ez az eszköz segít a kontroller analóg karjainak újraközpontosításában. Négy lépésből áll: mindkét hüvelykujjkart mozgasd a megadott irányba, majd engedd el.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Kérlek, vedd figyelembe, hogy <i>miután a kalibrálás elindul, azt nem lehet megszakítani</i>. Ne zárd be ezt az oldalt, és ne válaszd le a kontrollert, amíg be nem fejeződött a kalibrálási procedúra.",
|
||||
"Press <b>Start</b> to begin calibration.": "Nyomd meg a <b>Kezdés</b> gombot az újrakalibrálás megkezdéséhez",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Kérlek, mozgasd mindkét hüvelykujjkart átlósan a <b>bal felső sarokba</b>, és engedd el őket.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Amikor a hüvelykujjkarok ismét középen vannak, nyomd meg a <b>Folytatás</b> gombot.",
|
||||
@@ -37,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Lassan forgasd mind a két a hüvelykujjkart, hogy a teljes tartományt lefedje (legalább 6 teljes kör, körkörösen a külső szélek mentén). Ha elkészültél, nyomd meg a \"Kész\" gombot.",
|
||||
"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",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "Eszköz típusa",
|
||||
"Range calibration completed": "A tartománykalibráció befejeződött",
|
||||
"Range calibration failed": "A tartománykalibráció meghiúsult",
|
||||
"Cannot unlock NVS": "NVS feloldása nem lehetséges",
|
||||
"Cannot relock NVS": "NVS újbóli zárolása nem lehetséges",
|
||||
"Error 1": "Hiba 1",
|
||||
"Error 2": "Hiba 2",
|
||||
"Error 3": "Hiba 3",
|
||||
"Stick calibration failed": "Hüvelykujjkar kalibrálása sikertelen",
|
||||
"Stick calibration completed": "Hüvelykujjkar kalibrálása befejeződött",
|
||||
"NVS Lock failed": "NVS zárolása sikertelen",
|
||||
@@ -72,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Érvénytelen eszköz csatlakoztatva: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Úgy tűnik, hogy a kontroller egy DS4 klón (hamisítvány). Minden funkció le lesz tiltva.",
|
||||
"Error: ": "Hiba: ",
|
||||
"Connected invalid device": "Érvénytelen eszköz csatlakoztatva",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Hiba",
|
||||
"My handle on discord is: the_al": "Fogjunk kezet a Discordon: the_al",
|
||||
"Initializing...": "Inicializálás...",
|
||||
"Storing calibration...": "Kalibrálási adatok tárolása...",
|
||||
@@ -105,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Igen, ha bejelölöd a \"A változtatások végleges írása a kontrollerbe\" jelölőnégyzetet. Ebben az esetben a kalibrálás közvetlenül a kontroller firmware-ében jelenik meg. Ez biztosítja, hogy a helyén maradjon és aktív legyen, függetlenül attól, hogy melyik konzolhoz csatlakozik.",
|
||||
"Is this an officially endorsed service?": "Ez egy hivatalosan jóváhagyott szolgáltatás?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Nem, ez a szolgáltatás egyszerűen egy DualShock kontroller rajongó által készített szolgáltatás.",
|
||||
"Does this website detects if a controller is a clone?": "Ez a webhely érzékeli, hogy a csatlakoztatott kontroller klón?",
|
||||
"Does this website detect if a controller is a clone?": "Ez a webhely érzékeli, hogy a csatlakoztatott kontroller klón?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Igen, jelenleg csak a DualShock 4 kontrollereken. Ez azért történt, mert a készítő véletlenül vásárolt néhány klónt, időt töltött a különbségek azonosításával, és hozzáadta ezt a funkciót, hogy megakadályozza a jövőbeni megtévesztést.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Sajnos a klónokat amúgy sem lehet kalibrálni, mert csak a DualShock 4 kontroller viselkedését klónozzák normál játék közben, nem az összes dokumentálatlan funkciót.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Sajnos a klónokat amúgy sem lehet kalibrálni, mert csak a DualShock 4 kontroller viselkedését klónozzák normál játék közben, nem az összes dokumentálatlan funkciót.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Ha szeretnél segíteni ezt az észlelési funkciót kiterjeszteni a DualSense-re, küldj a fejlesztőnek egy hamis DualSense-t, és az alaklamzás néhány héten belül látni fogja.",
|
||||
"What development is in plan?": "Milyen fejlesztés van tervben?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "A fejlesztő két külön listát vezet ehhez a projekthez, bár a prioritást még meg kell határozni.",
|
||||
@@ -184,17 +177,9 @@
|
||||
"Show all": "Mindet megjelenít",
|
||||
"Finetune stick calibration": "Karok finomkalibrálása",
|
||||
"(beta)": "(béta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Ez a felület lehetővé teszi a kontroller nyers kalibrációs adatainak finomhangolását.",
|
||||
"Left stick": "Bal kar",
|
||||
"Right stick": "Jobb kar",
|
||||
"Center X": "X középállás",
|
||||
"Center Y": "Y középállás",
|
||||
"Save": "Mentés",
|
||||
"Cancel": "Mégse",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "A DualShock kontroller kalibráló felület jelenleg nem támogatja a DualSense Edge-et.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Aktívan dolgozom a kompatibilitás hozzáadásán, a legnagyobb kihívást az adatok hüvelykujjkar modulokba történő tárolása jelenti.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Ha ez az eszköz hasznos volt számodra, vagy szeretnéd, hogy a DualSense Edge támogatása gyorsabban megérkezzen, kérlek, fontold meg a projekt támogatását",
|
||||
"Thank you for your generosity and support!": "Köszönöm nagylelkűségedet és támogatásodat!",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Külsőleg</b>: +1,8 V közvetlen alkalmazásával a látható tesztpontra, anélkül, hogy a kontrollert szétszednéd.",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Belsőleg</b>: egy vezeték forrasztásával egy +1,8 V-os forrásból az írásvédelmi tesztponthoz.",
|
||||
"Calibration is being stored in the stick modules.": "A kalibráció mentése a hüvelykujjkar modulokban történik.",
|
||||
@@ -234,31 +219,95 @@
|
||||
"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": "",
|
||||
"Error triggering rumble": "",
|
||||
"Don't show again": "",
|
||||
"Fail": "",
|
||||
"Failed": "",
|
||||
"Failed to connect to device": "",
|
||||
"Failed to disable adaptive trigger": "",
|
||||
"Failed to set speaker tone": "",
|
||||
"Failed to set vibration": "",
|
||||
"Feel for vibration in the controller.": "",
|
||||
"Fortnite": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
|
||||
"No controller connected": "",
|
||||
"No tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"": ""
|
||||
}
|
||||
113
lang/it_it.json
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "Ottieni stato NVS",
|
||||
"NVS unlock": "Sblocca NVS",
|
||||
"NVS lock": "Blocca NVS",
|
||||
"Fast calibrate stick center (OLD)": "Ricentra velocemente gli analogici (vecchio)",
|
||||
"Stick center calibration": "Calibrazione del centro degli analogici",
|
||||
"Welcome": "Benvenuto",
|
||||
"Step 1": "Step 1",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "Step 4",
|
||||
"Completed": "Completato",
|
||||
"Welcome to the stick center-calibration wizard!": "Benvenuto nel wizard di calibrazione degli analogici",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Questo strumento ti guida nel ricentrare le levette analogiche del tuo controller. Consiste in quattro passi: ti verrà chiesto di spostare entrambi gli analogici in una direzione e poi rilasciarli.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Attenzione: <i>se la calibrazione è in corso, non può essere annullata</i>. Non chiudere questa pagina e non disconnettere il controller finché non è completata.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Questo strumento ti guida nel ricentrare le levette analogiche del tuo controller. Consiste in quattro passi: ti verrà chiesto di spostare entrambi gli analogici in una direzione e poi rilasciarli.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Attenzione: <i>se la calibrazione è in corso, non può essere annullata</i>. Non chiudere questa pagina e non disconnettere il controller finché non è completata.",
|
||||
"Press <b>Start</b> to begin calibration.": "Premi <b>Avvia</b> per avviare la calibrazione",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Muovi entrambi gli analogici <b>in alto a sinistra</b> e rilasciali.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Quando le levette sono nuovamente al centro, premi <b>Continua</b>",
|
||||
@@ -37,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Ruota gli analogici lentamente in modo da coprire l'intero range. Premi \"Fatto\" quando hai finito.",
|
||||
"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",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "Tipo Device",
|
||||
"Range calibration completed": "Calibrazione range completata",
|
||||
"Range calibration failed": "Calibrazione range fallita",
|
||||
"Cannot unlock NVS": "Impossibile sbloccare NVS",
|
||||
"Cannot relock NVS": "Impossibile ribloccare NVS",
|
||||
"Error 1": "Errore 1",
|
||||
"Error 2": "Errore 2",
|
||||
"Error 3": "Errore 3",
|
||||
"Stick calibration failed": "Calibrazione analogici fallita",
|
||||
"Stick calibration completed": "Calibrazione analogici completata",
|
||||
"NVS Lock failed": "Blocco NVS fallito",
|
||||
@@ -72,8 +65,8 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Connesso dispositivo non valido: ",
|
||||
"Error: ": "Errore: ",
|
||||
"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...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Sì, se spunti la casella \"Salva i cambiamenti permanentemente nel controller\". In tal caso, la calibrazione viene scritta direttamente nel firmware del controller. Ciò garantisce che rimanga in calibrato indipendentemente dalla console a cui è collegato.",
|
||||
"Is this an officially endorsed service?": "Questo è un servizio ufficialmente approvato?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "No, questo servizio è semplicemente una creazione di un appassionato di DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Questo sito web rileva se un controller è un clone?",
|
||||
"Does this website detect if a controller is a clone?": "Questo sito web rileva se un controller è un clone?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Sì, solo DualShock4 al momento. Questo è successo perché ho acquistato accidentalmente alcuni cloni, ho passato del tempo ad identificare le differenze e ho aggiunto questa funzionalità per evitare future frodi.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Sfortunatamente, i cloni non possono essere comunque calibrati, perché clonano solo il comportamento di un DualShock4 durante un gameplay normale, non tutte le funzionalità non documentate.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Sfortunatamente, i cloni non possono essere comunque calibrati, perché clonano solo il comportamento di un DualShock4 durante un gameplay normale, non tutte le funzionalità non documentate.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Se vuoi estendere questa funzionalità di rilevamento anche a DualSense, spediscimi un clone e vedrai il servizio attivo tra qualche settimana.",
|
||||
"What development is in plan?": "Quali sviluppi sono previsti?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Mantengo due elenchi di cose da fare separati per questo progetto, anche se la priorità deve ancora essere stabilita.",
|
||||
@@ -183,17 +176,9 @@
|
||||
"Show all": "Mostra tutto",
|
||||
"Finetune stick calibration": "Affina calibrazione joystick",
|
||||
"(beta)": "(beta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Questa schermata perfette di affinare i dati grezzi di calibrazione del controller.",
|
||||
"Left stick": "Levetta sinistra",
|
||||
"Right stick": "Levetta destra",
|
||||
"Center X": "Centro X",
|
||||
"Center Y": "Centro Y",
|
||||
"Save": "Salva",
|
||||
"Cancel": "Annulla",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock Calibration GUI non supporta ancora il DualSense Edge.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Sto lavorando attivamente per renderlo compatibile, ma la sfida principale rimane salvare i dati nei moduli degli stick.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Se questo strumento ti è stato utile o desideri che il supporto per il DualSense Edge arrivi più rapidamente, considera di supportare il progetto con una",
|
||||
"Thank you for your generosity and support!": "Grazie per la tua generosità e per il supporto!",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Esternamente</b>: applicando +1.8V direttamente al test point visibile senza aprire il controller",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Internamente</b>: saldando un filo da un test point a +1.8V al test point di write-protect.",
|
||||
"Calibration is being stored in the stick modules.": "Sto salvando la calibrazione nei moduli degli stick.",
|
||||
@@ -204,7 +189,7 @@
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Attenzione: i moduli degli stick del DS Edge <b>non possono essere calibrati solo tramite software</b>.",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Per salvare una calibrazione personalizzata nella memoria interna dello stick, è necessaria una <b>modifica hardware</b>.",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "Il supporto per la calibrazione dei moduli stick del DualSense Edge è ora disponibile come <b>funzionalità sperimentale</b>.",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Il dispositivo sembra essere un clone del DS4. Tutte le funzionalità sono disabilitate.",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Questo comporta la disattivazione temporanea della protezione scrittura applicando <b>+1.8V</b> a uno specifico punto di test su ciascun modulo.",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Questa procedura è destinata solo a utenti esperti. Se non sei sicuro di ciò che stai facendo, ti preghiamo di non tentarla.",
|
||||
"We are not responsible for any damage caused by attempting this modification.": "Non siamo responsabili per eventuali danni causati dal tentativo di questa modifica.",
|
||||
@@ -243,13 +228,7 @@
|
||||
"Normal": "Normale",
|
||||
"Calibration": "Calibrazione",
|
||||
"Debug": "Debug",
|
||||
"Error triggering rumble": "Errore nell'avvio della vibrazione",
|
||||
"Info": "Info",
|
||||
"Press L2 to test the strong (left) haptic motor": "Premi L2 per testare il motore forte (sinistro)",
|
||||
"Press R2 to test the weak (right) haptic motor": "Premi R2 per testare il motore debole (destro)",
|
||||
"Test the Haptic Motors": "Testa la vibrazione",
|
||||
"Tests": "Test",
|
||||
"The motor strength will match how hard you press the trigger": "La forza della vibrazione sarà proporzionale alla pressione del trigger",
|
||||
"Center (L1)": "Centro (L1)",
|
||||
"Circularity (R1)": "Circolarità (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.": "Sposta lo stick per selezionarlo per la calibrazione, quindi, senza toccare lo stick, usa i pulsanti del D-pad per regolare il punto centrale. Muovi rapidamente lo stick e regola di nuovo se non è centrato o se sfarfalla.",
|
||||
@@ -257,8 +236,78 @@
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Premi il D-pad o i pulsanti frontali nella direzione in cui vuoi spostare lo stick.",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "Premi lo stick completamente verso l'alto, il basso, sinistra o destra.",
|
||||
"Show raw numbers": "Mostra i dati raw",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "Mentre tieni lo stick da calibrare verso l'alto, il basso, sinistra o destra, <em>osserva il valore evidenziato sotto il cerchio</em>, quindi usa i pulsanti del D-pad per regolare il valore a ±0.99 (appena sotto ±1.00).",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Errore medio di circolarità:</strong> più basso non è sempre meglio! Punta al 7–9 %.",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "È necessario un riavvio per continuare a usare questo DualSense Edge. Disconnetti e ricollega il controller.",
|
||||
"Adaptive Trigger": "Trigger adattivo",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "I trigger adattivi sono supportati solo sui controller DualSense",
|
||||
"Add test": "Aggiungi test",
|
||||
"Be gentle to avoid damage.": "Agisci con delicatezza per evitare danni.",
|
||||
"Buttons": "Pulsanti",
|
||||
"Center": "Centro",
|
||||
"Circularity": "Circolarità",
|
||||
"Controller does not support adaptive trigger control": "Il controller non supporta il controllo dei trigger adattivi",
|
||||
"Don't show again": "Non mostrare più",
|
||||
"Fail": "Errore",
|
||||
"Failed": "Fallito",
|
||||
"Failed to connect to device": "Connessione al dispositivo non riuscita",
|
||||
"Failed to disable adaptive trigger": "Impossibile disattivare il trigger adattivo",
|
||||
"Failed to set speaker tone": "Impossibile attivare il tono dall'altoparlante",
|
||||
"Failed to set vibration": "Impossibile impostare la vibrazione",
|
||||
"Feel for vibration in the controller.": "Senti la vibrazione nel controller.",
|
||||
"Haptic Vibration": "Vibrazione aptica",
|
||||
"Headphone Jack": "Jack cuffie",
|
||||
"Increase non-circularity": "Aumenta la non-circolarità",
|
||||
"Instructions": "Istruzioni",
|
||||
"Keep rotating the sticks even if you see no progress!": "Continua a ruotare le levette anche se non vedi progressi!",
|
||||
"Learn more...": "Scopri di più...",
|
||||
"Lights": "LEDs",
|
||||
"Listen for a tone from the controller speaker.": "Ascolta un tono proveniente dall'altoparlante del controller.",
|
||||
"Long-press [circle] to skip ahead.": "Tieni premuto [circle] per saltare il test.",
|
||||
"Microphone": "Microfono",
|
||||
"Microphone Level:": "Livello microfono:",
|
||||
"No controller connected": "Nessun controller connesso",
|
||||
"No tests completed yet.": "Nessun test completato.",
|
||||
"Not tested": "Non testato",
|
||||
"Pass": "Superato",
|
||||
"Passed": "Superato",
|
||||
"Plug in headphones to the 3.5mm jack": "Collega le cuffie al jack da 3.5mm",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "Premi i trigger L2 e R2 per sentire la resistenza.",
|
||||
"Press [circle] to close, or [square] to start over": "Premi [circle] per chiudere o [square] per ricominciare",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Premi [square] se superato, [cross] se fallito o [circle] per saltare.",
|
||||
"Press [square] to begin or [circle] to close": "Premi [square] per iniziare o [circle] per chiudere",
|
||||
"Press [triangle] to go back.": "Premi [triangle] per tornare indietro.",
|
||||
"Press each button until they turn green.": "Premi ogni pulsante finché non diventa verde.",
|
||||
"Progress": "Progresso",
|
||||
"Quick Test": "Test rapido",
|
||||
"Quick calibrate": "Calibrazione rapida",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "La calibrazione del range sembra non essere riuscita. Riprova assicurandoti di ruotare le levette.",
|
||||
"Repeat": "Ripeti",
|
||||
"Restart": "Riavvia",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Ruota lentamente le levette almeno 2 volte in una direzione e 2 nell'altra per coprire l'intero range.",
|
||||
"Run through these tests to verify your controller's functionality.": "Esegui questi test per verificare il corretto funzionamento del controller.",
|
||||
"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.": "I controller Sony escono di fabbrica calibrati con un errore medio di circolarità di circa il 10 %, ed è ciò che i giochi si aspettano. Una circolarità troppo perfetta può rendere i movimenti e la mira rigidi e poco reattivi in alcuni titoli.",
|
||||
"Speaker": "Altoparlante",
|
||||
"Step size": "Dimensione passo",
|
||||
"Test Speaker": "Test altoparlante",
|
||||
"Test Summary": "Riepilogo test",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Testa tutti i pulsanti, oppure tieni premuto [square] per superarlo, [cross] per fallirlo o [circle] per saltare.",
|
||||
"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.": "Il pulsante <b>Fine</b> si sbloccherà dopo massimo 15 secondi. Se premi <b>Fine</b> senza ruotare le levette, la calibrazione sarà incompleta e dovrai ripeterla.",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Il dispositivo è connesso via Bluetooth. Disconnetti e ricollega tramite cavo USB.",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "Questo test verifica tutti i pulsanti del controller chiedendoti di premerli fino a tre volte ciascuno.",
|
||||
"This test checks the headphone jack functionality.": "Questo test verifica il funzionamento del jack cuffie.",
|
||||
"This test checks the reliability of the USB port.": "Questo test controlla l'affidabilità della porta 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.": "Questo test farà scorrere i colori rosso, verde e blu sulla barra luminosa del controller, animerà i LED giocatore e farà lampeggiare il pulsante mute.",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "Questo test attiverà un'elevata resistenza su entrambi i grilletti L2 e R2.",
|
||||
"USB Connector": "Connettore USB",
|
||||
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Osserva i LED del controller cambiare colore, i LED giocatore animarsi e il pulsante mute lampeggiare.",
|
||||
"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": "Tenendo l'analogico da regolare verso l'alto, basso, sinistra o destra, effettua le regolazioni finché non vedi settori azzurri in tutte e quattro le direzioni dopo aver ruotato la levetta in entrambi i sensi. Poi usa",
|
||||
"Wiggle the USB cable to see if the controller disconnects.": "Muovi leggermente il cavo USB per vedere se il controller si disconnette.",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Il tuo dispositivo potrebbe non essere un controller Sony originale. Se non è un clone, segnala il problema.",
|
||||
"failed": "fallito",
|
||||
"hide": "nascondi",
|
||||
"passed": "superato",
|
||||
"skipped": "saltato",
|
||||
"tests completed": "test completati",
|
||||
"to increase the non-circularity.": "per aumentare la non-circolarità.",
|
||||
"": ""
|
||||
}
|
||||
}
|
||||
|
||||
110
lang/jp_jp.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "NVSステータスをクエリ",
|
||||
"NVS unlock": "NVSロック解除",
|
||||
"NVS lock": "NVSロック",
|
||||
"Fast calibrate stick center (OLD)": "スティック中央を高速キャリブレーション(旧)",
|
||||
"Stick center calibration": "スティック中央のキャリブレーション",
|
||||
"Welcome": "ようこそ",
|
||||
"Step 1": "ステップ1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "ステップ4",
|
||||
"Completed": "完了",
|
||||
"Welcome to the stick center-calibration wizard!": "スティック中央キャリブレーションウィザードへようこそ!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "このツールは、コントローラのアナログスティックを再センタリングするのを案内します。4つのステップで構成されており、両方のスティックをある方向に移動させてからリリースするように求められます。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "キャリブレーションが実行されると、<i>キャンセルできなくなります</i>。完了するまで、このページを閉じたりコントローラを切断したりしないでください。",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "このツールは、コントローラのアナログスティックを再センタリングするのを案内します。4つのステップで構成されており、両方のスティックをある方向に移動させてからリリースするように求められます。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "キャリブレーションが実行されると、<i>キャンセルできなくなります</i>。完了するまで、このページを閉じたりコントローラを切断したりしないでください。",
|
||||
"Press <b>Start</b> to begin calibration.": "キャリブレーションを開始するには<b>開始</b>を押してください。",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "両方のスティックを<b>左上の隅</b>に倒して、戻してください。",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "スティックが中央に戻ったら、<b>続行</b>を押してください。",
|
||||
@@ -36,7 +35,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "このウインドウを閉じたり、コントローラーを切断したりしないでください。 ",
|
||||
"Range calibration": "範囲キャリブレーション",
|
||||
"<b>The controller is now sampling data!</b>": "<b>コントローラは現在データをサンプリングしています!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "スティックをゆっくり回して全範囲をカバーしてください。完了したら「完了」を押してください。",
|
||||
"Done": "完了",
|
||||
"Hi, thank you for using this software.": "こんにちは、このソフトウェアをご利用いただきありがとうございます。",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "役立つと思われる場合、または私の取り組みをサポートしたい場合は、お気軽に",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "デバイスタイプ",
|
||||
"Range calibration completed": "範囲キャリブレーションが完了しました",
|
||||
"Range calibration failed": "範囲キャリブレーションに失敗しました",
|
||||
"Cannot unlock NVS": "NVSをロック解除できません",
|
||||
"Cannot relock NVS": "NVSを再ロックできません",
|
||||
"Error 1": "エラー1",
|
||||
"Error 2": "エラー2",
|
||||
"Error 3": "エラー3",
|
||||
"Stick calibration failed": "スティックのキャリブレーションに失敗しました",
|
||||
"Stick calibration completed": "スティックのキャリブレーションが完了しました",
|
||||
"NVS Lock failed": "NVSロックに失敗しました",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "接続された無効なデバイス:",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "デバイスはDS4のクローンのようです。すべての機能が無効になっています。",
|
||||
"Error: ": "エラー:",
|
||||
"Connected invalid device": "接続された無効なデバイス",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "エラー",
|
||||
"My handle on discord is: the_al": "Discordでの私のハンドルは:the_al",
|
||||
"Initializing...": "初期化中...",
|
||||
"Storing calibration...": "キャリブレーションの保存中...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "はい、「コントローラーに変更を永久に書き込む」チェックボックスをオンにします。その場合、キャリブレーションは直接コントローラーファームウェアにフラッシュされます。これにより、接続されているコンソールに関係なく、その場に留まることが保証されます。",
|
||||
"Is this an officially endorsed service?": "これは公式に承認されたサービスですか?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "いいえ、このサービスは単なるDualShock愛好家によるものです。",
|
||||
"Does this website detects if a controller is a clone?": "このウェブサイトはコントローラーがクローンかどうかを検出しますか?",
|
||||
"Does this website detect if a controller is a clone?": "このウェブサイトはコントローラーがクローンかどうかを検出しますか?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "はい、現時点ではDualShock4のみです。これは私が偶然いくつかのクローンを購入し、違いを特定するのに時間を費やし、将来の誤解を防ぐためにこの機能を追加したためです。",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "残念ながら、クローンはどちらにせよキャリブレーションできません。なぜなら、彼らは通常のゲームプレイ中のDualShock4の振る舞いだけをクローン化し、未文書化の機能全てをクローン化しないからです。",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "残念ながら、クローンはどちらにせよキャリブレーションできません。なぜなら、彼らは通常のゲームプレイ中のDualShock4の振る舞いだけをクローン化し、未文書化の機能全てをクローン化しないからです。",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "この検出機能をDualSenseに拡張したい場合は、偽のDualSenseを送ってください。数週間で実装されます。",
|
||||
"What development is in plan?": "どのような開発計画がありますか?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "このプロジェクトでは、優先順位はまだ確立されていませんが、2つの別々のToDoリストを管理しています。",
|
||||
@@ -140,26 +133,25 @@
|
||||
"Check circularity": "円形を確認",
|
||||
"Finetune stick calibration": "スティックの微調整キャリブレーション",
|
||||
"(beta)": "(ベータ版)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "この画面ではコントローラーの生データを微調整できます。",
|
||||
"Left stick": "左スティック",
|
||||
"Right stick": "右スティック",
|
||||
"Center X": "中心 X",
|
||||
"Center Y": "中心 Y",
|
||||
"Save": "保存",
|
||||
"Cancel": "キャンセル",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShockキャリブレーションGUIは現在、DualSense Edgeをサポートしていません。",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "互換性を追加するために取り組んでいますが、主な課題はスティックモジュールへのデータ保存です。",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "このツールが役に立った場合、またはDualSense Edgeのサポートを早く実現したい場合は、プロジェクトへの支援をご検討ください。",
|
||||
"Thank you for your generosity and support!": "ご支援とご厚意に感謝します!",
|
||||
"(Dualsense) Will updating the firmware reset calibration?": "",
|
||||
"10x zoom": "",
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"After range calibration, joysticks always go in corners.": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Can I reset a permanent calibration to previous calibration?": "",
|
||||
@@ -167,23 +159,26 @@
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Changes saved successfully": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Does this software resolve stickdrift?": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"Error while saving changes": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
@@ -191,73 +186,128 @@
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"Headphone Jack": "",
|
||||
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"No.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Only after you have done that, you click on \"Done\".": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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.": "",
|
||||
"Reboot controller": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"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.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save changes permanently": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"Yes. Simply do another permanent calibration.": "",
|
||||
"You can do this in two ways:": "",
|
||||
"You have to rotate the joysticks before you press \"Done\".": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/ko_kr.json
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "NVS 상태 조회",
|
||||
"NVS unlock": "NVS 잠금 해제",
|
||||
"NVS lock": "NVS 잠금",
|
||||
"Fast calibrate stick center (OLD)": "스틱 중앙 빠른 보정 (구버전)",
|
||||
"Stick center calibration": "스틱 중앙 보정",
|
||||
"Welcome": "환영합니다",
|
||||
"Step 1": "1단계",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "4단계",
|
||||
"Completed": "완료",
|
||||
"Welcome to the stick center-calibration wizard!": "스틱 중앙 보정 마법사에 오신 것을 환영합니다!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "이 도구는 컨트롤러 아날로그 스틱의 중앙을 다시 설정하는 과정을 안내합니다. 총 4단계로 구성되며, 각 단계마다 양쪽 스틱을 특정 방향으로 움직였다가 놓으라는 안내가 표시됩니다.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "<i>보정이 시작되면 취소할 수 없습니다</i>. 완료될 때까지 이 페이지를 닫거나 컨트롤러 연결을 해제하지 마십시오.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "이 도구는 컨트롤러 아날로그 스틱의 중앙을 다시 설정하는 과정을 안내합니다. 총 4단계로 구성되며, 각 단계마다 양쪽 스틱을 특정 방향으로 움직였다가 놓으라는 안내가 표시됩니다.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "<i>보정이 시작되면 취소할 수 없습니다</i>. 완료될 때까지 이 페이지를 닫거나 컨트롤러 연결을 해제하지 마십시오.",
|
||||
"Press <b>Start</b> to begin calibration.": "<b>시작</b>을 눌러 보정을 시작하세요.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "양쪽 스틱을 <b>왼쪽 위</b> 방향으로 끝까지 민 다음 놓아주세요.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "스틱이 중앙으로 돌아오면 <b>계속</b> 버튼을 누르세요.",
|
||||
@@ -37,7 +36,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "이 창을 닫거나 컨트롤러 연결을 해제하지 마십시오.",
|
||||
"Range calibration": "범위 보정",
|
||||
"<b>The controller is now sampling data!</b>": "<b>컨트롤러가 데이터 샘플링을 시작했습니다!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "스틱을 천천히 돌려 전체 범위를 인식시키세요. 완료되면 <b>완료</b>를 누르세요.",
|
||||
"Done": "완료",
|
||||
"Hi, thank you for using this software.": "안녕하세요, 저희 소프트웨어를 이용해 주셔서 감사합니다.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "이 프로그램이 도움이 되었고, 개발자를 응원하고 싶으시다면",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "기기 종류",
|
||||
"Range calibration completed": "범위 보정이 완료되었습니다.",
|
||||
"Range calibration failed": "범위 보정에 실패했습니다",
|
||||
"Cannot unlock NVS": "NVS를 잠금 해제할 수 없습니다.",
|
||||
"Cannot relock NVS": "NVS를 다시 잠글 수 없습니다.",
|
||||
"Error 1": "오류 1",
|
||||
"Error 2": "오류 2",
|
||||
"Error 3": "오류 3",
|
||||
"Stick calibration failed": "스틱 보정에 실패했습니다",
|
||||
"Stick calibration completed": "스틱 보정이 완료되었습니다.",
|
||||
"NVS Lock failed": "NVS 잠금에 실패했습니다",
|
||||
@@ -72,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "잘못된 기기가 연결되었습니다:",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "이 기기는 DS4 복제품으로 보입니다. 모든 기능이 비활성화됩니다.",
|
||||
"Error: ": "오류:",
|
||||
"Connected invalid device": "잘못된 기기가 연결되었습니다",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "오류",
|
||||
"My handle on discord is: the_al": "제 Discord ID는 the_al 입니다.",
|
||||
"Initializing...": "초기화 중...",
|
||||
"Storing calibration...": "보정 값 저장 중...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "네, \"변경 사항을 컨트롤러에 영구적으로 저장\" 체크박스를 선택하면 됩니다. 이 경우 보정 값이 컨트롤러 펌웨어에 직접 저장되어, 어떤 콘솔에 연결하든 설정이 유지됩니다.",
|
||||
"Is this an officially endorsed service?": "이것은 공식적으로 인증된 서비스인가요?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "아니요, 이 서비스는 한 DualShock 팬이 만든 개인적인 창작물입니다.",
|
||||
"Does this website detects if a controller is a clone?": "이 웹사이트는 컨트롤러가 복제품인지 감지할 수 있나요?",
|
||||
"Does this website detect if a controller is a clone?": "이 웹사이트는 컨트롤러가 복제품인지 감지할 수 있나요?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "네, 현재로서는 DualShock 4만 감지할 수 있습니다. 제가 실수로 복제품을 구매하게 되어, 차이점을 파악하는 데 시간을 투자했고, 앞으로 다른 사람들이 속지 않도록 이 기능을 추가했습니다.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "안타깝게도 복제품은 보정이 불가능합니다. 일반적인 게임 플레이 동작만 복제할 뿐, 문서화되지 않은 모든 기능까지 복제하지는 않기 때문입니다.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "안타깝게도 복제품은 보정이 불가능합니다. 일반적인 게임 플레이 동작만 복제할 뿐, 문서화되지 않은 모든 기능까지 복제하지는 않기 때문입니다.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "DualSense 복제품 감지 기능 추가를 원하신다면, 저에게 가짜 DualSense를 보내주세요. 몇 주 안에 기능을 추가해 드리겠습니다.",
|
||||
"What development is in plan?": "어떤 개발 계획이 있나요?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "이 프로젝트에는 두 개의 별도 할 일 목록이 있으며, 아직 우선순위는 정해지지 않았습니다.",
|
||||
@@ -194,8 +187,6 @@
|
||||
"Cannot store data into": "데이터를 저장할 수 없음:",
|
||||
"Cannot unlock": "잠금 해제할 수 없음",
|
||||
"Center (L1)": "중앙 (L1)",
|
||||
"Center X": "중앙 X",
|
||||
"Center Y": "중앙 Y",
|
||||
"Chroma Indigo": "크로마 인디고",
|
||||
"Chroma Pearl": "크로마 펄",
|
||||
"Chroma Teal": "크로마 틸",
|
||||
@@ -206,16 +197,13 @@
|
||||
"Cosmic Red": "코스믹 레드",
|
||||
"Debug": "디버그",
|
||||
"DualSense Edge Calibration": "DualSense Edge 보정",
|
||||
"Error triggering rumble": "진동 활성화 오류",
|
||||
"Finetune stick calibration": "스틱 보정 미세 조정",
|
||||
"For more info or help, feel free to reach out on Discord.": "더 많은 정보나 도움이 필요하시면 Discord로 문의해주세요.",
|
||||
"Fortnite": "포트나이트",
|
||||
"Galactic Purple": "갤럭틱 퍼플",
|
||||
"God of War Ragnarok": "갓 오브 워 라그나로크",
|
||||
"Grey Camouflage": "그레이 카무플라주",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "호환성 추가 작업을 적극적으로 진행 중이며, 주된 과제는 스틱 모듈에 데이터를 저장하는 것입니다.",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "보정 값이 영구적으로 저장되지 않으면 하드웨어 개조 배선을 다시 확인해주세요.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "이 도구가 도움이 되었거나 DualSense Edge 지원이 더 빨리 이루어지기를 바란다면, 다음을 통해 프로젝트를 후원하는 것을 고려해주세요:",
|
||||
"Info": "정보",
|
||||
"Left Module Barcode": "왼쪽 모듈 바코드",
|
||||
"Left stick": "왼쪽 스틱",
|
||||
@@ -225,39 +213,101 @@
|
||||
"Normal": "일반",
|
||||
"Nova Pink": "노바 핑크",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "DualShock 4, DualSense 또는 DualSense Edge 컨트롤러를 컴퓨터에 연결하고 '연결'을 누르세요.",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "참고: DS Edge의 스틱 모듈은 <b>소프트웨어만으로는 보정할 수 없습니다</b>. 스틱 내부 메모리에 사용자 지정 보정 값을 저장하려면 <b>하드웨어 개조</b>가 필요합니다.",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "참고: DS Edge의 스틱 모듈은 <b>소프트웨어만으로는 보정할 수 없습니다</b>.",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "스틱 내부 메모리에 사용자 지정 보정 값을 저장하려면 <b>하드웨어 개조</b>가 필요합니다.",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "D-패드 버튼으로 조정하기 전에 스틱을 중앙 위치에 놓아주세요.",
|
||||
"Press L2 to test the strong (left) haptic motor": "L2를 눌러 강한 (왼쪽) 햅틱 모터를 테스트하세요",
|
||||
"Press R2 to test the weak (right) haptic motor": "R2를 눌러 약한 (오른쪽) 햅틱 모터를 테스트하세요",
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "스틱 위치를 이동시키고 싶은 방향으로 D-패드나 페이스 버튼을 누르세요.",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "스틱을 위/아래/왼쪽/오른쪽으로 최대한 밀어주세요.",
|
||||
"Right Module Barcode": "오른쪽 모듈 바코드",
|
||||
"Right stick": "오른쪽 스틱",
|
||||
"Save": "저장",
|
||||
"Show raw numbers": "원시 데이터 보기",
|
||||
"Spider-Man 2": "스파이더맨 2",
|
||||
"Starlight Blue": "스타라이트 블루",
|
||||
"Sterling Silver": "스털링 실버",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "DualSense Edge 스틱 모듈 보정 지원이 이제 <b>실험적인 기능</b>으로 제공됩니다.",
|
||||
"Test the Haptic Motors": "햅틱 모터 테스트",
|
||||
"Tests": "테스트",
|
||||
"Thank you for your generosity and support!": "너그러운 후원에 진심으로 감사드립니다!",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock 보정 GUI는 현재 DualSense Edge를 지원하지 않습니다.",
|
||||
"The Last of Us": "더 라스트 오브 어스",
|
||||
"The motor strength will match how hard you press the trigger": "트리거를 누르는 강도에 따라 모터의 세기가 조절됩니다.",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "이를 위해서는 각 모듈의 특정 테스트 포인트에 <b>+1.8V</b>를 인가하여 쓰기 방지를 일시적으로 비활성화해야 합니다.",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "이 기능은 고급 사용자 전용입니다. 잘 모르는 경우 시도하지 마십시오.",
|
||||
"This screen allows to finetune raw calibration data on your controller": "이 화면에서 컨트롤러의 원시 보정 데이터를 미세 조정할 수 있습니다.",
|
||||
"Volcanic Red": "볼캐닉 레드",
|
||||
"We are not responsible for any damage caused by attempting this modification.": "이 개조 시도로 인해 발생하는 어떠한 손상에 대해서도 책임지지 않습니다.",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "조정할 스틱을 위/아래/왼쪽/오른쪽으로 똑바로 잡은 상태에서 <em>원 아래에 강조 표시된 값</em>을 확인한 다음 D-패드 버튼을 사용하여 값을 ±0.99(±1.00 바로 아래)로 조정하세요.",
|
||||
"White": "화이트",
|
||||
"You can do this in two ways:": "두 가지 방법으로 할 수 있습니다:",
|
||||
"here": "여기",
|
||||
"left module": "왼쪽 모듈",
|
||||
"right module": "오른쪽 모듈",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Center": "",
|
||||
"Circularity": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Don't show again": "",
|
||||
"Fail": "",
|
||||
"Failed": "",
|
||||
"Failed to connect to device": "",
|
||||
"Failed to disable adaptive trigger": "",
|
||||
"Failed to set speaker tone": "",
|
||||
"Failed to set vibration": "",
|
||||
"Feel for vibration in the controller.": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"Increase non-circularity": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"No controller connected": "",
|
||||
"No tests completed yet.": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Plug in headphones to the 3.5mm jack": "",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "",
|
||||
"Press [circle] to close, or [square] to start over": "",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
|
||||
"Press [square] to begin or [circle] to close": "",
|
||||
"Press [triangle] to go back.": "",
|
||||
"Press each button until they turn green.": "",
|
||||
"Progress": "",
|
||||
"Quick Test": "",
|
||||
"Quick calibrate": "",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
|
||||
"Speaker": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
|
||||
"This test checks the headphone jack functionality.": "",
|
||||
"This test checks the reliability of the USB port.": "",
|
||||
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
|
||||
"Through": "",
|
||||
"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.": "",
|
||||
"": ""
|
||||
}
|
||||
110
lang/nl_nl.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "NVS-status opvragen",
|
||||
"NVS unlock": "NVS ontgrendelen",
|
||||
"NVS lock": "NVS vergrendelen",
|
||||
"Fast calibrate stick center (OLD)": "Snelle kalibratie van stick center (OUD)",
|
||||
"Stick center calibration": "Stick center kalibratie",
|
||||
"Welcome": "Welkom",
|
||||
"Step 1": "Stap 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Stap 4",
|
||||
"Completed": "Voltooid",
|
||||
"Welcome to the stick center-calibration wizard!": "Welkom bij de stick center kalibratie wizard!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Deze tool begeleidt u bij het opnieuw centreren van de analoge sticks van uw controller. Het bestaat uit vier stappen: u zal worden gevraagd om beide sticks in een richting te bewegen en ze los te laten.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Houd er rekening mee dat, <i>eenmaal de kalibratie is uitgevoerd, deze niet kan worden geannuleerd</i>. Sluit deze pagina niet en koppel uw controller niet los voordat deze is voltooid.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Deze tool begeleidt u bij het opnieuw centreren van de analoge sticks van uw controller. Het bestaat uit vier stappen: u zal worden gevraagd om beide sticks in een richting te bewegen en ze los te laten.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Houd er rekening mee dat, <i>eenmaal de kalibratie is uitgevoerd, deze niet kan worden geannuleerd</i>. Sluit deze pagina niet en koppel uw controller niet los voordat deze is voltooid.",
|
||||
"Press <b>Start</b> to begin calibration.": "Druk op <b>Start</b> om de kalibratie te starten.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Verplaats beide sticks naar de <b>linkerbovenhoek</b> en laat ze los.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Als de sticks weer in het midden staan, druk dan op <b>Doorgaan</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Draai de sticks langzaam rond om het hele bereik te bestrijken. Druk op \"Gereed\" als u klaar bent.",
|
||||
"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",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Apparaat type",
|
||||
"Range calibration completed": "Kalibratie van het bereik is voltooid",
|
||||
"Range calibration failed": " Kalibratie van het bereik is mislukt",
|
||||
"Cannot unlock NVS": " Kan NVS niet ontgrendelen",
|
||||
"Cannot relock NVS": "Kan NVS niet opnieuw vergrendelen",
|
||||
"Error 1": "Fout 1",
|
||||
"Error 2": "Fout 2",
|
||||
"Error 3": "Fout 3",
|
||||
"Stick calibration failed": "Stick kalibratie mislukt",
|
||||
"Stick calibration completed": "Stick kalibratie voltooid",
|
||||
"NVS Lock failed": "NVS vergrendeling mislukt",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Ongeldig apparaat verbonden: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Het apparaat lijkt een DS4-kloon te zijn. Alle functionaliteiten zijn uitgeschakeld.",
|
||||
"Error: ": "Error: ",
|
||||
"Connected invalid device": "Ongeldig apparaat verbonden",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Error",
|
||||
"My handle on discord is: the_al": "Mijn handle voor Discord is: the_al",
|
||||
"Initializing...": "Initialiseren...",
|
||||
"Storing calibration...": "Kalibratie opslaan...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Ja, als je het selectievakje \"Schrijf wijzigingen aanvinkt permanent in de controller\". In dat geval wordt de kalibratie direct in de controller firmware geflasht. Dit zorgt ervoor dat het op zijn plaats blijft, ongeacht de console waarmee het is verbonden.",
|
||||
"Is this an officially endorsed service?": "Is dit een officieel goedgekeurde dienst?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Nee, deze dienst is eenvoudigweg een creatie van een DualShock-liefhebber.",
|
||||
"Does this website detects if a controller is a clone?": "Detecteert deze website of een controller een kloon is?",
|
||||
"Does this website detect if a controller is a clone?": "Detecteert deze website of een controller een kloon is?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": " Ja, momenteel alleen DualShock4. Dit gebeurde omdat ik per ongeluk een aantal klonen kocht, tijd besteedde aan het identificeren van de verschillen en deze functionaliteit toevoegde om toekomstige misleiding te voorkomen.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Helaas kunnen de klonen hoe dan ook niet worden gekalibreerd, omdat ze alleen het gedrag klonen van een DualShock4 tijdens een normale gameplay en niet alle niet-gedocumenteerde functionaliteiten die een DualShock heeft.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Helaas kunnen de klonen hoe dan ook niet worden gekalibreerd, omdat ze alleen het gedrag klonen van een DualShock4 tijdens een normale gameplay en niet alle niet-gedocumenteerde functionaliteiten die een DualShock heeft.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Als u wilt dat ik deze detectie functionaliteit uitbreidt naar DualSense, stuur me dan een nep-DualSense en je zult het binnen een paar weken zien.",
|
||||
"What development is in plan?": "Welke ontwikkeling staat er op de planning?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Ik houd twee aparte to-do-lijsten bij voor dit project, hoewel de prioriteit nog moet worden vastgesteld.",
|
||||
@@ -144,10 +137,17 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"After range calibration, joysticks always go in corners.": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Can I reset a permanent calibration to previous calibration?": "",
|
||||
@@ -156,25 +156,26 @@
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Changes saved successfully": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Does this software resolve stickdrift?": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"Error while saving changes": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
@@ -182,6 +183,13 @@
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -189,75 +197,117 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"Headphone Jack": "",
|
||||
"I have noticed some controllers out of the box have worse factory calibration than if I would recalibrate them. Especially true for circularity of SCUF controllers with a unique shell.": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Make sure to touch the edges of the joystick frame and rotate slowly, preferably in each direction - clockwise and anti-clockwise.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"No.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Only after you have done that, you click on \"Done\".": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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.": "",
|
||||
"Reboot controller": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Save changes permanently": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Stickdrift is caused by a physical defect; namely dirt, worn potentiometer or in some cases a worn spring.": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"This screen allows to finetune raw calibration data on your controller": "",
|
||||
"This software will not fix stick drift on its own if you already experience that. What it will help with, is ensuring the new joystick(s) will function properly after replacing the old one(s) to work well with.": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"Yes. Simply do another permanent calibration.": "",
|
||||
"You can do this in two ways:": "",
|
||||
"You have to rotate the joysticks before you press \"Done\".": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
108
lang/pl_pl.json
@@ -7,7 +7,6 @@
|
||||
"Disconnect": "Rozłącz kontroler",
|
||||
"Calibrate stick center": "Skalibruj centralny punkt drążków",
|
||||
"Calibrate stick range": "Skalibruj maksymalny zakres drążków",
|
||||
"Reset controller": "Zresetuj kontroler",
|
||||
"Sections below are not useful, just some debug infos or manual commands": "Poniższe sekcje nie są przydatne, zawierają jedynie informacje dotyczące debugowania lub ręcznych poleceń",
|
||||
"NVS Status": "Status NVS",
|
||||
"Unknown": "Nieznany",
|
||||
@@ -15,7 +14,6 @@
|
||||
"Query NVS status": "Zapytanie o status NVS",
|
||||
"NVS unlock": "Odblokuj NVS",
|
||||
"NVS lock": "Zablokuj NVS",
|
||||
"Fast calibrate stick center (OLD)": "Szybka kalibracja punktu drążków (stara wersja)",
|
||||
"Stick center calibration": "Kalibracja centralna drążków",
|
||||
"Welcome": "Witamy",
|
||||
"Step 1": "Krok 1",
|
||||
@@ -24,8 +22,8 @@
|
||||
"Step 4": "Krok 4",
|
||||
"Completed": "Zakończono",
|
||||
"Welcome to the stick center-calibration wizard!": "Witamy w narzędziu kalibracyjnym centralnego punktu drążków!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "To narzędzie pomoże Ci w ponownym wycentrowaniu drążków kontrolera. Składa się z czterech kroków: zostaniesz poproszony o przesunięcie obu drążków w określonych kierunkach, a następnie w ich puszczeniu.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Prosimy pamiętać, żeby po rozpoczęciu kalibracji nie anulować całej procedury. Nie zamykaj tej strony ani nie odłączaj kontrolera do czasu zakończenia.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "To narzędzie pomoże Ci w ponownym wycentrowaniu drążków kontrolera. Składa się z czterech kroków: zostaniesz poproszony o przesunięcie obu drążków w określonych kierunkach, a następnie w ich puszczeniu.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Prosimy pamiętać, żeby po rozpoczęciu kalibracji nie anulować całej procedury. Nie zamykaj tej strony ani nie odłączaj kontrolera do czasu zakończenia.",
|
||||
"Press <b>Start</b> to begin calibration.": "Naciśnij <b>Start</b>, żeby rozpocząć kalibrację.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Proszę przesuń oba drążki maksymalnie do <b>lewy-górny-róg</b> a następnie je puść.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Gdy drążki po puszczeniu znajdują się na środku, naciśnij <b>Kontynuuj</b>.",
|
||||
@@ -38,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Obracaj powoli drążkami w ich maksymalnym możliwym zakresie, a następnie je puść. Naciśnij \"Gotowe\", jeżeli skończyłeś.",
|
||||
"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ę",
|
||||
@@ -59,11 +56,6 @@
|
||||
"Device Type": "Rodzaj urządzenia",
|
||||
"Range calibration completed": "Kalibracja maksymalnego zakresu drążków została zakończona pomyślnie",
|
||||
"Range calibration failed": "Kalibracja maksymalnego zakresu drążków została nieuadana",
|
||||
"Cannot unlock NVS": "Nie można odblokować NVS",
|
||||
"Cannot relock NVS": "Nie można ponownie zablokować NVS",
|
||||
"Error 1": "Błąd 1",
|
||||
"Error 2": "Błąd 2",
|
||||
"Error 3": "Błąd 3",
|
||||
"Stick calibration failed": "Kalibracja drążków nie powiodła się",
|
||||
"Stick calibration completed": "Kalibracja drążków powiodła się",
|
||||
"NVS Lock failed": "Blokada NVS nie powiodła się",
|
||||
@@ -73,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Podłączono nieznane urządzenie: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Wykryto urządzenie jako klon Dualshock 4. Wszystkie funkcje zostają wyłączone.",
|
||||
"Error: ": "Błąd: ",
|
||||
"Connected invalid device": "Podłączono nieznane urządzenie",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Błąd",
|
||||
"My handle on discord is: the_al": "Mój Discord to: the_al",
|
||||
"Initializing...": "Inicjowanie...",
|
||||
"Storing calibration...": "Zapisywanie kalibracji...",
|
||||
@@ -106,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Tak, jeśli zaznaczysz w checkbox \"Zapisz zmiany na stałe w kontrolerze\" W takim przypadku kalibracja zostanie wczytana bezpośrednio w oprogramowaniu sterownika. Dzięki temu pozostanie na swoim miejscu niezależnie od konsoli, do której jest podłączony.",
|
||||
"Is this an officially endorsed service?": "Czy jest to oficjalnie zatwierdzona usługa?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Nie, ta usługa jest po prostu dziełem entuzjasty DualShock'a",
|
||||
"Does this website detects if a controller is a clone?": "Czy ta witryna internetowa wykrywa, czy kontroler jest klonem?",
|
||||
"Does this website detect if a controller is a clone?": "Czy ta witryna internetowa wykrywa, czy kontroler jest klonem?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Tak, obecnie tylko DualShock 4. Stało się tak, ponieważ przez przypadek kupiłem kilka klonów, spędziłem czas na identyfikowaniu różnic i dodałem tę funkcję, aby zapobiec przyszłym oszustwom.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Niestety klonów i tak nie da się skalibrować, ponieważ klonują jedynie zachowanie DualShocka 4 podczas normalnej rozgrywki, a nie wszystkie nieudokumentowane funkcje.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Niestety klonów i tak nie da się skalibrować, ponieważ klonują jedynie zachowanie DualShocka 4 podczas normalnej rozgrywki, a nie wszystkie nieudokumentowane funkcje.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Jeśli chcesz rozszerzyć tę funkcję wykrywania na DualSense, prześlij mi fałszywy DualSense, a zobaczysz go za kilka tygodni.",
|
||||
"What development is in plan?": "Jakie masz dalsze plany na rozwój?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Prowadzę dwie osobne listy rzeczy do zrobienia dla tego projektu, chociaż priorytet nie został jeszcze ustalony.",
|
||||
@@ -185,17 +177,9 @@
|
||||
"Show all": "Pokaż wszystko",
|
||||
"Finetune stick calibration": "Dokładna kalibracja drążków",
|
||||
"(beta)": "(beta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Te okienko pozwala na ustawianie dokładniejszych danych o kalibracji w twoim kontrolerze",
|
||||
"Left stick": "Lewy drążęk",
|
||||
"Right stick": "Prawy drążęk",
|
||||
"Center X": "Punkt X",
|
||||
"Center Y": "Punkt Y",
|
||||
"Save": "Zapisz",
|
||||
"Cancel": "Anuluj",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "Strona DualShock Calibration GUI nie wspiera jeszcze kontrolera Dualsesne Edge",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Aktywnie pracuję nad dodaniem kompatybilności, ale głównym wyzwaniem jest przechowywanie danych w modułach drążków.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Jeśli uważasz że to narzędzie było dla ciebie pomocne, lub chcesz aby wsparcie DualSense Edge pojawiło się szybciej, rozważ wsparcie projektu poprzez",
|
||||
"Thank you for your generosity and support!": "Dziękujemy za hojność i wsparcie!",
|
||||
"30th Anniversary": "30th Anniversary",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Zewnętrznie</b>: poprzez podanie +1.8V bezpośrednio do widocznego punktu testowego bez otwierania kontrolera.",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Wewnętrznie</b>: przez przylutowanie przewodu z źródła +1.8V do punktu testowego ochrony przed zapisem.",
|
||||
@@ -243,14 +227,8 @@
|
||||
"10x zoom": "10-krotne przybliżenie",
|
||||
"Calibration": "Kalibracja",
|
||||
"Debug": "Wyszukiwanie błędów",
|
||||
"Error triggering rumble": "Błąd wyzwalania wibracji",
|
||||
"Info": "Informacje",
|
||||
"Normal": "Normalne",
|
||||
"Press L2 to test the strong (left) haptic motor": "Naciśnij L2 by sprawdzić silniejszy (lewy) silnik haptyczny",
|
||||
"Press R2 to test the weak (right) haptic motor": "Naciśnij R2 by sprawdzić delikatniejszy (prawy) silnik haptyczny",
|
||||
"Test the Haptic Motors": "Test Silników Haptycznych",
|
||||
"Tests": "Testy",
|
||||
"The motor strength will match how hard you press the trigger": "Siła wibracji będzie odpowiadała sile z jaką naciskasz na przyciski",
|
||||
"Center (L1)": "Centrowanie (L1)",
|
||||
"Circularity (R1)": "Kolistość (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.",
|
||||
@@ -258,8 +236,78 @@
|
||||
"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.",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "Przesuń drążek prosto w górę/dół/lewo/prawo najdalej jak to możliwe.",
|
||||
"Show raw numbers": "Pokaż surowe liczby",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "",
|
||||
"Adaptive Trigger": "",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "",
|
||||
"Add test": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Center": "",
|
||||
"Circularity": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Don't show again": "",
|
||||
"Fail": "",
|
||||
"Failed": "",
|
||||
"Failed to connect to device": "",
|
||||
"Failed to disable adaptive trigger": "",
|
||||
"Failed to set speaker tone": "",
|
||||
"Failed to set vibration": "",
|
||||
"Feel for vibration in the controller.": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"Increase non-circularity": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"No controller connected": "",
|
||||
"No tests completed yet.": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Plug in headphones to the 3.5mm jack": "",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "",
|
||||
"Press [circle] to close, or [square] to start over": "",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
|
||||
"Press [square] to begin or [circle] to close": "",
|
||||
"Press [triangle] to go back.": "",
|
||||
"Press each button until they turn green.": "",
|
||||
"Progress": "",
|
||||
"Quick Test": "",
|
||||
"Quick calibrate": "",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
|
||||
"Speaker": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "Trzymajac drążek w pozycji do wyregulowania (góra/dół/lewo/prawo), <em>obserwuj pogrubioną wartość pod okręgiem</em>, nastęnie użyj pada kierunkowego (d-pada/krzyżaka) by ustawić wartość na ±0.99 (zaraz poniżej ±1.00).",
|
||||
"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.": "",
|
||||
"": ""
|
||||
}
|
||||
102
lang/pt_br.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Consultar status NVS",
|
||||
"NVS unlock": "Desbloquear NVS",
|
||||
"NVS lock": "Bloquear NVS",
|
||||
"Fast calibrate stick center (OLD)": "Calibrar rapidamente o centro do Analog (Antigo)",
|
||||
"Stick center calibration": "Calibração do centro do Analog",
|
||||
"Welcome": "Bem-vindo",
|
||||
"Step 1": "Passo 1",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Gire os analógicos lentamente para cobrir todo o intervalo. Pressione \"Concluído\" quando terminar.",
|
||||
"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",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Tipo de Dispositivo",
|
||||
"Range calibration completed": "Calibração de alcance completa",
|
||||
"Range calibration failed": "Calibração de alcance falhou",
|
||||
"Cannot unlock NVS": "Não é possível desbloquear NVS",
|
||||
"Cannot relock NVS": "Não é possível bloquear NVS",
|
||||
"Error 1": "Erro 1",
|
||||
"Error 2": "Erro 2",
|
||||
"Error 3": "Erro 3",
|
||||
"Stick calibration failed": "Calibração de analógico falhou",
|
||||
"Stick calibration completed": "Calibração de analógico completa",
|
||||
"NVS Lock failed": "Bloqueio de NVS falhou",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Dispositivo conectado inválido: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "O dispositivo parece ser um clone do DS4. Todas as funcionalidades estão desabilitadas.",
|
||||
"Error: ": "Erro: ",
|
||||
"Connected invalid device": "Dispositivo conectado inválido",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Erro",
|
||||
"My handle on discord is: the_al": "Meu nome de usuário no Discord é: the_al",
|
||||
"Initializing...": "Inicializando...",
|
||||
"Storing calibration...": "Salvando calibração...",
|
||||
@@ -162,38 +155,53 @@
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Battery Barcode": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Bluetooth Address": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Cancel": "",
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Center X": "",
|
||||
"Center Y": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller Info": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Debug Info": "",
|
||||
"Debug buttons": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"FW Build Date": "",
|
||||
"FW Series": "",
|
||||
"FW Type": "",
|
||||
"FW Update": "",
|
||||
"FW Update Info": "",
|
||||
"FW Version": "",
|
||||
"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.": "",
|
||||
"Finetune stick calibration": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
@@ -201,63 +209,105 @@
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"HW Model": "",
|
||||
"Haptic Vibration": "",
|
||||
"Hardware": "",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "",
|
||||
"Headphone Jack": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Left stick": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"MCU Unique ID": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"PCBA ID": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"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.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"SBL FW Version": "",
|
||||
"Save": "",
|
||||
"Serial Number": "",
|
||||
"Show all": "",
|
||||
"Show raw numbers": "",
|
||||
"Software": "",
|
||||
"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 FW Version": "",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Thank you for your generosity and support!": "",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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 screen allows to finetune raw calibration data on your controller": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"VCM Left Barcode": "",
|
||||
"VCM Right Barcode": "",
|
||||
"Venom FW Version": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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 can do this in two ways:": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
133
lang/pt_pt.json
@@ -1,5 +1,5 @@
|
||||
{
|
||||
".authorMsg": "- Tradução para o Português de Portugal realizada por ricardo_57 :)",
|
||||
".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",
|
||||
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Consultar status NVS",
|
||||
"NVS unlock": "Desbloquear NVS",
|
||||
"NVS lock": "Bloquear NVS",
|
||||
"Fast calibrate stick center (OLD)": "Calibrar rapidamente o centro dos joysticks (ANTIGO)",
|
||||
"Stick center calibration": "Calibração do centro do joystick",
|
||||
"Welcome": "Bem-vindo",
|
||||
"Step 1": "Passo 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Passo 4",
|
||||
"Completed": "Concluído",
|
||||
"Welcome to the stick center-calibration wizard!": "Bem-vindo ao assistente de calibração de centro dos joysticks!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Esta ferramenta irá guiá-lo para recentrar os joysticks do controlador. Consiste em quatro etapas: onde será solicitado que mova ambos os joysticks numa direção e que os solte.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Esteja ciente de que, <i>quando a calibração iniciar, não poderá ser cancelada</i>. Não feche esta página ou desconecte o controlador, até que a calibração estar concluída.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Esta ferramenta irá guiá-lo para recentrar os joysticks do controlador. Consiste em quatro etapas: onde será solicitado que mova ambos os joysticks numa direção e que os solte.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Esteja ciente de que, <i>quando a calibração iniciar, não poderá ser cancelada</i>. Não feche esta página ou desconecte o controlador, até que a calibração estar concluída.",
|
||||
"Press <b>Start</b> to begin calibration.": "Pressione <b>Iniciar</b> para começar a calibração.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Mova ambos os joysticks para o <b>canto superior esquerdo</b> e solte-os.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Quando os joysticks voltarem ao centro, pressione <b>Continuar</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Rode os joysticks lentamente para cobrir todo o alcance. Pressione \"Concluído\" quando terminar.",
|
||||
"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",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Tipo de Dispositivo",
|
||||
"Range calibration completed": "Calibração de alcance completa",
|
||||
"Range calibration failed": "Calibração de alcance falhou",
|
||||
"Cannot unlock NVS": "Não é possível desbloquear NVS",
|
||||
"Cannot relock NVS": "Não é possível bloquear NVS",
|
||||
"Error 1": "Erro 1",
|
||||
"Error 2": "Erro 2",
|
||||
"Error 3": "Erro 3",
|
||||
"Stick calibration failed": "Calibração do joystick falhou",
|
||||
"Stick calibration completed": "Calibração do joystick completa",
|
||||
"NVS Lock failed": "Bloqueio de NVS falhou",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Dispositivo inválido ligado: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "O dispositivo parece ser um clone do DS4. Todas as funcionalidades estão desabilitadas.",
|
||||
"Error: ": "Erro: ",
|
||||
"Connected invalid device": "Dispositivo inválido ligado",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Erro",
|
||||
"My handle on discord is: the_al": "Meu nome de utilizador no Discord é: the_al",
|
||||
"Initializing...": "Iniciando...",
|
||||
"Storing calibration...": "Armazenando a calibração...",
|
||||
@@ -164,8 +157,6 @@
|
||||
"Bluetooth Address": "Endereço Bluetooth",
|
||||
"Calibration is being stored in the stick modules.": " A calibration esta a ser gravada nos modulos dos joysticks.",
|
||||
"Cancel": "Cancelar",
|
||||
"Center X": "Centro X",
|
||||
"Center Y": "Centro Y",
|
||||
"Controller Info": "Informação do controlador",
|
||||
"Debug Info": "Informação de depuração ",
|
||||
"Debug buttons": "Botões de depuração",
|
||||
@@ -179,8 +170,6 @@
|
||||
"For more info or help, feel free to reach out on Discord.": "Para mais informações ou ajuda, sinta-se a vontade para me contactar no Discord.",
|
||||
"HW Model": "Modelo de HW",
|
||||
"Hardware": "Hardware",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Estou a trabalhar ativamente para adicionar compatibilidade. O principal desafio está no armazenamento de dados nos módulos Joysticks.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Se esta ferramenta lhe foi útil ou pretende que o suporte do DualSense Edge chegue mais rapidamente, considere apoiar o projeto com um",
|
||||
"Left stick": "Joystick esquerdo",
|
||||
"MCU Unique ID": "ID Unico da MCU",
|
||||
"More details and images": "Mais detalhes e imagens",
|
||||
@@ -189,17 +178,13 @@
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Para armazenar uma calibração personalizada na memória interna do joystick, é necessária uma <b>modificação de hardware</b>.",
|
||||
"Right stick": "joystick direito",
|
||||
"SBL FW Version": "Versão de FW SBL",
|
||||
"Save": "Gravar",
|
||||
"Serial Number": "Numero de Série",
|
||||
"Show all": "Mostrar tudo",
|
||||
"Software": "Software",
|
||||
"Spider FW Version": "Versão Spider FW",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "O suporte para calibração dos módulos DualSense Edge está agora disponível como <b>recurso experimental</b>.",
|
||||
"Thank you for your generosity and support!": "Obrigado pela sua generosidade e apoio!",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "A (GUI) de calibração do DualShock atualmente não suporta o DualSense Edge.",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Isto envolve desativar temporariamente a proteção contra gravação aplicando <b>+1,8 V</b> para um ponto de teste específico em cada módulo",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Isto é apenas para utilizadores avançados. Se não tem a certeza do que está a fazer, por favor, não tente.",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Este ecrã permite ajustar os dados de calibração brutos no seu controlador",
|
||||
"Touchpad FW Version": "Versão FW do Touchpad",
|
||||
"Touchpad ID": "Touchpad ID",
|
||||
"VCM Left Barcode": "Codigo de barras VCM Esquerda",
|
||||
@@ -220,45 +205,109 @@
|
||||
"Right Module Barcode": "Código de barras do módulo direito",
|
||||
"left module": "módulo esquerdo",
|
||||
"right module": "módulo direito",
|
||||
"10x zoom": "",
|
||||
"10x zoom": "Ampliar 10x",
|
||||
"30th Anniversary": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Erro médio de circularidade:</strong> menor nem sempre é melhor! Procure entre 7 e 9%.",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "É necessário reiniciar o dispositivo para continuar a utilizar o DualSense Edge. Desligue e volte a ligar o controle.",
|
||||
"Adaptive Trigger": "Gatilho Adaptável",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "Os gatilhos adaptativos são suportados apenas nos controladores DualSense",
|
||||
"Add test": "adicionar teste",
|
||||
"Astro Bot": "",
|
||||
"Calibration": "",
|
||||
"Center (L1)": "",
|
||||
"Be gentle to avoid damage.": "Seja gentil para evitar danos.",
|
||||
"Buttons": "Botões",
|
||||
"Calibration": "Calibração",
|
||||
"Center": "Centro",
|
||||
"Center (L1)": "Centro (L1)",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity (R1)": "",
|
||||
"Circularity": "Circularidade",
|
||||
"Circularity (R1)": "Circularidade (R1)",
|
||||
"Cobalt Blue": "",
|
||||
"Controller does not support adaptive trigger control": "O controlador não suporta o controlo de gatilho adaptável",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Error triggering rumble": "",
|
||||
"Debug": "Depurar",
|
||||
"Don't show again": "Don't show again",
|
||||
"Fail": "Falha",
|
||||
"Failed": "falhou",
|
||||
"Failed to connect to device": "Falha ao ligar ao dispositivo",
|
||||
"Failed to disable adaptive trigger": "Falha ao desativar o gatilho adaptável",
|
||||
"Failed to set speaker tone": "Falha ao definir o tom do altifalante",
|
||||
"Failed to set vibration": "Falha ao definir vibração",
|
||||
"Feel for vibration in the controller.": "Sinta a vibração no controlador.",
|
||||
"Fortnite": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"Info": "",
|
||||
"Haptic Vibration": "Vibração háptica",
|
||||
"Headphone Jack": "Entrada dos auscultadores",
|
||||
"Increase non-circularity": "Aumentar a não circularidade",
|
||||
"Info": "Informação",
|
||||
"Instructions": "Instruções",
|
||||
"Keep rotating the sticks even if you see no progress!": "Continue a rodar os joysticks mesmo que não veja qualquer progresso!",
|
||||
"Learn more...": "Saber mais...",
|
||||
"Lights": "Luzes",
|
||||
"Listen for a tone from the controller speaker.": "Ouça um tom vindo do altifalante do controlador.",
|
||||
"Long-press [circle] to skip ahead.": "Mantenha premido [círculo] para avançar.",
|
||||
"Microphone": "microfone",
|
||||
"Microphone Level:": "Nivel do microfone",
|
||||
"Midnight Black": "",
|
||||
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "",
|
||||
"Normal": "",
|
||||
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Mova o analógico para selecionar a afinação e, sem tocar no analógico, utilize os botões direcionais para ajustar o ponto central. Mova-o e ajuste-o novamente se estiver descentrado ou a piscar.",
|
||||
"No controller connected": "Nenhum controlador ligado",
|
||||
"No tests completed yet.": "Nenhum teste concluído ainda.",
|
||||
"Normal": "Normal",
|
||||
"Not tested": "Não testado",
|
||||
"Nova Pink": "",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "",
|
||||
"Show raw numbers": "",
|
||||
"Pass": "Passar",
|
||||
"Passed": "Passou",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "Solte o joystick para a posição central antes de ajustar com os botões D-pad.",
|
||||
"Plug in headphones to the 3.5mm jack": "Connecte os auscultadores ao jack de audio de 3,5 mm",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "Pressione os gatilhos L2 e R2 para sentir a resistência do gatilho.",
|
||||
"Press [circle] to close, or [square] to start over": "Prima [círculo] para fechar ou [quadrado] para recomeçar",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Prima [quadrado] para Passar, [cruz] para Reprovar ou [círculo] para Saltar.",
|
||||
"Press [square] to begin or [circle] to close": "Prima [quadrado] para começar ou [círculo] para fechar",
|
||||
"Press [triangle] to go back.": "Prima [triângulo] para voltar atrás.",
|
||||
"Press each button until they turn green.": "Pressione cada botão até que fiquem verdes.",
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Pressione o D-pad ou os botões frontais na direção em que pretende que a posição do comando se mova.",
|
||||
"Progress": "Progresso",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "Empurre o joystick para cima/baixo/esquerda/direita o mais possível.",
|
||||
"Quick Test": "Teste rápido",
|
||||
"Quick calibrate": "Calibração rápida",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "A calibração do alcance parece ter falhado. Tente novamente e certifique-se de que roda os joysticks.",
|
||||
"Repeat": "Repetir",
|
||||
"Restart": "Reiniciar",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Rode os joysticks lentamente pelo menos 2 vezes numa direção e 2 vezes na outra direção para cobrir todo o alcance.",
|
||||
"Run through these tests to verify your controller's functionality.": "Execute estes testes para verificar a funcionalidade do seu controlador.",
|
||||
"Show raw numbers": "Mostrar números brutos",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Os comandos da Sony saem de fábrica calibrados para terem um erro médio de circularidade de quase 10%, e é isso que os jogos esperam. Uma circulação demasiado perfeita pode fazer com que os movimentos e a mira pareçam rígidos e sem resposta em alguns jogos.",
|
||||
"Speaker": "auscultadores",
|
||||
"Spider-Man 2": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "Tamanho do passo",
|
||||
"Sterling Silver": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Test Speaker": "Testar o auscultadores",
|
||||
"Test Summary": "Resumo do teste",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Teste todos os botões ou mantenha premido [quadrado] para Passar e [cruz] para Reprovar, ou [círculo] para Saltar.",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "O botão <b>Concluído</b> será desbloqueado após, no máximo, 15 segundos. Se premir <b>Concluído</b> sem rodar os manípulos, a calibração ficará incompleta e será necessário repeti-la.",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "O dispositivo está ligado via Bluetooth. Desligue e volte a ligar usando um cabo USB.",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "Este teste verifica todos os botões do comando, exigindo que pressione cada botão até três vezes.",
|
||||
"This test checks the headphone jack functionality.": "Este teste verifica a funcionalidade do conector de auscultadores.",
|
||||
"This test checks the reliability of the USB port.": "Este teste verifica a fiabilidade da porta 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.": "Este teste irá alternar entre as cores vermelha, verde e azul na barra de luzes do comando, animar as luzes indicadoras do jogador e piscar o botão de silenciar.",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "Este teste irá habilitar alta resistência nos gatilhos L2 e R2.",
|
||||
"USB Connector": "Conector USB",
|
||||
"Volcanic Red": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Observe as luzes do comando a mudar de cor, as luzes do leitor a animarem-se e o botão de silêncio a piscar.",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Enquanto segura o joystick a ser ajustado para cima/baixo/esquerda/direita, faça ajustes até ver setores azul-claros em todas as quatro direções, depois de rodar o joystick para a esquerda e para a direita. Em seguida, utilize o",
|
||||
"White": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"Wiggle the USB cable to see if the controller disconnects.": "Mexa o cabo USB para ver se o comando se desliga.",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "O seu dispositivo pode não ser um comando original da Sony. Se não for um clone, comunique o problema.",
|
||||
"failed": "falhou",
|
||||
"hide": "ocultar",
|
||||
"passed": "passou",
|
||||
"skipped": "ignorado",
|
||||
"tests completed": "testes concluídos",
|
||||
"to increase the non-circularity.": "para aumentar a não circularidade.",
|
||||
"": ""
|
||||
}
|
||||
110
lang/rs_rs.json
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "Upitaj status NVS",
|
||||
"NVS unlock": "Otključaj NVS",
|
||||
"NVS lock": "Zaključaj NVS",
|
||||
"Fast calibrate stick center (OLD)": "Brza kalibracija centra džojstika (stara metoda)",
|
||||
"Stick center calibration": "Kalibracija centra džojstika",
|
||||
"Welcome": "Dobrodošli",
|
||||
"Step 1": "Korak 1",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "Korak 4",
|
||||
"Completed": "Završeno",
|
||||
"Welcome to the stick center-calibration wizard!": "Dobrodošli u asistent za kalibraciju centra džojstika!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Ovaj alat će vas voditi kroz ponovno centriranje analognih džojstika na vašem kontroleru. Sastoji se od četiri koraka: biće vam zatraženo da pomerate oba džojstika u određenom pravcu i zatim ih otpustite.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Molimo vas da imate na umu da <i>jednom kada kalibracija počne, ne može se otkazati</i>. Ne zatvarajte ovu stranicu i ne prekidajte vezu sa kontrolerom dok se proces ne završi.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Ovaj alat će vas voditi kroz ponovno centriranje analognih džojstika na vašem kontroleru. Sastoji se od četiri koraka: biće vam zatraženo da pomerate oba džojstika u određenom pravcu i zatim ih otpustite.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Molimo vas da imate na umu da <i>jednom kada kalibracija počne, ne može se otkazati</i>. Ne zatvarajte ovu stranicu i ne prekidajte vezu sa kontrolerom dok se proces ne završi.",
|
||||
"Press <b>Start</b> to begin calibration.": "Pritisnite <b>Počni</b> da biste započeli kalibraciju.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Molimo vas da pomerite oba džojstika u <b>gornji levi ugao</b> i zatim ih otpustite.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Kada se džojstici vrate u centar, pritisnite <b>Nastavi</b>.",
|
||||
@@ -37,7 +36,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Polako rotirajte džojstike kako biste pokrili ceo opseg. Pritisnite \"Završeno\" kada završite.",
|
||||
"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",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "Tip uređaja",
|
||||
"Range calibration completed": "Kalibracija opsega završena",
|
||||
"Range calibration failed": "Kalibracija opsega nije uspela",
|
||||
"Cannot unlock NVS": "Nije moguće otključati NVS",
|
||||
"Cannot relock NVS": "Nije moguće zaključati NVS",
|
||||
"Error 1": "Greška 1",
|
||||
"Error 2": "Greška 2",
|
||||
"Error 3": "Greška 3",
|
||||
"Stick calibration failed": "Kalibracija džojstika nije uspela",
|
||||
"Stick calibration completed": "Kalibracija džojstika završena",
|
||||
"NVS Lock failed": "Zaključavanje NVS nije uspelo",
|
||||
@@ -72,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Povezan je nevažeći uređaj: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Uređaj izgleda da je klon DS4. Sve funkcionalnosti su onemogućene.",
|
||||
"Error: ": "Greška: ",
|
||||
"Connected invalid device": "Povezan je nevažeći uređaj",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Greška",
|
||||
"My handle on discord is: the_al": "Moj Discord ID je: the_al",
|
||||
"Initializing...": "Inicijalizacija...",
|
||||
"Storing calibration...": "Čuvanje kalibracije...",
|
||||
@@ -105,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Da, ako označite polje \"Zapiši promene trajno u kontroler\". U tom slučaju, kalibracija se upisuje direktno u firmware kontrolera. To obezbeđuje da ostane na mestu bez obzira na konzolu na koju je povezana.",
|
||||
"Is this an officially endorsed service?": "Da li je ovo zvanično odobren servis?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Ne, ovaj servis je jednostavno kreacija entuzijaste za DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Da li ovaj sajt detektuje da li je kontroler klon?",
|
||||
"Does this website detect if a controller is a clone?": "Da li ovaj sajt detektuje da li je kontroler klon?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Da, trenutno samo DualShock4. Ovo se dogodilo jer sam slučajno kupio nekoliko klonova, proveo vreme identifikujući razlike i dodao ovu funkcionalnost da bih sprečio buduće obmane.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Nažalost, klonovi se ne mogu kalibrisati, jer oni samo kopiraju ponašanje DualShock4 tokom normalne igre, a ne sve nedokumentovane funkcionalnosti.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Nažalost, klonovi se ne mogu kalibrisati, jer oni samo kopiraju ponašanje DualShock4 tokom normalne igre, a ne sve nedokumentovane funkcionalnosti.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Ako želite da proširite ovu funkcionalnost detekcije na DualSense, molimo vas da mi pošaljete lažnu DualSense i videćete je za nekoliko nedelja.",
|
||||
"What development is in plan?": "Koji razvoj je u planu?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Držim dve odvojene liste zadataka za ovaj projekat, iako prioritet još nije utvrđen.",
|
||||
@@ -184,80 +177,137 @@
|
||||
"Show all": "Prikaži sve",
|
||||
"Finetune stick calibration": "Fino podešavanje kalibracije džojstika",
|
||||
"(beta)": "(beta)",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Ovaj ekran omogućava fino podešavanje sirovih podataka kalibracije na vašem kontroleru",
|
||||
"Left stick": "Levi džojstik",
|
||||
"Right stick": "Desni džojstik",
|
||||
"Center X": "Centar X",
|
||||
"Center Y": "Centar Y",
|
||||
"Save": "Sačuvaj",
|
||||
"Cancel": "Otkaži",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock Calibration GUI trenutno ne podržava DualSense Edge.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Aktivno radim na dodavanju kompatibilnosti, glavni izazov je u čuvanju podataka u modulima džojstika.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Ako vam je ovaj alat bio koristan ili želite da podrška za DualSense Edge stigne brže, razmislite o podršci projekta sa",
|
||||
"Thank you for your generosity and support!": "Hvala vam na velikodušnosti i podršci!",
|
||||
"10x zoom": "",
|
||||
"30th Anniversary": "",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Calibration is being stored in the stick modules.": "",
|
||||
"Cannot lock": "",
|
||||
"Cannot store data into": "",
|
||||
"Cannot unlock": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Color": "",
|
||||
"Color detection thanks to": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Don't show again": "",
|
||||
"DualSense Edge Calibration": "",
|
||||
"Error triggering rumble": "",
|
||||
"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.": "",
|
||||
"For more info or help, feel free to reach out on Discord.": "",
|
||||
"Fortnite": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"Haptic Vibration": "",
|
||||
"Headphone Jack": "",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "",
|
||||
"Increase non-circularity": "",
|
||||
"Info": "",
|
||||
"Instructions": "",
|
||||
"Keep rotating the sticks even if you see no progress!": "",
|
||||
"Learn more...": "",
|
||||
"Left Module Barcode": "",
|
||||
"Lights": "",
|
||||
"Listen for a tone from the controller speaker.": "",
|
||||
"Long-press [circle] to skip ahead.": "",
|
||||
"Microphone": "",
|
||||
"Microphone Level:": "",
|
||||
"Midnight Black": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"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.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"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.": "",
|
||||
"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": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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.": "",
|
||||
"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.": "",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "",
|
||||
"USB Connector": "",
|
||||
"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.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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 can do this in two ways:": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"failed": "",
|
||||
"here": "",
|
||||
"hide": "",
|
||||
"left module": "",
|
||||
"passed": "",
|
||||
"right module": "",
|
||||
"skipped": "",
|
||||
"tests completed": "",
|
||||
"to increase the non-circularity.": "",
|
||||
"": ""
|
||||
}
|
||||
107
lang/ru_ru.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "Запросить статус NVS",
|
||||
"NVS unlock": "Разблокировать NVS",
|
||||
"NVS lock": "Заблокировать NVS",
|
||||
"Fast calibrate stick center (OLD)": "Быстрая калибровка центра джойстика (СТАРОЕ)",
|
||||
"Stick center calibration": "Калибровка центра джойстика",
|
||||
"Welcome": "Добро пожаловать",
|
||||
"Step 1": "Шаг 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "Шаг 4",
|
||||
"Completed": "Завершено",
|
||||
"Welcome to the stick center-calibration wizard!": "Добро пожаловать в мастер калибровки центра джойстика!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Этот инструмент поможет вам перекалибровать аналоговые стики вашего контроллера. Он состоит из четырех шагов: вам будет предложено переместить оба джойстика в определенном направлении и отпустить их.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Обратите внимание, что <i>после запуска калибровки ее нельзя отменить</i>. Не закрывайте эту страницу и не отключайте контроллер, пока не завершится.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Этот инструмент поможет вам перекалибровать аналоговые стики вашего контроллера. Он состоит из четырех шагов: вам будет предложено переместить оба джойстика в определенном направлении и отпустить их.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Обратите внимание, что <i>после запуска калибровки ее нельзя отменить</i>. Не закрывайте эту страницу и не отключайте контроллер, пока не завершится.",
|
||||
"Press <b>Start</b> to begin calibration.": "Нажмите <b>Начать</b>, чтобы начать калибровку.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Пожалуйста, переместите оба джойстика в <b>верхний левый угол</b> и отпустите их.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Когда стики вернутся в центр, нажмите <b>Продолжить</b>.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "Пожалуйста, не закрывайте это окно и не отключайте контроллер. ",
|
||||
"Range calibration": "Калибровка диапазона",
|
||||
"<b>The controller is now sampling data!</b>": "<b>Контроллер в настоящее время собирает данные!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Медленно поверните стики, чтобы охватить весь диапазон. Нажмите \"Готово\", когда закончите.",
|
||||
"Done": "Готово",
|
||||
"Hi, thank you for using this software.": "Привет, спасибо за использование этого программного обеспечения.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "Если вы находите это полезным и хотите поддержать мои усилия, не стесняйтесь",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Тип устройства",
|
||||
"Range calibration completed": "Калибровка диапазона завершена",
|
||||
"Range calibration failed": "Калибровка диапазона не удалась",
|
||||
"Cannot unlock NVS": "Не удается разблокировать NVS",
|
||||
"Cannot relock NVS": "Не удается заблокировать NVS повторно",
|
||||
"Error 1": "Ошибка 1",
|
||||
"Error 2": "Ошибка 2",
|
||||
"Error 3": "Ошибка 3",
|
||||
"Stick calibration failed": "Калибровка джойстика не удалась",
|
||||
"Stick calibration completed": "Калибровка джойстика завершена",
|
||||
"NVS Lock failed": "Блокировка NVS не удалась",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Подключено недопустимое устройство: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Устройство, похоже, является клоном DS4. Все функции отключены.",
|
||||
"Error: ": "Ошибка: ",
|
||||
"Connected invalid device": "Подключено недопустимое устройство",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Ошибка",
|
||||
"My handle on discord is: the_al": "Мой ник на discord: the_al",
|
||||
"Initializing...": "Инициализация...",
|
||||
"Storing calibration...": "Сохранение калибровки...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Да, если вы установите флажок \"Записывать изменения в постоянной памяти контроллера\". В этом случае калибровка прошивается непосредственно в прошивку контроллера. Это гарантирует, что она остается на месте независимо от подключенной к ней консоли.",
|
||||
"Is this an officially endorsed service?": "Это официально поддерживаемый сервис?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Нет, этот сервис просто создан энтузиастом DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Этот сайт определяет, является ли контроллер клоном?",
|
||||
"Does this website detect if a controller is a clone?": "Этот сайт определяет, является ли контроллер клоном?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Да, на данный момент только DualShock4. Это произошло потому, что я случайно приобрел несколько клонов, потратил время на выявление различий и добавил эту функциональность, чтобы предотвратить будущие обманы.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "К сожалению, клоны все равно не могут быть калиброваны, потому что они только клонируют поведение DualShock4 во время обычной игры, а не все не задокументированные функциональности.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "К сожалению, клоны все равно не могут быть калиброваны, потому что они только клонируют поведение DualShock4 во время обычной игры, а не все не задокументированные функциональности.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Если вы хотите расширить эту функциональность обнаружения на DualSense, пожалуйста, отправьте мне поддельный DualSense, и вы увидите его через несколько недель.",
|
||||
"What development is in plan?": "Какие разработки запланированы?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Я веду два отдельных списка дел по этому проекту, хотя приоритет еще не установлен.",
|
||||
@@ -167,8 +160,6 @@
|
||||
"Cannot lock": "Не удалось заблокировать",
|
||||
"Cannot store data into": "Не удалось сохранить данные",
|
||||
"Cannot unlock": "Не удалось разблокировать",
|
||||
"Center X": "Центр оси X",
|
||||
"Center Y": "Центр оси Y",
|
||||
"Color": "Цвет",
|
||||
"Color detection thanks to": "За определение цвета спасибо",
|
||||
"Controller Info": "Инфо контроллера",
|
||||
@@ -185,9 +176,7 @@
|
||||
"For more info or help, feel free to reach out on Discord.": "Для получения помощи не стесняйтесь обращаться в Discord",
|
||||
"HW Model": "Модель устройства",
|
||||
"Hardware": "Аппаратная часть",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Я активно работаю над добавлением совместимости, но основная проблема заключается в хранении данных в модулях стиков.",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Если калибровка не сохраняется после перезагрузки, тщательно проверьте правильность подключения.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Если этот инструмент был вам полезен или вы хотите, чтобы поддержка DualSense Edge появилась быстрее, пожалуйста, рассмотрите возможность поддержать проект —",
|
||||
"Left Module Barcode": "Штрих-код левого модуля",
|
||||
"Left stick": "Левый стик",
|
||||
"MCU Unique ID": "Уникальный MCU ID",
|
||||
@@ -199,17 +188,13 @@
|
||||
"Right Module Barcode": "Штрих-код правого модуля",
|
||||
"Right stick": "Правый стик",
|
||||
"SBL FW Version": "Версия прошивки SBL",
|
||||
"Save": "Сохранить",
|
||||
"Serial Number": "Серийный номер",
|
||||
"Show all": "Показать все",
|
||||
"Software": "Программное обеспечение",
|
||||
"Spider FW Version": "Версия прошивки Spider",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "Поддержка калибровки модулей DualSense Edge теперь доступна в качестве <b>экспериментальной функции</b>",
|
||||
"Thank you for your generosity and support!": "Спасибо за вашу щедрость и поддержку",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "В настоящее время графический интерфейс калибровки DualShock не поддерживает DualSense Edge.",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Для этого необходимо временно отключить защиту от записи, подав напряжение <b>+1,8 В</b> на определенную контрольную точку на каждом модуле.",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Только для продвинутых пользователей! Если вы не уверены ",
|
||||
"This screen allows to finetune raw calibration data on your controller": "На этом экране можно более точно откалибровать ваш контроллер",
|
||||
"Touchpad FW Version": "Версия прошивки тачпада",
|
||||
"Touchpad ID": "ID тачпада",
|
||||
"VCM Left Barcode": "Штрих-код левого VCM",
|
||||
@@ -222,43 +207,107 @@
|
||||
"right module": "Правый модуль",
|
||||
"10x zoom": "",
|
||||
"30th Anniversary": "",
|
||||
"<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": "",
|
||||
"Astro Bot": "",
|
||||
"Be gentle to avoid damage.": "",
|
||||
"Buttons": "",
|
||||
"Calibration": "",
|
||||
"Center": "",
|
||||
"Center (L1)": "",
|
||||
"Chroma Indigo": "",
|
||||
"Chroma Pearl": "",
|
||||
"Chroma Teal": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"Cobalt Blue": "",
|
||||
"Controller does not support adaptive trigger control": "",
|
||||
"Cosmic Red": "",
|
||||
"Debug": "",
|
||||
"Error triggering rumble": "",
|
||||
"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": "",
|
||||
"Galactic Purple": "",
|
||||
"God of War Ragnarok": "",
|
||||
"Grey Camouflage": "",
|
||||
"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:": "",
|
||||
"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 tests completed yet.": "",
|
||||
"Normal": "",
|
||||
"Not tested": "",
|
||||
"Nova Pink": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "",
|
||||
"Press L2 to test the strong (left) haptic motor": "",
|
||||
"Press R2 to test the weak (right) haptic motor": "",
|
||||
"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": "",
|
||||
"Starlight Blue": "",
|
||||
"Step size": "",
|
||||
"Sterling Silver": "",
|
||||
"Test the Haptic Motors": "",
|
||||
"Tests": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The Last of Us": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"The motor strength will match how hard you press the trigger": "",
|
||||
"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": "",
|
||||
"Volcanic Red": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"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.": "",
|
||||
"": ""
|
||||
}
|
||||
107
lang/tr_tr.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "NVS durumunu sorgula",
|
||||
"NVS unlock": "NVS kilidini aç",
|
||||
"NVS lock": "NVS kilitle",
|
||||
"Fast calibrate stick center (OLD)": "Analog Merkezini Hızlı Kalibre Et (ESKİ)",
|
||||
"Stick center calibration": "Analog Merkezi Kalibrasyonu",
|
||||
"Welcome": "Hoş geldiniz",
|
||||
"Step 1": "1.Adım",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "4.Adım",
|
||||
"Completed": "Tamamlandı",
|
||||
"Welcome to the stick center-calibration wizard!": "Analog Merkezi Kalibrasyon Sihirbazına Hoş Geldiniz!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Bu araç, denetleyicinizin analog çubuklarını yeniden merkezlemekte size rehberlik edecektir. Dört adımdan oluşur: Her iki çubuğu da bir yönde hareket ettirmeniz ve ardından bırakmanız istenecektir.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Lütfen bilin ki, <i>kalibrasyon başladığında, iptal edilemez</i>. Tamamlanana kadar bu sayfayı kapatmayın veya denetleyici bağlantısını kesmeyin.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Bu araç, denetleyicinizin analog çubuklarını yeniden merkezlemekte size rehberlik edecektir. Dört adımdan oluşur: Her iki çubuğu da bir yönde hareket ettirmeniz ve ardından bırakmanız istenecektir.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Lütfen bilin ki, <i>kalibrasyon başladığında, iptal edilemez</i>. Tamamlanana kadar bu sayfayı kapatmayın veya denetleyici bağlantısını kesmeyin.",
|
||||
"Press <b>Start</b> to begin calibration.": "Kalibrasyonu başlatmak için <b>Başlat</b> düğmesine basın.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Lütfen her iki analogu <b>sol üst köşeye</b> taşıyın ve bırakın.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Analoglar tekrar merkezdeyken, <b>Devam</b> düğmesine basın.",
|
||||
@@ -36,7 +35,6 @@
|
||||
"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>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Tüm aralığı kapsamak için analogları yavaşça döndürün. Tamamlandığında \"Tamam\" düğmesine basın.",
|
||||
"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.",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "Cihaz Türü",
|
||||
"Range calibration completed": "Ara mesafe kalibrasyonu tamamlandı",
|
||||
"Range calibration failed": "Ara mesafe kalibrasyonu başarısız oldu",
|
||||
"Cannot unlock NVS": "NVS kilidi açılamıyor",
|
||||
"Cannot relock NVS": "NVS kilidi tekrar kilitlenemiyor",
|
||||
"Error 1": "1.Hata",
|
||||
"Error 2": "2.Hata",
|
||||
"Error 3": "3.Hata",
|
||||
"Stick calibration failed": "Analog kalibrasyonu başarısız oldu",
|
||||
"Stick calibration completed": "Analog kalibrasyonu tamamlandı",
|
||||
"NVS Lock failed": "NVS kilidi kilitlenemedi",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Geçersiz bir cihaz bağlandı: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Cihazın yan sanayi bir kol gibi görünüyor. Tüm işlevler devre dışı bırakıldı.",
|
||||
"Error: ": "Hata: ",
|
||||
"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...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Evet, \"Kontrolcüye değişiklikleri kalıcı olarak yaz\" kutusunu işaretlerseniz. Bu durumda, kalibrasyon doğrudan denetleyici yazılımına yazılır. Bu, bağlı olduğu konsoldan bağımsız olarak yerinde kalmasını sağlar.",
|
||||
"Is this an officially endorsed service?": "Bu resmi olarak onaylanmış bir hizmet mi?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Hayır, bu hizmet sadece bir DualShock hayranı tarafından oluşturulmuştur.",
|
||||
"Does this website detects if a controller is a clone?": "Bu web sitesi bir denetleyicinin bir kopya olup olmadığını algılar mı?",
|
||||
"Does this website detect if a controller is a clone?": "Bu web sitesi bir denetleyicinin bir kopya olup olmadığını algılar mı?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Evet, şu anda sadece DualShock4. Bu, yanlışlıkla bazı kopyalar satın aldım, farkları belirlemek için zaman harcadım ve gelecekteki aldatmaları önlemek için bu işlevi ekledim.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "Maalesef, kopyalar zaten kalibre edilemez, çünkü sadece normal bir oyun sırasında DualShock4'ün davranışını kopyalarlar, belgelenmemiş tüm işlevleri değil.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "Maalesef, kopyalar zaten kalibre edilemez, çünkü sadece normal bir oyun sırasında DualShock4'ün davranışını kopyalarlar, belgelenmemiş tüm işlevleri değil.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Bu algılama işlevselliğini DualSense'e genişletmek istiyorsanız, lütfen bana sahte bir DualSense gönderin ve birkaç hafta içinde göreceksiniz.",
|
||||
"What development is in plan?": "Planlanan geliştirme nedir?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Bu proje için henüz öncelik belirlenmemiş olmasına rağmen, iki ayrı yapılacaklar listesi tutuyorum.",
|
||||
@@ -169,8 +162,6 @@
|
||||
"Cannot lock": "Kilitlenemiyor",
|
||||
"Cannot store data into": "Veri kaydedilemiyor",
|
||||
"Cannot unlock": "Kilit açılamıyor",
|
||||
"Center X": "Merkez X",
|
||||
"Center Y": "Merkez Y",
|
||||
"Chroma Indigo": "Kroma İndigo",
|
||||
"Chroma Pearl": "Kroma İnci",
|
||||
"Chroma Teal": "Kroma Turkuaz",
|
||||
@@ -196,9 +187,7 @@
|
||||
"Grey Camouflage": "Gri Kamuflaj",
|
||||
"HW Model": "HW Modeli",
|
||||
"Hardware": "Donanım",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Uyumluluk ekleme üzerinde aktif olarak çalışıyorum, asıl zorluk verilerin analog modüllere kaydedilmesinde yatıyor.",
|
||||
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Kalibrasyon kalıcı olarak kaydedilmezse, lütfen donanım modunun kablolamasını iki kez kontrol edin.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Eğer bu araç size yardımcı olduysa veya DualSense Edge desteğinin daha hızlı gelmesini istiyorsanız, lütfen projeyi bir",
|
||||
"Left Module Barcode": "Sol Modül Barkodu",
|
||||
"Left stick": "Sol analog",
|
||||
"MCU Unique ID": "MCU Benzersiz Kimliği",
|
||||
@@ -212,7 +201,6 @@
|
||||
"Right Module Barcode": "Sağ Modül Barkodu",
|
||||
"Right stick": "Sağ analog",
|
||||
"SBL FW Version": "SBL FW Sürümü",
|
||||
"Save": "Kaydet",
|
||||
"Serial Number": "Seri Numarası",
|
||||
"Show all": "Tümünü göster",
|
||||
"Software": "Yazılım",
|
||||
@@ -221,12 +209,9 @@
|
||||
"Starlight Blue": "Yıldız Işığı Mavisi",
|
||||
"Sterling Silver": "Gümüş",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "DualSense Edge analog modüllerinin kalibrasyonuna destek, artık <b>deneysel bir özellik</b> olarak mevcuttur.",
|
||||
"Thank you for your generosity and support!": "Cömertliğiniz ve desteğiniz için teşekkür ederiz!",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock Kalibrasyon Arayüzü şu anda DualSense Edge'i desteklemiyor.",
|
||||
"The Last of Us": "The Last of Us",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Bu, her modül üzerindeki belirli bir test noktasına <b>+1.8V</b> uygulayarak yazma korumasını geçici olarak devre dışı bırakmayı içerir.",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Bu sadece ileri düzey kullanıcılar içindir. Ne yaptığınızdan emin değilseniz, lütfen denemeyin.",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Bu ekran, denetleyicinizdeki ham kalibrasyon verilerini ince ayarlamaya olanak tanır",
|
||||
"Touchpad FW Version": "Dokunmatik Yüzey FW Sürümü",
|
||||
"Touchpad ID": "Dokunmatik Yüzey Kimliği",
|
||||
"VCM Left Barcode": "VCM Sol Barkodu",
|
||||
@@ -242,14 +227,8 @@
|
||||
"10x zoom": "10x Yakınlaştırma",
|
||||
"Calibration": "KALİBRASYON",
|
||||
"Debug": "HATA AYIKLAMA",
|
||||
"Error triggering rumble": "Titreşim tetiklenirken hata oluştu",
|
||||
"Info": "BİLGİ",
|
||||
"Normal": "Normal",
|
||||
"Press L2 to test the strong (left) haptic motor": "Güçlü (sol) dokunsal motoru test etmek için L2'ye basın",
|
||||
"Press R2 to test the weak (right) haptic motor": "Zayıf (sağ) dokunsal motoru test etmek için R2'ye basın",
|
||||
"Test the Haptic Motors": "Dokunsal Motorları Test Et",
|
||||
"Tests": "Testler",
|
||||
"The motor strength will match how hard you press the trigger": "Motor gücü, tetiğe ne kadar sert bastığınızla orantılı olacaktır",
|
||||
"Center (L1)": "Merkez (L1)",
|
||||
"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.",
|
||||
@@ -257,8 +236,78 @@
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Analoğun konumunu hareket ettirmek istediğiniz yöne yön tuşlarına veya yüz tuşlarına(△, ☐, O, ✕) basın.",
|
||||
"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",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "Ayarlanacak analoğu yukarı/aşağı/sola/sağa doğru basılı tutarken, <em>dairenin altındaki vurgulanan değeri gözlemleyin</em> ve ardından değeri ±0,99’a (±1,00’ın hemen altına) ayarlamak için yön tuşlarını kullanın.",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Cihaz Bluetooth üzerinden bağlı. Bunun yerine bağlantıyı kesip USB kablosu ile yeniden bağlayın.",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Cihazınız orijinal Sony kolu olmayabilir. Eğer yansanayi değilse lütfen bu sorunu bildirin.",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Ortalama dairesellik hatası:</strong> daha küçük her zaman daha iyi değildir! %7–9 aralığını hedefleyin.",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "Bu DualSense Edge'i kullanmaya devam etmek için yeniden başlatma gereklidir. Lütfen kontrol cihazınızı çıkarıp yeniden bağlayın.",
|
||||
"Adaptive Trigger": "Uyarlanabilir Tetik",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "Uyarlanabilir tetikler yalnızca DualSense kontrol cihazlarında desteklenir.",
|
||||
"Add test": "Test ekle",
|
||||
"Be gentle to avoid damage.": "Hasar oluşmaması için dikkatli olun.",
|
||||
"Buttons": "Tuşlar",
|
||||
"Center": "Merkez",
|
||||
"Circularity": "Dairesellik",
|
||||
"Controller does not support adaptive trigger control": "Bu kontrol cihazı uyarlanabilir tetik kontrolünü desteklemiyor.",
|
||||
"Don't show again": "Bir daha gösterme",
|
||||
"Fail": "Başarısız",
|
||||
"Failed": "Başarısız oldu",
|
||||
"Failed to connect to device": "Cihaza bağlanılamadı",
|
||||
"Failed to disable adaptive trigger": "Uyarlanabilir tetik devre dışı bırakılamadı",
|
||||
"Failed to set speaker tone": "Hoparlör sesi ayarlanamadı",
|
||||
"Failed to set vibration": "Titreşim ayarlanamadı",
|
||||
"Feel for vibration in the controller.": "Kontrol cihazındaki titreşimi hissedin.",
|
||||
"Haptic Vibration": "Dokunsal Titreşim",
|
||||
"Headphone Jack": "Kulaklık Girişi",
|
||||
"Increase non-circularity": "Dairesellik dışılığı artır",
|
||||
"Instructions": "Talimatlar",
|
||||
"Keep rotating the sticks even if you see no progress!": "İlerleme görmeseniz bile analogları döndürmeye devam edin!",
|
||||
"Learn more...": "Daha fazla bilgi...",
|
||||
"Lights": "Işıklar",
|
||||
"Listen for a tone from the controller speaker.": "Kontrol cihazı hoparlöründen gelen sesi dinleyin.",
|
||||
"Long-press [circle] to skip ahead.": "[O tuşuna uzun basarak atla.",
|
||||
"Microphone": "Mikrofon",
|
||||
"Microphone Level:": "Mikrofon Seviyesi:",
|
||||
"No controller connected": "Bağlı kontrol cihazı yok",
|
||||
"No tests completed yet.": "Henüz hiçbir test tamamlanmadı.",
|
||||
"Not tested": "Test edilmedi",
|
||||
"Pass": "Geç",
|
||||
"Passed": "Geçti",
|
||||
"Plug in headphones to the 3.5mm jack": "Kulaklığı 3.5 mm girişe takın",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "Tetik direncini hissetmek için L2 ve R2 tuşlarına basın.",
|
||||
"Press [circle] to close, or [square] to start over": "[O ile kapatın veya ☐ ile yeniden başlayın",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "☐ ile Geç, ✕ ile Başarısız, O ile atla.",
|
||||
"Press [square] to begin or [circle] to close": "☐ ile başlatın veya O ile kapatın",
|
||||
"Press [triangle] to go back.": "△ ile geri dönün.",
|
||||
"Press each button until they turn green.": "Her bir tuşa yeşil olana kadar basın.",
|
||||
"Progress": "İlerleme",
|
||||
"Quick Test": "Hızlı Test",
|
||||
"Quick calibrate": "Hızlı kalibrasyon",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Aralık kalibrasyonu başarısız gibi görünüyor. Lütfen yeniden deneyin ve analogları döndürdüğünüzden emin olun.",
|
||||
"Repeat": "Tekrar et",
|
||||
"Restart": "Yeniden başlat",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Analogları yavaşça en az iki kez bir yöne ve iki kez diğer yöne çevirerek tüm aralığı kapsayın.",
|
||||
"Run through these tests to verify your controller's functionality.": "Kontrol cihazınızın işlevselliğini doğrulamak için bu testleri gerçekleştirin.",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "Sony kontrol cihazları fabrikadan yaklaşık %10 ortalama dairesellik hatasıyla kalibre edilmiş olarak gelir ve oyunlar artık bunu bekler. Çok mükemmel dairesellik, bazı oyunlarda hareketleri ve nişan almayı sert ve tepkisiz hissettirebilir.",
|
||||
"Speaker": "Hoparlör",
|
||||
"Step size": "Adım boyutu",
|
||||
"Test Speaker": "Hoparlörü Test Et",
|
||||
"Test Summary": "Test Özeti",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Tüm tuşları test edin veya ☐ tuşuna uzun basarak Geçin, ✕ yuşuna uzun basarak Başarısız, O ile atlayın.",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "<b>Bitti</b> düğmesi en fazla 15 saniye sonra etkinleşecektir. Analogları döndürmeden <b>Bitti</b>ye basarsanız kalibrasyon eksik olur ve tekrarlamanız gerekir.",
|
||||
"This test checks all controller buttons by requiring you to press each button up to three times.": "Bu test, her bir tuşa en fazla üç kez basmanızı isteyerek tüm tuşları kontrol eder.",
|
||||
"This test checks the headphone jack functionality.": "Bu test, kulaklık girişinin işlevselliğini kontrol eder.",
|
||||
"This test checks the reliability of the USB port.": "Bu test, USB portunun güvenilirliğini kontrol eder.",
|
||||
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Bu testte kontrol cihazının ışık çubuğunda kırmızı, yeşil ve mavi renkler sırasıyla gösterilir, oyuncu göstergesi ışıkları animasyonlu yanar ve sessiz düğmesi yanıp söner.",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "Bu testte L2 ve R2 tetiklerinde yüksek direnç etkinleştirilir.",
|
||||
"USB Connector": "USB Bağlantı Noktası",
|
||||
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Kontrol cihazı ışıklarının renk değiştirmesini, oyuncu ışıklarının animasyon yapmasını ve sessiz düğmesinin yanıp sönmesini izleyin.",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Ayarlanacak analoğu yukarı/aşağı/sol/sağ konumda tutarken, analoğu hem sola hem sağa çevirdikten sonra dört yönde açık mavi alanlar görene kadar ayarlamalar yapın. Ardından şunu kullanın:",
|
||||
"Wiggle the USB cable to see if the controller disconnects.": "Kontrol cihazının bağlantısının kopup kopmadığını görmek için USB kablosunu hafifçe oynatın.",
|
||||
"failed": "başarısız",
|
||||
"hide": "gizle",
|
||||
"passed": "geçti",
|
||||
"skipped": "atlanmış",
|
||||
"tests completed": "tamamlanan testler",
|
||||
"to increase the non-circularity.": "Dairesellikten sapmayı artırmak için.",
|
||||
"": ""
|
||||
}
|
||||
|
||||
115
lang/ua_ua.json
@@ -1,6 +1,6 @@
|
||||
{
|
||||
".authorMsg": "- Переклав солов'їною: sladk0y",
|
||||
"DualShock Calibration GUI": "ГІК калібрування DualShock",
|
||||
"DualShock Calibration GUI": "Майстер калібрування DualКонтролерів",
|
||||
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Цей браузер не підтримується. Будь ласка, використовуйте веб-браузер із підтримкою WebHID (наприклад, Chrome).",
|
||||
"Connect": "Підключити",
|
||||
"Connected to:": "Підключено до:",
|
||||
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "Запит статусу NVS",
|
||||
"NVS unlock": "Розблокувати NVS",
|
||||
"NVS lock": "Заблокувати NVS",
|
||||
"Fast calibrate stick center (OLD)": "Швидка калібровка центрального положення стіка (СТАРЕ)",
|
||||
"Stick center calibration": "Калібрування центрального положення стіка.",
|
||||
"Welcome": "Ласкаво просимо!",
|
||||
"Step 1": "Крок 1",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "Крок 4",
|
||||
"Completed": "Завершено",
|
||||
"Welcome to the stick center-calibration wizard!": "Ласкаво просимо до майстра калібрування центрального положення стіка!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "Цей інструмент допоможе вам відкалібрувати центральне положення аналогових стіків вашого контролера. Процес складається з чотирьох кроків: вам буде запропоновано перемістити обидва стіки в певному напрямку і відпустити їх.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "Зверніть увагу, що <i>після початку калібрування, її неможливо буде скасувати</i>. Не закривайте цю сторінку та не відключайте контролер до завершення процесу.",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "Цей інструмент допоможе вам відкалібрувати центральне положення аналогових стіків вашого контролера. Процес складається з чотирьох кроків: вам буде запропоновано перемістити обидва стіки в певному напрямку і відпустити їх.",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "Зверніть увагу, що <i>після початку калібрування, її неможливо буде скасувати</i>. Не закривайте цю сторінку та не відключайте контролер до завершення процесу.",
|
||||
"Press <b>Start</b> to begin calibration.": "Натисніть <b>Старт</b>, щоб почати калібрування.",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "Будь ласка, перемістіть обидва стіки в <b>верхній лівий кут</b> і відпустіть їх.",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "Коли стіки повернуться в центральне положення, натисніть <b>Продовжити</b>.",
|
||||
@@ -37,7 +36,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "Будь ласка, не закривайте це вікно і не відключайте ваш контролер. ",
|
||||
"Range calibration": "Калібрування діапазону.",
|
||||
"<b>The controller is now sampling data!</b>": "<b>Контролер зараз збирає дані!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "Повільно обертайте стіки, щоб охопити весь діапазон. Натисніть \"Готово\", коли завершите.",
|
||||
"Done": "Готово",
|
||||
"Hi, thank you for using this software.": "Привіт, дякуємо за використання цього програмного забезпечення.",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "Якщо вважаєте, що це корисно й хочете підтримати мої зусилля - не соромтесь і",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "Тип пристрою",
|
||||
"Range calibration completed": "Калібрування діапазону завершено",
|
||||
"Range calibration failed": "Калібрування діапазону не вдалося",
|
||||
"Cannot unlock NVS": "Не вдається розблокувати NVS",
|
||||
"Cannot relock NVS": "Не вдається заблокувати NVS повторно",
|
||||
"Error 1": "Помилка 1",
|
||||
"Error 2": "Помилка 2",
|
||||
"Error 3": "Помилка 3",
|
||||
"Stick calibration failed": "Калібрування джойстика не вдалося",
|
||||
"Stick calibration completed": "Калібрування джойстика завершено",
|
||||
"NVS Lock failed": "Блокування NVS не вдалося",
|
||||
@@ -72,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "Підключено неприпустиме пристрій: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "Пристрій, ймовірно, є клоном DS4. Усі функції вимкнено.",
|
||||
"Error: ": "Помилка: ",
|
||||
"Connected invalid device": "Підключено неприпустиме пристрій",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "Помилка",
|
||||
"My handle on discord is: the_al": "Мій нік у Discord: the_al",
|
||||
"Initializing...": "Ініціалізація...",
|
||||
"Storing calibration...": "Збереження калібрування...",
|
||||
@@ -105,14 +98,14 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "Так, якщо ви поставите прапорець \"Записати зміни постійно в контролер\". У такому випадку калібрування прошивається безпосередньо в прошивку контролера. Це гарантує, що воно залишиться на місці незалежно від консолі, до якої підключено.",
|
||||
"Is this an officially endorsed service?": "Це офіційно підтримуваний сервіс?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "Ні, цей сервіс є просто твором ентузіаста DualShock.",
|
||||
"Does this website detects if a controller is a clone?": "Цей сайт визначає, чи є контролер клоном?",
|
||||
"Does this website detect if a controller is a clone?": "Цей сайт визначає, чи є контролер клоном?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "Так, наразі тільки для DualShock4. Це сталося тому, що я випадково придбав кілька клонів, витратив час на визначення відмінностей і додав цю функціональність, щоб запобігти майбутнім обманам.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "На жаль, клони все одно не можуть бути відкалібровані, тому що вони лише клонують поведінку DualShock4 під час звичайної гри, а не всі не задокументовані функції.",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "На жаль, клони все одно не можуть бути відкалібровані, тому що вони лише клонують поведінку DualShock4 під час звичайної гри, а не всі не задокументовані функції.",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "Якщо ви хочете розширити цю функціональність виявлення на DualSense, будь ласка, надішліть мені підроблений DualSense, і ви побачите результат за кілька тижнів.",
|
||||
"What development is in plan?": "Які розробки заплановані?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "Я веду два окремих списки справ для цього проекту, хоча пріоритет ще не встановлений.",
|
||||
"The first list is about enhancing support for DualShock4 and DualSense controllers:": "Перший список стосується покращення підтримки контролерів DualShock4 та DualSense:",
|
||||
"Implement calibration of L2/R2 triggers.": "Впровадити калібрування тригерів L2/R2.",
|
||||
"Implement calibration of L2/R2 triggers.": "Впровадити калібрування спускових гачків L2/R2.",
|
||||
"Improve detection of clones, particularly beneficial for those seeking to purchase used controllers with assurance of authenticity.": "Покращити виявлення клонів, що особливо корисно для тих, хто хоче придбати вживані контролери з гарантією автентичності.",
|
||||
"Enhance user interface (e.g. provide additional controller information)": "Покращити інтерфейс користувача (наприклад, надати додаткову інформацію про контролер)",
|
||||
"Add support for recalibrating IMUs.": "Додати підтримку повторної калібровки IMU.",
|
||||
@@ -183,30 +176,22 @@
|
||||
"Bluetooth Address": "Bluetooth адреса",
|
||||
"Show all": "Показати все",
|
||||
"(beta)": "(бета)",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller": "<b>Зовнішньо</b>: шляхом подачі +1,8В безпосередньо на видиму тестову точку без розбирання контролера",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Зовнішньо</b>: шляхом подачі +1,8В безпосередньо на видиму тестову точку без розбирання контролера.",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>Внутрішньо</b>: припаявши дріт від джерела +1,8В до тестової точки захисту від запису.",
|
||||
"Calibration is being stored in the stick modules.": "Калібрування зберігається в модулях стіків.",
|
||||
"Cancel": "Скасувати",
|
||||
"Center X": "Центр X",
|
||||
"Center Y": "Центр Y",
|
||||
"DualSense Edge Calibration": "Калібрування DualSense Edge",
|
||||
"Finetune stick calibration": "Тонке налаштування калібрування стіків",
|
||||
"For more info or help, feel free to reach out on Discord.": "Для додаткової інформації або допомоги звертайтесь у Discord.",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "Я активно працюю над додаванням сумісності, головна складність полягає в записі даних у модулі стіків.",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "Якщо цей інструмент був вам корисний або ви хочете пришвидшити додавання підтримки DualSense Edge, розгляньте можливість підтримати проєкт через",
|
||||
"Left stick": "Лівий стік",
|
||||
"More details and images": "Більше деталей та зображень",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Будь ласка, підключіть контролер DualShock 4, DualSense або DualSense Edge до комп’ютера та натисніть «Підключити».",
|
||||
"Please connect a DualShock 4, a DualSense or DualSense Edge controller to your computer and press Connect.": "Будь ласка, під`єднайте контролер DualShock 4, DualSense або DualSense Edge до комп’ютера та натисніть «Підключити».",
|
||||
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Зверніть увагу: модулі стіків на DS Edge <b>неможливо відкалібрувати лише програмним шляхом</b>.",
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Щоб зберегти власне калібрування у внутрішній памʼяті стіка, потрібна <b>апаратна модифікація</b>.",
|
||||
"Right stick": "Правий стік",
|
||||
"Save": "Зберегти",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "Підтримка калібрування модулів стіків DualSense Edge тепер доступна як <b>експериментальна функція</b>.",
|
||||
"Thank you for your generosity and support!": "Дякуємо за вашу щедрість та підтримку!",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "Графічний інтерфейс калібрування DualShock наразі не підтримує DualSense Edge.",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "Це вимагає тимчасового вимкнення захисту від запису шляхом подачі <b>+1,8В</b> на певну тестову точку кожного модуля.",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "Це лише для досвідчених користувачів. Якщо ви не впевнені у своїх діях, будь ласка, не намагайтеся це зробити.",
|
||||
"This screen allows to finetune raw calibration data on your controller": "Цей екран дозволяє тонко налаштувати необроблені дані калібрування вашого контролера",
|
||||
"We are not responsible for any damage caused by attempting this modification.": "Ми не несемо відповідальності за будь-які пошкодження, спричинені спробами цієї модифікації.",
|
||||
"You can do this in two ways:": "Ви можете зробити це двома способами:",
|
||||
"here": "тут",
|
||||
@@ -243,13 +228,7 @@
|
||||
"Normal": "Нормальний маштаб",
|
||||
"Calibration": "Калібрування",
|
||||
"Debug": "Налагодження",
|
||||
"Error triggering rumble": "Помилка під час запуску вібрації",
|
||||
"Info": "Інформація",
|
||||
"Press L2 to test the strong (left) haptic motor": "Натисніть L2, щоб протестувати потужний (лівий) вібромотор",
|
||||
"Press R2 to test the weak (right) haptic motor": "Натисніть R2, щоб протестувати слабкий (правий) вібромотор",
|
||||
"Test the Haptic Motors": "Перевірити вібромотори",
|
||||
"Tests": "Тести",
|
||||
"The motor strength will match how hard you press the trigger": "Потужність вібрації залежатиме від сили натискання на тригер",
|
||||
"Center (L1)": "Центрування (L1)",
|
||||
"Circularity (R1)": "Округлість (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.": "Перемістіть стік, щоб вибрати його для налаштування, потім, не торкаючись стіка, використовуйте кнопки D-pad для регулювання центральної точки. Різко відпустіть і налаштуйте знову, якщо стік зміщений від центру або тремтить.",
|
||||
@@ -257,8 +236,78 @@
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Натисніть D-pad або передні кнопки в напрямку, куди потрібно змістити положення стіка.",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "Відхиліть стік максимально вгору/вниз/вліво/вправо.",
|
||||
"Show raw numbers": "Показати необроблені значення",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "Утримуючи стік, який потрібно налаштувати, максимально вгору/вниз/вліво/вправо, <em>стежте за виділеним значенням під колом</em>, потім використовуйте кнопки D-pad, щоб відрегулювати значення до ±0.99 (трохи нижче за ±1.00).",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Пристрій під’єднано через Bluetooth. Від’єднайте його та під’єднайте знову, але вже за допомогою USB-кабелю.",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Ваш пристрій може бути не оригінальним контролером Sony. Якщо це не підробка, повідомте про цю проблему.",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Середня похибка округлості:</strong> менше — не завжди краще! Орієнтуйтеся на 7–9 %.",
|
||||
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "Щоб продовжити використання DualSense Edge, потрібно перезавантажити контролер. Від’єднайте його та під’єднайте знову.",
|
||||
"Adaptive Trigger": "Адаптивний спусковий гачок",
|
||||
"Adaptive triggers are only supported on DualSense controllers": "Адаптивні спускові гачки підтримуються лише контролерами DualSense",
|
||||
"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.": "Утримуйте [circle], щоб пропустити і перейти далі.",
|
||||
"Microphone": "Мікрофон",
|
||||
"Microphone Level:": "Рівень мікрофона:",
|
||||
"No controller connected": "Контролер не під’єднано",
|
||||
"No tests completed yet.": "Жодного тесту ще не завершено.",
|
||||
"Not tested": "Не перевірено",
|
||||
"Pass": "Пройдено",
|
||||
"Passed": "Успішно",
|
||||
"Plug in headphones to the 3.5mm jack": "Підключіть навушники до роз’єму 3,5 мм",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "Натисніть спускові гачки L2 і R2, щоб відчути опір.",
|
||||
"Press [circle] to close, or [square] to start over": "Натисніть [circle], щоб закрити, або [square], щоб почати спочатку",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Натисніть [square], щоб позначити як пройдено, [cross] — як не пройдено, або [circle], щоб пропустити.",
|
||||
"Press [square] to begin or [circle] to close": "Натисніть [square], щоб почати, або [circle], щоб закрити",
|
||||
"Press [triangle] to go back.": "Натисніть [triangle], щоб повернутися назад.",
|
||||
"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.": "Контролери Sony з заводу калібровані із середньою похибкою округлості близько 10 % — саме цього очікують ігри. Надто ідеальна округлість може зробити рухи або прицілювання надто жорсткими й нечутливим.",
|
||||
"Speaker": "Динамік",
|
||||
"Step size": "Крок зміни",
|
||||
"Test Speaker": "Перевірити динамік",
|
||||
"Test Summary": "Підсумок тесту",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Перевірте всі кнопки, або утримуйте [square], щоб позначити як пройдено, [cross] — як не пройдено, або [circle] — щоб пропустити.",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "Кнопка <b>Готово</b> стане доступною не пізніше ніж через 15 секунд. Якщо натиснути <b>Готово</b>, не обертаючи стіки, калібрування буде неповним, і доведеться повторити.",
|
||||
"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.": "Цей тест перевіряє надійність 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.": "Цей тест послідовно відтворить червоний, зелений і синій кольори на панелі підсвічування контролера, а також анімує індикатори гравця й блимне кнопкою вимкнення мікрофона.",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "Цей тест вмикає сильний опір на обох спускових гачках L2 та R2.",
|
||||
"USB Connector": "USB-роз’єм",
|
||||
"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.": "Поворушіть USB-кабель, щоб перевірити, чи не роз’єднується контролер.",
|
||||
"failed": "невдало",
|
||||
"hide": "приховати",
|
||||
"passed": "успішно",
|
||||
"skipped": "пропущено",
|
||||
"tests completed": "тестів завершено",
|
||||
"to increase the non-circularity.": "щоб збільшити неокруглість.",
|
||||
"": ""
|
||||
}
|
||||
|
||||
127
lang/zh_cn.json
@@ -14,7 +14,6 @@
|
||||
"Query NVS status": "查询 NVS 状态",
|
||||
"NVS unlock": "解锁 NVS",
|
||||
"NVS lock": "锁定 NVS",
|
||||
"Fast calibrate stick center (OLD)": "快速校准摇杆中心 (旧版)",
|
||||
"Stick center calibration": "摇杆中心校准",
|
||||
"Welcome": "欢迎",
|
||||
"Step 1": "步骤 1",
|
||||
@@ -23,8 +22,8 @@
|
||||
"Step 4": "步骤 4",
|
||||
"Completed": "已完成",
|
||||
"Welcome to the stick center-calibration wizard!": "欢迎使用摇杆中心校准向导!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "此工具将指导您重新定位摇杆中心。 包括四个步骤:您将被要求将两个摇杆移动到一个方向并松开摇杆。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "请注意,<i>一旦校准开始,就无法取消</i>。 在完成之前,请不要关闭此页面或断开手柄的连接。",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "此工具将指导您重新定位摇杆中心。 包括四个步骤:您将被要求将两个摇杆移动到一个方向并松开摇杆。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "请注意,<i>一旦校准开始,就无法取消</i>。 在完成之前,请不要关闭此页面或断开手柄的连接。",
|
||||
"Press <b>Start</b> to begin calibration.": "按 <b>开始</b> 开始校准。",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "请将两个摇杆移动到 <b>左上角</b> 并松开摇杆。",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "当摇杆回到中心位置时,按 <b>继续</b>。",
|
||||
@@ -37,7 +36,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "请不要关闭此窗口,也不要断开手柄的连接。 ",
|
||||
"Range calibration": "摇杆外圈校准",
|
||||
"<b>The controller is now sampling data!</b>": "<b>手柄现在正在采样数据!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "缓慢转动摇杆以覆盖整个圆形区域。 完成后按 \"完成\"。",
|
||||
"Done": "完成",
|
||||
"Hi, thank you for using this software.": "嗨,感谢您使用此软件。",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "如果你觉得这些对你有帮助,想支持我的工作,随时欢迎!",
|
||||
@@ -58,11 +56,6 @@
|
||||
"Device Type": "设备类型",
|
||||
"Range calibration completed": "摇杆外圈校准已完成",
|
||||
"Range calibration failed": "摇杆外圈校准失败",
|
||||
"Cannot unlock NVS": "无法解锁 NVS",
|
||||
"Cannot relock NVS": "无法重新锁定 NVS",
|
||||
"Error 1": "错误 1",
|
||||
"Error 2": "错误 2",
|
||||
"Error 3": "错误 3",
|
||||
"Stick calibration failed": "摇杆校准失败",
|
||||
"Stick calibration completed": "摇杆校准完成",
|
||||
"NVS Lock failed": "NVS 锁定失败",
|
||||
@@ -72,9 +65,9 @@
|
||||
"Sony DualShock 4 V2": "PS4手柄二代(Sony DualShock 4 V2)",
|
||||
"Sony DualSense": "PS5手柄(Sony DualSense)",
|
||||
"Sony DualSense Edge": "PS5精英手柄/DSE(Sony DualSense Edge)",
|
||||
"Connected invalid device: ": "连接了无效设备: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "该设备似乎是 盗版DS4 。所有功能均已禁用。",
|
||||
"Error: ": "错误: ",
|
||||
"Connected invalid device": "连接了无效设备",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "错误",
|
||||
"My handle on discord is: the_al": "我的 Discord 用户名是: the_al",
|
||||
"Initializing...": "初始化...",
|
||||
"Storing calibration...": "正在存储校准...",
|
||||
@@ -105,9 +98,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "是的,如果您点击了“在手柄中永久写入更改”按钮。在这种情况下,校准直接刷新到手柄固件中。这确保了它无论连接到哪个游戏机都会生效。",
|
||||
"Is this an officially endorsed service?": "这是官方认可的工具吗?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "不,这个工具只是一个DualShock爱好者的创作。",
|
||||
"Does this website detects if a controller is a clone?": "这个网站能检测到手柄是否是正品吗?",
|
||||
"Does this website detect if a controller is a clone?": "这个网站能检测到手柄是否是正品吗?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "是的,目前只有DualShock4。这是因为我不小心买到了一些盗版,因此花了些时间鉴别了它们的差异,并添加了这个功能以防止未来被骗。(译者注:DS5也可以)",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "坏消息,盗版无论如何都不能进行校准,因为它们只复制了在正常游戏过程中DualShock4的功能部分,而不是所有未记录的功能。",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "坏消息,盗版无论如何都不能进行校准,因为它们只复制了在正常游戏过程中DualShock4的功能部分,而不是所有未记录的功能。",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "如果您想将此检测功能扩展到DualSense,请给我寄送一个假的DualSense,您将在几周内看到结果。",
|
||||
"What development is in plan?": "有什么发展计划吗?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "我在这个项目上还有两件想个的功能,虽然不知道先做哪个。",
|
||||
@@ -184,17 +177,9 @@
|
||||
"Show all": "显示全部信息",
|
||||
"Finetune stick calibration": "微调摇杆校准",
|
||||
"(beta)": "测试版本",
|
||||
"This screen allows to finetune raw calibration data on your controller": "此界面允许微调手柄上的原始校准数据",
|
||||
"Left stick": "左摇杆电压(mV)",
|
||||
"Right stick": "右摇杆电压(mV)",
|
||||
"Center X": "X轴中心",
|
||||
"Center Y": "Y轴中心",
|
||||
"Save": "保存",
|
||||
"Cancel": "取消",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock校准GUI目前不支持DualSense Edge。",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "我正在积极致力于兼容,主要研究将数据存储到摇杆模块中。",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "如果这个工具对你有所帮助,或者你希望看到对于DualSense Edge的支持更快到来,请考虑支持这个项目。",
|
||||
"Thank you for your generosity and support!": "感谢您的慷慨和支持!",
|
||||
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>外部</b>:无需打开手柄,直接对可见的测试点施加+1.8V",
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>内部</b>:将+1.8V电源与写保护测试点飞线连接。",
|
||||
"Calibration is being stored in the stick modules.": "校准数据正在存储于摇杆模块中。",
|
||||
@@ -242,23 +227,87 @@
|
||||
"10x zoom": "10倍速测试",
|
||||
"Calibration": "校准",
|
||||
"Debug": "调试",
|
||||
"Error triggering rumble": "触发震动时出错",
|
||||
"Info": "信息",
|
||||
"Normal": "正常",
|
||||
"Press L2 to test the strong (left) haptic motor": "按下L2键测试强(左)震动",
|
||||
"Press R2 to test the weak (right) haptic motor": "按下R2键测试弱(右)震动",
|
||||
"Test the Haptic Motors": "测试震动",
|
||||
"Tests": "测试",
|
||||
"The motor strength will match how hard you press the trigger": "震动马达的力度与你扣动扳机的力度相匹配",
|
||||
"Center (L1)": "",
|
||||
"Circularity (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.": "",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "",
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "",
|
||||
"Show raw numbers": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
|
||||
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>摇杆圆度误差</strong>:正常应该在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": "自适应扳机仅支持PS5手柄",
|
||||
"Add test": "进行测试",
|
||||
"Be gentle to avoid damage.": "操作时请轻柔,以防损坏",
|
||||
"Buttons": "按钮",
|
||||
"Center": "中心",
|
||||
"Center (L1)": "中心 (L1)",
|
||||
"Circularity": "圆度",
|
||||
"Circularity (R1)": "圆度 (R1)",
|
||||
"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:": "麦克风音量",
|
||||
"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.": "尚未完成任何测试",
|
||||
"Not tested": "未测试",
|
||||
"Pass": "通过",
|
||||
"Passed": "已通过",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "在使用方向键调整之前,请确保摇杆处于正中心位置。",
|
||||
"Plug in headphones to the 3.5mm jack": "将耳机插入3.5毫米接口",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "按下 L2 和 R2 扳机键感受扳机阻力",
|
||||
"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.": "向一个方向缓慢旋转摇杆至少 2 次,然后在另一个方向上旋转 2 次以覆盖整个范围。",
|
||||
"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.": "索尼手柄出厂时已校准,平均圆度误差接近 10%,这符合游戏的预期。在某些游戏中,过于完美的圆度会使移动和瞄准感觉僵硬且反应迟钝。",
|
||||
"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.": "<b>完成</b> 按钮将在最多 15 秒后解锁。如果您在未旋转摇杆的情况下按下 <b>完成</b>,则校准将失败,您需要重新进行校准。",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "手柄使用的是蓝牙连接。请断开连接并使用 USB 数据线重新连接。",
|
||||
"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.": "此测试检查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.": "此测试将循环切换控制器灯条上的红、绿、蓝颜色,使玩家指示灯动起来,并使静音按钮闪烁。",
|
||||
"This test will enable heavy resistance on both L2 and R2 triggers.": "此测试将对 L2 和 R2 扳机施加阻力。",
|
||||
"USB Connector": "USB 连接器",
|
||||
"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.": "晃动USB线,检测手柄是否会断开连接。",
|
||||
"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.": "增加非圆度",
|
||||
"": ""
|
||||
}
|
||||
}
|
||||
|
||||
107
lang/zh_tw.json
@@ -13,7 +13,6 @@
|
||||
"Query NVS status": "查詢 NVS 狀態",
|
||||
"NVS unlock": "解鎖 NVS",
|
||||
"NVS lock": "鎖定 NVS",
|
||||
"Fast calibrate stick center (OLD)": "快速校準搖桿中心 (舊版)",
|
||||
"Stick center calibration": "搖桿中心校準",
|
||||
"Welcome": "歡迎",
|
||||
"Step 1": "步驟 1",
|
||||
@@ -22,8 +21,8 @@
|
||||
"Step 4": "步驟 4",
|
||||
"Completed": "已完成",
|
||||
"Welcome to the stick center-calibration wizard!": "歡迎使用搖桿中心校準嚮導!",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.": "此工具將指導您重新定位手把的模擬搖桿。 它包括四個步驟:您將被要求將兩個搖桿移動到一個方向並釋放它們。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.": "請注意,<i>一旦校準开始,就無法取消</i>。 在完成之前,請不要關閉此頁面或斷開手把的連結。",
|
||||
"This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.": "此工具將指導您重新定位手把的模擬搖桿。 它包括四個步驟:您將被要求將兩個搖桿移動到一個方向並釋放它們。",
|
||||
"Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.": "請注意,<i>一旦校準开始,就無法取消</i>。 在完成之前,請不要關閉此頁面或斷開手把的連結。",
|
||||
"Press <b>Start</b> to begin calibration.": "按 <b>開始</b> 開始校準。",
|
||||
"Please move both sticks to the <b>top-left corner</b> and release them.": "請將兩個搖桿移到 <b>左上角</b> 並釋放它們。",
|
||||
"When the sticks are back in the center, press <b>Continue</b>.": "當搖桿回到中心位置時,按 <b>繼續</b>。",
|
||||
@@ -36,7 +35,6 @@
|
||||
"Please do not close this window and do not disconnect your controller. ": "請不要關閉此窗口,也不要斷開手把的連接。 ",
|
||||
"Range calibration": "摇杆外圈校準",
|
||||
"<b>The controller is now sampling data!</b>": "<b>手把現在正在採樣數據!</b>",
|
||||
"Rotate the sticks slowly to cover the whole range. Press \"Done\" when completed.": "緩慢轉動搖桿以覆蓋整個範圍。 完成後按 \"完成\"。",
|
||||
"Done": "完成",
|
||||
"Hi, thank you for using this software.": "嗨,感謝您使用此軟體。",
|
||||
"If you're finding it helpful and you want to support my efforts, feel free to": "如果您覺得有幫助,想支持我的努力,請隨時",
|
||||
@@ -57,11 +55,6 @@
|
||||
"Device Type": "設備類型",
|
||||
"Range calibration completed": "搖桿外圈校準已完成",
|
||||
"Range calibration failed": "搖桿外圈校準失敗",
|
||||
"Cannot unlock NVS": "無法解鎖 NVS",
|
||||
"Cannot relock NVS": "無法重新鎖定 NVS",
|
||||
"Error 1": "錯誤 1",
|
||||
"Error 2": "錯誤 2",
|
||||
"Error 3": "錯誤 3",
|
||||
"Stick calibration failed": "摇杆校準失敗",
|
||||
"Stick calibration completed": "摇杆校準完成",
|
||||
"NVS Lock failed": "NVS 鎖定失敗",
|
||||
@@ -71,9 +64,9 @@
|
||||
"Sony DualShock 4 V2": "Sony DualShock 4 V2",
|
||||
"Sony DualSense": "Sony DualSense",
|
||||
"Sony DualSense Edge": "Sony DualSense Edge",
|
||||
"Connected invalid device: ": "連接了無效設備: ",
|
||||
"The device appears to be a DS4 clone. All functionalities are disabled.": "該設備似乎是 DS4 盜版。所有功能均已停用。",
|
||||
"Error: ": "錯誤: ",
|
||||
"Connected invalid device": "連接了無效設備",
|
||||
"The device appears to be a clone. All calibration functionality is disabled.": "",
|
||||
"Error": "錯誤",
|
||||
"My handle on discord is: the_al": "我的 Discord 用戶名是: the_al",
|
||||
"Initializing...": "初始化...",
|
||||
"Storing calibration...": "正在儲存校準...",
|
||||
@@ -104,9 +97,9 @@
|
||||
"Yes, if you tick the checkbox \"Write changes permanently in the controller\". In that case, the calibration is flashed directly in the controller firmware. This ensures that it remains in place regardless of the console it's connected to.": "是的,如果您勾選了「在手把中永久寫入變更」複選框。在這種情況下,校準直接刷新到手把韌體中。這確保了它無論連接到哪個遊戲機都會生效。",
|
||||
"Is this an officially endorsed service?": "這是官方認可的工具嗎?",
|
||||
"No, this service is simply a creation by a DualShock enthusiast.": "不,這個工具只是一個DualShock愛好者的創作。",
|
||||
"Does this website detects if a controller is a clone?": "這個網站能偵測到手把是否是正品嗎?",
|
||||
"Does this website detect if a controller is a clone?": "這個網站能偵測到手把是否是正品嗎?",
|
||||
"Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.": "是的,目前只有DualShock4。這是因為我不小心買到了一些盜版,因此花了一些時間鑑別了它們的差異,並添加了這個功能以防止未來被騙。",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.": "不幸的是,盜版無論如何都不能進行校準,因為它們只複製了在正常遊戲過程中DualShock4的功能部分,而不是所有未記錄的功能。",
|
||||
"Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.": "不幸的是,盜版無論如何都不能進行校準,因為它們只複製了在正常遊戲過程中DualShock4的功能部分,而不是所有未記錄的功能。",
|
||||
"If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.": "如果您想將此檢測功能擴展到DualSense,請寄給我一個假的DualSense,您將在幾週內看到結果。",
|
||||
"What development is in plan?": "有什麼發展計畫嗎?",
|
||||
"I maintain two separate to-do lists for this project, although the priority has yet to be established.": "我為這個項目維護兩個單獨的待辦事項列表,儘管優先順序尚未確定。",
|
||||
@@ -162,8 +155,6 @@
|
||||
"<b>Internally</b>: by soldering a wire from a +1.8V source to the write-protect TP.": "<b>內部方式</b>:從 +1.8V 電源點焊接一條導線至寫入保護測試點(TP)",
|
||||
"Calibration is being stored in the stick modules.": "校正資料正被儲存到搖桿模組中。",
|
||||
"Cancel": "取消",
|
||||
"Center X": "X軸中心",
|
||||
"Center Y": "Y軸中心",
|
||||
"Controller Info": "手把資訊",
|
||||
"Debug Info": "除錯資訊",
|
||||
"Debug buttons": "除錯按鈕",
|
||||
@@ -178,8 +169,6 @@
|
||||
"For more info or help, feel free to reach out on Discord.": "如需更多資訊或協助,歡迎隨時在 Discord 上與我們聯繫。",
|
||||
"HW Model": "硬體型號",
|
||||
"Hardware": "硬體",
|
||||
"I'm actively working on adding compatibility, the primary challenge lies in storing data into the stick modules.": "我正在積極處理相容性的問題,主要的挑戰在於將資料儲存到記憶模組中。",
|
||||
"If this tool has been helpful to you or you want to see DualSense Edge support arrive faster, please consider supporting the project with a": "如果這個工具對您有所幫助,或您希望看到 DualSense Edge 支援更快推出,請考慮通過以下方式支持該專案:",
|
||||
"Left stick": "左搖桿電壓(mV)",
|
||||
"More details and images": "更多詳情與圖片",
|
||||
"PCBA ID": "PCBA ID",
|
||||
@@ -188,16 +177,12 @@
|
||||
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "要在搖桿的內部存儲器上存儲自定義校準,需要進行<b>硬件修改</b>。",
|
||||
"Right stick": "右搖桿電壓(mV)",
|
||||
"SBL FW Version": "SBL韌體版本",
|
||||
"Save": "儲存",
|
||||
"Show all": "顯示全部資訊",
|
||||
"Software": "軟體",
|
||||
"Spider FW Version": "Spider韌體版本",
|
||||
"Support for calibrating DualSense Edge stick modules is now available as an <b>experimental feature</b>.": "現在已提供對 DualSense Edge 搖桿模組校正的支援,作為一項<b>實驗性功能</b>。",
|
||||
"Thank you for your generosity and support!": "感謝您的慷慨與支持!",
|
||||
"The DualShock Calibration GUI does not currently support the DualSense Edge.": "DualShock 校正圖形介面目前不支援 DualSense Edge。",
|
||||
"This involves temporarily disabling write protection by applying <b>+1.8V</b> to a specific test point on each module.": "這需要在每個模組上的特定測試點施加 <b>+1.8V</b> 電壓,以暫時停用寫入保護。",
|
||||
"This is only for advanced users. If you're not sure what you're doing, please do not attempt it.": "這僅適用於進階使用者。如果您不確定自己在做什麼,請不要嘗試。",
|
||||
"This screen allows to finetune raw calibration data on your controller": "此畫面可讓您微調手把上的原始校正資料",
|
||||
"Touchpad FW Version": "觸摸版韌體版本",
|
||||
"Touchpad ID": "觸摸版ID",
|
||||
"We are not responsible for any damage caused by attempting this modification.": "我們不對嘗試此修改所造成的任何損壞負責。",
|
||||
@@ -242,23 +227,87 @@
|
||||
"10x zoom": "10倍速測試",
|
||||
"Calibration": "校準",
|
||||
"Debug": "調試",
|
||||
"Error triggering rumble": "觸發震動時出錯",
|
||||
"Info": "信息",
|
||||
"Normal": "正常",
|
||||
"Press L2 to test the strong (left) haptic motor": "按下L2鍵測試強(左)震動",
|
||||
"Press R2 to test the weak (right) haptic motor": "按下R2鍵測試弱(右)震動",
|
||||
"Test the Haptic Motors": "測試震動",
|
||||
"Tests": "測試",
|
||||
"The motor strength will match how hard you press the trigger": "震動馬達的力度與妳扣動扳機的力度相匹配",
|
||||
"<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": "",
|
||||
"Center (L1)": "",
|
||||
"Circularity": "",
|
||||
"Circularity (R1)": "",
|
||||
"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:": "",
|
||||
"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.": "",
|
||||
"Not tested": "",
|
||||
"Pass": "",
|
||||
"Passed": "",
|
||||
"Please release the stick to center position before adjusting with D-pad buttons.": "",
|
||||
"Plug in headphones to the 3.5mm jack": "",
|
||||
"Press L2 and R2 triggers to feel the trigger resistance.": "",
|
||||
"Press [circle] to close, or [square] to start over": "",
|
||||
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "",
|
||||
"Press [square] to begin or [circle] to close": "",
|
||||
"Press [triangle] to go back.": "",
|
||||
"Press each button until they turn green.": "",
|
||||
"Press the D-pad or face buttons in the direction you want the stick position to move.": "",
|
||||
"Progress": "",
|
||||
"Push the stick straight up/down/left/right as far as possible.": "",
|
||||
"Quick Test": "",
|
||||
"Quick calibrate": "",
|
||||
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "",
|
||||
"Repeat": "",
|
||||
"Restart": "",
|
||||
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
|
||||
"Run through these tests to verify your controller's functionality.": "",
|
||||
"Show raw numbers": "",
|
||||
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
|
||||
"Speaker": "",
|
||||
"Step size": "",
|
||||
"Test Speaker": "",
|
||||
"Test Summary": "",
|
||||
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
|
||||
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
|
||||
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
|
||||
"While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).": "",
|
||||
"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.": "",
|
||||
"": ""
|
||||
}
|
||||
225
scripts/README_check_translations.md
Normal file
@@ -0,0 +1,225 @@
|
||||
# Translation String Checker
|
||||
|
||||
This script analyzes the DualShock Tools codebase to find translation strings and compares them with the language files to identify discrepancies.
|
||||
|
||||
## Features
|
||||
|
||||
### 1. **Source Code Analysis**
|
||||
|
||||
- Scans HTML files for elements with the `ds-i18n` class
|
||||
- Scans JavaScript files for strings passed to the `l()` function
|
||||
- Handles both `l()` and `this.l()` function calls
|
||||
- Strips simple HTML formatting tags (`<b>`, `<i>`, `<em>`, `<strong>`, `<span>`)
|
||||
- Decodes HTML entities and normalizes whitespace
|
||||
- **Automatically ignores commented-out code:**
|
||||
- HTML comments (`<!-- ... -->`)
|
||||
- JavaScript single-line comments (`// ...`)
|
||||
- JavaScript multi-line comments (`/* ... */`)
|
||||
|
||||
### 2. **Smart Filtering**
|
||||
|
||||
Automatically excludes non-translatable strings:
|
||||
|
||||
- CSS class selectors (e.g., `.alert`, `.hide`)
|
||||
- CSS ID selectors (e.g., `#id`)
|
||||
- Compound selectors (e.g., `circle.ds-touch`)
|
||||
- SVG element lists (e.g., `path,rect,circle`)
|
||||
- Hex escape sequences (e.g., `\x1B`)
|
||||
- CSS display values (`hide`, `show`)
|
||||
|
||||
### 3. **Whitelist for Unused Strings**
|
||||
|
||||
The script includes a whitelist (`WHITELIST_UNUSED`) for strings that are in language files but should be ignored by the unused check. These strings may be:
|
||||
|
||||
- Used dynamically (e.g., controller model names, color variants)
|
||||
- Reserved for future use
|
||||
- Used in comments or documentation
|
||||
- Part of error messages that are rarely triggered
|
||||
|
||||
The whitelist is defined in the script and can be updated as needed. Whitelisted strings are excluded from the "unused translations" report but are still included in the JSON output for reference.
|
||||
|
||||
### 4. **Comparison & Reporting**
|
||||
|
||||
Identifies two types of issues:
|
||||
|
||||
- **Missing translations**: Strings used in code but not in translation files
|
||||
- **Unused translations**: Strings in translation files but no longer used in code (excluding whitelisted strings)
|
||||
|
||||
### 5. **Clickable File References & Language Tracking**
|
||||
|
||||
Each missing translation shows:
|
||||
|
||||
- The exact file location in `file:line:col` format (clickable in VS Code)
|
||||
- A note if the string appears in multiple locations
|
||||
- Which language files are missing this translation
|
||||
|
||||
Example output:
|
||||
|
||||
```
|
||||
- Don't show again
|
||||
→ templates/edge-modal.html:33:11
|
||||
Missing from: ALL languages (22)
|
||||
- Connected invalid device:
|
||||
→ js/core.js:224:11
|
||||
(and 1 more location)
|
||||
Missing from: ALL languages (22)
|
||||
- Some partial translation
|
||||
→ index.html:123:45
|
||||
Missing from: ar_ar, de_de, es_es, fr_fr, it_it (and 5 more)
|
||||
```
|
||||
|
||||
### 6. **Multiple Output Modes**
|
||||
|
||||
#### Normal Mode (default)
|
||||
|
||||
Human-readable output with sections for missing and unused translations:
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py
|
||||
```
|
||||
|
||||
#### Verbose Mode
|
||||
|
||||
Shows excluded strings for debugging:
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py --verbose
|
||||
# or
|
||||
python3 scripts/check_translations.py -v
|
||||
```
|
||||
|
||||
#### JSON Mode
|
||||
|
||||
Machine-readable output for integration with other tools:
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py --json
|
||||
```
|
||||
|
||||
JSON output includes location and language information:
|
||||
|
||||
```json
|
||||
{
|
||||
"summary": {
|
||||
"total_strings_used": 223,
|
||||
"total_translation_keys": 268,
|
||||
"total_languages": 22,
|
||||
"missing_count": 28,
|
||||
"unused_count": 0,
|
||||
"excluded_count": 5,
|
||||
"whitelisted_count": 57
|
||||
},
|
||||
"missing_translations": [
|
||||
{
|
||||
"string": "Don't show again",
|
||||
"missing_from_languages": [
|
||||
"ar_ar", "bg_bg", "cz_cz", "da_dk", "de_de", "es_es",
|
||||
"fa_fa", "fr_fr", "hu_hu", "it_it", "jp_jp", "ko_kr",
|
||||
"nl_nl", "pl_pl", "pt_br", "pt_pt", "rs_rs", "ru_ru",
|
||||
"tr_tr", "ua_ua", "zh_cn", "zh_tw"
|
||||
],
|
||||
"locations": [
|
||||
{
|
||||
"file": "templates/edge-modal.html",
|
||||
"line": 33,
|
||||
"col": 11
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"unused_translations": [...],
|
||||
"excluded_strings": [...],
|
||||
"whitelisted_strings": [...]
|
||||
}
|
||||
```
|
||||
|
||||
## Exit Codes
|
||||
|
||||
- **0**: All translations are in sync
|
||||
- **1**: There are missing or unused translations (suitable for CI/CD)
|
||||
|
||||
## Usage Examples
|
||||
|
||||
### Check translations and see results
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py
|
||||
```
|
||||
|
||||
### Debug excluded strings
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py --verbose
|
||||
```
|
||||
|
||||
### Generate JSON report
|
||||
|
||||
```bash
|
||||
python3 scripts/check_translations.py --json > translation_report.json
|
||||
```
|
||||
|
||||
### Use in CI/CD pipeline
|
||||
|
||||
```bash
|
||||
# This will fail (exit code 1) if there are discrepancies
|
||||
python3 scripts/check_translations.py
|
||||
```
|
||||
|
||||
## How It Works
|
||||
|
||||
1. **Scan Phase**: The script scans all HTML and JavaScript files to extract translation strings
|
||||
- Comments are automatically removed before extraction to avoid false positives
|
||||
2. **Filter Phase**: Non-translatable strings (CSS selectors, etc.) are filtered out
|
||||
3. **Load Phase**: Translation keys are loaded from all language files in `lang/`
|
||||
4. **Compare Phase**: Set operations identify missing and unused translations
|
||||
5. **Report Phase**: Results are displayed with clickable file references
|
||||
|
||||
## Special Keys
|
||||
|
||||
The following keys are excluded from comparison as they are metadata:
|
||||
|
||||
- `.authorMsg` - Author information in language files
|
||||
- `.title` - Language name in language files
|
||||
|
||||
## Managing the Whitelist
|
||||
|
||||
The `WHITELIST_UNUSED` set in the script contains strings that should be ignored by the unused translations check. To update the whitelist:
|
||||
|
||||
1. Open `scripts/check_translations.py`
|
||||
2. Find the `WHITELIST_UNUSED` set (near the top of the file)
|
||||
3. Add or remove strings as needed
|
||||
4. Run the script to verify the changes
|
||||
|
||||
**When to add strings to the whitelist:**
|
||||
|
||||
- Controller model names (e.g., "Sony DualSense", "DualShock 4 V2")
|
||||
- Color variants (e.g., "Midnight Black", "Cosmic Red")
|
||||
- Special edition names (e.g., "30th Anniversary", "God of War Ragnarok")
|
||||
- Error messages that are rarely shown (e.g., "Error 2", "Error 3")
|
||||
- Strings used dynamically or conditionally
|
||||
- Strings reserved for future features
|
||||
|
||||
**When NOT to add strings to the whitelist:**
|
||||
|
||||
- Strings that are truly unused and should be removed from language files
|
||||
- Strings that should be used in code but aren't yet (fix the code instead)
|
||||
|
||||
## File Structure
|
||||
|
||||
The script expects the following directory structure:
|
||||
|
||||
```
|
||||
.
|
||||
├── lang/ # Translation JSON files
|
||||
├── js/ # JavaScript files
|
||||
├── templates/ # HTML template files
|
||||
└── *.html # Root HTML files
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- The script uses regex patterns to extract strings, so it may not catch dynamically generated translation keys
|
||||
- HTML content with complex nested tags is skipped to avoid false positives
|
||||
- The script normalizes whitespace to match how the translation system processes strings
|
||||
- All language files should ideally have the same keys (the script takes a union of all keys)
|
||||
- **Commented-out code is automatically ignored**, so translation strings in comments won't be detected as "used"
|
||||
513
scripts/check_translations.py
Executable file
@@ -0,0 +1,513 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# (C) 2025 dualshock-tools
|
||||
#
|
||||
# This script analyzes the source files to find translation strings and compares
|
||||
# them with the language files to identify:
|
||||
# - Strings that are used in code but missing from translation files
|
||||
# - Strings that are in translation files but no longer used in code
|
||||
#
|
||||
# The script extracts translation strings from:
|
||||
# - HTML files: elements with ds-i18n class
|
||||
# - JavaScript files: l() function calls
|
||||
# - JavaScript files: HTML embedded in strings with ds-i18n class
|
||||
#
|
||||
# The script automatically ignores commented-out code:
|
||||
# - HTML comments (<!-- ... -->)
|
||||
# - JavaScript single-line comments (// ...)
|
||||
# - JavaScript multi-line comments (/* ... */)
|
||||
#
|
||||
# Usage:
|
||||
# python3 scripts/check_translations.py # Normal output
|
||||
# python3 scripts/check_translations.py --verbose # Show excluded strings
|
||||
# python3 scripts/check_translations.py --json # Output in JSON format
|
||||
|
||||
import os
|
||||
import re
|
||||
import json
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
# Check for flags
|
||||
VERBOSE = '--verbose' in sys.argv or '-v' in sys.argv
|
||||
JSON_OUTPUT = '--json' in sys.argv
|
||||
|
||||
# Directories to scan
|
||||
ROOT_DIR = Path(".")
|
||||
LANG_DIR = ROOT_DIR / "lang"
|
||||
JS_DIR = ROOT_DIR / "js"
|
||||
TEMPLATES_DIR = ROOT_DIR / "templates"
|
||||
|
||||
# Special keys that are not in source code
|
||||
SPECIAL_KEYS = {".authorMsg", ".title"}
|
||||
|
||||
# Patterns to exclude from translation checks (CSS selectors, technical strings, etc.)
|
||||
EXCLUDE_PATTERNS = [
|
||||
r'^\.[\w-]+$', # CSS class selectors like .alert, .hide
|
||||
r'^#[\w-]+$', # CSS ID selectors
|
||||
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
|
||||
# These strings may be used dynamically, in comments, or reserved for future use
|
||||
WHITELIST_UNUSED = {
|
||||
"(beta)",
|
||||
"30th Anniversary",
|
||||
"Astro Bot",
|
||||
"Chroma Indigo",
|
||||
"Chroma Pearl",
|
||||
"Chroma Teal",
|
||||
"Cobalt Blue",
|
||||
"Cosmic Red",
|
||||
"Fortnite",
|
||||
"Galactic Purple",
|
||||
"God of War Ragnarok",
|
||||
"Grey Camouflage",
|
||||
"Midnight Black",
|
||||
"Nova Pink",
|
||||
"Spider-Man 2",
|
||||
"Starlight Blue",
|
||||
"Sterling Silver",
|
||||
"The Last of Us",
|
||||
"Volcanic Red",
|
||||
"White",
|
||||
|
||||
"Sony DualSense",
|
||||
"Sony DualSense Edge",
|
||||
"Sony DualShock 4 V1",
|
||||
"Sony DualShock 4 V2",
|
||||
|
||||
"Calibration in progress",
|
||||
"Continue",
|
||||
"Start",
|
||||
"Initializing...",
|
||||
"Sampling...",
|
||||
"left module",
|
||||
"right module",
|
||||
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.",
|
||||
|
||||
"Adaptive Trigger",
|
||||
"Buttons",
|
||||
"Haptic Vibration",
|
||||
"Headphone Jack",
|
||||
"Lights",
|
||||
"Microphone",
|
||||
"Speaker",
|
||||
"USB Connector",
|
||||
}
|
||||
|
||||
|
||||
def should_exclude_string(text):
|
||||
"""Check if a string should be excluded from translation checks."""
|
||||
for pattern in EXCLUDE_PATTERNS:
|
||||
if re.match(pattern, text):
|
||||
return True
|
||||
return False
|
||||
|
||||
def find_html_files():
|
||||
"""Find all HTML files in the project."""
|
||||
html_files = []
|
||||
# Root HTML files
|
||||
html_files.extend(ROOT_DIR.glob("*.html"))
|
||||
# Template HTML files
|
||||
html_files.extend(TEMPLATES_DIR.glob("*.html"))
|
||||
return html_files
|
||||
|
||||
def find_js_files():
|
||||
"""Find all JavaScript files in the js directory."""
|
||||
js_files = []
|
||||
js_files.extend(JS_DIR.glob("**/*.js"))
|
||||
return js_files
|
||||
|
||||
def extract_ds_i18n_strings(html_files):
|
||||
"""Extract strings from elements with ds-i18n class in HTML files.
|
||||
|
||||
Automatically ignores HTML comments (<!-- ... -->) before extraction.
|
||||
"""
|
||||
strings = {} # Changed to dict to track locations
|
||||
|
||||
# Pattern to match elements with ds-i18n class and extract their content
|
||||
# This handles various HTML structures including multi-line content
|
||||
# Match opening tag with ds-i18n class, then capture content until closing tag
|
||||
pattern = r'<(\w+)[^>]*class="[^"]*ds-i18n[^"]*"[^>]*>(.*?)</\1>'
|
||||
|
||||
for html_file in html_files:
|
||||
try:
|
||||
with open(html_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
lines = content.split('\n')
|
||||
|
||||
# Remove HTML comments before processing
|
||||
# This regex handles both single-line and multi-line comments
|
||||
content = re.sub(r'<!--.*?-->', '', content, flags=re.DOTALL)
|
||||
|
||||
# Find all matches (DOTALL flag allows . to match newlines)
|
||||
matches = re.finditer(pattern, content, re.DOTALL)
|
||||
for match in matches:
|
||||
text = match.group(2)
|
||||
|
||||
# Skip if contains complex nested HTML tags
|
||||
# Allow simple formatting tags like <b>, <i>, <em>, <strong>, <span>
|
||||
if '<' in text and '>' in text:
|
||||
# Check if it contains only simple formatting tags
|
||||
# Remove simple formatting tags temporarily to check for other HTML
|
||||
text_without_simple_tags = re.sub(r'</?(?:b|i|em|strong|span)>', '', text)
|
||||
if '<' in text_without_simple_tags:
|
||||
# Contains other HTML elements (complex content), skip it
|
||||
continue
|
||||
# Otherwise, keep the original text with simple formatting tags
|
||||
|
||||
if text:
|
||||
# Calculate line and column number
|
||||
line_num = content[:match.start()].count('\n') + 1
|
||||
col_num = match.start() - content[:match.start()].rfind('\n')
|
||||
|
||||
# Store location info
|
||||
if text not in strings:
|
||||
strings[text] = []
|
||||
strings[text].append({
|
||||
'file': str(html_file),
|
||||
'line': line_num,
|
||||
'col': col_num
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
print(f"Error reading {html_file}: {e}")
|
||||
|
||||
return strings
|
||||
|
||||
def extract_l_function_strings(js_files):
|
||||
"""Extract strings passed to l() function in JavaScript files.
|
||||
|
||||
Automatically ignores JavaScript comments (// and /* ... */) before extraction.
|
||||
"""
|
||||
strings = {} # Changed to dict to track locations
|
||||
|
||||
# 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*\)'
|
||||
|
||||
for js_file in js_files:
|
||||
try:
|
||||
with open(js_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
|
||||
# Remove JavaScript comments before processing
|
||||
# Remove single-line comments (// ...)
|
||||
content = re.sub(r'//.*?$', '', content, flags=re.MULTILINE)
|
||||
# Remove multi-line comments (/* ... */)
|
||||
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
|
||||
|
||||
# Find all matches
|
||||
matches = re.finditer(pattern, content)
|
||||
for match in matches:
|
||||
text = match.group(1)
|
||||
if text:
|
||||
# Calculate line and column number
|
||||
line_num = content[:match.start()].count('\n') + 1
|
||||
col_num = match.start() - 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}")
|
||||
|
||||
return strings
|
||||
|
||||
def extract_html_strings_from_js(js_files):
|
||||
"""Extract strings from HTML embedded in JavaScript files.
|
||||
|
||||
This function looks for HTML strings in JavaScript that contain elements with ds-i18n class.
|
||||
Automatically ignores JavaScript comments (// and /* ... */) before extraction.
|
||||
"""
|
||||
strings = {} # Dict to track locations
|
||||
|
||||
# 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>'
|
||||
|
||||
for js_file in js_files:
|
||||
try:
|
||||
with open(js_file, 'r', encoding='utf-8') as f:
|
||||
content = f.read()
|
||||
original_content = content # Keep original for line number calculation
|
||||
|
||||
# Remove JavaScript comments before processing
|
||||
# Remove single-line comments (// ...)
|
||||
content = re.sub(r'//.*?$', '', content, flags=re.MULTILINE)
|
||||
# Remove multi-line comments (/* ... */)
|
||||
content = re.sub(r'/\*.*?\*/', '', content, flags=re.DOTALL)
|
||||
|
||||
# Find all matches (DOTALL flag allows . to match newlines)
|
||||
matches = re.finditer(pattern, content, re.DOTALL)
|
||||
for match in matches:
|
||||
text = match.group(2)
|
||||
|
||||
# Skip if contains complex nested HTML tags
|
||||
# Allow simple formatting tags like <b>, <i>, <em>, <strong>, <span>
|
||||
if '<' in text and '>' in text:
|
||||
# Check if it contains only simple formatting tags
|
||||
# Remove simple formatting tags temporarily to check for other HTML
|
||||
text_without_simple_tags = re.sub(r'</?(?:b|i|em|strong|span)>', '', text)
|
||||
if '<' in text_without_simple_tags:
|
||||
# Contains other HTML elements (complex content), skip it
|
||||
continue
|
||||
# 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')
|
||||
|
||||
# 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}")
|
||||
|
||||
return strings
|
||||
|
||||
def load_translation_keys():
|
||||
"""Load all translation keys from language files.
|
||||
|
||||
Returns:
|
||||
tuple: (all_keys, keys_by_language)
|
||||
- all_keys: set of all unique keys across all language files
|
||||
- keys_by_language: dict mapping language code to set of keys in that language
|
||||
"""
|
||||
all_keys = set()
|
||||
keys_by_language = {}
|
||||
|
||||
lang_files = list(LANG_DIR.glob("*.json"))
|
||||
|
||||
if not lang_files:
|
||||
print(f"Warning: No language files found in {LANG_DIR}")
|
||||
return all_keys, keys_by_language
|
||||
|
||||
# Load keys from all language files
|
||||
for lang_file in lang_files:
|
||||
try:
|
||||
# Extract language code from filename (e.g., "en_us" from "en_us.json")
|
||||
lang_code = lang_file.stem
|
||||
|
||||
with open(lang_file, 'r', encoding='utf-8') as f:
|
||||
data = json.load(f)
|
||||
keys = set(data.keys())
|
||||
keys.discard("") # Remove empty string key if present
|
||||
|
||||
keys_by_language[lang_code] = keys
|
||||
all_keys.update(keys)
|
||||
except Exception as e:
|
||||
print(f"Error reading {lang_file}: {e}")
|
||||
|
||||
# Remove empty string key if present
|
||||
all_keys.discard("")
|
||||
|
||||
return all_keys, keys_by_language
|
||||
|
||||
def main():
|
||||
if not JSON_OUTPUT:
|
||||
print("=" * 80)
|
||||
print("Translation String Checker")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
# Find all source files
|
||||
if not JSON_OUTPUT:
|
||||
print("Scanning source files...")
|
||||
html_files = find_html_files()
|
||||
js_files = find_js_files()
|
||||
|
||||
if not JSON_OUTPUT:
|
||||
print(f"Found {len(html_files)} HTML files")
|
||||
print(f"Found {len(js_files)} JavaScript files")
|
||||
print()
|
||||
|
||||
# Extract strings from source files
|
||||
if not JSON_OUTPUT:
|
||||
print("Extracting translation strings from source files...")
|
||||
ds_i18n_strings = extract_ds_i18n_strings(html_files)
|
||||
l_function_strings = extract_l_function_strings(js_files)
|
||||
html_in_js_strings = extract_html_strings_from_js(js_files)
|
||||
|
||||
if not JSON_OUTPUT:
|
||||
print(f"Found {len(ds_i18n_strings)} strings with ds-i18n class in HTML files")
|
||||
print(f"Found {len(l_function_strings)} strings in l() function calls")
|
||||
print(f"Found {len(html_in_js_strings)} strings with ds-i18n class in JavaScript files")
|
||||
print()
|
||||
|
||||
# Combine all used strings and filter out excluded patterns
|
||||
# Merge the three dictionaries, combining location lists for duplicate strings
|
||||
all_used_strings_with_locations = {}
|
||||
for text, locations in ds_i18n_strings.items():
|
||||
all_used_strings_with_locations[text] = locations.copy()
|
||||
for text, locations in l_function_strings.items():
|
||||
if text in all_used_strings_with_locations:
|
||||
all_used_strings_with_locations[text].extend(locations)
|
||||
else:
|
||||
all_used_strings_with_locations[text] = locations.copy()
|
||||
for text, locations in html_in_js_strings.items():
|
||||
if text in all_used_strings_with_locations:
|
||||
all_used_strings_with_locations[text].extend(locations)
|
||||
else:
|
||||
all_used_strings_with_locations[text] = locations.copy()
|
||||
|
||||
excluded_strings = {s for s in all_used_strings_with_locations.keys() if should_exclude_string(s)}
|
||||
used_strings_with_locations = {k: v for k, v in all_used_strings_with_locations.items() if k not in excluded_strings}
|
||||
used_strings = set(used_strings_with_locations.keys())
|
||||
|
||||
if not JSON_OUTPUT and excluded_strings:
|
||||
print(f"Excluded {len(excluded_strings)} non-translatable strings (CSS selectors, etc.)")
|
||||
if VERBOSE:
|
||||
for s in sorted(excluded_strings):
|
||||
print(f" - \"{s}\"")
|
||||
print()
|
||||
|
||||
# Load translation keys
|
||||
if not JSON_OUTPUT:
|
||||
print("Loading translation keys from language files...")
|
||||
translation_keys, keys_by_language = load_translation_keys()
|
||||
if not JSON_OUTPUT:
|
||||
print(f"Found {len(translation_keys)} keys in translation files")
|
||||
print(f"Found {len(keys_by_language)} language files")
|
||||
print()
|
||||
|
||||
# Remove special keys from comparison
|
||||
translation_keys_for_comparison = translation_keys - SPECIAL_KEYS
|
||||
|
||||
# Remove special keys from each language's key set
|
||||
keys_by_language_filtered = {}
|
||||
for lang_code, keys in keys_by_language.items():
|
||||
keys_by_language_filtered[lang_code] = keys - SPECIAL_KEYS
|
||||
|
||||
# Find missing translations (used in code but not in translation files)
|
||||
missing_translations = used_strings - translation_keys_for_comparison
|
||||
|
||||
# For each missing translation, find which languages are missing it
|
||||
missing_by_language = {}
|
||||
for string in missing_translations:
|
||||
missing_langs = []
|
||||
for lang_code, keys in keys_by_language_filtered.items():
|
||||
if string not in keys:
|
||||
missing_langs.append(lang_code)
|
||||
missing_by_language[string] = sorted(missing_langs)
|
||||
|
||||
# Find unused translations (in translation files but not used in code)
|
||||
# Exclude whitelisted strings from unused check
|
||||
unused_translations = (translation_keys_for_comparison - used_strings) - WHITELIST_UNUSED
|
||||
|
||||
# Output results
|
||||
if JSON_OUTPUT:
|
||||
# Build missing translations with locations and missing languages
|
||||
missing_with_locations = []
|
||||
for string in sorted(missing_translations):
|
||||
entry = {
|
||||
"string": string,
|
||||
"missing_from_languages": missing_by_language.get(string, [])
|
||||
}
|
||||
if string in used_strings_with_locations:
|
||||
entry["locations"] = used_strings_with_locations[string]
|
||||
missing_with_locations.append(entry)
|
||||
|
||||
result = {
|
||||
"summary": {
|
||||
"total_strings_used": len(used_strings),
|
||||
"total_translation_keys": len(translation_keys_for_comparison),
|
||||
"total_languages": len(keys_by_language),
|
||||
"missing_count": len(missing_translations),
|
||||
"unused_count": len(unused_translations),
|
||||
"excluded_count": len(excluded_strings),
|
||||
"whitelisted_count": len(WHITELIST_UNUSED)
|
||||
},
|
||||
"missing_translations": missing_with_locations,
|
||||
"unused_translations": sorted(unused_translations),
|
||||
"excluded_strings": sorted(excluded_strings),
|
||||
"whitelisted_strings": sorted(WHITELIST_UNUSED)
|
||||
}
|
||||
print(json.dumps(result, indent=2, ensure_ascii=False))
|
||||
return 1 if (missing_translations or unused_translations) else 0
|
||||
|
||||
# Print results (text format)
|
||||
print("=" * 80)
|
||||
print("RESULTS")
|
||||
print("=" * 80)
|
||||
print()
|
||||
|
||||
if missing_translations:
|
||||
print(f"⚠️ MISSING TRANSLATIONS ({len(missing_translations)} strings)")
|
||||
print("These strings are used in code but not found in translation files:")
|
||||
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:
|
||||
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:
|
||||
missing_langs = missing_by_language[string]
|
||||
if len(missing_langs) == len(keys_by_language):
|
||||
print(f" Missing from: ALL languages ({len(missing_langs)})")
|
||||
else:
|
||||
# Show first few languages, then count
|
||||
if len(missing_langs) <= 5:
|
||||
print(f" Missing from: {', '.join(missing_langs)}")
|
||||
else:
|
||||
print(f" Missing from: {', '.join(missing_langs[:5])} (and {len(missing_langs) - 5} more)")
|
||||
print()
|
||||
else:
|
||||
print("✅ No missing translations found!")
|
||||
print()
|
||||
|
||||
if unused_translations:
|
||||
print(f"ℹ️ UNUSED TRANSLATIONS ({len(unused_translations)} strings)")
|
||||
print("These strings are in translation files but not used in code:")
|
||||
print("-" * 80)
|
||||
for string in sorted(unused_translations):
|
||||
print(f" - \"{string}\"")
|
||||
print()
|
||||
else:
|
||||
print("✅ No unused translations found!")
|
||||
print()
|
||||
|
||||
# Summary
|
||||
print("=" * 80)
|
||||
print("SUMMARY")
|
||||
print("=" * 80)
|
||||
print(f"Total strings used in code: {len(used_strings)}")
|
||||
print(f"Total keys in translation files: {len(translation_keys_for_comparison)}")
|
||||
print(f"Missing translations: {len(missing_translations)}")
|
||||
print(f"Unused translations: {len(unused_translations)}")
|
||||
print(f"Whitelisted strings: {len(WHITELIST_UNUSED)}")
|
||||
print()
|
||||
|
||||
if missing_translations or unused_translations:
|
||||
print("⚠️ Translation files need updates!")
|
||||
return 1
|
||||
else:
|
||||
print("✅ All translations are in sync!")
|
||||
return 0
|
||||
|
||||
if __name__ == "__main__":
|
||||
exit(main())
|
||||
174
scripts/forget_bluetooth.py
Executable file
@@ -0,0 +1,174 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
# (C) 2025 dualshock-tools
|
||||
#
|
||||
# This script lists paired Bluetooth devices on macOS and allows you to
|
||||
# select which ones to forget (unpair).
|
||||
#
|
||||
# Usage: python3 scripts/forget_bluetooth.py
|
||||
#
|
||||
# Requirements: macOS with blueutil installed
|
||||
# Install blueutil: brew install blueutil
|
||||
|
||||
import subprocess
|
||||
import sys
|
||||
import re
|
||||
|
||||
def check_blueutil():
|
||||
"""Check if blueutil is installed."""
|
||||
try:
|
||||
subprocess.run(['blueutil', '--version'], capture_output=True, check=True)
|
||||
return True
|
||||
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||
return False
|
||||
|
||||
def get_paired_devices():
|
||||
"""Get list of paired Bluetooth devices."""
|
||||
try:
|
||||
result = subprocess.run(
|
||||
['blueutil', '--paired'],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
return result.stdout
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error getting paired devices: {e}")
|
||||
return None
|
||||
|
||||
def parse_devices(output):
|
||||
"""Parse blueutil output into a list of devices."""
|
||||
devices = []
|
||||
# Pattern: address: xx-xx-xx-xx-xx-xx, name: "Device Name", ...
|
||||
pattern = r'address: ([0-9a-f-]+).*?name: "([^"]*)"'
|
||||
matches = re.finditer(pattern, output, re.IGNORECASE | re.DOTALL)
|
||||
|
||||
for match in matches:
|
||||
address = match.group(1)
|
||||
name = match.group(2)
|
||||
devices.append({
|
||||
'address': address,
|
||||
'name': name
|
||||
})
|
||||
|
||||
return devices
|
||||
|
||||
def forget_device(address):
|
||||
"""Forget (unpair) a Bluetooth device by its address."""
|
||||
try:
|
||||
subprocess.run(
|
||||
['blueutil', '--unpair', address],
|
||||
capture_output=True,
|
||||
text=True,
|
||||
check=True
|
||||
)
|
||||
return True
|
||||
except subprocess.CalledProcessError as e:
|
||||
print(f"Error forgetting device {address}: {e}")
|
||||
return False
|
||||
|
||||
def main():
|
||||
print("=" * 60)
|
||||
print("Bluetooth Controller Manager for macOS")
|
||||
print("=" * 60)
|
||||
print()
|
||||
|
||||
# Check if blueutil is installed
|
||||
if not check_blueutil():
|
||||
print("ERROR: blueutil is not installed.")
|
||||
print()
|
||||
print("Please install it using Homebrew:")
|
||||
print(" brew install blueutil")
|
||||
print()
|
||||
print("If you don't have Homebrew, install it from:")
|
||||
print(" https://brew.sh")
|
||||
sys.exit(1)
|
||||
|
||||
# Get paired devices
|
||||
print("Fetching paired Bluetooth controllers...")
|
||||
output = get_paired_devices()
|
||||
|
||||
if output is None:
|
||||
print("Failed to get paired devices.")
|
||||
sys.exit(1)
|
||||
|
||||
devices = parse_devices(output)
|
||||
|
||||
if not devices:
|
||||
print("No paired Bluetooth devices found.")
|
||||
sys.exit(0)
|
||||
|
||||
# Filter devices to only show controllers
|
||||
devices = [d for d in devices if 'controller' in d['name'].lower()]
|
||||
|
||||
if not devices:
|
||||
print("No paired Bluetooth controllers found.")
|
||||
sys.exit(0)
|
||||
|
||||
# Display devices
|
||||
print(f"\nFound {len(devices)} paired device(s):\n")
|
||||
for idx, device in enumerate(devices, 1):
|
||||
print(f" {idx}. {device['name']}")
|
||||
print(f" Address: {device['address']}")
|
||||
print()
|
||||
|
||||
# Ask user which devices to forget
|
||||
print("=" * 60)
|
||||
print("Enter the numbers of devices to forget (comma-separated),")
|
||||
print("or 'all' to forget all devices, or 'q' to quit:")
|
||||
print("=" * 60)
|
||||
|
||||
user_input = input("> ").strip().lower()
|
||||
|
||||
if user_input == 'q':
|
||||
print("Cancelled.")
|
||||
sys.exit(0)
|
||||
|
||||
# Parse selection
|
||||
selected_indices = []
|
||||
if user_input == 'all':
|
||||
selected_indices = list(range(len(devices)))
|
||||
else:
|
||||
try:
|
||||
parts = [p.strip() for p in user_input.split(',')]
|
||||
for part in parts:
|
||||
idx = int(part) - 1
|
||||
if 0 <= idx < len(devices):
|
||||
selected_indices.append(idx)
|
||||
else:
|
||||
print(f"Warning: Invalid number {part}, skipping.")
|
||||
except ValueError:
|
||||
print("Invalid input. Please enter numbers separated by commas.")
|
||||
sys.exit(1)
|
||||
|
||||
if not selected_indices:
|
||||
print("No devices selected.")
|
||||
sys.exit(0)
|
||||
|
||||
# Confirm
|
||||
print("\nDevices to forget:")
|
||||
for idx in selected_indices:
|
||||
device = devices[idx]
|
||||
print(f" - {device['name']} ({device['address']})")
|
||||
|
||||
confirm = input("\nAre you sure? (yes/no): ").strip().lower()
|
||||
if confirm not in ['yes', 'y']:
|
||||
print("Cancelled.")
|
||||
sys.exit(0)
|
||||
|
||||
# Forget devices
|
||||
print("\nForgetting devices...")
|
||||
success_count = 0
|
||||
for idx in selected_indices:
|
||||
device = devices[idx]
|
||||
print(f" Forgetting {device['name']}...", end=' ')
|
||||
if forget_device(device['address']):
|
||||
print("✓ Done")
|
||||
success_count += 1
|
||||
else:
|
||||
print("✗ Failed")
|
||||
|
||||
print(f"\nSuccessfully forgot {success_count} of {len(selected_indices)} device(s).")
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
@@ -39,7 +39,8 @@ def process_file(filename):
|
||||
x[i] = ""
|
||||
modified = True
|
||||
|
||||
del x[""]
|
||||
if "" in x:
|
||||
del x[""]
|
||||
empties = []
|
||||
for i in x:
|
||||
if len(x[i].strip()) == 0:
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!-- Modal -->
|
||||
<div class="modal fade" id="calibrateModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
|
||||
<div class="modal fade" id="autoCalibCenterModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="staticBackdropLabel" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
@@ -9,7 +9,7 @@
|
||||
<p class="ds-i18n">Recentering the controller sticks.</p>
|
||||
<p class="ds-i18n">Please do not close this window and do not disconnect your controller. </p>
|
||||
<div class="progress" role="progressbar" aria-label="Centering" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100">
|
||||
<div class="progress-bar" style="width: 0%"></div>
|
||||
<div id="calib-center-progress" class="progress-bar" style="width: 0%"></div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
@@ -23,9 +23,9 @@
|
||||
<div class="container" id="list-1">
|
||||
<h4 class="ds-i18n">Welcome to the stick center-calibration wizard!</h4>
|
||||
|
||||
<p class="ds-i18n">This tool will guide you in re-centering the analog sticks of your controller. It consists in four steps: you will be asked to move both sticks in a direction and release them.</p>
|
||||
<p class="ds-i18n">This tool will guide you in re-centering the analog sticks of your controller. It consists of four steps: you will be asked to move both sticks in a direction and release them.</p>
|
||||
|
||||
<p class="ds-i18n">Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until is completed.</p>
|
||||
<p class="ds-i18n">Please be aware that, <i>once the calibration is running, it cannot be canceled</i>. Do not close this page or disconnect your controller until it is completed.</p>
|
||||
|
||||
<p class="ds-i18n">Press <b>Start</b> to begin calibration.</p>
|
||||
</div>
|
||||
@@ -55,6 +55,9 @@
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-outline-secondary" id="quickCalibBtn" onclick="quick_calibrate_instead()">
|
||||
<i class="fas fa-bolt"></i> <span class="ds-i18n">Quick calibrate</span>
|
||||
</button>
|
||||
<button type="button" class="btn btn-primary" id="calibNext" onclick="calib_next()">
|
||||
<span class="spinner-border spinner-border-sm" role="status" aria-hidden="true" id="btnSpinner" style="display: none;"></span>
|
||||
<span id="calibNextText" class="ds-i18n">Next</span>
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<div class="collapse" id="ethereumCollapse">
|
||||
<div class="card card-body">
|
||||
<h5 class="card-title">Ethereum Address</h5>
|
||||
<center><img src="donate.png" width="128px" /></center>
|
||||
<center><img src="assets/donate.png" width="128px" /></center>
|
||||
<input type="text" class="form-control" value="0x27dDA2f15A6A477fcdFB3709Ed0760aEF0246D5D" readonly />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -21,13 +21,17 @@
|
||||
</p>
|
||||
|
||||
<p><b><span class="ds-i18n">This is only for advanced users. If you're not sure what you're doing, please do not attempt it.</span></b></p>
|
||||
<p><span class="ds-i18n">More details and images</span> <a href="https://github.com/lewy20041/Dualsense_Edge_Modules_Callibration">here</a>.</p>
|
||||
<p><span class="ds-i18n">More details and images</span> <a href="https://github.com/lewy20041/Dualsense_Edge_Modules_Callibration" class="ds-i18n">here</a>.</p>
|
||||
|
||||
<p class="ds-i18n">We are not responsible for any damage caused by attempting this modification.</p>
|
||||
<p class="ds-i18n">For more info or help, feel free to reach out on Discord.</p>
|
||||
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="form-check me-auto">
|
||||
<input class="form-check-input" type="checkbox" id="edgeModalDontShowAgain">
|
||||
<label class="form-check-label ds-i18n" for="edgeModalDontShowAgain">Don't show again</label>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary ds-i18n" data-bs-dismiss="modal">Understood</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -40,13 +40,13 @@
|
||||
</div>
|
||||
<div class="accordion-item">
|
||||
<h2 class="accordion-header">
|
||||
<button class="ds-i18n accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse4" aria-expanded="false" aria-controls="flush-collapse4">Does this website detects if a controller is a clone?</button>
|
||||
<button class="ds-i18n accordion-button collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#flush-collapse4" aria-expanded="false" aria-controls="flush-collapse4">Does this website detect if a controller is a clone?</button>
|
||||
</h2>
|
||||
<div id="flush-collapse4" class="accordion-collapse collapse" data-bs-parent="#accordionFlushExample">
|
||||
<div class="accordion-body">
|
||||
<p class="ds-i18n">Yes, only DualShock4 at the moment. This happened because I accidentally purchased some clones, spent time identifying the differences and added this functionality to prevent future deception.</p>
|
||||
|
||||
<p class="ds-i18n">Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during a normal gameplay, not all the undocumented functionalities.</p>
|
||||
<p class="ds-i18n">Unfortunately, the clones cannot be calibrated anyway, because they only clone the behavior of a DualShock4 during normal gameplay, not all the undocumented functionalities.</p>
|
||||
|
||||
<p class="ds-i18n">If you want to extend this detection functionality to DualSense, please ship me a fake DualSense and you'll see it in few weeks.</p>
|
||||
</div>
|
||||
|
||||
@@ -6,8 +6,6 @@
|
||||
<button type="button" class="btn-close" aria-label="Close" onclick="finetune_cancel()"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="ds-i18n">This screen allows to finetune raw calibration data on your controller</p>
|
||||
|
||||
<div class="modal-header border-top-0 pt-0">
|
||||
<div class="btn-group w-100" role="group" aria-label="Finetune mode selection">
|
||||
<input type="radio" class="btn-check" name="finetuneMode" id="finetuneModeCenter" autocomplete="off" checked>
|
||||
@@ -31,8 +29,20 @@
|
||||
<span class="ds-i18n">Press the D-pad or face buttons in the direction you want the stick position to move.</span>
|
||||
</div>
|
||||
<div class="alert alert-info finetune-circularity-mode" role="alert">
|
||||
<i class="fas fa-info-circle"></i>
|
||||
<span class="ds-i18n">While holding the stick to be adjusted straight up/down/left/right, <em>observe the highlighted value below the circle</em>, then use the D-pad buttons to adjust the value to ±0.99 (just below ±1.00).</span>
|
||||
<p>
|
||||
<i class="fas fa-info-circle"></i>
|
||||
<span class="ds-i18n">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</span>
|
||||
<svg width="24" height="24" style="vertical-align: -6px;"><use xlink:href="#arrows-alt"/></svg>
|
||||
<span class="ds-i18n">to increase the non-circularity.</span>
|
||||
</p>
|
||||
<p class="mb-0">
|
||||
<i class="fas fa-hand-point-up"></i>
|
||||
<span class="ds-i18n"><strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.</span>
|
||||
<a class="btn-link text-decoration-none ds-i18n" href="#" id="learn-more-link">Learn more...</a>
|
||||
</p>
|
||||
<p class="mb-0" id="learn-more-text" style="display: none;">
|
||||
<span class="ds-i18n">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.</span>
|
||||
</p>
|
||||
</div>
|
||||
<div class="alert alert-warning finetune-circularity-mode" role="alert" id="finetuneCircularityWarning">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
@@ -47,9 +57,17 @@
|
||||
<div class="row">
|
||||
<div class="col col-lg-6 col-12">
|
||||
|
||||
<div class="card text-bg-light" id="left-stick-card" style="height: 340px;">
|
||||
<div class="card-header"><span class="ds-i18n">Left stick</span></div>
|
||||
<div class="card-body">
|
||||
<div class="card text-bg-light" id="left-stick-card" style="height: 350px;">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<span class="ds-i18n">Left stick</span>
|
||||
</div>
|
||||
<div class="card-body position-relative">
|
||||
<button type="button" class="btn btn-secondary position-absolute top-0 end-0 finetune-circularity-mode" id="leftErrorSlackBtn" style="z-index: 10; margin: 0.5rem;">
|
||||
<svg class="bi" width="32" height="32" style="margin: -15px -8px -12px -8px;"><use xlink:href="#arrows-alt"/></svg>
|
||||
</button>
|
||||
<button type="button" class="btn btn-warning position-absolute top-0 end-0 finetune-circularity-mode d-none" id="leftErrorSlackUndoBtn" style="z-index: 10; margin: 0.5rem;">
|
||||
<i class="fas fa-undo"></i>
|
||||
</button>
|
||||
<div class="container-fluid">
|
||||
<div class="finetune-grid">
|
||||
<div class="finetune-top finetune-center-mode">
|
||||
@@ -77,7 +95,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-2">
|
||||
<!-- LX/LY values display -->
|
||||
<div class="px-2 left-stick-values">
|
||||
<div class="spacer finetune-center-mode hide-raw-numbers" style="height: 35px;"> </div>
|
||||
|
||||
<div class="hstack">
|
||||
<div class="vstack" style="text-align: center;">
|
||||
<span>LX:</span>
|
||||
@@ -91,14 +112,28 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Circularity slider for left stick -->
|
||||
<div class="px-2 mt-2 finetune-circularity-mode left-stick-slider" style="display: none;">
|
||||
<label for="leftCircularitySlider" class="form-label ds-i18n" style="margin-bottom: 2px;">Increase non-circularity</label>
|
||||
<input type="range" class="form-range" min="0" max="100" value="0" id="leftCircularitySlider">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- col -->
|
||||
|
||||
<div class="col col-lg-6 col-12">
|
||||
<div class="card text-bg-light" id="right-stick-card" style="height: 340px;">
|
||||
<div class="card-header"><span class="ds-i18n">Right stick</span></div>
|
||||
<div class="card-body">
|
||||
<div class="card text-bg-light" id="right-stick-card" style="height: 350px;">
|
||||
<div class="card-header d-flex justify-content-between align-items-center">
|
||||
<span class="ds-i18n">Right stick</span>
|
||||
</div>
|
||||
<div class="card-body position-relative">
|
||||
<button type="button" class="btn btn-secondary position-absolute top-0 end-0 finetune-circularity-mode" id="rightErrorSlackBtn" style="z-index: 10; margin: 0.5rem;">
|
||||
<svg class="bi" width="32" height="32" style="margin: -15px -8px -12px -8px;"><use xlink:href="#arrows-alt"/></svg>
|
||||
</button>
|
||||
<button type="button" class="btn btn-warning position-absolute top-0 end-0 finetune-circularity-mode d-none" id="rightErrorSlackUndoBtn" style="z-index: 10; margin: 0.5rem;">
|
||||
<i class="fas fa-undo"></i>
|
||||
</button>
|
||||
<div class="container-fluid">
|
||||
<div class="finetune-grid">
|
||||
<div class="finetune-top finetune-center-mode">
|
||||
@@ -125,7 +160,10 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-2">
|
||||
<!-- RX/RY values display -->
|
||||
<div class="px-2 right-stick-values">
|
||||
<div class="spacer finetune-center-mode hide-raw-numbers" style="height: 35px;"> </div>
|
||||
|
||||
<div class="hstack">
|
||||
<div class="vstack" style="text-align: center;">
|
||||
<span>RX:</span>
|
||||
@@ -139,6 +177,12 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Circularity slider for right stick -->
|
||||
<div class="px-2 mt-2 finetune-circularity-mode right-stick-slider" style="display: none;">
|
||||
<label for="rightCircularitySlider" class="form-label ds-i18n" style="margin-bottom: 2px;">Increase non-circularity</label>
|
||||
<input type="range" class="form-range" min="0" max="100" value="0" id="rightCircularitySlider">
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div> <!-- col -->
|
||||
@@ -175,6 +219,19 @@
|
||||
<li><a class="dropdown-item" href="#" data-step="1">1</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="dropdown me-2">
|
||||
<button class="btn btn-outline-secondary dropdown-toggle" type="button" id="quickCalibrateDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fas fa-bolt"></i> <span class="ds-i18n">Quick calibrate</span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" aria-labelledby="quickCalibrateDropdown">
|
||||
<li><a class="dropdown-item" href="#" onclick="finetune_quick_calibrate_center()">
|
||||
<i class="fas fa-crosshairs"></i> <span class="ds-i18n">Center</span>
|
||||
</a></li>
|
||||
<li><a class="dropdown-item" href="#" onclick="finetune_quick_calibrate_range()">
|
||||
<i class="fas fa-expand-arrows-alt"></i> <span class="ds-i18n">Circularity</span>
|
||||
</a></li>
|
||||
</ul>
|
||||
</div>
|
||||
<button type="button" class="btn btn-secondary ds-i18n" onclick="finetune_cancel()">Cancel</button>
|
||||
<button type="button" class="btn btn-primary ds-i18n" onclick="finetune_save()">Done</button>
|
||||
</div>
|
||||
|
||||
38
templates/quick-test-modal.html
Normal file
@@ -0,0 +1,38 @@
|
||||
<!-- Quick Test Modal -->
|
||||
<div class="modal fade" id="quickTestModal" data-bs-backdrop="static" data-bs-keyboard="false" tabindex="-1" aria-labelledby="quickTestModalLabel" aria-hidden="true">
|
||||
<div class="modal-dialog modal-lg modal-dialog-centered">
|
||||
<div class="modal-content">
|
||||
<div class="modal-header">
|
||||
<h1 class="modal-title fs-5 ds-i18n" id="quickTestModalLabel">Quick Test</h1>
|
||||
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="ds-i18n mb-3">Run through these tests to verify your controller's functionality.</p>
|
||||
<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>
|
||||
</div>
|
||||
|
||||
<div class="accordion" id="quickTestAccordion">
|
||||
<!-- Accordion items will be dynamically generated -->
|
||||
</div>
|
||||
|
||||
<div class="mt-4">
|
||||
<h6><span class="ds-i18n">Test Summary</span>:</h6>
|
||||
<div id="test-summary" class="text-muted ds-i18n">No tests completed yet.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<div class="dropdown" id="skipped-tests-dropdown" style="display: none;">
|
||||
<button class="btn btn-outline-primary dropdown-toggle" type="button" id="skippedTestsDropdown" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fas fa-list me-1"></i><span class="ds-i18n">Add test</span>
|
||||
</button>
|
||||
<ul class="dropdown-menu" aria-labelledby="skippedTestsDropdown" id="skipped-tests-list">
|
||||
<!-- Skipped tests will be populated here -->
|
||||
</ul>
|
||||
</div>
|
||||
<button type="button" class="btn btn-primary ds-i18n" data-bs-dismiss="modal">Close</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -7,10 +7,26 @@
|
||||
</div>
|
||||
<div class="modal-body">
|
||||
<p class="ds-i18n"><b>The controller is now sampling data!</b></p>
|
||||
<p class="ds-i18n">Rotate the sticks slowly to cover the whole range. Press "Done" when completed.</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 id="range-progress-bar" class="progress-bar" style="width:0%"></div>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<small class="text-muted">
|
||||
<span class="ds-i18n">Progress</span>: <span id="range-progress-text">0%</span>
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-info mt-3" id="range-calibration-alert" role="alert">
|
||||
<span id="keep-rotating-alert" ><i class="fas fa-info-circle"></i>
|
||||
<small class="ds-i18n">Keep rotating the sticks even if you see no progress!</small>
|
||||
</span>
|
||||
<br><br>
|
||||
<small class="ds-i18n">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.</small>
|
||||
</div>
|
||||
</div>
|
||||
<div class="modal-footer">
|
||||
<button type="button" class="btn btn-primary ds-i18n" onclick="calibrate_range_on_close()">Done</button>
|
||||
<button type="button" id="range-done-btn" class="btn btn-outline-primary ds-i18n" onclick="calibrate_range_on_close()">Done</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||