{
  "_version": 1,
  "localConfig": {
    "createConfigDirError": "Cannot create directory for local config file",
    "createConfigError": "Cannot create local config file",
    "writeConfigError": "Cannot write to local config file",
    "serializeConfigError": "Cannot serialize local config",
    "readConfigError": "Cannot read local config file"
  },
  "web": {
    "ws": {
      "connected": "WS connected",
      "disconnected": "WS disconnected",
      "receiverLagged": "WS channel receiver lagged, skipped %{skipped} messages",
      "wsChannelClosed": "WS channel closed or error occurred",
      "failedToParseMessage": "Failed to parse message"
    },
    "server": {
      "startingOn": "Starting web server on",
      "webServerAccessible": "Web server is accessible at",
      "failedToOpenBrowser": "Failed to open browser",
      "responseError": "Response Error"
    },
    "mapping": {
      "setActiveMapping": "Set active mapping",
      "setActiveMappingSuccess": "Successfully set active mapping",
      "failedToLoadMappingConfig": "Failed to load mapping config",
      "nameNotSafe": "Mapping config name is not safe",
      "mappingConfigExists": "Mapping config already exists",
      "createMappingConfig": "Create new mapping config",
      "cannotDeleteActiveMapping": "Cannot delete active mapping",
      "mappingConfigNotExists": "Mapping config not exists",
      "deleteMappingConfigError": "Failed to delete mapping config",
      "mappingConfigNotFound": "Mapping config not found",
      "renameActivateMappingSuccess": "Successfully rename mapping config from %{oldFile} to %{newFile}. Successfully set active mapping %{newFile}",
      "renameMappingConfigSuccess": "Successfully rename mapping config from %{file} to %{newFile}",
      "copyMappingConfig": "Copy mapping config from %{file} to %{newFile}",
      "updateAndActivateMappingConfig": "Update and activate mapping config",
      "failedToLoadUpdatedMappingConfig": "Failed to load updated mapping config",
      "updateMappingConfig": "Update mapping config",
      "unableReadMappingConfigDir": "Unable to read mapping config dir",
      "readMappingListSuccess": "Successfully read mapping list",
      "cannotReadMappingConfig": "Cannot read mapping config",
      "cannotDeserializeConfig": "Cannot deserialize mapping config",
      "invalidMappingConfig": "Invalid mapping config",
      "mappingReadSuccess": "Successfully read mapping config",
      "invalidSize": "Invalid size",
      "migrateMappingConfig": "Migrate mapping config from %{file} to %{newFile}",
      "deleteMappingConfig": "Delete mapping config"
    },
    "device": {
      "deviceListObtained": "Successfully obtained device list",
      "alreadyControlled": "Device is already controlled",
      "pushScrcpyServerSuccess": "Push scrcpy server to device successfully",
      "reverseSuccess": "Reverse %{remote} to %{local} successfully",
      "removingDeviceAfterExit": "scrcpy has exited, removing corresponding device",
      "tryStartingScrcpy": "Trying to start scrcpy app",
      "decontrolDevice": "Decontrol device",
      "reconnectDevice": "Reconnect device",
      "deviceNotFound": "Device not found",
      "adbConnect": "Adb connect %{address} successfully",
      "adbConnectFailed": "Adb connect %{address} failed",
      "adbPairSuccess": "Adb pair %{address} with code %{code} successfully",
      "adbPairFailed": "Adb pair %{address} with code %{code} failed",
      "screenshotError": "Failed to take screenshot for device",
      "failedGetScreenshotFile": "Failed to get screenshot file",
      "failedRemoveScreenshot": "Failed to remove screenshot file for device",
      "noDeviceControlled": "No device under controlled",
      "setDisplayPowerSuccess": "Set display power of all controlled devices successfully",
      "evalScriptSuccess": "Eval script successfully",
      "evalScriptError": "Eval script failed",
      "startingScrcpyApp": "Start scrcpy app...",
      "sendKeySuccess": "Send key to all controlled devices successfully"
    },
    "config": {
      "getLocalConfigSuccess": "Successfully get local config",
      "invalidLanguage": "Invalid language",
      "setLanguageSuccess": "Successfully set language",
      "languageMustBeString": "The language must be string",
      "restartToApplyWebPort": "Please restart app to apply new web_port",
      "webPortMustBeU16": "The web_port must be u16",
      "adbPathSetSuccess": "Successfully set adb_path",
      "adbPathSetFailed": "Failed to set adb_path",
      "adbPathMustBeString": "The adb_path must be string",
      "restartToApplyControllerPort": "Please restart app to apply new controller_port",
      "controllerPortMustBeU16": "The controller_port must be u16",
      "setVerticalMaskHeightSuccess": "Successfully set vertical_mask_height",
      "verticalMaskHeightMustBeu32": "The vertical_mask_height must be u32",
      "setHorizontalMaskWidthSuccess": "Successfully set horizontal_mask_width",
      "horizontalMaskWidthMustBeu32": "The horizontal_mask_width must be u32",
      "setVerticalPositionSuccess": "Successfully set vertical_position",
      "verticalPositionTypeError": "vertical_position must be array [i32, i32]",
      "setHorizontalPositionSuccess": "Successfully set horizontal_position",
      "horizontalPositionTypeError": "The horizontal_position must be array [i32, i32]",
      "pleaseRequestForOperation": "Please request %{api} for this operation",
      "setMappingLabelOpacitySuccess": "Successfully set mapping_label_opacity",
      "mappingLabelOpacityRange": "The mapping_label_opacity must be between 0.0 and 1.0",
      "invalidMappingKey": "Invalid config key",
      "successfullySet": "Successfully set",
      "setClipboardSyncSuccess": "Successfully set clipboard_sync",
      "clipboardSyncTypeError": "The clipboard_sync must be bool",
      "invalidVideoCodec": "Unsupported video codec",
      "videoCodecTypeError": "The video_codec must be string",
      "setVideoCodecSuccess": "Successfully set video_codec (takes effect on next connection)",
      "videoBitRateTypeError": "The video_bit_rate must be u32",
      "setVideoBitRateSuccess": "Successfully set video_bit_rate (takes effect on next connection)",
      "setVideoMaxSizeSuccess": "Successfully set video_max_size (takes effect on next connection)",
      "videoMaxSizeTypeError": "The video_max_size must be u32",
      "setVideoMaxFpsSuccess": "Successfully set video_max_fps (takes effect on next connection)",
      "videoMaxFpsTypeError": "The video_max_fps must be u32",
      "alwaysOnTopMustBeBool": "The always_on_top must be bool",
      "openDataPathFailed": "Failed to open data path",
      "openDataPathSuccess": "Successfully open data path",
      "getUpdateInfoSuccess": "Successfully get update info"
    }
  },
  "utils": {
    "cannotGetCurrentExePath": "Cannot get current executable path",
    "noParentDirectory": "No parent directory for executable",
    "checkForUpdateFailed": "Check for update failed",
    "updateAvailable": "Update available",
    "noUpdateAvailable": "Already up to date"
  },
  "scrcpy": {
    "syncClipboardFromMain": "Sync clipboard from main device",
    "deviceRotation": "Device %{scid} rotation %{degree}°",
    "crChannelClosed": "CR channel closed, exiting msg handler",
    "startingController": "Starting scrcpy controller",
    "startReceiveCommand": "Starting to receive command from web server",
    "deviceNotRecorded": "Controlled device not recorded",
    "errorAcceptingConnection": "Error accepting connection",
    "creatingMainControl": "Creating scrcpy main control connection",
    "creatingMainVideo": "Creating scrcpy main video connection",
    "creatingSubControl": "Creating scrcpy sub control connection",
    "mainConnectionNotExist": "Scrcpy main connection not exists",
    "shutdownMain": "Shutting down scrcpy main connection",
    "subConnectionNotExist": "Scrcpy sub connection not exists",
    "shutdownSub": "Shutting down scrcpy sub connection",
    "dChannelClosed": "D channel closed, exiting msg handler",
    "controllerStopped": "Scrcpy controller stopped",
    "failedReadControlConnection": "Failed to read from scrcpy control connection",
    "controlConnectionCancelled": "Scrcpy control connection read half cancelled manually",
    "controlConnWriteFailed": "Failed to write to control connection write half",
    "controlChannelClosed": "Control channel closed or error occurred",
    "controlCnnShutdownUnexpectedly": "Scrcpy control write connection shutdown unexpectedly",
    "invalidDeviceName": "Received invalid UTF-8 device name",
    "controlConnectionReaderCancelled": "Scrcpy control connection reader half cancelled manually",
    "controlReadShutdownUnexpectedly": "Scrcpy control read connection shutdown unexpectedly",
    "handleControlConnection": "Handling scrcpy control connection...",
    "controlConnectionClosed": "Scrcpy control connection closed",
    "handleVideoConnection": "Handling scrcpy video connection...",
    "failedToReadControlMetadata": "Failed to read control metadata",
    "failedToReadVideoMetadata": "Failed to read video metadata",
    "invalidVideoCodec": "Unsupported VideoCodec identifier",
    "failedToReadFrameHeader": "Faild to read media packet header",
    "videoConnectionReaderCancelled": "Scrcpy video connection cancelled manually",
    "videoReadShutdownUnexpectedly": "Scrcpy video connection shutdown unexpectedly",
    "videoConnectionClosed": "Scrcpy video connection closed",
    "unknownControlMsg": "Unknown control message from main device",
    "videoCodec": "Video Codec",
    "noDefaultOutputDevice": "no output device available"
  },
  "controller": {
    "csReceiverLagged": "CS receiver lagged, skipped %{skipped} messages"
  },
  "adb": {
    "failedToOpenFile": "Failed to open file",
    "failedToPushFile": "Failed to push file",
    "failedToPullFile": "Failed to pull file '%{file}' from device",
    "reverseFailed": "Failed to reverse '%{remote}' to '%{local}'",
    "forwardFailed": "Failed to forward '{}' to '{}'",
    "adbShellCommandFailed": "Failed to run adb shell command",
    "missingWidth": "Missing width",
    "missingHeight": "Missing height",
    "parseWidthFailed": "Failed to parse width",
    "parseHeightFailed": "Failed to parse height",
    "getScreenSizeFailed": "Failed to get screen size",
    "adbNotFound": "adb not found",
    "killServerFailed": "Failed to kill adb server",
    "parseDeviceAddressFailed": "Failed to parse device address",
    "connectDeviceFailed": "Failed to connect to device",
    "pairFailed": "Failed to pair with device"
  },
  "mask": {
    "windowMovedAndResized": "Window moved to (%{left},%{top}) and resize to %{width}x%{height}",
    "enterNormalMappingMode": "Enter normal mapping mode",
    "mainDeviceConnected": "Main device connected",
    "mainDeviceDisconnected": "Main device connection disconnected",
    "loadActivateMappingConfig": "Load and activate mapping config",
    "padLabelNotSupported": "Pad label not support %{count} bindings",
    "mapping": {
      "pressedScriptError": "Pressed script error",
      "releasedScriptError": "Released script error",
      "heldScriptError": "Held script error",
      "pressedScriptRuntimeError": "Pressed script runtime error",
      "releasedScriptRuntimeError": "Released script runtime error",
      "heldScriptRuntimeError": "Held script runtime error",
      "parseScriptFailed": "Failed to parse script by pest",
      "noProgramFound": "No program found",
      "rawInputModeHint": "Enter raw input mode, long press mouse right button to exit",
      "exitRawInputMode": "Exit raw input mode",
      "usingMappingConfig": "Using mapping config",
      "useDefaultMapping": "Using default mapping config",
      "invalidPosition": "Invalid position (%{x}, %{y}), x and y must be greater than %{margin}",
      "enterFpsMode": "Enter FPS mode",
      "exitFpsMode": "Exit FPS mode",
      "mappingActionExceedsMaxCount": "Mapping action '%{name}' exceeds the maximum allowed count (current: %{count}, max: %{max})",
      "mappingConfigValidationFailed": "Mapping config validation failed:",
      "fileNameNotSafe": "File name is not safe",
      "mappingConfigNotFound": "Mapping config file not found",
      "cannotCreateConfigDir": "Cannot create parent directory for config file",
      "cannotCreateMappingConfig": "Cannot create mapping config file",
      "cannotWriteMappingConfig": "Cannot write to mapping config file",
      "invalidGamepadButtonCode": "Invalid gamepad button code",
      "unknownGamepadButton": "Unknown gamepad button variant",
      "invalidCode": "Invalid %{name} code",
      "unknownKeyCode": "Unknown KeyCode variant",
      "failedToParseTo": "Failed to parse to",
      "unknownMouseButton": "Unknown mouse button variant"
    },
    "evalScriptnoMappingError": "Unable to execute script: No active mapping, cannot retrieve mapping configuration size",
    "video": {
      "noDecoder": "Video decoder not created"
    },
    "exitStopMappingMode": "Exit mapping mode",
    "windowLevelChanged": "Mask always on top"
  }
}
