Compare commits

..

38 Commits

Author SHA1 Message Date
dualshock-tools
2e6797be60 Remove editor directories and update .gitignore 2025-12-21 11:22:13 +01:00
dualshock-tools
3f3f56ed4f Revert gulp-deploy.yml change 2025-12-21 11:17:58 +01:00
Mathias Malmqvist
e056c497ab Update translations and fix related issues 2025-12-21 11:04:38 +01:00
Mathias Malmqvist
576da9e224 Fix regression 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
1f445b0d3c Fixup 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
7ccdd28e0d Raise the threashold before showing failed calibration modal 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
7fa2ca4e37 Open Quick Test when pressing L1 + Options on the controller 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
b4748f856e Tidy 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
bb5478d7fd Adapt range modal to single-stick devices 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
2855be1a88 Update the beta number 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
90ae4be5fb Refactor the code reading and writing local storage 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
6f466c5639 Show a warning on the Connect screen if the changes were not saved 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
2c6e18f5b9 Show info about the last connected controller at the bottom of the Connect screen 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
ee7e8f8252 Limit the number of times the range-calibration-failed modal will be shown 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
dbe3498c0a Update beta number 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
d0d95040c0 Show LX, LY, RX, RY in the range calibration modal 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
2e46e62951 Remove the numbers from the calibration buttons 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
6f2663444e Show a info-icon and modal when average circularity error is below 5% 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
12c9ab9d80 Refactor the Calibration History modal 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
ff7d7bb3e6 On connecting to a controller, show a message if the last calibration change was not saved 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
5c271f0cd4 Reset the trackpad size when switching between controller types 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
2d02b6dd74 Collect DS4 Bluetooth addresses for analysis and clone detection 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
95293f2b04 Add icon linking to version history page 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
13342cb42c Press L2 or R2 in finetune modal to binary-search for circularity values 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
500af8d4c3 Add option to restore previous calibration settings for DS5 and Edge 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
757069340c Add stick dials to the range calibration modal 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
2143e7a329 Add Repeat-button to the Haptic test 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
24121d6d4c Add Expert Mode option for the range calibration modal 2025-12-21 10:58:55 +01:00
Mathias Malmqvist
0cd01c9f01 Remove the outdated reference to gamepad tester site 2025-12-21 10:58:53 +01:00
Mathias Malmqvist
130b4a76a9 Add option for which center calibration method to use on DS5 and Edge controllers 2025-12-21 10:56:09 +01:00
Mathias Malmqvist
3d2f4cfcd8 Improve the unsupported browser warning and clarofy that this utility cannot fix drift 2025-12-21 10:53:59 +01:00
Mathias Malmqvist
500ebd7fb7 Allow finetuning with the keyboard arrows 2025-12-21 10:49:22 +01:00
Mathias Malmqvist
3ab97fb10f Be smarter when resetting circularity data in finetune modal 2025-12-21 10:49:22 +01:00
Mathias Malmqvist
bc7a8942b0 Show not-genuin-sony-controller message also for DS5 when calibration can't be started 2025-12-21 10:49:22 +01:00
Mathias Malmqvist
935b9be7ee Show power-saving warning in Quick Test modal when battery is low 2025-12-21 10:49:20 +01:00
Mathias Malmqvist
fc2f250739 Make sure the range calibration modal is destroyed when pulling the cable out 2025-12-21 10:45:35 +01:00
Mathias Malmqvist
5410239dfb Update GitHub action to allow manual deployment from any branch 2025-12-21 10:45:35 +01:00
Mathias Malmqvist
6426dafb6d Allow manual deployment from any branch, take 2 2025-12-21 10:45:35 +01:00
51 changed files with 3580 additions and 714 deletions

5
.gitignore vendored
View File

@@ -55,4 +55,7 @@ jspm_packages/
.yarn-integrity
# dotenv environment variables file
.env
.env
.zencoder/
*.code-workspace

874
CONTROLLER_API_REFERENCE.md Normal file
View File

@@ -0,0 +1,874 @@
# DualSense Controller API Reference
This document describes the data structures, constants, and API calls used to interact with PlayStation controllers (DualSense, DualSense Edge, and DualShock 4) in the DualSense Tester application.
## Table of Contents
1. [Controller Types and Identification](#controller-types-and-identification)
2. [Connection Types](#connection-types)
3. [Data Structures](#data-structures)
4. [Input Report Offsets](#input-report-offsets)
5. [API Functions](#api-functions)
6. [Constants and Enums](#constants-and-enums)
7. [Controller-Specific Differences](#controller-specific-differences)
8. [Communication Protocols](#communication-protocols)
9. [Output Commands and Control](#output-commands-and-control)
## Controller Types and Identification
### Vendor and Product IDs
```typescript
export const VENDOR_ID_SONY = 0x054C
// Product IDs
export const PRODUCT_ID_DUALSHOCK_V1 = 0x05C4
export const PRODUCT_ID_DUALSHOCK_V2 = 0x09CC
export const PRODUCT_ID_DUALSENSE = 0x0CE6
export const PRODUCT_ID_DUALSENSE_EDGE = 0x0DF2
// HID Usage
export const USAGE_PAGE_GENERIC_DESKTOP = 0x0001
export const USAGE_ID_GD_GAME_PAD = 0x0005
```
### Controller Type Enum
```typescript
export enum DualSenseType {
DualSense = 'DualSense',
DualSenseEdge = 'DualSenseEdge',
Unknown = 'Unknown',
}
```
## Connection Types
```typescript
export enum DualSenseConnectionType {
Unknown = 'unknown',
/** The controller is connected over USB */
USB = 'usb',
/** The controller is connected over Bluetooth */
Bluetooth = 'bluetooth',
}
export enum DeviceConnectionType {
USB = 'usb',
Bluetooth = 'bluetooth',
Unknown = 'unknown',
}
```
### Connection Type Detection
Controllers are identified by their input report sizes:
- **DualSense/DualSense Edge USB**: 504 bits (63 bytes)
- **DualSense/DualSense Edge Bluetooth**: 616 bits (77 bytes)
- **DualShock 4 USB**: 504 bits (63 bytes)
- **DualShock 4 Bluetooth**: Variable (uses different detection logic)
## Data Structures
### Device Information
```typescript
export interface DeviceItem {
deviceName: string
connectionType: DeviceConnectionType
device: HIDDevice
}
export interface DualSenseDeviceInfo {
deviceName: string
vendorId: number
productId: number
atSerialNoLeft: string
atSerialNoRight: string
atMotorInfoLeft: string
atMotorInfoRight: string
}
```
### Firmware Information
```typescript
export interface DualSenseFirmwareInfo {
buildDate: string
buildTime: string
fwType: number
swSeries: number
hwInfo: number
mainFwVersion: number
deviceInfo: DataView // 12 bytes
updateVersion: number
updateImageInfo: DataView // 1 byte
sblFwVersion: number
dspFwVersion: number
spiderDspFwVersion: number
pcbaId: bigint
pcbaIdFull: DataView // 24 bytes
uniqueId: bigint
bdMacAddress: bigint
btPatchVersion: number
serialNumber: DataView // 32 bytes
assemblePartsInfo: DataView // 32 bytes
batteryBarcode: DataView // 32 bytes
vcmRightBarcode: DataView // 32 bytes
vcmLeftBarcode: DataView // 32 bytes
individualDataVerifyStatus: string
}
```
### Input Data Structure
```typescript
export interface DualSenseVisualResult {
// Digital buttons
triangle: boolean
circle: boolean
square: boolean
cross: boolean
r3: boolean
l3: boolean
option: boolean
create: boolean
r2: boolean
l2: boolean
r1: boolean
l1: boolean
mic: boolean
touchpad: boolean
ps: boolean
up: boolean
right: boolean
down: boolean
left: boolean
fnR: boolean // DualSense Edge only
fnL: boolean // DualSense Edge only
bR: boolean // DualSense Edge only
bL: boolean // DualSense Edge only
// Analog inputs
triggerLevelL: number
triggerLevelR: number
triggerL: number
triggerR: number
stickLX: number
stickLY: number
stickRX: number
stickRY: number
// Motion sensors
gyroPitch: number
gyroYaw: number
gyroRoll: number
accelX: number
accelY: number
accelZ: number
// Touchpad
touchpadID1: number
touchpadX1: number
touchpadY1: number
touchpadID2: number
touchpadX2: number
touchpadY2: number
}
export interface TouchPadItem {
id: number
x: number
y: number
}
```
## Input Report Offsets
### DualSense/DualSense Edge
```typescript
// USB Connection (offset starts at 0)
export const inputReportOffsetUSB = {
analogStickLX: 0,
analogStickLY: 1,
analogStickRX: 2,
analogStickRY: 3,
analogTriggerL: 4,
analogTriggerR: 5,
sequenceNum: 6,
digitalKeys: 7,
incrementalNumber: 11,
gyroPitch: 15,
gyroYaw: 17,
gyroRoll: 19,
accelX: 21,
accelY: 23,
accelZ: 25,
motionTimeStamp: 27,
motionTemperature: 31,
touchData: 32,
atStatus0: 41,
atStatus1: 42,
hostTimestamp: 43,
atStatus2: 47,
deviceTimestamp: 48,
status0: 52,
status1: 53,
status2: 54,
aesCmac: 55,
seqTag: 0,
crc32: 0,
}
// Bluetooth Connection (offset starts at 1, crc32 at 73)
export const inputReportOffsetBluetooth = {
// All offsets +1 from USB
crc32: 73,
// ... other fields offset by +1
}
```
### DualShock 4
```typescript
// USB Connection
export const inputReportOffsetUSB = {
analogStickLX: 0,
analogStickLY: 1,
analogStickRX: 2,
analogStickRY: 3,
digitalKeys: 4,
sequenceNum: 6,
analogTriggerL: 7,
analogTriggerR: 8,
motionTimeStamp: 9,
motionTemperature: 11,
gyroPitch: 12,
gyroYaw: 14,
gyroRoll: 16,
accelX: 18,
accelY: 20,
accelZ: 22,
reserved2: 24,
status: 29,
reserved3: 31,
touchData: 34,
seqTag: 0,
crc32: 0,
}
// Bluetooth Connection (offset starts at 2, crc32 at 73)
export const inputReportOffsetBluetooth = {
// All offsets +2 from USB
crc32: 73,
// ... other fields offset by +2
}
```
## API Functions
### Connection and Communication
```typescript
// Request HID device access
async function requestHIDDevice(filters: HIDDeviceFilter[]): Promise<boolean>
// Send output reports
function sendOutputReportFactory(item: DeviceItem): (data: ArrayBuffer) => Promise<void>
// Send/receive feature reports
async function sendFeatureReport(item: DeviceItem, reportId: number, data: ArrayBuffer): Promise<void>
async function receiveFeatureReport(item: DeviceItem, reportId: number): Promise<DataView>
```
### DualSense-Specific Test Commands
```typescript
// Send test commands to DualSense controllers
async function sendTestCommand(
item: DeviceItem,
deviceId: DualSenseTestDeviceId,
actionId: DualSenseTestActionId,
resultLength: number
): Promise<{ result: TestResult, report: DataView } | { result: TestResult, report: null }>
// Get device information
async function getPcbaId(item: DeviceItem): Promise<bigint | undefined>
async function getUniqueId(item: DeviceItem): Promise<bigint | undefined>
async function getBdMacAddress(item: DeviceItem): Promise<bigint | undefined>
async function getSerialNumber(item: DeviceItem): Promise<DataView | undefined>
async function getBatteryBarcode(item: DeviceItem): Promise<DataView | undefined>
```
### Audio Control
```typescript
// Control wave output for DualSense
async function controlWaveOut(
item: DeviceItem,
enable: boolean,
waveDevice: 'headphone' | 'speaker'
): Promise<void>
```
### Data Processing
```typescript
// Normalize thumbstick values to [-1, +1] range
function normalizeThumbStickAxis(value: number): number
// Format version numbers
function formatUpdateVersion(ver: number): string
function formatThreePartVersion(ver: number): string
function formatDspVersion(ver: number): string
```
## Constants and Enums
### Test Device IDs (DualSense)
```typescript
export enum DualSenseTestDeviceId {
SYSTEM = 1,
POWER = 2,
MEMORY = 3,
ANALOG_DATA = 4,
TOUCH = 5,
AUDIO = 6,
ADAPTIVE_TRIGGER = 7,
BULLET = 8,
BLUETOOTH = 9,
MOTION = 10,
TRIGGER = 11,
STICK = 12,
LED = 13,
BT_PATCH = 14,
DSP_FW = 15,
SPIDER_DSP_FW = 16,
FINGER = 17,
POSITION_TRACKING = 19,
BUILTIN_MIC_CALIB_DATA = 20,
}
```
### Battery and Charging Status
```typescript
export enum ChargeStatus {
DISCHARGING = 0,
CHARGING = 1,
COMPLETE = 2,
ABNORMAL_VOLTAGE = 10,
ABNORMAL_TEMPERATURE = 11,
CHARGING_ERROR = 15,
}
export enum BatteryLevel {
LEVEL1 = 0, // 0-9%
LEVEL2 = 1, // 10-19%
LEVEL3 = 2, // 20-29%
LEVEL4 = 3, // 30-39%
LEVEL5 = 4, // 40-49%
LEVEL6 = 5, // 50-59%
LEVEL7 = 6, // 60-69%
LEVEL8 = 7, // 70-79%
LEVEL9 = 8, // 80-89%
LEVEL10 = 9, // 90-99%
LEVEL11 = 10, // 100%
UNKNOWN = 11,
}
```
### LED Control
```typescript
export enum PlayerLedControl {
OFF = 0x00,
PLAYER_1 = 0x04,
PLAYER_2 = 0x0A,
PLAYER_3 = 0x15,
PLAYER_4 = 0x1B,
ALL = 0x1F,
}
export enum MuteButtonLedControl {
MIC_THRU,
MIC_MUTED,
ALL_MUTED,
}
```
## Controller-Specific Differences
### DualSense vs DualSense Edge
| Feature | DualSense | DualSense Edge |
|---------|-----------|----------------|
| Product ID | 0x0CE6 | 0x0DF2 |
| Additional Buttons | No | fnL, fnR, bL, bR |
| Profile Support | No | Yes (up to 3 profiles) |
| Profile Configuration | No | Yes (via test commands) |
| Adaptive Triggers | Yes | Yes |
| Haptic Feedback | Yes | Yes |
| Audio Control | Yes | Yes |
### DualSense vs DualShock 4
| Feature | DualSense | DualShock 4 |
|---------|-----------|-------------|
| Product ID | 0x0CE6 | 0x09CC/0x05C4 |
| Adaptive Triggers | Yes | No |
| Haptic Feedback | Yes | Limited |
| Audio Control | Yes | Limited |
| Motion Sensors | 6-axis | 6-axis |
| Touchpad | Yes | Yes |
| Light Bar | RGB LED | RGB Light Bar |
| Test Commands | Extensive | Limited |
### Input Report Differences
#### DualSense/DualSense Edge
- **USB Report Size**: 63 bytes
- **Bluetooth Report Size**: 77 bytes
- **Motion Data**: 16-bit signed integers
- **Adaptive Trigger Status**: Available
- **Profile Information**: Available (Edge only)
#### DualShock 4
- **USB Report Size**: 63 bytes
- **Bluetooth Report Size**: 77 bytes
- **Motion Data**: 16-bit signed integers
- **Adaptive Trigger Status**: Not available
- **Profile Information**: Not available
## Communication Protocols
### Report IDs
#### Output Reports
- **DualSense USB**: 0x02
- **DualSense Bluetooth**: 0x31
- **DualShock 4 USB**: 0x05
- **DualShock 4 Bluetooth**: 0x11
#### Feature Reports
- **0x80**: Test command (DualSense)
- **0x81**: Test result (DualSense)
- **0x22**: Bluetooth patch info (DualSense)
- **0x84/0x85**: Individual data verify (DualSense)
### CRC32 Checksums
Bluetooth communications require CRC32 checksums:
```typescript
// Output report checksum (DualSense)
function fillOutputReportChecksum(reportId: number, reportData: Uint8Array): void
// Feature report checksum (DualSense)
function fillFeatureReportChecksum(reportId: number, reportData: Uint8Array): void
// Profile array checksum (DualSense Edge)
function fillProfileArrayReportChecksum(byteArray: Uint8Array[]): void
```
### Checksum Calculation
```typescript
function crc32(prefixBytes: number[], dataView: DataView, suffixBytes: number[] = []): number
```
**Prefix bytes:**
- Output reports: `[0xA2, reportId]`
- Feature reports: `[0x53, reportId]`
## Output Commands and Control
### OutputStruct Class
The `OutputStruct` class is the primary interface for sending commands to DualSense controllers. It provides a structured way to control all output features including vibration, lights, audio, and adaptive triggers.
#### OutputStruct Structure (DualSense/DualSense Edge)
```typescript
export class OutputStruct {
// Control flags - determine which features are active
validFlag0: Ref<number> // Controls vibration, triggers, audio
validFlag1: Ref<number> // Controls LEDs, mute button
validFlag2: Ref<number> // Controls LED brightness
// Vibration motors (0-255)
bcVibrationRight: Ref<number> // Light rumble motor
bcVibrationLeft: Ref<number> // Heavy rumble motor
// Audio control (0-255)
headphoneVolume: Ref<number>
speakerVolume: Ref<number>
micVolume: Ref<number>
audioControl: Ref<number> // Audio routing control
audioControl2: Ref<number> // Additional audio control
// LED and indicator control
muteLedControl: Ref<number> // Mute button LED state
powerSaveMuteControl: Ref<number>
lightbarSetup: Ref<number> // Lightbar configuration
ledBrightness: Ref<number> // Player LED brightness (0-2)
playerIndicator: Ref<number> // Player LED pattern
ledCRed: Ref<number> // Lightbar red (0-255)
ledCGreen: Ref<number> // Lightbar green (0-255)
ledCBlue: Ref<number> // Lightbar blue (0-255)
// Adaptive triggers - Right trigger
adaptiveTriggerRightMode: Ref<number> // Trigger effect mode
adaptiveTriggerRightParam0: Ref<number> // Effect parameter 0
adaptiveTriggerRightParam1: Ref<number> // Effect parameter 1
adaptiveTriggerRightParam2: Ref<number> // Effect parameter 2
adaptiveTriggerRightParam3: Ref<number> // Effect parameter 3
adaptiveTriggerRightParam4: Ref<number> // Effect parameter 4
adaptiveTriggerRightParam5: Ref<number> // Effect parameter 5
adaptiveTriggerRightParam6: Ref<number> // Effect parameter 6
adaptiveTriggerRightParam7: Ref<number> // Effect parameter 7
adaptiveTriggerRightParam8: Ref<number> // Effect parameter 8
adaptiveTriggerRightParam9: Ref<number> // Effect parameter 9
// Adaptive triggers - Left trigger
adaptiveTriggerLeftMode: Ref<number> // Trigger effect mode
adaptiveTriggerLeftParam0: Ref<number> // Effect parameter 0
adaptiveTriggerLeftParam1: Ref<number> // Effect parameter 1
adaptiveTriggerLeftParam2: Ref<number> // Effect parameter 2
adaptiveTriggerLeftParam3: Ref<number> // Effect parameter 3
adaptiveTriggerLeftParam4: Ref<number> // Effect parameter 4
adaptiveTriggerLeftParam5: Ref<number> // Effect parameter 5
adaptiveTriggerLeftParam6: Ref<number> // Effect parameter 6
adaptiveTriggerLeftParam7: Ref<number> // Effect parameter 7
adaptiveTriggerLeftParam8: Ref<number> // Effect parameter 8
adaptiveTriggerLeftParam9: Ref<number> // Effect parameter 9
// Haptic feedback
hapticVolume: Ref<number> // Haptic feedback intensity
// Reserved fields for future use
Reserved0: Ref<number>
Reserved1: Ref<number>
Reserved2: Ref<number>
Reserved3: Ref<number>
Reserved7: Ref<number>
Reserved8: Ref<number>
// Generate binary report data
get reportData(): Uint8Array
}
```
#### OutputStruct Structure (DualShock 4)
```typescript
export class OutputStruct {
// Hardware and audio control
hwControl: Ref<number> // Hardware control flags (default: 0xC4)
audioControl: Ref<number> // Audio control settings
// Control flags
validFlag0: Ref<number> // Feature enable flags
validFlag1: Ref<number> // Additional feature flags
// Vibration motors (0-255)
motorRight: Ref<number> // Light rumble motor
motorLeft: Ref<number> // Heavy rumble motor
// Light bar control (0-255)
ledRed: Ref<number> // Light bar red component
ledGreen: Ref<number> // Light bar green component
ledBlue: Ref<number> // Light bar blue component
ledBlinkOn: Ref<number> // Blink on duration
ledBlinkOff: Ref<number> // Blink off duration
reserved: Ref<number> // Reserved field
// Generate binary report data (73 bytes for DualShock 4)
get reportData(): Uint8Array
}
```
### Valid Flags System
The valid flags system controls which features are active in the output report. Each bit in the valid flag bytes corresponds to a specific feature:
#### ValidFlag0 (DualSense)
- **Bit 0**: Vibration motors enable
- **Bit 1**: Vibration motors control
- **Bit 2**: Adaptive trigger left enable
- **Bit 3**: Adaptive trigger right enable
- **Bit 4**: Headphone volume control
- **Bit 5**: Speaker volume control
- **Bit 6**: Microphone volume control
- **Bit 7**: Audio control enable
#### ValidFlag1 (DualSense)
- **Bit 0**: Mute LED control
- **Bit 1**: Power save control
- **Bit 2**: Lightbar color control
- **Bit 3**: Release lightbar control
- **Bit 4**: Player LED control
#### ValidFlag2 (DualSense)
- **Bit 0**: Player LED brightness control
### Adaptive Trigger Effects
The DualSense controller supports several adaptive trigger effect modes:
#### Trigger Effect Modes
```typescript
enum TriggerEffectMode {
OFF = 0x00, // No effect
RESISTANCE = 0x01, // Constant resistance
TRIGGER = 0x02, // Trigger-like effect with release
AUTO_TRIGGER = 0x06, // Automatic trigger with vibration
}
```
#### Effect Parameters by Mode
**Resistance Mode (0x01)**
- `Param0`: Start position (0-255) - where resistance begins
- `Param1`: Force strength (0-255) - resistance intensity
**Trigger Mode (0x02)**
- `Param0`: Start position (0-255) - where trigger effect begins
- `Param1`: End position (0-255) - where trigger releases
- `Param2`: Force strength (0-255) - trigger resistance
**Auto Trigger Mode (0x06)**
- `Param0`: Frequency (0-15) - vibration frequency
- `Param1`: Force strength (0-255) - effect intensity
- `Param2`: Start position (0-255) - where effect begins
### Sending Output Commands
#### Basic Output Command Flow
```typescript
// 1. Create OutputStruct instance
const outputStruct = new OutputStruct()
// 2. Configure desired features
outputStruct.bcVibrationLeft.value = 128 // Set left motor to 50%
outputStruct.bcVibrationRight.value = 64 // Set right motor to 25%
// 3. Set appropriate valid flags
outputStruct.validFlag0.value |= 0x03 // Enable vibration (bits 0 and 1)
// 4. Get binary report data
const reportData = outputStruct.reportData
// 5. Send via output report
const sendOutputReport = sendOutputReportFactory(deviceItem)
await sendOutputReport(reportData.buffer)
// 6. Clear valid flags after sending (optional)
outputStruct.validFlag0.value &= ~0x03 // Disable vibration flags
```
#### Advanced Example: Adaptive Trigger Configuration
```typescript
// Configure right trigger with resistance effect
const outputStruct = new OutputStruct()
// Set trigger mode to resistance
outputStruct.adaptiveTriggerRightMode.value = 0x01
// Configure resistance parameters
outputStruct.adaptiveTriggerRightParam0.value = 40 // Start at 40/255 position
outputStruct.adaptiveTriggerRightParam1.value = 230 // High resistance force
// Enable adaptive trigger
outputStruct.validFlag0.value |= 0x08 // Bit 3 for right trigger
// Send command
const reportData = outputStruct.reportData
await sendOutputReport(reportData.buffer)
```
#### LED and Lightbar Control
```typescript
// Set lightbar color to purple
outputStruct.ledCRed.value = 128
outputStruct.ledCGreen.value = 0
outputStruct.ledCBlue.value = 255
// Set player indicator to player 2
outputStruct.playerIndicator.value = PlayerLedControl.PLAYER_2
// Set LED brightness to medium
outputStruct.ledBrightness.value = 1
// Enable LED controls
outputStruct.validFlag1.value |= 0x14 // Bits 2 and 4 for lightbar and player LED
outputStruct.validFlag2.value |= 0x01 // Bit 0 for brightness control
// Send command
const reportData = outputStruct.reportData
await sendOutputReport(reportData.buffer)
```
### Connection-Specific Behavior
#### USB Connection
- **Report ID**: 0x02 (DualSense), 0x05 (DualShock 4)
- **Data Size**: Exact OutputStruct size (52 bytes for DualSense)
- **Checksum**: Not required
- **Sequence**: Not required
#### Bluetooth Connection
- **Report ID**: 0x31 (DualSense), 0x11 (DualShock 4)
- **Data Size**: 77 bytes total
- **Sequence Number**: Required in first byte (upper 4 bits)
- **Header**: 0x10 in second byte
- **Payload**: OutputStruct data starting at byte 2
- **Checksum**: CRC32 in last 4 bytes
#### Bluetooth Output Report Structure
```typescript
function sendOutputReportBluetooth(outputData: ArrayBuffer) {
const reportData = new Uint8Array(77)
// Sequence number (increments 0-255, then wraps)
reportData[0] = (outputSeq << 4)
outputSeq = (outputSeq + 1) % 256
// Header byte
reportData[1] = 0x10
// Payload data
reportData.set(new Uint8Array(outputData), 2)
// Calculate and set CRC32 checksum
fillOutputReportChecksum(0x31, reportData)
// Send report
await device.sendReport(0x31, reportData)
}
```
### Error Handling and Best Practices
#### Async Lock Pattern
```typescript
const outputReportLock = createAsyncLock()
async function sendOutputReport(beforeFn?: () => void, afterFn?: () => void) {
await outputReportLock(async () => {
beforeFn?.() // Set valid flags
const reportData = outputStruct.reportData
await sendOutputReportFactory(device)(reportData.buffer)
afterFn?.() // Clear valid flags
})
}
```
#### Valid Flag Management
```typescript
// Helper functions for flag management
function setValidFlag(target: Ref<number>, flagBit: number) {
target.value |= (1 << flagBit)
}
function clearValidFlag(target: Ref<number>, flagBit: number) {
target.value &= ~(1 << flagBit)
}
// Usage example
setValidFlag(outputStruct.validFlag0, 0) // Enable vibration
clearValidFlag(outputStruct.validFlag0, 0) // Disable vibration
```
## Usage Examples
### Basic Controller Detection
```typescript
// Request controller access
const filters = [
{
vendorId: VENDOR_ID_SONY,
productId: PRODUCT_ID_DUALSENSE,
usagePage: USAGE_PAGE_GENERIC_DESKTOP,
usage: USAGE_ID_GD_GAME_PAD,
}
]
await requestHIDDevice(filters)
```
### Reading Input Data
```typescript
// Set up input report handler
device.addEventListener('inputreport', (event: HIDInputReportEvent) => {
const data = event.data
const reportId = event.reportId
// Parse based on connection type and controller model
const offset = connectionType === 'usb' ? inputReportOffsetUSB : inputReportOffsetBluetooth
const leftStickX = data.getUint8(offset.analogStickLX)
const leftStickY = data.getUint8(offset.analogStickLY)
// ... parse other data
})
```
### Complete Output Control Example
```typescript
// Initialize controller communication
const deviceItem = { device, connectionType }
const sendOutputReport = sendOutputReportFactory(deviceItem)
const outputStruct = new OutputStruct()
// Create async lock for thread safety
const outputLock = createAsyncLock()
async function controllerCommand(setupFn: () => void, cleanupFn?: () => void) {
await outputLock(async () => {
setupFn()
const reportData = outputStruct.reportData
await sendOutputReport(reportData.buffer)
cleanupFn?.()
})
}
// Example: Pulse vibration
await controllerCommand(
() => {
outputStruct.bcVibrationLeft.value = 255
outputStruct.bcVibrationRight.value = 128
outputStruct.validFlag0.value |= 0x03
},
() => {
outputStruct.validFlag0.value &= ~0x03
}
)
// Example: Set adaptive trigger effect
await controllerCommand(
() => {
outputStruct.adaptiveTriggerRightMode.value = 0x02 // Trigger mode
outputStruct.adaptiveTriggerRightParam0.value = 15 // Start position
outputStruct.adaptiveTriggerRightParam1.value = 100 // End position
outputStruct.adaptiveTriggerRightParam2.value = 255 // Force
outputStruct.validFlag0.value |= 0x08 // Enable right trigger
},
() => {
outputStruct.validFlag0.value &= ~0x08
}
)
```
This reference provides a comprehensive overview of the data structures, constants, and API calls used to interact with PlayStation controllers in the DualSense Tester application. The differences between controller models are clearly outlined, making it easier to implement controller-specific functionality.

View File

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

Before

Width:  |  Height:  |  Size: 7.5 KiB

After

Width:  |  Height:  |  Size: 8.1 KiB

View File

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

View File

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

View File

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

View File

@@ -100,6 +100,14 @@ class BaseController {
}
}
/**
* Get the serial number of the device
* @returns {Promise<string>} The device serial number
*/
async getSerialNumber() {
throw new Error('getSerialNumber() must be implemented by subclass');
}
// Abstract methods that must be implemented by subclasses
async getInfo() {
throw new Error('getInfo() must be implemented by subclass');

View File

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

View File

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

View File

@@ -266,6 +266,10 @@ class DS5Controller extends BaseController {
return DS5_INPUT_CONFIG;
}
async getSerialNumber() {
return await this.getSystemInfo(1, 19, 17);
}
async getInfo() {
return this._getInfo(false);
}
@@ -844,7 +848,7 @@ class DS5Controller extends BaseController {
const bat_charge = bat & 0x0f;
const bat_status = bat >> 4;
let bat_capacity = 0;
let charge_level = 0;
let cable_connected = false;
let is_charging = false;
let is_error = false;
@@ -852,32 +856,33 @@ class DS5Controller extends BaseController {
switch (bat_status) {
case 0:
// On battery power
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
charge_level = Math.min(bat_charge * 10 + 5, 100);
break;
case 1:
// Charging
bat_capacity = Math.min(bat_charge * 10 + 5, 100);
charge_level = Math.min(bat_charge * 10 + 5, 100);
is_charging = true;
cable_connected = true;
break;
case 2:
// Fully charged
bat_capacity = 100;
charge_level = 100;
cable_connected = true;
break;
case 15:
// Battery is flat
bat_capacity = 0;
charge_level = 0;
is_charging = true;
cable_connected = true;
break;
case 11: // not sure yet what this error means
default:
// Error state
is_error = true;
break;
}
return { bat_capacity, cable_connected, is_charging, is_error };
return { charge_level, cable_connected, is_charging, is_error };
}
}

View File

@@ -50,25 +50,14 @@ class DS5EdgeController extends DS5Controller {
}
async getBarcode() {
try {
const td = new TextDecoder();
await this.sendFeatureReport(0x80, [21,34,0]);
await sleep(100);
const r_data = await this.receiveFeatureReport(0x81);
const r_bc = td.decode(r_data.buffer.slice(21, 21+17));
await this.sendFeatureReport(0x80, [21,34,1]);
await sleep(100);
const l_data = await this.receiveFeatureReport(0x81);
const l_bc = td.decode(l_data.buffer.slice(21, 21+17));
return [l_bc, r_bc];
} catch(error) {
la("ds5_edge_barcode_modules_failed", {"r": error});
throw new Error(l("Cannot read module barcodes"), { cause: error });
}
await this.sendFeatureReport(0x80, [21,34]);
await sleep(100);
const data = await this.receiveFeatureReport(0x81);
const td = new TextDecoder();
const r_bc = td.decode(data.buffer.slice(21, 21+17));
const l_bc = td.decode(data.buffer.slice(40, 40+17));
return [r_bc, l_bc];
}
async unlockModule(i) {

View File

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

View File

@@ -1,19 +1,22 @@
'use strict';
import { sleep, float_to_str, dec2hex, dec2hex32, lerp_color, initAnalyticsApi, la, createCookie, readCookie } from './utils.js';
import { sleep, float_to_str, dec2hex, dec2hex32, lerp_color, initAnalyticsApi, la } from './utils.js';
import { Storage } from './storage.js';
import { initControllerManager } from './controller-manager.js';
import ControllerFactory from './controllers/controller-factory.js';
import { lang_init, l } from './translations.js';
import { loadAllTemplates } from './template-loader.js';
import { draw_stick_position, CIRCULARITY_DATA_SIZE } from './stick-renderer.js';
import { draw_stick_dial, CIRCULARITY_DATA_SIZE, calculateCircularityError } from './stick-renderer.js';
import { ds5_finetune, isFinetuneVisible, finetune_handle_controller_input } from './modals/finetune-modal.js';
import { calibrate_stick_centers, auto_calibrate_stick_centers } from './modals/calib-center-modal.js';
import { calibrate_range } from './modals/calib-range-modal.js';
import { calibrate_range, rangeCalibHandleControllerInput } from './modals/calib-range-modal.js';
import {
show_quick_test_modal,
isQuickTestVisible,
quicktest_handle_controller_input
} from './modals/quick-test-modal.js';
import { show_calibration_history_modal } from './modals/calibration-history-modal.js';
import { FinetuneHistory } from './finetune-history.js';
// Application State - manages app-wide state and UI
const app = {
@@ -22,6 +25,12 @@ const app = {
last_disable_btn: 0,
shownRangeCalibrationWarning: false,
failedCalibrationDetectionsCount: 0,
failedCalibrationModalShownCount: 0,
// Calibration method preference
centerCalibrationMethod: 'four-step', // 'quick' or 'four-step'
rangeCalibrationMethod: 'normal', // 'normal' or 'expert'
// Language and UI state
lang_orig_text: {},
@@ -107,12 +116,12 @@ function gboot() {
initAnalyticsApi(app); // init just with gu for now
lang_init(app, handleLanguageChange, show_welcome_modal);
show_welcome_modal();
initCalibrationMethod();
$("input[name='displayMode']").on('change', on_stick_mode_change);
// Setup edge modal "Don't show again" checkbox
$('#edgeModalDontShowAgain').on('change', function() {
localStorage.setItem('edgeModalDontShowAgain', this.checked.toString());
Storage.edgeModalDontShowAgain.set(this.checked);
});
}
@@ -132,6 +141,8 @@ function gboot() {
}
$("#offlinebar").show();
$("#aboutdrift").show();
updateLastConnectedInfo();
navigator.hid.addEventListener("disconnect", handleDisconnectedDevice);
}
@@ -209,13 +220,15 @@ async function continue_connection({data, device}) {
}
// Helper to apply basic UI visibility based on device type
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showFourStepCalib, showQuickTests, showQuickCalib }) {
function applyDeviceUI({ showInfo, showFinetune, showInfoTab, showQuickTests, showFourStepCalib, showQuickCalib, showCalibrationHistory }) {
$("#infoshowall").toggle(!!showInfo);
$("#ds5finetune").toggle(!!showFinetune);
$("#info-tab").toggle(!!showInfoTab);
$("#four-step-center-calib").toggle(!!showFourStepCalib);
$("#quick-tests-div").css("visibility", showQuickTests ? "visible" : "hidden");
$("#four-step-center-calib").toggle(!!showFourStepCalib);
$("#quick-center-calib").toggle(!!showQuickCalib);
$("#quick-center-calib-group").toggle(!!showQuickCalib);
$("#restore-calibration-btn").toggle(!!showCalibrationHistory);
}
let controllerInstance = null;
@@ -260,14 +273,13 @@ async function continue_connection({data, device}) {
$("#onlinebar").show();
$("#mainmenu").show();
$("#resetBtn").show();
$("#aboutdrift").hide();
$("#d-nvstatus").text = l("Unknown");
$("#d-bdaddr").text = l("Unknown");
$('#controller-tab').tab('show');
const model = controllerInstance.getModel();
const numOfSticks = controllerInstance.getNumberOfSticks();
if(numOfSticks == 2) {
$("#stick-item-rx").show();
@@ -279,6 +291,29 @@ async function continue_connection({data, device}) {
throw new Error(`Invalid number of sticks: ${numOfSticks}`);
}
const model = controllerInstance.getModel();
// Save controller info to local storage
const lastConnectedInfo = {
deviceName: deviceName,
timestamp: new Date().toISOString(),
serialNumber: await controllerInstance.getSerialNumber(),
};
// Extract info from infoItems
if (info.infoItems && Array.isArray(info.infoItems)) {
for (const item of info.infoItems) {
if (item.key === l("Board Model")) {
lastConnectedInfo.boardModel = item.value;
} else if (item.key === l("Color")) {
lastConnectedInfo.color = item.value;
}
}
}
Storage.lastConnectedController.set(lastConnectedInfo);
updateLastConnectedInfo();
// Initialize SVG controller based on model
await init_svg_controller(model);
@@ -320,6 +355,24 @@ async function continue_connection({data, device}) {
if(model == "VR2") {
show_popup(l("<p>Support for PS VR2 controllers is <b>minimal and highly experimental</b>.</p><p>I currently don't own these controllers, so I cannot verify the calibration process myself.</p><p>If you'd like to help improve full support, you can contribute with a donation or even send the controllers for testing.</p><p>Feel free to contact me on Discord (the_al) or by email at ds4@the.al .</p><br><p>Thank you for your support!</p>"), true)
}
// Check for unsaved calibration changes
if (controller.has_changes_to_write) {
show_popup(`<p>${
l("It appears the latest joystick calibration has not been saved.")
}</p><p>${
l("You should save your changes, or reboot the controller to revert back to the previous state.")
}</p>`, true);
}
// Save finetune parameters for DS5 and Edge controllers
if (model === "DS5" || model === "DS5_Edge") {
if (!controller.has_changes_to_write) {
const finetuneData = await controllerInstance.getInMemoryModuleData();
const serialNumber = await controllerInstance.getSerialNumber();
FinetuneHistory.save(finetuneData, serialNumber);
}
}
} catch(err) {
await disconnect();
throw err;
@@ -337,6 +390,8 @@ async function disconnect() {
}
app.gj = 0;
app.disable_btn = 0;
app.shownRangeCalibrationWarning = false;
app.failedCalibrationDetectionsCount = 0;
update_disable_btn();
await controller.disconnect();
@@ -345,6 +400,45 @@ async function disconnect() {
$("#offlinebar").show();
$("#onlinebar").hide();
$("#mainmenu").hide();
$("#aboutdrift").show();
updateLastConnectedInfo();
}
function updateLastConnectedInfo() {
const $lastConnected = $("#lastConnected");
const $infoDiv = $("#lastConnectedInfo");
const info = Storage.lastConnectedController.get();
if (!info) {
console.log("No last connected info found.", $lastConnected);
$lastConnected.hide();
return;
}
try {
const parts = [];
if (info.color) parts.push(l(info.color));
if (info.boardModel) parts.push(info.boardModel);
if (info.deviceName) parts.push(info.deviceName);
let text = parts.join(" ");
if (info.serialNumber) {
text += ", " + l("serial number") + " " + info.serialNumber;
}
$infoDiv.text(text);
if (info.serialNumber) {
const hasChanges = Storage.hasChangesState.get(info.serialNumber);
const $warning = $("#lastConnectedWarning");
$warning.toggle(hasChanges);
}
$lastConnected.show();
} catch (error) {
console.error("Error parsing last connected info:", error);
$lastConnected.hide();
}
}
// Wrapper function for HTML onclick handlers
@@ -400,7 +494,7 @@ function set_edge_progress(score) {
}
function show_welcome_modal() {
const already_accepted = readCookie("welcome_accepted");
const already_accepted = Storage.getString("welcome_accepted");
if(already_accepted == "1")
return;
@@ -409,7 +503,7 @@ function show_welcome_modal() {
function welcome_accepted() {
la("welcome_accepted");
createCookie("welcome_accepted", "1");
Storage.setString("welcome_accepted", "1");
$("#welcomeModal").modal("hide");
}
@@ -446,6 +540,9 @@ async function init_svg_controller(model) {
svgContainer.innerHTML = svgContent;
// Reset trackpad bounding box so it's recalculated for the new SVG
trackpadBbox = undefined;
const lightBlue = '#7ecbff';
const midBlue = '#3399cc';
const dualshock = document.getElementById('Controller');
@@ -487,9 +584,9 @@ function collectCircularityData(stickStates, leftData, rightData) {
}
}
function clear_circularity() {
ll_data.fill(0);
rr_data.fill(0);
function clear_circularity(leftOrRight = 'both') {
if(['left', 'both'].includes(leftOrRight)) ll_data.fill(0);
if(['right', 'both'].includes(leftOrRight)) rr_data.fill(0);
}
function reset_circularity_mode() {
@@ -517,14 +614,14 @@ function refresh_stick_pos() {
const enable_circ_test = circ_checked();
// Draw left stick
draw_stick_position(ctx, hb, yb, sz, plx, ply, {
draw_stick_dial(ctx, hb, yb, sz, plx, ply, {
circularity_data: enable_circ_test ? ll_data : null,
enable_zoom_center,
});
if(!hasSingleStick) {
// Draw right stick
draw_stick_position(ctx, w-hb, yb, sz, prx, pry, {
draw_stick_dial(ctx, w-hb, yb, sz, prx, pry, {
circularity_data: enable_circ_test ? rr_data : null,
enable_zoom_center,
});
@@ -584,6 +681,17 @@ function refresh_stick_pos() {
} catch (e) {
// Fail silently if SVG not present
}
const circularityCheckIcon = document.getElementById('circularityCheckIcon');
if (!enable_circ_test) {
circularityCheckIcon.style.display = 'none';
return;
}
const ll_error = calculateCircularityError(ll_data);
const rr_error = calculateCircularityError(rr_data);
const isTooSmall = (ll_error && ll_error < 5 || rr_error && rr_error < 5);
circularityCheckIcon.style.display = isTooSmall ? 'block' : 'none';
}
const circ_checked = () => $("#checkCircularityMode").is(':checked');
@@ -623,7 +731,7 @@ const throttled_refresh_sticks = (() => {
const update_stick_graphics = (changes) => throttled_refresh_sticks(changes);
function update_battery_status({/* bat_capacity, cable_connected, is_charging, is_error, */ bat_txt, changed}) {
function update_battery_status({/* charge_level, cable_connected, is_charging, is_error, */ bat_txt, changed}) {
if(changed) {
$("#d-bat").html(bat_txt);
}
@@ -749,18 +857,48 @@ function detectFailedRangeCalibration(changes) {
const hasOpenModals = document.querySelectorAll('.modal.show').length > 0;
if (failedCalibration && !app.shownRangeCalibrationWarning && !hasOpenModals) {
app.failedCalibrationDetectionsCount++;
if (app.failedCalibrationDetectionsCount < 5) {
return; // require 5 consecutive detections
}
app.failedCalibrationModalShownCount++;
Storage.failedCalibrationCount.set(app.failedCalibrationModalShownCount);
app.shownRangeCalibrationWarning = true;
show_popup(l("Range calibration appears to have failed. Please try again and make sure you rotate the sticks."));
if (app.failedCalibrationCount <= 6) { // keep it from getting annoying
show_popup(l("Range calibration appears to have failed. Please try again and make sure you rotate the sticks."));
}
}
}
function isRangeCalibrationVisible() {
const modal = document.getElementById('rangeModal');
if (!modal) return false;
return modal.classList.contains('show');
}
// Callback function to handle UI updates after controller input processing
function handleControllerInput({ changes, inputConfig, touchPoints, batteryStatus }) {
const { buttonMap } = inputConfig;
// Open Quick Test modal if options button is pressed while L1 is held down
if (changes.options && controller.button_states.l1) {
update_ds_button_svg({ l1: false }, buttonMap); // Clear L1
show_quick_test_modal(controller);
return;
}
// Update range calibration modal stick visualization if visible
if (isRangeCalibrationVisible() && changes.sticks) {
collectCircularityData(changes.sticks, ll_data, rr_data);
rangeCalibHandleControllerInput(changes);
return;
}
// Handle Quick Test Modal input (can be open from any tab)
if (isQuickTestVisible()) {
quicktest_handle_controller_input(changes);
quicktest_handle_controller_input(changes, batteryStatus);
return;
}
@@ -959,8 +1097,7 @@ function show_donate_modal() {
function show_edge_modal() {
// Check if user has chosen not to show the modal again
const dontShowAgain = localStorage.getItem('edgeModalDontShowAgain');
if (dontShowAgain === 'true') {
if (Storage.edgeModalDontShowAgain.get()) {
return;
}
@@ -973,6 +1110,15 @@ function show_info_tab() {
$('#info-tab').tab('show');
}
function show_circularity_warning() {
const message = `<p>
${l("Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.")
}</p><p>
${l("Aim for a circularity error of around 7-9 % for the best playing experience.")}`;
show_popup(message, true);
}
// Alert Management Functions
let alertCounter = 0;
@@ -1059,50 +1205,153 @@ window.disconnect = disconnectSync;
window.show_faq_modal = show_faq_modal;
window.show_info_tab = show_info_tab;
window.copyValueToClipboard = copyValueToClipboard;
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);
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
window.ds5_finetune = () => ds5_finetune(
controller,
{ ll_data, rr_data, clear_circularity },
(success) => success && switchToRangeMode()
);
window.openCalibrationHistoryModal = async () => {
let currentFinetuneData = null;
let controllerSerialNumber = null;
try {
if (controller && typeof controller.getInMemoryModuleData === 'function') {
currentFinetuneData = await controller.getInMemoryModuleData('finetune');
}
if (controller && typeof controller.getDeviceInfo === 'function') {
const info = await controller.getDeviceInfo();
const serialNumberItem = info?.infoItems?.find(item => item.key === l("Serial Number"));
controllerSerialNumber = serialNumberItem?.value;
}
} catch (error) {
console.warn('Could not retrieve current finetune data or serial number:', error);
}
await show_calibration_history_modal(controller, currentFinetuneData, controllerSerialNumber, (success, message) => {
if(!message) return;
success ? infoAlert(message) : errorAlert(message);
});
};
window.flash_all_changes = flash_all_changes;
window.reboot_controller = reboot_controller;
window.refresh_nvstatus = refresh_nvstatus;
window.nvsunlock = nvsunlock;
// Calibration method selection
window.setCenterCalibrationMethod = (method, event) => {
if (event) {
event.preventDefault();
event.stopPropagation();
}
app.centerCalibrationMethod = method;
Storage.centerCalibrationMethod.set(method);
updateCalibrationMethodUI();
// Close the dropdown
const dropdownButton = event?.target?.closest('.dropdown-menu')?.previousElementSibling;
if (dropdownButton) {
const dropdown = bootstrap.Dropdown.getInstance(dropdownButton);
if (dropdown) dropdown.hide();
}
};
window.executeSelectedCenterCalibration = () => {
if (app.centerCalibrationMethod === 'quick') {
auto_calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
} else {
calibrate_stick_centers(
controller,
(success, message) => {
if (success) {
resetStickDiagrams();
infoAlert(message, 2_000);
switchTo10xZoomMode();
}
}
);
}
};
window.setRangeCalibrationMethod = (method, event) => {
if (event) {
event.preventDefault();
event.stopPropagation();
}
app.rangeCalibrationMethod = method;
Storage.rangeCalibrationMethod.set(method);
updateCalibrationMethodUI();
// Close the dropdown
const dropdownButton = event?.target?.closest('.dropdown-menu')?.previousElementSibling;
if (dropdownButton) {
const dropdown = bootstrap.Dropdown.getInstance(dropdownButton);
if (dropdown) dropdown.hide();
}
};
window.executeSelectedRangeCalibration = () => {
calibrate_range(
controller,
{ ll_data, rr_data },
(success, message) => {
resetStickDiagrams();
if(message) {
infoAlert(message, 2_000);
}
switchToRangeMode();
},
app.rangeCalibrationMethod === 'expert'
);
};
function updateCalibrationMethodUI() {
$('#check-quick').toggle(app.centerCalibrationMethod === 'quick');
$('#check-four-step').toggle(app.centerCalibrationMethod === 'four-step');
$('#check-range-normal').toggle(app.rangeCalibrationMethod === 'normal');
$('#check-range-expert').toggle(app.rangeCalibrationMethod === 'expert');
}
function initCalibrationMethod() {
const savedCenterMethod = Storage.centerCalibrationMethod.get();
if (savedCenterMethod && (savedCenterMethod === 'quick' || savedCenterMethod === 'four-step')) {
app.centerCalibrationMethod = savedCenterMethod;
}
const savedRangeMethod = Storage.rangeCalibrationMethod.get();
if (savedRangeMethod && (savedRangeMethod === 'normal' || savedRangeMethod === 'expert')) {
app.rangeCalibrationMethod = savedRangeMethod;
}
const savedFailedCalibrationCount = Storage.failedCalibrationCount.get();
if (savedFailedCalibrationCount > 0) {
app.failedCalibrationModalShownCount = savedFailedCalibrationCount;
}
updateCalibrationMethodUI();
}
window.nvslock = nvslock;
window.welcome_accepted = welcome_accepted;
window.show_donate_modal = show_donate_modal;
window.show_circularity_warning = show_circularity_warning;
window.show_quick_test_modal = () => {
show_quick_test_modal(controller).catch(error => {
throw new Error("Failed to show quick test modal", { cause: error });

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

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

View File

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

View File

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

View File

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

View File

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

View File

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

245
js/storage.js Normal file
View File

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

View File

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

View File

@@ -1,6 +1,7 @@
'use strict';
import { la, createCookie, readCookie } from './utils.js';
import { la } from './utils.js';
import { Storage } from './storage.js';
// Alphabetical order
const available_langs = {
@@ -50,7 +51,7 @@ export function lang_init(appState, handleLanguageChangeCb, welcomeModalCb) {
}
translationState.lang_orig_text[".title"] = document.title;
const force_lang = readCookie("force_lang");
const force_lang = Storage.getString("force_lang");
if (force_lang != null) {
lang_set(force_lang, true).catch(error => {
console.error("Failed to set forced language:", error);
@@ -89,9 +90,9 @@ async function lang_set(lang, skip_modal=false) {
}
await handleLanguageChange(lang);
createCookie("force_lang", lang);
Storage.setString("force_lang", lang);
if(!skip_modal && welcomeModal) {
createCookie("welcome_accepted", "0");
Storage.setString("welcome_accepted", "0");
welcomeModal();
}
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "| A magyarítást a <a href='https://pandafix.hu' target='_blank'>Pandafix</a> készítette.",
"DualShock Calibration GUI": "DualShock / DualSense kontroller kalibráló felület",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nem támogatott böngésző! Kérlek olyan böngészőt használj, ami támogatja a WebHID protokollt (pl: Chrome, Maxthon)",
"Connect": "Csatlakozás",
"Connected to:": "Csatlakoztatva:",
"Disconnect": "Lecsatlakozás",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "A kontroller hüvelykujjkar középállásának újrakalibrálása.",
"Please do not close this window and do not disconnect your controller. ": "Kérlek, ne zárd be ezt az ablakot, és ne válaszd le a kontrollert. ",
"Range calibration": "Elmozdulási tartomány kalibrálása",
"<b>The controller is now sampling data!</b>": "<b>A kontroller most az adatokat mintavételezi!</b>",
"The controller is now sampling data!": "A kontroller most az adatokat mintavételezi!",
"Done": "Kész",
"Hi, thank you for using this software.": "Szia! Köszönjük, hogy ezt az alkalmazást használtad.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Ha hasznosnak találod ezt az alkalmazást, és támogatni szeretnéd a készítőt, akkor kérlek tedd meg",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Érvénytelen eszköz csatlakoztatva",
"Error": "Hiba",
"My handle on discord is: the_al": "Fogjunk kezet a Discordon: the_al",
"Initializing...": "Inicializálás...",
"Storing calibration...": "Kalibrálási adatok tárolása...",
"Sampling...": "Mintavételezés...",
"Calibration in progress": "Kalibrálás folyamatban",
"Start": "Kezdés",
"Continue": "Folytatás",
"You can check the calibration with the": "Az újrakalibrálást ellenőrizheted az alábbi alkalmazással is:",
"Have a nice day :)": "További szép napot kívánunk! :)",
"Welcome to the Calibration GUI": "Üdvözöl a Dualshock/DualSense kalibrálást segítő alkalmazás!",
"Just few things to know before you can start:": "Csak néhány dolog, amit tudnod kell, mielőtt belevágnál:",
@@ -124,8 +121,6 @@
", to help more people like you!": ", hogy több hozzád hasonló embernek segítsen!",
"This website uses analytics to improve the service.": "Ez a weboldal analitikát használ a szolgáltatás javításához.",
"Board Model": "Alaplap verzió",
"This feature is experimental.": "Ez egy kisérleti funkció",
"Please let me know if the board model of your controller is not detected correctly.": "Kérlek értesítsd a fejlesztőt, ha az alaplap verziója nem egyezik meg a felimert verzióval!",
"This DualSense controller has outdated firmware.": "Ennek a DualSense vezérlőnek elavult a firmware-e.",
"Please update the firmware and try again.": "Kérlek frissítsd a firmware-t, és próbáld újra.",
"Joystick Info": "Analógkar Információ",
@@ -214,106 +209,128 @@
"Sterling Silver": "Sterling Silver",
"Volcanic Red": "Volcanic Red",
"White": "Fehér",
"10x zoom": "10x nagyítás",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Átlagos körkörösségi hiba:</strong> a kisebb nem mindig jobb! Célozd meg a 7-9%-ot.",
"A reboot is needed to continue using this DualSense Edge. Please disconnect and reconnect your controller.": "A DualSense Edge további használatához újraindítás szükséges. Kérlek, válaszd le, majd csatlakoztasd újra a kontrollert.",
"Adaptive Trigger": "Adaptív ravasz",
"Adaptive triggers are only supported on DualSense controllers": "Az adaptív ravaszok csak DualSense kontrollereken támogatottak",
"Add test": "Teszt hozzáadása",
"Be gentle to avoid damage.": "Légy óvatos, hogy elkerüld a sérülést.",
"Buttons": "Gombok",
"Calibration": "Kalibrálás",
"Center": "Közép",
"Center (L1)": "Közép (L1)",
"Chroma Indigo": "Chroma Indigó",
"Chroma Pearl": "Chroma Gyöngy",
"Chroma Teal": "Chroma Kékeszöld",
"Circularity": "Körkörösség",
"Circularity (R1)": "Körkörösség (R1)",
"Controller does not support adaptive trigger control": "A kontroller nem támogatja az adaptív ravasz vezérlését",
"Debug": "Hibakeresés",
"Don't show again": "Ne jelenjen meg újra",
"Fail": "Sikertelen",
"Failed": "Sikertelen",
"Failed to connect to device": "Nem sikerült csatlakozni az eszközhöz",
"Failed to disable adaptive trigger": "Nem sikerült letiltani az adaptív ravaszt",
"Failed to set speaker tone": "Nem sikerült beállítani a hangszóró hangját",
"Failed to set vibration": "Nem sikerült beállítani a rezgést",
"Feel for vibration in the controller.": "Érezd a rezgést a kontrollerben.",
"Fortnite": "Fortnite",
"Haptic Vibration": "Haptikus rezgés",
"Headphone Jack": "Fejhallgató-csatlakozó",
"Increase non-circularity": "Nem-körkörösség növelése",
"Info": "Infó",
"Instructions": "Utasítások",
"Keep rotating the sticks even if you see no progress!": "Forgasd tovább a karokat akkor is, ha nem látsz változást!",
"Learn more...": "Tudj meg többet...",
"Lights": "Fények",
"Listen for a tone from the controller speaker.": "Figyeld a hangjelzést a kontroller hangszórójából.",
"Long-press [circle] to skip ahead.": "Nyomd hosszan a [kör] gombot a kihagyáshoz.",
"Microphone": "Mikrofon",
"Microphone Level:": "Mikrofon szint:",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Mozgasd meg a kart a kiválasztáshoz, majd anélkül, hogy hozzáérnél, használd a D-pad (nyíl) gombokat a középpont beállításához. Pöccintsd meg, és állítsd be újra, ha nincs középen vagy ugrál.",
"No controller connected": "Nincs csatlakoztatva kontroller",
"No tests completed yet.": "Még nincsenek befejezett tesztek.",
"Normal": "Normál",
"Not tested": "Nincs tesztelve",
"Pass": "Sikeres",
"Passed": "Sikeres",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Kérlek, csatlakoztass egy DualShock 4, DualSense, DualSense Edge vagy VR2 kontrollert a számítógépedhez, és kattints a Csatlakozás gombra.",
"Please release the stick to center position before adjusting with D-pad buttons.": "Kérlek, engedd el a kart középső állásba, mielőtt a D-pad gombokkal módosítanád.",
"Plug in headphones to the 3.5mm jack": "Csatlakoztass egy fejhallgatót a 3,5 mm-es jack aljzathoz",
"Press L2 and R2 triggers to feel the trigger resistance.": "Nyomd meg az L2 és R2 ravaszokat az ellenállás érzékeléséhez.",
"Press [circle] to close, or [square] to start over": "Nyomd meg a [kör] gombot a bezáráshoz, vagy a [négyzet] gombot az újrakezdéshez",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "Nyomd meg a [négyzet] gombot, ha Sikeres, a [kereszt] gombot, ha Sikertelen, vagy a [kör] gombot a kihagyáshoz.",
"Press [square] to begin or [circle] to close": "Nyomd meg a [négyzet] gombot a kezdéshez, vagy a [kör] gombot a bezáráshoz",
"Press [triangle] to go back.": "Nyomd meg a [háromszög] gombot a visszalépéshez.",
"Press each button until they turn green.": "Nyomj meg minden gombot, amíg zöldre nem váltanak.",
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Nyomd a D-padot vagy az előlapi gombokat abba az irányba, amerre a kar pozícióját mozgatni szeretnéd.",
"Progress": "Folyamat",
"Push the stick straight up/down/left/right as far as possible.": "Told a kart egyenesen fel/le/balra/jobbra, ameddig csak lehet.",
"Quick Test": "Gyors teszt",
"Quick calibrate": "Gyors kalibrálás",
"Range calibration appears to have failed. Please try again and make sure you rotate the sticks.": "Úgy tűnik, a tartománykalibrálás sikertelen volt. Kérlek, próbáld újra, és győződj meg róla, hogy forgatod a karokat.",
"Repeat": "Ismétlés",
"Restart": "Újraindítás",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "Forgasd a karokat lassan legalább kétszer az egyik irányba, és kétszer a másik irányba, hogy a teljes tartományt lefedd.",
"Run through these tests to verify your controller's functionality.": "Futtasd le ezeket a teszteket a kontroller működésének ellenőrzéséhez.",
"Show raw numbers": "Nyers adatok mutatása",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "A Sony kontrollerek gyárilag közel 10%-os átlagos körkörösségi hibával érkeznek, és a játékok jelenleg ezt várják el. A túl tökéletes körkörösség miatt a mozgás és a célzás merevnek és érzéketlennek tűnhet bizonyos játékokban.",
"Speaker": "Hangszóró",
"Spider-Man 2": "Spider-Man 2",
"Step size": "Lépésköz",
"Test Speaker": "Hangszóró tesztelése",
"Test Summary": "Teszt összesítése",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Teszteld az összes gombot, vagy nyomd hosszan a [négyzet] gombot, ha Sikeres, a [kereszt] gombot, ha Sikertelen, vagy a [kör] gombot a kihagyáshoz.",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "A <b>Kész</b> gomb legfeljebb 15 másodperc múlva válik elérhetővé. Ha a karok forgatása nélkül nyomod meg a <b>Kész</b> gombot, a kalibrálás hiányos lesz, és meg kell ismételned.",
"The Last of Us": "The Last of Us",
"The device appears to be a clone. All calibration functionality is disabled.": "Az eszköz hamisítványnak tűnik. Minden kalibrációs funkció letiltásra került.",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Az eszköz Bluetooth-on keresztül csatlakozik. Válaszd le, és csatlakoztasd inkább USB-kábellel.",
"This test checks all controller buttons by requiring you to press each button up to three times.": "Ez a teszt az összes kontrollergombot ellenőrzi; minden gombot akár háromszor is meg kell nyomnod.",
"This test checks the headphone jack functionality.": "Ez a teszt a fejhallgató-csatlakozó működését ellenőrzi.",
"This test checks the reliability of the USB port.": "Ez a teszt az USB-port megbízhatóságát ellenőrzi.",
"This test will activate the controller's vibration motors, first the heavy one, and then the light one.": "Ez a teszt aktiválja a kontroller rezgőmotorjait, először az erőset, majd a gyengét.",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "Ez a teszt végigmegy a piros, zöld és kék színeken a fénysávon, animálja a játékosjelző fényeket, és villogtatja a némítás gombot.",
"This test will enable heavy resistance on both L2 and R2 triggers.": "Ez a teszt erős ellenállást kapcsol be mind az L2, mind az R2 ravaszon.",
"This test will play a tone through the controller's built-in speaker.": "Ez a teszt egy hangot játszik le a kontroller beépített hangszóróján keresztül.",
"This test will monitor the controller's microphone input levels.": "Ez a teszt figyeli a kontroller mikrofonjának bemeneti szintjeit.",
"Blow gently into the controller's microphone. You should see the audio level indicator respond.": "Fújj óvatosan a kontroller mikrofonjába. A hangerőszint-jelzőnek reagálnia kell.",
"Click \"Test Speaker\" to listen for the tone through the headphones": "Kattints a \"Hangszóró tesztelése\" gombra, hogy a fejhallgatón keresztül halld a hangot.",
"USB Connector": "USB csatlakozó",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Figyeld, ahogy a kontroller fényei színt váltanak, a játékosjelzők animálódnak, és a némítás gomb villog.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Miközben a beállítandó kart egyenesen fel/le/balra/jobbra tartod, végezd el a módosításokat, amíg világoskék szektorokat nem látsz mind a négy irányban, miután a kart balra és jobbra is körbeforgattad. Ezután használd a",
"Wiggle the USB cable to see if the controller disconnects.": "Mozgasd meg az USB-kábelt, hogy lásd, szétkapcsol-e a kontroller.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Lehetséges, hogy az eszközöd nem eredeti Sony kontroller. Ha nem hamisítvány, kérlek, jelentsd ezt a problémát.",
"failed": "sikertelen",
"hide": "elrejtés",
"passed": "sikeres",
"skipped": "kihagyva",
"tests completed": "befejezett teszt",
"to increase the non-circularity.": "a nem-körkörösség növeléséhez.",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"The item has been copied to the clipboard.": "",
"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": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Be gentle to avoid damage.": "",
"Buttons": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration": "",
"Calibration History": "",
"Center": "",
"Center (L1)": "",
"Chroma Indigo": "",
"Chroma Pearl": "",
"Chroma Teal": "",
"Circularity": "",
"Circularity (R1)": "",
"Clear All": "",
"Controller does not support adaptive trigger control": "",
"Current": "",
"Debug": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
"Failed to disable adaptive trigger": "",
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Fortnite": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Info": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
"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 saved calibrations found.": "",
"No tests completed yet.": "",
"Normal": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please release the stick to center position before adjusting with D-pad buttons.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
"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": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Show raw numbers": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
"Speaker": "",
"Spider-Man 2": "",
"Step size": "",
"Test Speaker": "",
"Test Summary": "",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "",
"The <b>Done</b> button will unlock after at most 15 seconds. If you press <b>Done</b> without rotating the sticks, the calibration will be incomplete and you will need to repeat it.": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"USB Connector": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "",
"Wiggle the USB cable to see if the controller disconnects.": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",
"": ""
}

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Traduzione in Italiano a cura di <a href='https://blog.the.al'>the_al</a>",
"DualShock Calibration GUI": "GUI di Calibrazione DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Browser non supportato. Visita questo sito usando un browser con supporto WebHID (es. Google Chrome).",
"Connect": "Connetti",
"Connected to:": "Connesso a:",
"Disconnect": "Disconnetti",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Ricentro gli analogici.",
"Please do not close this window and do not disconnect your controller. ": "Non chiudere questa finestra e non disconnettere il controller. ",
"Range calibration": "Calibrazione del range",
"<b>The controller is now sampling data!</b>": "<b>Il controller sta campionando i dati!</b>",
"The controller is now sampling data!": "Il controller sta campionando i dati!",
"Done": "Fatto",
"Hi, thank you for using this software.": "Ciao, grazie per aver usato questo software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Se lo hai trovato utile e vuoi supportare i miei sforzi, sentiti libero di",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Connesso dispositivo non valido",
"Error": "Errore",
"My handle on discord is: the_al": "Il mio handle su discord è: the_al",
"Initializing...": "Inizializzo...",
"Storing calibration...": "Salvo la calibrazione...",
"Sampling...": "Campiono...",
"Calibration in progress": "Calibrazione in corso",
"Start": "Avvia",
"Continue": "Continua",
"You can check the calibration with the": "Puoi controllare la calibrazione con il",
"Have a nice day :)": "Buona giornata! :)",
"Welcome to the Calibration GUI": "Benvenuto alla Calibration GUI",
"Just few things to know before you can start:": "Alcune cose da sapere prima di iniziare:",
@@ -124,8 +121,6 @@
", to help more people like you!": ", per aiutare più persone come te!",
"This website uses analytics to improve the service.": "Questo sito web utilizza analytics per migliorare il servizio.",
"Board Model": "Modello scheda",
"This feature is experimental.": "Questa funzionalità è sperimentale.",
"Please let me know if the board model of your controller is not detected correctly.": "Scrivimi se il modello della scheda del tuo controller non viene riconosciuto correttamente.",
"This DualSense controller has outdated firmware.": "Questo controller DualSense ha un firmware non aggiornato.",
"Please update the firmware and try again.": "Aggiorna il firmware e riprova.",
"Joystick Info": "Informazioni sui Joystick",
@@ -305,10 +300,37 @@
"skipped": "saltato",
"tests completed": "test completati",
"to increase the non-circularity.": "per aumentare la non-circolarità.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Connetti un controller DualShock 4, DualSense, DualSense Edge o VR2 al computer e premi Connetti.",
"Cannot copy text to the clipboard:": "Non posso copiare il testo negli appunti:",
"The device appears to be a clone. All calibration functionality is disabled.": "Il dispositivo sembra un clone. Le funzioni di calibrazione sono disattivate.",
"The item has been copied to the clipboard.": "Testo copiato negli appunti.",
"Cannot read module barcodes": "Errore nella lettura dei codici a barre dei moduli",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Clear All": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"No saved calibrations found.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}

View File

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

View File

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

View File

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

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "Tłumaczenie na język polski wykonał <a href='https://github.com/Marekk2k'>Marekk</a>, oraz <a href='https://github.com/GoomisPL'>GoomisPL</a>",
"DualShock Calibration GUI": "DualShock Calibration GUI",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Nie wspierana przeglądarka! Proszę użyć przeglądarki internetowej wpierającą WebHID (np. Chrome).",
"Connect": "Połącz",
"Connected to:": "Połączono z:",
"Disconnect": "Rozłącz kontroler",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Ponowne centrowanie drążków kontrolera.",
"Please do not close this window and do not disconnect your controller. ": "Proszę nie zamykaj tego okna, ani nie odłączaj swojego kontrolera. ",
"Range calibration": "Kalibracja maksymalnego zakresu drążków",
"<b>The controller is now sampling data!</b>": "<b>Kontroler zbiera teraz dane!</b>",
"The controller is now sampling data!": "Kontroler zbiera teraz dane!",
"Done": "Gotowe",
"Hi, thank you for using this software.": "Cześć, dzięki ci za użycie tego oprogramowania.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Jeżeli uznałeś to narzędzie za pomocne, i chcesz wesprzeć mój wysiłek, nie krępuj się",
@@ -67,14 +66,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Podłączono nieznane urządzenie",
"Error": "Błąd",
"My handle on discord is: the_al": "Mój Discord to: the_al",
"Initializing...": "Inicjowanie...",
"Storing calibration...": "Zapisywanie kalibracji...",
"Sampling...": "Próbowanie...",
"Calibration in progress": "Kalibracja w toku",
"Start": "Start",
"Continue": "Kontynuuj",
"You can check the calibration with the": "Możesz sprawdzić kalibrację za pomocą",
"Have a nice day :)": "Życzę ci miłego dnia! :)",
"Welcome to the Calibration GUI": "Witamy w Calibration GUI",
"Just few things to know before you can start:": "O to kilka rzeczy o których musisz wiedzieć przed rozpoczęciem",
@@ -124,9 +121,6 @@
", to help more people like you!": ", aby pomóc większej ilości osób takich jak ty!",
"This website uses analytics to improve the service.": "Ta strona korzysta z analiz w celu ulepszenia usług.",
"Board Model": "Model płytki",
"This feature is experimental.": "Ta funkcja jest eksperymentalna.",
"Please let me know if the board model of your controller is not detected correctly.": "Jeżeli model płytki został wykryty błędnie prosimy o kontakt",
"Board model detection thanks to": "Podziękowania dla osoby za funkcję wykrywania modelu płytki",
"This DualSense controller has outdated firmware.": "Ten kontroler Dualsense posiada przestarzały firmware.",
"Please update the firmware and try again.": "Proszę zaktualizuj firmware i spróbuj ponownie.",
"Joystick Info": "Informacje o drążkach",
@@ -189,7 +183,6 @@
"Cannot unlock": "Nie można odblokować",
"Cobalt Blue": "Cobalt Blue",
"Color": "Kolor",
"Color detection thanks to": "Podziękowania dla osoby za funkcję wykrywania kolorów",
"Cosmic Red": "Cosmic Red",
"DualSense Edge Calibration": "Kalibracja Dualsense Edge",
"For more info or help, feel free to reach out on Discord.": "Aby uzyskać więcej informacji lub pomoc, skontaktuj się do nas na Discordzie",
@@ -309,6 +302,99 @@
"skipped": "pominięto",
"tests completed": "testy zakończone",
"to increase the non-circularity.": "by zwiększyć nie-okrężność",
"Cannot read module barcodes": "",
"Cannot copy text to the clipboard:": "",
"The item has been copied to the clipboard.": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Center": "",
"Circularity": "",
"Clear All": "",
"Controller does not support adaptive trigger control": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Don't show again": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Fail": "",
"Failed": "",
"Failed to connect to device": "",
"Failed to disable adaptive trigger": "",
"Failed to set speaker tone": "",
"Failed to set vibration": "",
"Feel for vibration in the controller.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Haptic Vibration": "",
"Headphone Jack": "",
"Increase non-circularity": "",
"Instructions": "",
"It appears the latest joystick calibration has not been saved.": "",
"Keep rotating the sticks even if you see no progress!": "",
"Last connected": "",
"Learn more...": "",
"Lights": "",
"Listen for a tone from the controller speaker.": "",
"Long-press [circle] to skip ahead.": "",
"Microphone": "",
"Microphone Level:": "",
"No controller connected": "",
"No saved calibrations found.": "",
"No tests completed yet.": "",
"Not tested": "",
"Pass": "",
"Passed": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Plug in headphones to the 3.5mm jack": "",
"Press L2 and R2 triggers to feel the trigger resistance.": "",
"Press [circle] to close, or [square] to start over": "",
"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": "",
"Restore": "",
"Restore calibration": "",
"Rotate the sticks slowly at least 2 times in one direction and 2 times in the other direction to cover the whole range.": "",
"Run through these tests to verify your controller's functionality.": "",
"Sony controllers come from the factory calibrated to have an average circularity error of nearly 10 %, and this is now what games expect. Too perfect circularity can make movements and aim feel stiff and unresponsive in some games.": "",
"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 calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This test checks all controller buttons by requiring you to press each button up to three times.": "",
"This test checks the headphone jack functionality.": "",
"This test checks the reliability of the USB port.": "",
"This test will cycle through red, green, and blue colors on the controller lightbar, animate the player indicator lights, and flash the mute button.": "",
"This test will enable heavy resistance on both L2 and R2 triggers.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"failed": "",
"hide": "",
"passed": "",
"serial number": "",
"skipped": "",
"tests completed": "",
"to increase the non-circularity.": "",
"": ""
}
}

View File

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

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Tradução para Português de Portugal realizada por @dualsense_no_drift :)",
"DualShock Calibration GUI": "GUI Calibração de DualShock",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Navegador não suportado. Por favor, use um navegador de web com suporte ao WebHID (por exemplo, Chrome).",
"Connect": "Conectar",
"Connected to:": "Conectado a:",
"Disconnect": "Desconectar",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "A recentrar os manípulos do controlador.",
"Please do not close this window and do not disconnect your controller. ": "Por favor, não feche esta janela e não desconecte o seu controlador. ",
"Range calibration": "Calibração de alcançe",
"<b>The controller is now sampling data!</b>": "<b>O controlador está agora a recolher dados!</b>",
"The controller is now sampling data!": "O controlador está agora a recolher dados!",
"Done": "Concluído",
"Hi, thank you for using this software.": "Olá, obrigado por usar este software.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Se está a achar útil e quiser suportar-me os esforços, sinta-se à vontade para",
@@ -66,14 +65,12 @@
"Sony DualSense Edge": "Sony DualSense Edge",
"Connected invalid device": "Dispositivo inválido ligado",
"Error": "Erro",
"My handle on discord is: the_al": "Meu nome de utilizador no Discord é: the_al",
"Initializing...": "Iniciando...",
"Storing calibration...": "Armazenando a calibração...",
"Sampling...": "Amostragem...",
"Calibration in progress": "Calibração em progresso",
"Start": "Inicio",
"Continue": "Continuar",
"You can check the calibration with the": "Pode verificar a calibração com o",
"Have a nice day :)": "Tenha um bom dia :)",
"Welcome to the Calibration GUI": "Bem-vindo à GUI de Calibração",
"Just few things to know before you can start:": "Algumas coisas que precisa de saber antes de começar:",
@@ -123,8 +120,6 @@
", to help more people like you!": ", para ajudar mais pessoas como você!",
"This website uses analytics to improve the service.": "Este site utiliza análises para melhorar o serviço.",
"Board Model": "Modelo da Placa",
"This feature is experimental.": "Esta funcionalidade é experimental.",
"Please let me know if the board model of your controller is not detected correctly.": "Por favor, avise-me se o modelo da placa do seu controlador não for detectado corretamente.",
"This DualSense controller has outdated firmware.": "Este controlador DualSense possui um firmware desatualizado.",
"Please update the firmware and try again.": "Por favor, atualize o firmware e tente novamente.",
"Joystick Info": "Informações do Joystick",
@@ -287,28 +282,54 @@
"tests completed": "testes concluídos",
"to increase the non-circularity.": "para aumentar a não circularidade.",
"30th Anniversary": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Astro Bot": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Chroma Indigo": "",
"Chroma Pearl": "",
"Chroma Teal": "",
"Clear All": "",
"Cobalt Blue": "",
"Cosmic Red": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"Fortnite": "",
"Galactic Purple": "",
"God of War Ragnarok": "",
"Grey Camouflage": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"Midnight Black": "",
"No saved calibrations found.": "",
"Nova Pink": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"Spider-Man 2": "",
"Starlight Blue": "",
"Sterling Silver": "",
"The Last of Us": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The device appears to be a clone. All calibration functionality is disabled.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"Volcanic Red": "",
"White": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}

View File

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

View File

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

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Çeviri: <a href='https://www.youtube.com/channel/UC8pzDCIt_CUj8sa7cYgPzHQ'>Tamir-Teknik</a> ve <a href='https://share.google/hCBJV5fFMbd5gJxxZ'>CzR PlayStation&Bilgisayar Teknik Servis</a> tarafından yapılmıştır.",
"DualShock Calibration GUI": "DualShock Kalibrasyon Arayüzü",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Desteklenmeyen tarayıcı. Lütfen WebHID desteği olan bir web tarayıcısı kullanın (örneğin, Chrome).",
"Connect": "Bağlan",
"Connected to:": "Bağlanılan Cihaz:",
"Disconnect": "Bağlantıyı Kes",
@@ -10,11 +9,11 @@
"Sections below are not useful, just some debug infos or manual commands": "Aşağıdaki bölümler kullanışlı değildir, sadece bazı hata ayıklama bilgileri veya manuel komutlar içerir",
"NVS Status": "NVS Durumu",
"Unknown": "Bilinmiyor",
"Query NVS status": "NVS Durumunu Sorgula",
"NVS unlock": "NVS Kilidini Aç",
"NVS lock": "NVS Kilitle",
"Query NVS status": "NVS durumunu sorgula",
"NVS unlock": "NVS kilidini aç",
"NVS lock": "NVS kilitle",
"Stick center calibration": "Analog Merkezi Kalibrasyonu",
"Welcome": "Hoş Geldiniz",
"Welcome": "Hoş geldiniz",
"Step 1": "1.Adım",
"Step 2": "2.Adım",
"Step 3": "3.Adım",
@@ -34,7 +33,7 @@
"Recentering the controller sticks.": "Denetleyici analoglarını yeniden merkezleme.",
"Please do not close this window and do not disconnect your controller. ": "Lütfen bu pencereyi kapatmayın ve denetleyici bağlantısını kesmeyin. ",
"Range calibration": "Ara Mesafe Kalibrasyonu",
"<b>The controller is now sampling data!</b>": "<b>Denetleyici şu anda veri örnekleme yapıyor!</b>",
"The controller is now sampling data!": "Denetleyici şu anda veri örnekleme yapıyor!",
"Done": "Tamamlandı",
"Hi, thank you for using this software.": "Merhaba, bu yazılımı kullandığınız için teşekkür ederim.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Yararlı bulduysanız ve çabalarımı desteklemek istiyorsanız, bana destek olabilirsiniz.",
@@ -42,12 +41,12 @@
"! :)": "! :)",
"Do you have any suggestion or issue? Drop me a message via email or discord.": "Herhangi bir öneriniz veya sorunuz var mı? Bana e-posta veya discord üzerinden mesaj atabilirsiniz.",
"Cheers!": "Teşekkürler!",
"Support this project": "Bu Projeyi Destekle",
"Support this project": "Bu projeyi destekle",
"unknown": "Bilinmeyen",
"original": "Orijinal",
"clone": "Yan Sanayi",
"locked": "Kilitli",
"unlocked": "Kilidi Açık",
"unlocked": "Kilidi açık",
"error": "Hata",
"Build Date": "Derleme Tarihi",
"HW Version": "Donanım Sürümü",
@@ -67,15 +66,13 @@
"Connected invalid device": "Geçersiz bir cihaz bağlandı",
"The device appears to be a clone. All calibration functionality is disabled.": "Bağladığınız kol yan sanayi, bu nedenle tüm kalibrasyon işlevleri devre dışı bırakıldı.",
"Error": "Hata",
"My handle on discord is: the_al": "Discord'daki kullanıcı adım: the_al",
"Initializing...": "Başlatılıyor...",
"Storing calibration...": "Kalibrasyon kaydediliyor...",
"Sampling...": "Örnekleme yapılıyor...",
"Calibration in progress": "Kalibrasyon devam ediyor",
"Start": "Başlat",
"Continue": "Devam",
"You can check the calibration with the": "Kalibrasyonu şununla kontrol edebilirsiniz:",
"Have a nice day :)": " CzR PS&PC ekibi olarak keyifli oyunlar ve iyi günler dileriz 🎮",
"Have a nice day :)": "İyi günler! :)",
"Welcome to the Calibration GUI": "Kalibrasyon Arayüzü'ne hoş geldiniz",
"Just few things to know before you can start:": "Başlamadan önce bilmeniz gereken birkaç şey:",
"This website is not affiliated with Sony, PlayStation &amp; co.": "Bu web sitesi, Sony, PlayStation ve diğerleri ile ilişkili değildir.",
@@ -124,12 +121,10 @@
", to help more people like you!": ", sizin gibi daha fazla insanın faydalanması için!",
"This website uses analytics to improve the service.": "Bu web sitesi hizmeti iyileştirmek için analiz kullanıyor.",
"Board Model": "Kart Modeli",
"This feature is experimental.": "Bu özellik deneysel.",
"Please let me know if the board model of your controller is not detected correctly.": "Denetleyicinizin kart modeli doğru tespit edilmezse lütfen bana bildirin.",
"This DualSense controller has outdated firmware.": "Bu DualSense denetleyicisinin yazılımı güncel değil.",
"Please update the firmware and try again.": "Lütfen yazılımı güncelleyin ve tekrar deneyin.",
"Joystick Info": "Joystick Bilgisi",
"Check circularity": "Daireselliği Kontrol Et",
"Check circularity": "Daireselliği kontrol et",
"Can I reset a permanent calibration to previous calibration?": "Kalıcı bir kalibrasyonu önceki kalibrasyona sıfırlayabilir miyim?",
"No.": "Hayır.",
"Can you overwrite a permanent calibration?": "Kalıcı bir kalibrasyonun üzerine yeniden yazabilir miyiz?",
@@ -147,8 +142,8 @@
"Only after you have done that, you click on \"Done\".": "Ancak bunu yaptıktan sonra \"Tamam\" butonuna basmalısınız.",
"Changes saved successfully": "Değişiklikler başarıyla kaydedildi.",
"Error while saving changes": "Değişiklikleri kaydederken hata:",
"Save changes permanently": "Değişiklikleri Kalıcı Olarak Kaydet",
"Reboot controller": "Denetleyiciyi Yeniden Başlat",
"Save changes permanently": "Değişiklikleri kalıcı olarak kaydet",
"Reboot controller": "Denetleyiciyi yeniden başlat",
"(beta)": "(beta)",
"30th Anniversary": "30. Yıl Dönümü",
"<b>Externally</b>: by applying +1.8V directly to the visible test point without opening the controller.": "<b>Harici olarak</b>: Denetleyiciyi açmadan görünür test noktasına doğrudan +1.8V uygulayarak",
@@ -187,7 +182,7 @@
"Hardware": "Donanım",
"If the calibration is not stored permanently, please double-check the wirings of the hardware mod.": "Kalibrasyon kalıcı olarak kaydedilmezse, lütfen donanım modunun kablolamasını iki kez kontrol edin.",
"Left Module Barcode": "Sol Modül Barkodu",
"Left stick": "Sol Analog",
"Left stick": "Sol analog",
"MCU Unique ID": "MCU Benzersiz Kimliği",
"Midnight Black": "Gece Yarısı Siyahı",
"More details and images": "Daha fazla detay ve görsel",
@@ -196,10 +191,10 @@
"Please note: the stick modules on the DS Edge <b>cannot be calibrated via software alone</b>.": "Lütfen dikkat: DS Edge üzerindeki analog modülleri <b>yalnızca yazılım aracılığıyla kalibre edilemez</b>.",
"To store a custom calibration on the stick's internal memory, a <b>hardware modification</b> is required.": "Özelleştirilmiş bir kalibrasyonu analogun dahili belleğine kaydetmek için bir <b>donanım değişikliği</b> gereklidir.",
"Right Module Barcode": "Sağ Modül Barkodu",
"Right stick": "Sağ Analog",
"Right stick": "Sağ analog",
"SBL FW Version": "SBL FW Sürümü",
"Serial Number": "Seri Numarası",
"Show all": "Tümünü Göster",
"Show all": "Tümünü göster",
"Software": "Yazılım",
"Spider FW Version": "Örümcek FW Sürümü",
"Spider-Man 2": "Örümcek-Adam 2",
@@ -230,11 +225,15 @@
"Circularity (R1)": "Dairesellik (R1)",
"Move the stick to select it for tuning, then without touching the stick use the D-pad buttons to adjust the center point. Flick it and adjust it again if it is off center or flickers.": "Analoğu ayar için seçin, ardından analoğa dokunmadan yön tuşlarını kullanarak merkez noktasını ayarlayın. Analoğu hafifçe oynatın, merkezden kaymışsa veya titreme oluyorsa tekrar ayarlayın.",
"Please release the stick to center position before adjusting with D-pad buttons.": "Lütfen yön tuşlarıyla ayarlamadan önce analoğu merkez konumuna bırakın.",
<<<<<<< HEAD
"Press the D-pad or face buttons in the direction you want the stick position to move.": "Analoğun konumunu hareket ettirmek istediğiniz yöne (↑, ↓, ⬅, ➡) veya (△, ☐, O, ✕) tuşlarına basarak ayarlayın.",
=======
"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.",
>>>>>>> 1cf7120 (Show power-saving warning in Quick Test modal when battery is low)
"Push the stick straight up/down/left/right as far as possible.": "Analoğu mümkün olduğunca yukarı/aşağı/sola/sağa itin.",
"Show raw numbers": "Ham değerleri göster",
"The device is connected via Bluetooth. Disconnect and reconnect using a USB cable instead.": "Cihaz Bluetooth üzerinden bağlı. Bunun yerine bağlantıyı kesip USB kablosu ile yeniden bağlayın.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Cihazınız orijinal Sony kolu olmayabilir. Eğer yan sanayi değilse lütfen bu sorunu bildirin.",
"Your device might not be a genuine Sony controller. If it is not a clone then please report this issue.": "Cihazınız orijinal Sony kolu olmayabilir. Eğer yansanayi değilse lütfen bu sorunu bildirin.",
"<strong>Average circularity error:</strong> smaller is not always better! Aim for 7-9 %.": "<strong>Ortalama dairesellik hatası:</strong> daha küçük her zaman daha iyi değildir! %79 aralığını hedefleyin.",
"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",
@@ -247,7 +246,7 @@
"Controller does not support adaptive trigger control": "Bu kontrol cihazı uyarlanabilir tetik kontrolünü desteklemiyor.",
"Don't show again": "Bir daha gösterme",
"Fail": "Başarısız",
"Failed": "Başarısız Oldu",
"Failed": "Başarısız oldu",
"Failed to connect to device": "Cihaza bağlanılamadı",
"Failed to disable adaptive trigger": "Uyarlanabilir tetik devre dışı bırakılamadı",
"Failed to set speaker tone": "Hoparlör sesi ayarlanamadı",
@@ -255,33 +254,33 @@
"Feel for vibration in the controller.": "Kontrol cihazındaki titreşimi hissedin.",
"Haptic Vibration": "Dokunsal Titreşim",
"Headphone Jack": "Kulaklık Girişi",
"Increase non-circularity": "Dairesellikten Sapmayı Artır",
"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.": "[circle] tuşuna uzun basarak atla.",
"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",
"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": "[circle] ile Kapatın veya [square] ile Yeniden Başlayın",
"Press [square] to Pass, [cross] to Fail, or [circle] to skip.": "[square] ile Geç, [cross] ile Başarısız, [circle] ile Atla.",
"Press [square] to begin or [circle] to close": "[square] ile Başlatın veya [circle] ile Kapatın",
"Press [triangle] to go back.": "[triangle] ile Geri Dönün.",
"Press [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",
"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",
"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.",
@@ -289,7 +288,7 @@
"Step size": "Adım boyutu",
"Test Speaker": "Hoparlörü Test Et",
"Test Summary": "Test Özeti",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Tüm tuşları test edin veya [square] tuşuna uzun basarak Geçin, [cross] tuşuna uzun basarak Başarısız, [circle] ile atlayın.",
"Test all buttons, or long-press [square] to Pass and [cross] to Fail, or [circle] to skip.": "Tüm tuşları test edin veya 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.",
@@ -300,15 +299,44 @@
"Watch the controller lights change colors, the player lights animate, and the mute button flash.": "Kontrol cihazı ışıklarının renk değiştirmesini, oyuncu ışıklarının animasyon yapmasını ve sessiz düğmesinin yanıp sönmesini izleyin.",
"While holding the stick to be adjusted straight up/down/left/right, make adjustments until you see lightblue sectors in all four directions after circling the stick both left and right. Then use the": "Ayarlanacak analoğu yukarı/aşağı/sol/sağ konumda tutarken, analoğu hem sola hem sağa çevirdikten sonra dört yönde açık mavi alanlar görene kadar ayarlamalar yapın. Ardından şunu kullanın:",
"Wiggle the USB cable to see if the controller disconnects.": "Kontrol cihazının bağlantısının kopup kopmadığını görmek için USB kablosunu hafifçe oynatın.",
"failed": "Başarısız",
"hide": "Gizle",
"passed": "Geçti",
"skipped": "Atlanmış",
"tests completed": "Tamamlanan Testler",
"failed": "başarısız",
"hide": "gizle",
"passed": "geçti",
"skipped": "atlanmış",
"tests completed": "tamamlanan testler",
"to increase the non-circularity.": "Dairesellikten sapmayı artırmak için.",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "Lütfen bir DualShock 4, DualSense, DualSense Edge veya VR2 kontrolcüsünü bilgisayarınıza bağlayın ve Bağlan butonuna basın.",
"Cannot copy text to the clipboard:": "Metin panoya kopyalanamıyor:",
"The item has been copied to the clipboard.": "Öğe panoya kopyalandı.",
"Cannot read module barcodes": "",
"After they have been replaced, this utility can be used to calibrate the controller to work with the new joysticks.": "",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Battery level is low. Tests may fail due to the controller being in power saving mode.": "",
"Calibrating without replacing the joysticks may help temporarily, but it may also make the problem worse, with no way to undo it.": "",
"Calibration History": "",
"Clear All": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"Drift is caused by mechanical parts in the joystick being worn out, and they need to be replaced to fix the drift.": "",
"Firefox is supported with the WebHID extension installed.": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"No saved calibrations found.": "",
"Please use a web browser with WebHID support (e.g. Google Chrome or Microsoft Edge) on a PC or Mac.": "",
"Restore": "",
"Restore calibration": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"This utility cannot fix stick drift.": "",
"Unsupported browser.": "",
"Use expert mode": "",
"Use four-step calibration": "",
"Use normal mode": "",
"Use quick calibration": "",
"Using this utility on a phone or tablet is not supported.": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}
}

View File

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

View File

@@ -1,7 +1,6 @@
{
".authorMsg": "- Bản dịch tiếng Việt do MeoU cung cấp",
"DualShock Calibration GUI": "Giao diện Hiệu chỉnh Tay cầm",
"Unsupported browser. Please use a web browser with WebHID support (e.g. Chrome).": "Trình duyệt không được hỗ trợ. Vui lòng sử dụng trình duyệt có hỗ trợ WebHID (ví dụ: Chrome).",
"Connect": "Kết nối",
"Connected to:": "Đã kết nối với:",
"Disconnect": "Ngắt kết nối",
@@ -35,7 +34,7 @@
"Recentering the controller sticks.": "Đang định vị lại tâm analog.",
"Please do not close this window and do not disconnect your controller. ": "Vui lòng không đóng cửa sổ này và không ngắt kết nối tay cầm.",
"Range calibration": "Hiệu chỉnh phạm vi ngoài analog",
"<b>The controller is now sampling data!</b>": "<b>Tay cầm hiện đang lấy mẫu dữ liệu!</b>",
"The controller is now sampling data!": "Tay cầm hiện đang lấy mẫu dữ liệu!",
"Done": "Hoàn thành",
"Hi, thank you for using this software.": "Chào, cảm ơn mày đã sử dụng phần mềm này.",
"If you're finding it helpful and you want to support my efforts, feel free to": "Nếu mày thấy nó hữu ích và muốn ủng hộ công sức của tao, hãy ủng hộ nhé!",
@@ -68,14 +67,12 @@
"Connected invalid device": "Đã kết nối thiết bị không hợp lệ",
"The device appears to be a clone. All calibration functionality is disabled.": "Thiết bị có vẻ là hàng nhái. Tất cả chức năng hiệu chỉnh đều bị vô hiệu hóa.",
"Error": "Lỗi",
"My handle on discord is: the_al": "Tên Discord của tao là: the_al",
"Initializing...": "Đang khởi tạo...",
"Storing calibration...": "Đang lưu hiệu chỉnh...",
"Sampling...": "Đang lấy mẫu...",
"Calibration in progress": "Đang tiến hành hiệu chỉnh",
"Start": "Bắt đầu",
"Continue": "Tiếp tục",
"You can check the calibration with the": "Mày có thể kiểm tra hiệu chỉnh bằng",
"Have a nice day :)": "Chúc mày một ngày tốt lành :)",
"Welcome to the Calibration GUI": "Chào mừng đến với Giao diện Hiệu chỉnh",
"Just few things to know before you can start:": "Vài điều cần biết trước khi mày bắt đầu:",
@@ -125,8 +122,6 @@
", to help more people like you!": "để giúp đỡ nhiều người hơn như mày!",
"This website uses analytics to improve the service.": "Trang web này sử dụng công cụ phân tích để cải thiện chất lượng dịch vụ.",
"Board Model": "Mẫu bo mạch",
"This feature is experimental.": "Tính năng này mang tính thử nghiệm.",
"Please let me know if the board model of your controller is not detected correctly.": "Nếu mẫu bo mạch của tay cầm không được phát hiện chính xác, vui lòng cho tao biết.",
"This DualSense controller has outdated firmware.": "Tay cầm DualSense này có firmware đã lỗi thời.",
"Please update the firmware and try again.": "Vui lòng cập nhật firmware và thử lại.",
"Joystick Info": "Thông tin Joystick",
@@ -306,9 +301,27 @@
"skipped": "đã bỏ qua",
"tests completed": "bài kiểm tra đã hoàn thành",
"to increase the non-circularity.": "để tăng độ không tròn.",
"Aim for a circularity error of around 7-9 % for the best playing experience.": "",
"Calibration History": "",
"Cannot copy text to the clipboard:": "",
"Cannot read module barcodes": "",
"Clear All": "",
"Current": "",
"Delete": "",
"Delete all calibration history for this controller? This cannot be undone.": "",
"Delete this calibration entry?": "",
"It appears the latest joystick calibration has not been saved.": "",
"Last connected": "",
"No saved calibrations found.": "",
"Please connect a DualShock 4, a DualSense, DualSense Edge or VR2 controller to your computer and press Connect.": "",
"Restore": "",
"Restore calibration": "",
"The calibration was restored successfully! Remember to save the changes in order not to loose them when the controller is rebooted.": "",
"The item has been copied to the clipboard.": "",
"This controller has unsaved changes that will be lost when the controller is rebooted.": "",
"Use expert mode": "",
"Use normal mode": "",
"Values": "",
"You should save your changes, or reboot the controller to revert back to the previous state.": "",
"serial number": "",
"": ""
}

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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