diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000000..4f22e6081d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,33 @@ +--- +name: Bug report +about: Create a report to help us improve +title: '' +labels: '' +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots and Logs** +If applicable, add screenshots to help explain your problem. Also, please add the most +log file (ds4windows_log.txt) from the Logs folder in your DS4Windows config folder. + +**Desktop (please complete the following information):** + - Controller Make and Model: Sony DS4 v.2 (CUH-ZCT2U) + - OS: [e.g. Windows 10 Pro Build 2004] + - DS4Windows Version [e.g. 3.0.3] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000000..0860221811 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,6 @@ +version: 2 +updates: + - package-ecosystem: "nuget" + directory: "/" + schedule: + interval: "monthly" diff --git a/.github/workflows/duplicate.yml b/.github/workflows/duplicate.yml new file mode 100644 index 0000000000..f170667ca2 --- /dev/null +++ b/.github/workflows/duplicate.yml @@ -0,0 +1,24 @@ +name: 'Duplicate Issue' + +on: + issues: + types: [labeled, unlabeled, reopened] + +permissions: + issues: write + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/support-requests@v2 + with: + github-token: ${{ github.token }} + support-label: 'duplicate' + issue-comment: > + :wave: @{issue-author}, one or more issues for this topic already exist, + please follow those instead of opening another one. Use the search function + to find issues related to your troubles. Thank you! + close-issue: true + lock-issue: true + issue-lock-reason: 'off-topic' \ No newline at end of file diff --git a/.github/workflows/fix-shipped.yml b/.github/workflows/fix-shipped.yml new file mode 100644 index 0000000000..85f9262a95 --- /dev/null +++ b/.github/workflows/fix-shipped.yml @@ -0,0 +1,23 @@ +name: 'Fix shipped with Release' + +on: + issues: + types: [labeled, unlabeled, reopened] + +permissions: + issues: write + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/support-requests@v2 + with: + github-token: ${{ github.token }} + support-label: 'fix-shipped' + issue-comment: > + This issues' topic has been resolved and an update has been published. + Please check out the Releases page for a new version. + close-issue: true + lock-issue: false + issue-lock-reason: 'off-topic' \ No newline at end of file diff --git a/.github/workflows/out-of-scope.yml b/.github/workflows/out-of-scope.yml new file mode 100644 index 0000000000..ee0bec8093 --- /dev/null +++ b/.github/workflows/out-of-scope.yml @@ -0,0 +1,23 @@ +name: 'Out-of-scope Issue' + +on: + issues: + types: [labeled, unlabeled, reopened] + +permissions: + issues: write + +jobs: + action: + runs-on: ubuntu-latest + steps: + - uses: dessant/support-requests@v2 + with: + github-token: ${{ github.token }} + support-label: 'out-of-scope' + issue-comment: > + :wave: @{issue-author}, unfortunately this topic is out of scope + of the projects' overall goals and will not be worked on. + close-issue: true + lock-issue: true + issue-lock-reason: 'off-topic' \ No newline at end of file diff --git a/.gitignore b/.gitignore index 1bc915c5cb..1eb67a32ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,73 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore # User-specific files *.suo *.user +*.userosscache *.sln.docstates -# Build results +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs +# Build results [Dd]ebug/ +[Dd]ebugPublic/ [Rr]elease/ +[Rr]eleases/ x64/ -build/ +x86/ +bld/ [Bb]in/ [Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ -# Enable "build/" folder in the NuGet Packages folder since NuGet packages use it for MSBuild targets -!packages/*/build/ +# Visual Studio 2017 auto generated files +Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ +**/Properties/launchSettings.json + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio *_i.c *_p.c +*_i.h *.ilk *.meta *.obj +*.iobj *.pch *.pdb +*.ipdb *.pgc *.pgd *.rsp @@ -43,21 +82,34 @@ build/ *.vssscc .builds *.pidb -*.log +*.svclog *.scc +# Chutzpah Test files +_Chutzpah* + # Visual C++ cache files ipch/ *.aps *.ncb +*.opendb *.opensdf *.sdf *.cachefile +*.VC.db +*.VC.VC.opendb # Visual Studio profiler *.psess *.vsp *.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ # Guidance Automation Toolkit *.gpState @@ -65,6 +117,10 @@ ipch/ # ReSharper is a .NET coding add-in _ReSharper*/ *.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode # TeamCity is a build add-in _TeamCity* @@ -72,9 +128,25 @@ _TeamCity* # DotCover is a Code Coverage Tool *.dotCover +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + # NCrunch -*.ncrunch* +_NCrunch_* .*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ # Installshield output folder [Ee]xpress/ @@ -93,64 +165,170 @@ DocProject/Help/html publish/ # Publish Web Output -*.Publish.xml +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ -# NuGet Packages Directory -## TODO: If you have NuGet Package Restore enabled, uncomment the next line -#packages/ +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets -# Windows Azure Build Output -csx +# Microsoft Azure Build Output +csx/ *.build.csdef -# Windows Store app package directory +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ # Others -sql/ -*.Cache ClientBin/ -[Ss]tyle[Cc]op.* ~$* *~ *.dbmdl -*.[Pp]ublish.xml +*.dbproj.schemaview +*.jfm *.pfx *.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ # RIA/Silverlight projects Generated_Code/ -# Backup & report files from converting an old project file to a newer -# Visual Studio version. Backup files are not needed, because we have git ;-) +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) _UpgradeReport_Files/ Backup*/ UpgradeLog*.XML UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak # SQL Server files -App_Data/*.mdf -App_Data/*.ldf +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/ +*.sln.iml + +# CodeRush +.cr/ + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs +# OpenCover UI analysis results +OpenCover/ -#LightSwitch generated files -GeneratedArtifacts/ -_Pvt_Extensions/ -ModelManifest.xml +# Azure Stream Analytics local run output +ASALocalRun/ -# ========================= -# Windows detritus -# ========================= +# MSBuild Binary and Structured Log +*.binlog -# Windows image file caches -Thumbs.db -ehthumbs.db +# NVidia Nsight GPU debugger configuration file +*.nvuser -# Folder config file -Desktop.ini +# MFractors (Xamarin productivity tool) working folder +.mfractor/ -# Recycle Bin used on file shares -$RECYCLE.BIN/ +!DS4Windows/libs/x64/ +!DS4Windows/libs/x86/ -# Mac desktop service store files -.DS_Store diff --git a/.vs/config/applicationhost.config b/.vs/config/applicationhost.config deleted file mode 100644 index c2abfb4801..0000000000 --- a/.vs/config/applicationhost.config +++ /dev/null @@ -1,1030 +0,0 @@ - - - - - - - - -
-
-
-
-
-
-
-
- - - -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
- -
-
- -
-
-
- - -
-
-
-
-
-
- -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/COPYING b/COPYING new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/COPYING @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/DS4Windows.sln b/DS4Windows.sln deleted file mode 100644 index 916f340568..0000000000 --- a/DS4Windows.sln +++ /dev/null @@ -1,28 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 14 -VisualStudioVersion = 14.0.25420.1 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DS4Windows", "DS4Windows\DS4Windows.csproj", "{7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|Any CPU.Build.0 = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|x64.ActiveCfg = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Debug|x64.Build.0 = Debug|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|Any CPU.ActiveCfg = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|Any CPU.Build.0 = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|x64.ActiveCfg = Release|Any CPU - {7B9354BF-AF82-4CCB-A83D-4BEB1E9D8C96}.Release|x64.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal diff --git a/DS4Windows/App.xaml b/DS4Windows/App.xaml new file mode 100644 index 0000000000..955ad023ea --- /dev/null +++ b/DS4Windows/App.xaml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + diff --git a/DS4Windows/App.xaml.cs b/DS4Windows/App.xaml.cs new file mode 100644 index 0000000000..3152d460c8 --- /dev/null +++ b/DS4Windows/App.xaml.cs @@ -0,0 +1,781 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Configuration; +using System.Data; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.IO.MemoryMappedFiles; +using System.Linq; +using System.Net.Http; +using System.Runtime.InteropServices; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using System.Windows; +using System.Windows.Interop; +using WPFLocalizeExtension.Engine; +using NLog; +using System.Windows.Media; +using System.Net; +using Microsoft.Win32.SafeHandles; +using DS4Windows.DS4Control; + +namespace DS4WinWPF +{ + /// + /// Interaction logic for App.xaml + /// + [System.Security.SuppressUnmanagedCodeSecurity] + public partial class App : Application + { + [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)] + private static extern int GetClassName(IntPtr hWnd, StringBuilder lpClassName, int nMaxCount); + + [DllImport("user32.dll", EntryPoint = "FindWindow")] + private static extern IntPtr FindWindow(string sClass, string sWindow); + + [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = false)] + private static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, IntPtr wParam, ref COPYDATASTRUCT lParam); + + [StructLayout(LayoutKind.Sequential)] + public struct COPYDATASTRUCT + { + public IntPtr dwData; + public int cbData; + public IntPtr lpData; + } + + private Thread controlThread; + public static DS4Windows.ControlService rootHub; + public static HttpClient requestClient; + private bool skipSave; + private bool runShutdown; + private bool exitApp; + private Thread testThread; + private bool exitComThread = false; + private const string SingleAppComEventName = "{a52b5b20-d9ee-4f32-8518-307fa14aa0c6}"; + private EventWaitHandle threadComEvent = null; + private Timer collectTimer; + private static LoggerHolder logHolder; + + private MemoryMappedFile ipcClassNameMMF = null; // MemoryMappedFile for inter-process communication used to hold className of DS4Form window + private MemoryMappedFile ipcResultDataMMF = null; // MemoryMappedFile for inter-process communication used to exchange string result data between cmdline client process and the background running DS4Windows app + + private static Dictionary themeLocs = new + Dictionary() + { + [DS4Windows.AppThemeChoice.Default] = "DS4Forms/Themes/DefaultTheme.xaml", + [DS4Windows.AppThemeChoice.Light] = "DS4Forms/Themes/DefaultTheme.xaml", + [DS4Windows.AppThemeChoice.Dark] = "DS4Forms/Themes/DarkTheme.xaml", + }; + + public event EventHandler ThemeChanged; + + private void Application_Startup(object sender, StartupEventArgs e) + { + runShutdown = true; + skipSave = true; + + ArgumentParser parser = new ArgumentParser(); + parser.Parse(e.Args); + CheckOptions(parser); + + if (exitApp) + { + return; + } + + try + { + Process.GetCurrentProcess().PriorityClass = + ProcessPriorityClass.High; + } + catch { } // Ignore problems raising the priority. + + // Force Normal IO Priority + IntPtr ioPrio = new IntPtr(2); + DS4Windows.Util.NtSetInformationProcess(Process.GetCurrentProcess().Handle, + DS4Windows.Util.PROCESS_INFORMATION_CLASS.ProcessIoPriority, ref ioPrio, 4); + + // Force Normal Page Priority + IntPtr pagePrio = new IntPtr(5); + DS4Windows.Util.NtSetInformationProcess(Process.GetCurrentProcess().Handle, + DS4Windows.Util.PROCESS_INFORMATION_CLASS.ProcessPagePriority, ref pagePrio, 4); + + // another instance is already running if TryOpenExisting returns true. + try + { + if (EventWaitHandleAcl.TryOpenExisting(SingleAppComEventName, + System.Security.AccessControl.EventWaitHandleRights.Synchronize | + System.Security.AccessControl.EventWaitHandleRights.Modify, + out EventWaitHandle tempComEvent)) + { + tempComEvent.Set(); // signal the other instance. + tempComEvent.Close(); + + runShutdown = false; + Current.Shutdown(); // Quit temp instance + return; + } + } + catch (System.UnauthorizedAccessException) + { + // Ignore exception + } + + // Allow sleep time durations less than 16 ms + DS4Windows.Util.timeBeginPeriod(1); + + // Retrieve info about installed ViGEmBus device if found + DS4Windows.Global.RefreshViGEmBusInfo(); + + // Create the Event handle + threadComEvent = new EventWaitHandle(false, EventResetMode.ManualReset, SingleAppComEventName); + CreateTempWorkerThread(); + + CreateControlService(parser); + RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly; + + DS4Windows.Global.FindConfigLocation(); + bool firstRun = DS4Windows.Global.firstRun; + + // Could not find unique profile location; does not exist or multiple places. + // Advise user to specify where DS4Windows should save its configuation files + // and profiles + if (firstRun) + { + DS4Forms.SaveWhere savewh = + new DS4Forms.SaveWhere(DS4Windows.Global.multisavespots); + savewh.ShowDialog(); + } + + // Exit if base configuration could not be generated + if (firstRun && !CreateConfDirSkeleton()) + { + MessageBox.Show($"Cannot create config folder structure in {DS4Windows.Global.appdatapath}. Exiting", + "DS4Windows", MessageBoxButton.OK, MessageBoxImage.Error); + Current.Shutdown(1); + return; + } + + logHolder = new LoggerHolder(rootHub); + DispatcherUnhandledException += App_DispatcherUnhandledException; + AppDomain.CurrentDomain.UnhandledException += CurrentDomain_UnhandledException; + Logger logger = logHolder.Logger; + string version = DS4Windows.Global.exeversion; + logger.Info($"DS4Windows version {version}"); + logger.Info($"DS4Windows exe file: {DS4Windows.Global.exeFileName}"); + logger.Info($"DS4Windows Assembly Architecture: {(Environment.Is64BitProcess ? "x64" : "x86")}"); + logger.Info($"OS Version: {Environment.OSVersion}"); + logger.Info($"OS Product Name: {DS4Windows.Util.GetOSProductName()}"); + logger.Info($"OS Release ID: {DS4Windows.Util.GetOSReleaseId()}"); + logger.Info($"System Architecture: {(Environment.Is64BitOperatingSystem ? "x64" : "x86")}"); + logger.Info("Logger created"); + + bool readAppConfig = DS4Windows.Global.Load(); + if (!firstRun && !readAppConfig) + { + logger.Info($@"Profiles.xml not read at location ${DS4Windows.Global.appdatapath}\Profiles.xml. Using default app settings"); + } + + // Ask user which devices the mapper should attempt to open when detected. + // Currently only support DS4 by default to avoid extra complications from + // Steam Input + if (firstRun) + { + DS4Forms.FirstLaunchUtilWindow firstLaunchUtilWin = + new DS4Forms.FirstLaunchUtilWindow(DS4Windows.Global.DeviceOptions); + firstLaunchUtilWin.ShowDialog(); + DS4Windows.Global.Save(); + } + + if (firstRun) + { + logger.Info("No config found. Creating default config"); + AttemptSave(); + + DS4Windows.Global.SaveAsNewProfile(0, "Default"); + for (int i = 0; i < DS4Windows.ControlService.MAX_DS4_CONTROLLER_COUNT; i++) + { + DS4Windows.Global.ProfilePath[i] = DS4Windows.Global.OlderProfilePath[i] = "Default"; + } + + logger.Info("Default config created"); + } + + skipSave = false; + + if (!DS4Windows.Global.LoadActions()) + { + DS4Windows.Global.CreateStdActions(); + } + + // Have app use selected culture + SetUICulture(DS4Windows.Global.UseLang); + DS4Windows.AppThemeChoice themeChoice = DS4Windows.Global.UseCurrentTheme; + ChangeTheme(DS4Windows.Global.UseCurrentTheme, false); + + DS4Windows.Global.LoadLinkedProfiles(); + DS4Forms.MainWindow window = new DS4Forms.MainWindow(parser); + MainWindow = window; + window.IsInitialShow = true; + window.Show(); + window.IsInitialShow = false; + + // Set up hooks for IPC command calls + HwndSource source = PresentationSource.FromVisual(window) as HwndSource; + CreateIPCClassNameMMF(source.Handle); + + window.CheckMinStatus(); + + bool runningAsAdmin = DS4Windows.Global.IsAdministrator(); + rootHub.LogDebug($"Running as {(runningAsAdmin ? "Admin" : "User")}"); + + if (DS4Windows.Global.hidHideInstalled) + { + rootHub.CheckHidHidePresence(); + } + + rootHub.LoadPermanentSlotsConfig(); + window.LateChecks(parser); + } + + private void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e) + { + if (!Current.Dispatcher.CheckAccess()) + { + Logger logger = logHolder.Logger; + Exception exp = e.ExceptionObject as Exception; + logger.Error($"Thread App Crashed with message {exp.Message}"); + logger.Error(exp.ToString()); + //LogManager.Flush(); + //LogManager.Shutdown(); + if (e.IsTerminating) + { + Dispatcher.Invoke(() => + { + rootHub?.PrepareAbort(); + CleanShutdown(); + }); + } + } + else + { + Logger logger = logHolder.Logger; + Exception exp = e.ExceptionObject as Exception; + if (e.IsTerminating) + { + logger.Error($"Thread Crashed with message {exp.Message}"); + logger.Error(exp.ToString()); + + rootHub?.PrepareAbort(); + CleanShutdown(); + } + } + } + + private void App_DispatcherUnhandledException(object sender, System.Windows.Threading.DispatcherUnhandledExceptionEventArgs e) + { + //Debug.WriteLine("App Crashed"); + //Debug.WriteLine(e.Exception.StackTrace); + Logger logger = logHolder.Logger; + logger.Error($"Thread Crashed with message {e.Exception.Message}"); + logger.Error(e.Exception.ToString()); + //LogManager.Flush(); + //LogManager.Shutdown(); + } + + private bool CreateConfDirSkeleton() + { + bool result = true; + try + { + Directory.CreateDirectory(DS4Windows.Global.appdatapath); + Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Profiles\"); + Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Logs\"); + //Directory.CreateDirectory(DS4Windows.Global.appdatapath + @"\Macros\"); + } + catch (UnauthorizedAccessException) + { + result = false; + } + + + return result; + } + + private void AttemptSave() + { + if (!DS4Windows.Global.Save()) //if can't write to file + { + if (MessageBox.Show("Cannot write at current location\nCopy Settings to appdata?", "DS4Windows", + MessageBoxButton.YesNo, MessageBoxImage.Warning) == MessageBoxResult.Yes) + { + try + { + Directory.CreateDirectory(DS4Windows.Global.appDataPpath); + File.Copy(DS4Windows.Global.exedirpath + "\\Profiles.xml", + DS4Windows.Global.appDataPpath + "\\Profiles.xml"); + File.Copy(DS4Windows.Global.exedirpath + "\\Auto Profiles.xml", + DS4Windows.Global.appDataPpath + "\\Auto Profiles.xml"); + Directory.CreateDirectory(DS4Windows.Global.appDataPpath + "\\Profiles"); + foreach (string s in Directory.GetFiles(DS4Windows.Global.exedirpath + "\\Profiles")) + { + File.Copy(s, DS4Windows.Global.appDataPpath + "\\Profiles\\" + Path.GetFileName(s)); + } + } + catch { } + MessageBox.Show("Copy complete, please relaunch DS4Windows and remove settings from Program Directory", + "DS4Windows"); + } + else + { + MessageBox.Show("DS4Windows cannot edit settings here, This will now close", + "DS4Windows"); + } + + DS4Windows.Global.appdatapath = null; + skipSave = true; + Current.Shutdown(); + return; + } + } + + private void CheckOptions(ArgumentParser parser) + { + if (parser.HasErrors) + { + runShutdown = false; + exitApp = true; + Current.Shutdown(1); + } + else if (parser.Driverinstall) + { + // Retrieve info about installed ViGEmBus device if found. + // Might not be needed here + DS4Windows.Global.RefreshViGEmBusInfo(); + + // Load DS4Windows config if it exists + DS4Windows.Global.FindConfigLocation(); + bool readAppConfig = DS4Windows.Global.Load(); + if (readAppConfig) + { + // Have app use selected culture + SetUICulture(DS4Windows.Global.UseLang); + DS4Windows.AppThemeChoice themeChoice = DS4Windows.Global.UseCurrentTheme; + ChangeTheme(DS4Windows.Global.UseCurrentTheme, false); + } + + CreateBaseThread(); + DS4Forms.WelcomeDialog dialog = new DS4Forms.WelcomeDialog(true); + dialog.ShowDialog(); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.ReenableDevice) + { + DS4Windows.DS4Devices.reEnableDevice(parser.DeviceInstanceId); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.Runtask) + { + StartupMethods.LaunchOldTask(); + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + else if (parser.Command) + { + IntPtr hWndDS4WindowsForm = IntPtr.Zero; + hWndDS4WindowsForm = FindWindow(ReadIPCClassNameMMF(), "DS4Windows"); + if (hWndDS4WindowsForm != IntPtr.Zero) + { + bool bDoSendMsg = true; + bool bWaitResultData = false; + bool bOwnsMutex = false; + Mutex ipcSingleTaskMutex = null; + EventWaitHandle ipcNotifyEvent = null; + + COPYDATASTRUCT cds; + cds.lpData = IntPtr.Zero; + + try + { + if (parser.CommandArgs.ToLower().StartsWith("query.")) + { + // Query.device# (1..4) command returns a string result via memory mapped file. The cmd is sent to the background DS4Windows + // process (via WM_COPYDATA wnd msg), then this client process waits for the availability of the result and prints it to console output pipe. + // Use mutex obj to make sure that concurrent client calls won't try to write and read the same MMF result file at the same time. + ipcSingleTaskMutex = new Mutex(false, "DS4Windows_IPCResultData_SingleTaskMtx"); + try + { + bOwnsMutex = ipcSingleTaskMutex.WaitOne(10000); + } + catch (AbandonedMutexException) + { + bOwnsMutex = true; + } + + if (bOwnsMutex) + { + // This process owns the inter-process sync mutex obj. Let's proceed with creating the output MMF file and waiting for a result. + bWaitResultData = true; + CreateIPCResultDataMMF(); + ipcNotifyEvent = new EventWaitHandle(false, EventResetMode.AutoReset, "DS4Windows_IPCResultData_ReadyEvent"); + } + else + // If the mtx failed then something must be seriously wrong. Cannot do anything in that case because MMF file may be modified by concurrent processes. + bDoSendMsg = false; + } + + if (bDoSendMsg) + { + cds.dwData = IntPtr.Zero; + cds.cbData = parser.CommandArgs.Length; + cds.lpData = Marshal.StringToHGlobalAnsi(parser.CommandArgs); + SendMessage(hWndDS4WindowsForm, DS4Forms.MainWindow.WM_COPYDATA, IntPtr.Zero, ref cds); + + if (bWaitResultData) + Console.WriteLine(WaitAndReadIPCResultDataMMF(ipcNotifyEvent)); + } + } + finally + { + // Release the result MMF file in the client process before releasing the mtx and letting other client process to proceed with the same MMF file + if (ipcResultDataMMF != null) ipcResultDataMMF.Dispose(); + ipcResultDataMMF = null; + + // If this was "Query.xxx" cmdline client call then release the inter-process mutex and let other concurrent clients to proceed (if there are anyone waiting for the MMF result file) + if (bOwnsMutex && ipcSingleTaskMutex != null) + ipcSingleTaskMutex.ReleaseMutex(); + + if (cds.lpData != IntPtr.Zero) + Marshal.FreeHGlobal(cds.lpData); + } + } + + runShutdown = false; + exitApp = true; + Current.Shutdown(); + } + } + + private void CreateControlService(ArgumentParser parser) + { + controlThread = new Thread(() => { + rootHub = new DS4Windows.ControlService(parser); + + DS4Windows.Program.rootHub = rootHub; + requestClient = new HttpClient(); + collectTimer = new Timer(GarbageTask, null, 30000, 30000); + + }); + controlThread.Priority = ThreadPriority.Normal; + controlThread.IsBackground = true; + controlThread.Start(); + while (controlThread.IsAlive) + Thread.SpinWait(500); + } + + private void CreateBaseThread() + { + controlThread = new Thread(() => { + DS4Windows.Program.rootHub = rootHub; + requestClient = new HttpClient(); + collectTimer = new Timer(GarbageTask, null, 30000, 30000); + }); + controlThread.Priority = ThreadPriority.Normal; + controlThread.IsBackground = true; + controlThread.Start(); + while (controlThread.IsAlive) + Thread.SpinWait(500); + } + + private void GarbageTask(object state) + { + GC.Collect(0, GCCollectionMode.Forced, false); + } + + private void CreateTempWorkerThread() + { + testThread = new Thread(SingleAppComThread_DoWork); + testThread.Priority = ThreadPriority.Lowest; + testThread.IsBackground = true; + testThread.Start(); + } + + private void SingleAppComThread_DoWork() + { + while (!exitComThread) + { + // check for a signal. + if (threadComEvent.WaitOne()) + { + threadComEvent.Reset(); + // The user tried to start another instance. We can't allow that, + // so bring the other instance back into view and enable that one. + // That form is created in another thread, so we need some thread sync magic. + if (!exitComThread) + { + Dispatcher.BeginInvoke((Action)(() => + { + MainWindow.Show(); + MainWindow.WindowState = WindowState.Normal; + })); + } + } + } + } + + public void CreateIPCClassNameMMF(IntPtr hWnd) + { + if (ipcClassNameMMF != null) return; // Already holding a handle to MMF file. No need to re-write the data + + try + { + StringBuilder wndClassNameStr = new StringBuilder(128); + if (GetClassName(hWnd, wndClassNameStr, wndClassNameStr.Capacity) != 0 && wndClassNameStr.Length > 0) + { + byte[] buffer = ASCIIEncoding.ASCII.GetBytes(wndClassNameStr.ToString()); + + ipcClassNameMMF = MemoryMappedFile.CreateNew("DS4Windows_IPCClassName.dat", 128); + MemoryMappedViewAccessor ipcClassNameMMA_Now = ipcClassNameMMF.CreateViewAccessor(0, buffer.Length); + ipcClassNameMMA_Now.WriteArray(0, buffer, 0, buffer.Length); + ipcClassNameMMA_Now?.Dispose(); + // The MMF file is alive as long this process holds the file handle open + } + } + catch (Exception) + { + /* Eat all exceptions because errors here are not fatal for DS4Win */ + } + } + + private string ReadIPCClassNameMMF() + { + MemoryMappedFile mmf = null; + MemoryMappedViewAccessor mma = null; + + try + { + byte[] buffer = new byte[128]; + mmf = MemoryMappedFile.OpenExisting("DS4Windows_IPCClassName.dat"); + mma = mmf.CreateViewAccessor(0, 128); + mma.ReadArray(0, buffer, 0, buffer.Length); + return ASCIIEncoding.ASCII.GetString(buffer); + } + catch (Exception) + { + // Eat all exceptions + } + finally + { + if (mma != null) mma.Dispose(); + if (mmf != null) mmf.Dispose(); + } + + return null; + } + + private void CreateIPCResultDataMMF() + { + // Cmdline client process calls this to create the MMF file used in inter-process-communications. The background DS4Windows process + // uses WriteIPCResultDataMMF method to write a command result and the client process reads the result from the same MMF file. + if (ipcResultDataMMF != null) return; // Already holding a handle to MMF file. No need to re-write the data + + try + { + ipcResultDataMMF = MemoryMappedFile.CreateNew("DS4Windows_IPCResultData.dat", 256); + // The MMF file is alive as long this process holds the file handle open + } + catch (Exception) + { + /* Eat all exceptions because errors here are not fatal for DS4Win */ + } + } + + private string WaitAndReadIPCResultDataMMF(EventWaitHandle ipcNotifyEvent) + { + if (ipcResultDataMMF != null) + { + // Wait until the inter-process-communication (IPC) result data is available and read the result + try + { + // Wait max 10 secs and if the result is still not available then timeout and return "empty" result + if (ipcNotifyEvent == null || ipcNotifyEvent.WaitOne(10000)) + { + int strNullCharIdx; + byte[] buffer = new byte[256]; + MemoryMappedViewAccessor ipcResultDataMMA = ipcClassNameMMF.CreateViewAccessor(0, buffer.Length); + ipcResultDataMMA.ReadArray(0, buffer, 0, buffer.Length); + strNullCharIdx = Array.FindIndex(buffer, byteVal => byteVal == 0); + return ASCIIEncoding.ASCII.GetString(buffer, 0, (strNullCharIdx <= 1 ? 1 : strNullCharIdx)); + } + } + catch (Exception) + { + /* Eat all exceptions because errors here are not fatal for DS4Win */ + } + } + + return String.Empty; + } + + public void WriteIPCResultDataMMF(string dataStr) + { + // The background DS4Windows process calls this method to write out the result of "-command QueryProfile.device#" command. + // The cmdline client process reads the result from the DS4Windows_IPCResultData.dat MMF file and sends the result to console output pipe. + MemoryMappedFile mmf = null; + MemoryMappedViewAccessor mma = null; + EventWaitHandle ipcNotifyEvent = null; + + try + { + ipcNotifyEvent = EventWaitHandle.OpenExisting("DS4Windows_IPCResultData_ReadyEvent"); + + byte[] buffer = ASCIIEncoding.ASCII.GetBytes(dataStr); + mmf = MemoryMappedFile.OpenExisting("DS4Windows_IPCResultData.dat"); + mma = mmf.CreateViewAccessor(0, 256); + mma.WriteArray(0, buffer, 0, (buffer.Length >= 256 ? 256 : buffer.Length)); + } + catch (Exception) + { + // Eat all exceptions + } + finally + { + if (mma != null) mma.Dispose(); + if (mmf != null) mmf.Dispose(); + + if (ipcNotifyEvent != null) ipcNotifyEvent.Set(); + } + } + + private void SetUICulture(string culture) + { + try + { + //CultureInfo ci = new CultureInfo("ja"); + CultureInfo ci = CultureInfo.GetCultureInfo(culture); + LocalizeDictionary.Instance.SetCurrentThreadCulture = true; + LocalizeDictionary.Instance.Culture = ci; + // fixes the culture in threads + CultureInfo.DefaultThreadCurrentCulture = ci; + CultureInfo.DefaultThreadCurrentUICulture = ci; + //DS4WinWPF.Properties.Resources.Culture = ci; + Thread.CurrentThread.CurrentCulture = ci; + Thread.CurrentThread.CurrentUICulture = ci; + } + catch (CultureNotFoundException) { /* Skip setting culture that we cannot set */ } + } + + public void ChangeTheme(DS4Windows.AppThemeChoice themeChoice, + bool fireChanged=true) + { + if (themeChoice == DS4Windows.AppThemeChoice.Default) + { + Application.Current.Resources.MergedDictionaries.Clear(); + + // Attempt to switch theme based on currently selected Windows apps theme mode + DS4Windows.AppThemeChoice implicitTheme = DS4Windows.Util.SystemAppsUsingDarkTheme() ? + DS4Windows.AppThemeChoice.Dark : DS4Windows.AppThemeChoice.Light; + themeLocs.TryGetValue(implicitTheme, out string loc); + Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(loc, uriKind: UriKind.Relative) }); + + if (fireChanged) + { + ThemeChanged?.Invoke(this, EventArgs.Empty); + } + } + else if (themeLocs.TryGetValue(themeChoice, out string loc)) + { + Application.Current.Resources.MergedDictionaries.Clear(); + Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(loc, uriKind: UriKind.Relative) }); + + if (fireChanged) + { + ThemeChanged?.Invoke(this, EventArgs.Empty); + } + } + } + + private void Application_Exit(object sender, ExitEventArgs e) + { + if (runShutdown) + { + Logger logger = logHolder.Logger; + logger.Info("Request App Shutdown"); + CleanShutdown(); + } + } + + private void Application_SessionEnding(object sender, SessionEndingCancelEventArgs e) + { + Logger logger = logHolder.Logger; + logger.Info("User Session Ending"); + CleanShutdown(); + } + + private void CleanShutdown() + { + if (runShutdown) + { + if (rootHub != null) + { + Task.Run(() => + { + if (rootHub.running) + { + rootHub.Stop(immediateUnplug: true); + rootHub.ShutDown(); + } + }).Wait(); + } + + if (!skipSave) + { + DS4Windows.Global.Save(); + } + + // Reset timer + DS4Windows.Util.timeEndPeriod(1); + + exitComThread = true; + if (threadComEvent != null) + { + threadComEvent.Set(); // signal the other instance. + while (testThread.IsAlive) + Thread.SpinWait(500); + threadComEvent.Close(); + } + + if (ipcClassNameMMF != null) ipcClassNameMMF.Dispose(); + + LogManager.Flush(); + LogManager.Shutdown(); + } + } + } +} diff --git a/DS4Windows/ArgumentParser.cs b/DS4Windows/ArgumentParser.cs new file mode 100644 index 0000000000..ab1f48729f --- /dev/null +++ b/DS4Windows/ArgumentParser.cs @@ -0,0 +1,130 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System.Collections.Generic; +using DS4Windows.DS4Control; + +namespace DS4WinWPF +{ + public class ArgumentParser + { + private bool mini; + private bool stop; + private bool driverinstall; + private bool reenableDevice; + private string deviceInstanceId; + private bool runtask; + private bool command; + private string commandArgs; + private string virtualkbmHandler = VirtualKBMFactory.DEFAULT_IDENTIFIER; + + private Dictionary errors = + new Dictionary(); + + public bool Mini { get => mini; } + public bool Stop { get => stop; } + public bool Driverinstall { get => driverinstall; } + public bool ReenableDevice { get => reenableDevice; } + public bool Runtask { get => runtask; } + public bool Command { get => command; } + public string DeviceInstanceId { get => deviceInstanceId; } + public string CommandArgs { get => commandArgs; } + public string VirtualkbmHandler { get => virtualkbmHandler; } + public Dictionary Errors { get => errors; } + + public bool HasErrors => errors.Count > 0; + + public void Parse(string[] args) + { + errors.Clear(); + //foreach (string arg in args) + for (int i = 0; i < args.Length; i++) + { + string arg = args[i]; + switch(arg) + { + case "driverinstall": + case "-driverinstall": + driverinstall = true; + break; + + case "re-enabledevice": + case "-re-enabledevice": + reenableDevice = true; + if (i + 1 < args.Length) + { + deviceInstanceId = args[++i]; + } + + break; + + case "runtask": + case "-runtask": + runtask = true; + break; + + case "-stop": + stop = true; + break; + + case "-m": + mini = true; + break; + + case "command": + case "-command": + command = true; + if (i + 1 < args.Length) + { + i++; + string temp = args[i]; + if (temp.Length > 0 && temp.Length <= 256) + { + commandArgs = temp; + } + else + { + command = false; + errors["Command"] = "Command length is invalid"; + } + } + else + { + errors["Command"] = "Command string not given"; + } + break; + case "-virtualkbm": + if (i + 1 < args.Length) + { + i++; + string temp = args[i]; + bool valid = VirtualKBMFactory.IsValidHandler(temp); + if (valid) + { + virtualkbmHandler = temp; + } + } + + break; + + default: break; + } + } + } + } +} diff --git a/DS4Windows/AutoProfileChecker.cs b/DS4Windows/AutoProfileChecker.cs new file mode 100644 index 0000000000..59bb4341b6 --- /dev/null +++ b/DS4Windows/AutoProfileChecker.cs @@ -0,0 +1,339 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; +using System.Diagnostics; // StopWatch +using System.Threading; // Sleep +using System.Threading.Tasks; +using DS4Windows; + +namespace DS4WinWPF +{ + [SuppressUnmanagedCodeSecurity] + public class AutoProfileChecker + { + private AutoProfileHolder profileHolder; + private IntPtr prevForegroundWnd = IntPtr.Zero; + private uint prevForegroundProcessID; + private string prevForegroundProcessName = string.Empty; + private string prevForegroundWndTitleName = string.Empty; + private StringBuilder autoProfileCheckTextBuilder = new StringBuilder(1000); + private int autoProfileDebugLogLevel = 0; + private bool turnOffTemp; + private AutoProfileEntity tempAutoProfile; + private bool running; + + public int AutoProfileDebugLogLevel { get => autoProfileDebugLogLevel; set => autoProfileDebugLogLevel = value; } + public bool Running { get => running; set => running = value; } + + public delegate void ChangeServiceHandler(AutoProfileChecker sender, bool state); + public event ChangeServiceHandler RequestServiceChange; + + public AutoProfileChecker(AutoProfileHolder holder) + { + profileHolder = holder; + } + + public void Process() + { + string topProcessName, topWindowTitle; + bool turnOffDS4WinApp = false; + AutoProfileEntity matchedProfileEntity = null; + + if (GetTopWindowName(out topProcessName, out topWindowTitle)) + { + // Find a profile match based on autoprofile program path and wnd title list. + // The same program may set different profiles for each of the controllers, so we need an array of newProfileName[controllerIdx] values. + for (int i = 0, pathsLen = profileHolder.AutoProfileColl.Count; i < pathsLen; i++) + { + AutoProfileEntity tempEntity = profileHolder.AutoProfileColl[i]; + if (tempEntity.IsMatch(topProcessName, topWindowTitle)) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Rule#{i + 1} Path={tempEntity.path} Title={tempEntity.title}", false, true); + + // Matching autoprofile rule found + turnOffDS4WinApp = tempEntity.Turnoff; + matchedProfileEntity = tempEntity; + break; + } + } + + if (matchedProfileEntity != null) + { + bool forceLoadProfile = false; + + if (!turnOffDS4WinApp && turnOffTemp) + { + // DS4Win was temporarily turned off by another auto-profile rule. Turn DS4Win on before trying to load a new profile because otherwise the new profile won't do anything. + // Force load the profile when DS4Win service afer waking up DS4Win service to make sure that the new profile will be active. + turnOffTemp = false; + SetAndWaitServiceStatus(true); + forceLoadProfile = true; + } + + // Program match found. Check if the new profile is different than current profile of the controller. Load the new profile only if it is not already loaded. + for (int j = 0; j < ControlService.CURRENT_DS4_CONTROLLER_LIMIT; j++) + { + string tempname = matchedProfileEntity.ProfileNames[j]; + if (tempname != string.Empty && tempname != "(none)") + { + if ((Global.useTempProfile[j] && tempname != Global.tempprofilename[j]) || + (!Global.useTempProfile[j] && tempname != Global.ProfilePath[j]) || + forceLoadProfile) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. LoadProfile Controller {j + 1}={tempname}", false, true); + + if (Global.autoProfileSwitchNotifyChoice != + AutoProfileDisplayProfileSwitchChoices.None) + { + DisplayProfileChange(j, tempname); + } + + DS4Device device = Program.rootHub.DS4Controllers[j]; + if (device != null) + { + // Wait for controller to be in a wait period + int tempInd = j; + device.HaltReportingRunAction(() => + { + Global.LoadTempProfile(tempInd, tempname, true, Program.rootHub); // j is controller index, i is filename + // if (LaunchProgram[j] != string.Empty) Process.Start(LaunchProgram[j]); + }); + } + else + { + Global.LoadTempProfile(j, tempname, true, Program.rootHub); // j is controller index, i is filename + // if (LaunchProgram[j] != string.Empty) Process.Start(LaunchProgram[j]); + } + } + else + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. LoadProfile Controller {j + 1}={tempname} (already loaded)", false, true); + } + } + } + + if (turnOffDS4WinApp) + { + turnOffTemp = true; + if (App.rootHub.running) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Turning DS4Windows temporarily off", false, true); + + SetAndWaitServiceStatus(false); + } + } + + tempAutoProfile = matchedProfileEntity; + } + else if (tempAutoProfile != null) + { + if (turnOffTemp && DS4Windows.Global.AutoProfileRevertDefaultProfile) + { + turnOffTemp = false; + if (!App.rootHub.running) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Turning DS4Windows on before reverting to default profile", false, true); + + SetAndWaitServiceStatus(true); + } + } + + tempAutoProfile = null; + for (int j = 0; j < ControlService.CURRENT_DS4_CONTROLLER_LIMIT; j++) + { + if (Global.useTempProfile[j]) + { + if (DS4Windows.Global.AutoProfileRevertDefaultProfile) + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Unknown process. Reverting to default profile. Controller {j + 1}={Global.ProfilePath[j]} (default)", false, true); + + if (Global.autoProfileSwitchNotifyChoice != + AutoProfileDisplayProfileSwitchChoices.None) + { + DisplayProfileChange(j, "default"); + } + + DS4Device device = Program.rootHub.DS4Controllers[j]; + if (device != null) + { + // Wait for controller to be in a wait period + int tempInd = j; + device.HaltReportingRunAction(() => + { + Global.LoadProfile(tempInd, false, Program.rootHub); + }); + } + else + { + Global.LoadProfile(j, false, Program.rootHub); + } + } + else + { + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. Unknown process. Existing profile left as active. Controller {j + 1}={Global.tempprofilename[j]}", false, true); + } + } + } + } + } + } + + private bool GetTopWindowName(out string topProcessName, out string topWndTitleName) + { + IntPtr hWnd = GetForegroundWindow(); + if (hWnd == IntPtr.Zero) + { + // Top window unknown or cannot acquire a handle. Return FALSE and return unknown process and wndTitle values + prevForegroundWnd = IntPtr.Zero; + prevForegroundProcessID = 0; + topProcessName = topWndTitleName = String.Empty; + return false; + } + + // + // If this function was called from "auto-profile watcher timer" then check cached "previous hWnd handle". If the current hWnd is the same + // as during the previous check then return cached previous wnd and name values (ie. foreground app and window are assumed to be the same, so no need to re-query names). + // This should optimize the auto-profile timer check process and causes less burden to .NET GC collector because StringBuffer is not re-allocated every second. + // + // Note! hWnd handles may be re-cycled but not during the lifetime of the window. This "cache" optimization still works because when an old window is closed + // then foreground window changes to something else and the cached prevForgroundWnd variable is updated to store the new hWnd handle. + // It doesn't matter even when the previously cached handle is recycled by WinOS to represent some other window (it is no longer used as a cached value anyway). + // + if (hWnd == prevForegroundWnd) + { + // The active window is still the same. Return cached process and wndTitle values and FALSE to indicate caller that no changes since the last call of this method + topProcessName = prevForegroundProcessName; + topWndTitleName = prevForegroundWndTitleName; + return false; + } + + prevForegroundWnd = hWnd; + + IntPtr hProcess = IntPtr.Zero; + uint lpdwProcessId = 0; + GetWindowThreadProcessId(hWnd, out lpdwProcessId); + + if (lpdwProcessId == prevForegroundProcessID) + { + topProcessName = prevForegroundProcessName; + } + else + { + prevForegroundProcessID = lpdwProcessId; + + hProcess = OpenProcess(0x0410, false, lpdwProcessId); + if (hProcess != IntPtr.Zero) GetModuleFileNameEx(hProcess, IntPtr.Zero, autoProfileCheckTextBuilder, autoProfileCheckTextBuilder.Capacity); + else autoProfileCheckTextBuilder.Clear(); + + prevForegroundProcessName = topProcessName = autoProfileCheckTextBuilder.Replace('/', '\\').ToString().ToLower(); + } + + GetWindowText(hWnd, autoProfileCheckTextBuilder, autoProfileCheckTextBuilder.Capacity); + prevForegroundWndTitleName = topWndTitleName = autoProfileCheckTextBuilder.ToString().ToLower(); + + + if (hProcess != IntPtr.Zero) CloseHandle(hProcess); + + if (autoProfileDebugLogLevel > 0) + DS4Windows.AppLogger.LogToGui($"DEBUG: Auto-Profile. PID={lpdwProcessId} Path={topProcessName} | WND={hWnd} Title={topWndTitleName}", false, true); + + return true; + } + + private void SetAndWaitServiceStatus(bool serviceRunningStatus) + { + // Start or Stop the service only if it is not already in the requested state + if (App.rootHub.running != serviceRunningStatus) + { + RequestServiceChange?.Invoke(this, serviceRunningStatus); + + // Wait until DS4Win app service is running or stopped (as requested by serviceRunningStatus value) or timeout. + // LoadProfile call fails if a new profile is loaded while DS4Win service is still in stopped state (ie the loaded temp profile doesn't do anything). + Stopwatch sw = new Stopwatch(); + sw.Start(); + while (App.rootHub.running != serviceRunningStatus && sw.Elapsed.TotalSeconds < 10) + { + Thread.SpinWait(1000); + } + Thread.SpinWait(1000); + } + } + + private void DisplayProfileChange(int ind, string profile) + { + switch (Global.autoProfileSwitchNotifyChoice) + { + case AutoProfileDisplayProfileSwitchChoices.Log: + { + string prolog = string.Format(DS4WinWPF.Properties.Resources.UsingAutoTempProfile, (ind + 1).ToString(), profile); + DS4Windows.AppLogger.LogToGui(prolog, false); + } + + break; + case AutoProfileDisplayProfileSwitchChoices.Notification: + { + string prolog = string.Format(DS4WinWPF.Properties.Resources.UsingAutoTempProfile, (ind + 1).ToString(), profile); + DS4Windows.AppLogger.LogToTray(prolog); + } + + break; + case AutoProfileDisplayProfileSwitchChoices.LogAndNotification: + { + string prolog = string.Format(DS4WinWPF.Properties.Resources.UsingAutoTempProfile, (ind + 1).ToString(), profile); + DS4Windows.AppLogger.LogToGui(prolog, false); + DS4Windows.AppLogger.LogToTray(prolog); + } + + break; + default: + break; + } + } + + [DllImport("user32.dll")] + private static extern IntPtr GetForegroundWindow(); + + [DllImport("user32.dll")] + private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId); + + [DllImport("kernel32.dll")] + private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId); + + [DllImport("kernel32.dll")] + private static extern bool CloseHandle(IntPtr handle); + + [DllImport("psapi.dll")] + private static extern uint GetModuleFileNameEx(IntPtr hWnd, IntPtr hModule, StringBuilder lpFileName, int nSize); + + [DllImport("user32.dll", CharSet = CharSet.Auto)] + private static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nSize); + } +} diff --git a/DS4Windows/AutoProfileHolder.cs b/DS4Windows/AutoProfileHolder.cs new file mode 100644 index 0000000000..ecd7f11759 --- /dev/null +++ b/DS4Windows/AutoProfileHolder.cs @@ -0,0 +1,212 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; +using System.Xml; +using System.Xml.Serialization; +using DS4Windows; +using DS4WinWPF.DS4Control.DTOXml; + +namespace DS4WinWPF +{ + public class AutoProfileHolder + { + private object _colLockobj = new object(); + private ObservableCollection autoProfileColl; + public ObservableCollection AutoProfileColl { get => autoProfileColl; } + //public Dictionary AutoProfileDict { get => autoProfileDict; } + + //private Dictionary autoProfileDict; + + public AutoProfileHolder() + { + autoProfileColl = new ObservableCollection(); + //autoProfileDict = new Dictionary(); + Load(); + + BindingOperations.EnableCollectionSynchronization(autoProfileColl, _colLockobj); + } + + private void Load() + { + string configFile = Path.Combine(Global.appdatapath, "Auto Profiles.xml"); + if (!File.Exists(configFile)) + return; + + XmlSerializer serializer = new XmlSerializer(typeof(AutoProfilesDTO)); + using StreamReader sr = new StreamReader(configFile); + try + { + AutoProfilesDTO dto = serializer.Deserialize(sr) as AutoProfilesDTO; + dto.MapTo(this); + } + catch (InvalidOperationException) {} + catch (XmlException) {} + } + + public bool Save(string m_Profile) + { + bool saved = true; + + string output_path = m_Profile; + string testStr = string.Empty; + XmlSerializer serializer = new XmlSerializer(typeof(AutoProfilesDTO)); + using (Utf8StringWriter strWriter = new Utf8StringWriter()) + { + using XmlWriter xmlWriter = XmlWriter.Create(strWriter, + new XmlWriterSettings() + { + Encoding = Encoding.UTF8, + Indent = true, + }); + + // Write header explicitly + //xmlWriter.WriteStartDocument(); + xmlWriter.WriteComment(string.Format(" Auto-Profile Configuration Data. {0} ", DateTime.Now)); + xmlWriter.WriteWhitespace("\r\n"); + xmlWriter.WriteWhitespace("\r\n"); + + // Write root element and children + AutoProfilesDTO dto = new AutoProfilesDTO(); + dto.MapFrom(this); + // Omit xmlns:xsi and xmlns:xsd from output + serializer.Serialize(xmlWriter, dto, + new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty })); + xmlWriter.Flush(); + xmlWriter.Close(); + + testStr = strWriter.ToString(); + //Trace.WriteLine("TEST OUTPUT"); + //Trace.WriteLine(testStr); + } + + try + { + using (StreamWriter sw = new StreamWriter(output_path, false)) + { + sw.Write(testStr); + } + } + catch (UnauthorizedAccessException) + { + saved = false; + } + + return saved; + } + + public void Remove(AutoProfileEntity item) + { + //autoProfileDict.Remove(item.Path); + autoProfileColl.Remove(item); + } + } + + public class AutoProfileEntity + { + public string path = string.Empty; + public string title = string.Empty; + private string path_lowercase; + private string title_lowercase; + private bool turnoff; + private string[] profileNames = new string[DS4Windows.Global.MAX_DS4_CONTROLLER_COUNT] { string.Empty, string.Empty, + string.Empty, string.Empty, string.Empty, string.Empty, string.Empty, string.Empty }; + public const string NONE_STRING = "(none)"; + + public string Path { get => path; set => SetSearchPath(value); } + public string Title { get => title; set => SetSearchTitle(value); } + public bool Turnoff { get => turnoff; set => turnoff = value; } + public string[] ProfileNames { get => profileNames; set => profileNames = value; } + + public AutoProfileEntity(string pathStr, string titleStr) + { + // Initialize autoprofile search keywords(xxx_tolower).To improve performance the search keyword is pre - calculated in xxx_tolower variables, + // so autoprofile timer thread doesn't have to create substrings/replace/tolower string instances every second over and over again. + SetSearchPath(pathStr); + SetSearchTitle(titleStr); + } + + public bool IsMatch(string searchPath, string searchTitle) + { + bool bPathMatched = true; + bool bTitleMwatched = true; + + if (!string.IsNullOrEmpty(path_lowercase)) + { + bPathMatched = (path_lowercase == searchPath + || (path[0] == '^' && searchPath.StartsWith(path_lowercase)) + || (path[path.Length - 1] == '$' && searchPath.EndsWith(path_lowercase)) + || (path[0] == '*' && searchPath.Contains(path_lowercase)) + ); + } + + if (bPathMatched && !string.IsNullOrEmpty(title_lowercase)) + { + bTitleMwatched = (title_lowercase == searchTitle + || (title[0] == '^' && searchTitle.StartsWith(title_lowercase)) + || (title[title.Length - 1] == '$' && searchTitle.EndsWith(title_lowercase)) + || (title[0] == '*' && searchTitle.Contains(title_lowercase)) + ); + } + + // If both path and title defined in autoprofile entry then do AND condition (ie. both path and title should match) + return bPathMatched && bTitleMwatched; + } + + private void SetSearchPath(string pathStr) + { + if (!string.IsNullOrEmpty(pathStr)) + { + path = pathStr; + path_lowercase = path.ToLower().Replace('/', '\\'); + + if (path.Length >= 2) + { + if (path[0] == '^') path_lowercase = path_lowercase.Substring(1); + else if (path[path.Length - 1] == '$') path_lowercase = path_lowercase.Substring(0, path_lowercase.Length - 1); + else if (path[0] == '*') path_lowercase = path_lowercase.Substring(1); + } + } + else path = path_lowercase = string.Empty; + } + + private void SetSearchTitle(string titleStr) + { + if (!string.IsNullOrEmpty(titleStr)) + { + title = titleStr; + title_lowercase = title.ToLower(); + + if (title.Length >= 2) + { + if (title[0] == '^') title_lowercase = title_lowercase.Substring(1); + else if (title[title.Length - 1] == '$') title_lowercase = title_lowercase.Substring(0, title_lowercase.Length - 1); + else if (title[0] == '*') title_lowercase = title_lowercase.Substring(1); + } + } + else title = title_lowercase = string.Empty; + } + } +} diff --git a/DS4Windows/BezierCurveEditor/BezierCurve.cs b/DS4Windows/BezierCurveEditor/BezierCurve.cs new file mode 100644 index 0000000000..efd65c21cb --- /dev/null +++ b/DS4Windows/BezierCurveEditor/BezierCurve.cs @@ -0,0 +1,395 @@ +/* MIT License + * + * KeySpline - use bezier curve for transition easing function + * Copyright (c) 2012 Gaetan Renaudeau (GRE) + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, + * and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ +/* KeySpline - use bezier curve for transition easing function is inspired from Firefox's nsSMILKeySpline.cpp */ + +/* +* This file contains the original bezier curve code (see comments above) and calculations ported as C# code. The original code was in JavaScript. +* +* This file has few customizations and optimizations for the needs of DS4Windows application (see https://github.com/Ryochan7/DS4Windows). +* MIT License. Permission is hereby granted, free of charge, to any person to do whatever they want with this C# ported version of BezierCurve calculation code +* as long this part of the code is open sourced and usage is in compliance with the above shown original license, also. +* +* Copyright (c) 2019, MIKA-N (https://github.com/mika-n). +* +* The original JavaScript version of bezier easing made by GRE (https://github.com/gre/bezier-easing). +* +* Usage: +* BezierCurve.InitBezierCurve = Initialize bezier curve and output lookup table. Must be called at least once before calling GetBezierEasing method (or accessing lookup table directly) to re-map analog axis input. +* BezierCurve.GetBezierEasing = Return re-mapped output value for an input axis value (or alternatively directly accessing the lookup table BezierCurve.arrayBezierLUT[inputVal] if even tiny CPU cycles matter) +* +*/ +using System; +using System.Globalization; + +namespace DS4Windows +{ + public class BezierCurve + { + public enum AxisType { LSRS, L2R2, SA }; + + private static int kSplineTableSize = 11; + private static double kSampleStepSize = 1.0 / (kSplineTableSize - 1.0); + private double[] arraySampleValues; + + // These values are established by empiricism with tests (tradeoff: performance VS precision) (comment by GRE) + private static int NEWTON_ITERATIONS = 4; + private static double NEWTON_MIN_SLOPE = 0.001; + private static double SUBDIVISION_PRECISION = 0.0000001; + private static int SUBDIVISION_MAX_ITERATIONS = 10; + + private double mX1 = 0, mY1 = 0, mX2 = 0, mY2 = 0; // Bezier curve definition (0, 0, 0, 0 = Linear. 99, 99, 0, 0 = Pre-defined hard-coded EnhancedPrecision curve) + + // Set or Get string representation of the bezier curve definition value (Note! Set doesn't initialize the lookup table. InitBezierCurve needs to be called to actually initalize the calculation) + public string AsString + { + get + { + //CultureInfo usDataFormatCulture = CultureInfo.CreateSpecificCulture("en-US"); + return $"{mX1.ToString("G")}, {mY1.ToString("G")}, {mX2.ToString("G")}, {mY2.ToString("G")}"; + } + set + { + // Set bezier curve defintion from a string value (4 comma separated decimals). If any of the string values are invalid then set curve as linear "zero" curve. + // Original assumption was values were in "en-US" data format (ie. period as decimal separator and comma as list separator). + // Attempt to not enforce that anymore. Do very basic parsing and rely on double.TryParse to handle confirming values are valid + var bezierMatch = System.Text.RegularExpressions.Regex.Match(value, + @"(.{3,9}),\s?(.{3,9}),\s?(.{3,9}),\s?(.{3,9})"); + if (bezierMatch.Success) + { + //var bezierDef = value.Split(new Char[] { ',' }, 4); + //CultureInfo usDataFormatCulture = CultureInfo.CreateSpecificCulture("en-US"); + if (bezierMatch.Groups.Count < 5 || !double.TryParse(bezierMatch.Groups[1].Value, out mX1) || + !double.TryParse(bezierMatch.Groups[2].Value, out mY1) || !double.TryParse(bezierMatch.Groups[3].Value, out mX2) || + !double.TryParse(bezierMatch.Groups[4].Value, out mY2)) + mX1 = mY1 = mX2 = mY2 = 0; + } + } + } + + // Custom definition set by DS4Windows options screens. This string is not validated (ie. the value is as user entered it and could be an invalid curve definition). This value is saved in a profile XML file. + public string CustomDefinition { get; set; } + public override string ToString() { return this.CustomDefinition; } + + public AxisType axisType; // Axis type of curve object (LS/RS/R2/L2/SA) + private double axisMaxDouble; // Max range of axis (range of positive values) + private double axisCenterPosDouble; // Center pos of axis (LS/RS has 128 as "stick center", other axies has 0 as zero center point) + + // Lookup result table is always either in 0..128 or 0..255 range depending on the DS4 analog axis range. LUT table set as public to let DS4Win reading thread to access it directly (every CPU cycle matters) + public byte[] arrayBezierLUT = null; + + public BezierCurve() + { + CustomDefinition = ""; + } + + public bool InitBezierCurve(string bezierCurveDefinition, AxisType gamepadAxisType, bool setCustomDefinitionProperty = false) + { + if (setCustomDefinitionProperty) + this.CustomDefinition = bezierCurveDefinition; + + this.AsString = bezierCurveDefinition; + return InitBezierCurve(mX1, mY1, mX2, mY2, gamepadAxisType); + } + + public bool InitBezierCurve(double x1, double y1, double x2, double y2, AxisType gamepadAxisType) + { + bool bRetValue = true; + + if (arrayBezierLUT == null) + arrayBezierLUT = new byte[256]; + + // Axis type and max range per axis + axisType = gamepadAxisType; + switch (gamepadAxisType) + { + case AxisType.LSRS: + axisMaxDouble = 127; // DS4 LS/RS axis has a "center position" at 128. Left turn has 0..127 positions and right turn 128..255 positions + axisCenterPosDouble = 128; + break; + + case AxisType.L2R2: + axisMaxDouble = 255; // L2R2 analog trigger range 0..255 + axisCenterPosDouble = 0; + break; + + default: + axisMaxDouble = 128; // SixAxis x/z/y range 0..128 + axisCenterPosDouble = 0; + break; + } + + // If x1 = 99.0 then this is probably just a dummy bezier curve value + if (x1 == 99.0) + { + mX1 = 99.0; + mY1 = y1; + mX2 = x2; + mY2 = y2; + + switch (y1) + { + case 91.0: return InitEnhancedPrecision_91(); + case 92.0: return InitQuadric_92(); + case 93.0: return InitCubic_93(); + case 94.0: return InitEaseoutQuad_94(); + case 95.0: return InitEaseoutCubic_95(); + } + } + + if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1) + { + // throw new Exception("INVALID VALUE. BezierCurve X1 and X2 should be in [0, 1] range"); + AppLogger.LogToGui($"WARNING. Invalid custom bezier curve \"{x1}, {y1}, {x2}, {y2}\" in {gamepadAxisType} axis. x1 and x2 should be in 0..1 range. Using linear curve.", true); + mX1 = mY1 = mX2 = mY2 = 0; + bRetValue = false; + } + else + { + mX1 = x1; + mY1 = y1; + mX2 = x2; + mY2 = y2; + } + + // If this is linear definition then init the lookup table with 1-on-1 mapping + if (x1 == 0 && y1 == 0 && ((x2 == 0 && y2 == 0) || (x2 == 1 && y2 == 1))) + { + for (int idx = 0; idx <= 255; idx++) + arrayBezierLUT[idx] = (byte)idx; + + return bRetValue; + } + + try + { + arraySampleValues = new double[BezierCurve.kSplineTableSize]; + for (int idx = 0; idx < BezierCurve.kSplineTableSize; idx++) + arraySampleValues[idx] = CalcBezier(idx * BezierCurve.kSampleStepSize, mX1, mX2); + + // Pre-populate lookup result table for GetBezierEasing function (performance optimization) + for (byte idx = 0; idx <= (byte)axisMaxDouble; idx++) + { + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(idx / axisMaxDouble), mY1, mY2) * axisMaxDouble), axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (gamepadAxisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + } + finally + { + arraySampleValues = null; + } + + return bRetValue; + } + + // Initialize a special "hard-coded" and pre-defined EnhancedPrecision output curve as a lookup result table + private bool InitEnhancedPrecision_91() + { + double abs, output; + + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + abs = idx / axisMaxDouble; + if (abs <= 0.4) + output = 0.55 * abs; + else if (abs <= 0.75) + output = abs - 0.18; + else //if (abs > 0.75) + output = (abs * 1.72) - 0.72; + + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(output * axisMaxDouble + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitQuadric_92() + { + double temp; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + temp = idx / axisMaxDouble; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((temp * temp * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitCubic_93() + { + double temp; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + temp = idx / axisMaxDouble; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((temp * temp * temp * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitEaseoutQuad_94() + { + double abs, output; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + abs = idx / axisMaxDouble; + output = abs * (abs - 2.0); + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((-1.0 * output * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + private bool InitEaseoutCubic_95() + { + double inner, output; + for (byte idx = 0; idx <= axisMaxDouble; idx++) + { + inner = (idx / axisMaxDouble) - 1.0; + output = (inner * inner * inner) + 1.0; + arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)((1.0 * output * axisMaxDouble) + axisCenterPosDouble); + + // Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt) + if (this.axisType == AxisType.LSRS) + arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]); + + // If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio) + if (idx == axisMaxDouble) break; + } + return true; + } + + public byte GetBezierEasing(byte inputXValue) + { + unchecked + { + return (arrayBezierLUT == null ? inputXValue : arrayBezierLUT[inputXValue]); + //return (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(inputXValue / 255), mY1, mY2) * 255), 255)); + } + } + + private double A(double aA1, double aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; } + private double B(double aA1, double aA2) { return 3.0 * aA2 - 6.0 * aA1; } + private double C(double aA1) { return 3.0 * aA1; } + + private double CalcBezier(double aT, double aA1, double aA2) + { + return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT; + } + + private double getTForX(double aX) + { + double intervalStart = 0.0; + int currentSample = 1; + int lastSample = kSplineTableSize - 1; + + for (; currentSample != lastSample && arraySampleValues[currentSample] <= aX; ++currentSample) + { + intervalStart += kSampleStepSize; + } + --currentSample; + + // Interpolate to provide an initial guess for t + double dist = (aX - arraySampleValues[currentSample]) / (arraySampleValues[currentSample + 1] - arraySampleValues[currentSample]); + double guessForT = intervalStart + dist * kSampleStepSize; + + double initialSlope = getSlope(guessForT, mX1, mX2); + if (initialSlope >= NEWTON_MIN_SLOPE) + { + return newtonRaphsonIterate(aX, guessForT /*, mX1, mX2*/); + } + else if (initialSlope == 0.0) + { + return guessForT; + } + else + { + return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize /*, mX1, mX2*/); + } + } + + // Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2. + private double getSlope(double aT, double aA1, double aA2) + { + return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1); + } + + private double newtonRaphsonIterate(double aX, double aGuessT /*, double mX1, double mX2*/) + { + for (int i = 0; i < BezierCurve.NEWTON_ITERATIONS; ++i) + { + double currentSlope = getSlope(aGuessT, mX1, mX2); + if (currentSlope == 0.0) + { + return aGuessT; + } + double currentX = CalcBezier(aGuessT, mX1, mX2) - aX; + aGuessT -= currentX / currentSlope; + } + return aGuessT; + } + + private double binarySubdivide(double aX, double aA, double aB /*, double mX1, double mX2*/) + { + double currentX, currentT, i = 0; + do + { + currentT = aA + (aB - aA) / 2.0; + currentX = CalcBezier(currentT, mX1, mX2) - aX; + if (currentX > 0.0) + { + aB = currentT; + } + else + { + aA = currentT; + } + } while (Math.Abs(currentX) > BezierCurve.SUBDIVISION_PRECISION && ++i < BezierCurve.SUBDIVISION_MAX_ITERATIONS); + + return currentT; + } + + } +} diff --git a/DS4Windows/BezierCurveEditor/build.js b/DS4Windows/BezierCurveEditor/build.js new file mode 100644 index 0000000000..278059de0a --- /dev/null +++ b/DS4Windows/BezierCurveEditor/build.js @@ -0,0 +1,10114 @@ +! function e(t, n, r) { + function o(i, s) { + if (!n[i]) { + if (!t[i]) { + var u = "function" == typeof require && require; + if (!s && u) return u(i, !0); + if (a) return a(i, !0); + var c = new Error("Cannot find module '" + i + "'"); + throw c.code = "MODULE_NOT_FOUND", c + } + var l = n[i] = { + exports: {} + }; + t[i][0].call(l.exports, function(e) { + var n = t[i][1][e]; + return o(n ? n : e) + }, l, l.exports, e, t, n, r) + } + return n[i].exports + } + for (var a = "function" == typeof require && require, i = 0; i < r.length; i++) o(r[i]); + return o +}({ + 1: [function(e) { + "use strict"; + var t = function(e) { + return e && e.__esModule ? e["default"] : e + }, + n = function() { + function e(e, t) { + for (var n in t) { + var r = t[n]; + r.configurable = !0, r.value && (r.writable = !0) + } + Object.defineProperties(e, t) + } + return function(t, n, r) { + return n && e(t.prototype, n), r && e(t, r), t + } + }(), + r = function f(e, t, n) { + var r = Object.getOwnPropertyDescriptor(e, t); + if (void 0 === r) { + var o = Object.getPrototypeOf(e); + return null === o ? void 0 : f(o, t, n) + } + if ("value" in r && r.writable) return r.value; + var a = r.get; + return void 0 === a ? void 0 : a.call(n) + }, + o = function(e, t) { + if ("function" != typeof t && null !== t) throw new TypeError("Super expression must either be null or a function, not " + typeof t); + e.prototype = Object.create(t && t.prototype, { + constructor: { + value: e, + enumerable: !1, + writable: !0, + configurable: !0 + } + }), t && (e.__proto__ = t) + }, + a = function(e, t) { + if (!(e instanceof t)) throw new TypeError("Cannot call a class as a function") + }, + i = t(e("react/addons")), + s = t(e("..")), + u = t(e("../package.json")), + c = t(e("raf")); + window.Perf = i.addons.Perf; + var l = { + color: "#0000c6", + textDecoration: "none" + }, + p = { + display: "inline-block", + margin: "5px" + }, + qryVariableValue = function(variableName) + { + var query = window.location.search.substring(1); + var vars = query.split("&"); + for (var i=0;i o; ++o) { + var a = v(r, e, c); + if (0 === a) return r; + var i = h(r, e, c) - t; + r -= i / a + } + return r + } + + function y() { + for (var t = 0; i > t; ++t) _[t] = h(t * s, e, c) + } + + function g(t, n, r) { + var i, s, u = 0; + do s = n + (r - n) / 2, i = h(s, e, c) - t, i > 0 ? r = s : n = s; while (Math.abs(i) > o && ++u < a); + return s + } + + function E(t) { + for (var n = 0, o = 1, a = i - 1; o != a && _[o] <= t; ++o) n += s; + --o; + var u = (t - _[o]) / (_[o + 1] - _[o]), + l = n + u * s, + p = v(l, e, c); + return p >= r ? m(t, l) : 0 === p ? l : g(t, n, n + s) + } + + function C() { + N = !0, (e != t || c != l) && y() + } + if (4 !== arguments.length) throw new Error("BezierEasing requires 4 arguments."); + for (var b = 0; 4 > b; ++b) + if ("number" != typeof arguments[b] || isNaN(arguments[b]) || !isFinite(arguments[b])) throw new Error("BezierEasing arguments should be integers."); + if (0 > e || e > 1 || 0 > c || c > 1) throw new Error("BezierEasing x values must be in [0, 1] range."); + var _ = u ? new Float32Array(i) : new Array(i), + N = !1, + O = function(n) { + return N || C(), e === t && c === l ? n : 0 === n ? 0 : 1 === n ? 1 : h(E(n), t, l) + }; + O.getControlPoints = function() { + return [{ + x: e, + y: t + }, { + x: c, + y: l + }] + }; + var R = [e, t, c, l], + D = "BezierEasing(" + R + ")"; + O.toString = function() { + return D + }; + var w = "cubic-bezier(" + R + ")"; + return O.toCSS = function() { + return w + }, O + } + var t = this, + n = 4, + r = .001, + o = 1e-7, + a = 10, + i = 11, + s = 1 / (i - 1), + u = "Float32Array" in t; + return e.css = { + ease: e(.25, .1, .25, 1), + linear: e(0, 0, 1, 1), + "ease-in": e(.42, 0, 1, 1), + "ease-out": e(0, 0, .58, 1), + "ease-in-out": e(.42, 0, .58, 1) + }, e + }) + }, {}], + 6: [function(e, t) { + "use strict"; + + function n(e) { + if (null == e) throw new TypeError("Object.assign cannot be called with null or undefined"); + return Object(e) + } + t.exports = Object.assign || function(e) { + for (var t, r, o = n(e), a = 1; a < arguments.length; a++) { + t = arguments[a], r = Object.keys(Object(t)); + for (var i = 0; i < r.length; i++) o[r[i]] = t[r[i]] + } + return o + } + }, {}], + 7: [function(e, t) { + t.exports = e("./lib/ReactWithAddons") + }, { + "./lib/ReactWithAddons": 107 + }], + 8: [function(e, t) { + "use strict"; + var n = e("./focusNode"), + r = { + componentDidMount: function() { + this.props.autoFocus && n(this.getDOMNode()) + } + }; + t.exports = r + }, { + "./focusNode": 141 + }], + 9: [function(e, t) { + "use strict"; + + function n() { + var e = window.opera; + return "object" == typeof e && "function" == typeof e.version && parseInt(e.version(), 10) <= 12 + } + + function r(e) { + return (e.ctrlKey || e.altKey || e.metaKey) && !(e.ctrlKey && e.altKey) + } + + function o(e) { + switch (e) { + case w.topCompositionStart: + return M.compositionStart; + case w.topCompositionEnd: + return M.compositionEnd; + case w.topCompositionUpdate: + return M.compositionUpdate + } + } + + function a(e, t) { + return e === w.topKeyDown && t.keyCode === C + } + + function i(e, t) { + switch (e) { + case w.topKeyUp: + return -1 !== E.indexOf(t.keyCode); + case w.topKeyDown: + return t.keyCode !== C; + case w.topKeyPress: + case w.topMouseDown: + case w.topBlur: + return !0; + default: + return !1 + } + } + + function s(e) { + var t = e.detail; + return "object" == typeof t && "data" in t ? t.data : null + } + + function u(e, t, n, r) { + var u, c; + if (b ? u = o(e) : T ? i(e, r) && (u = M.compositionEnd) : a(e, r) && (u = M.compositionStart), !u) return null; + O && (T || u !== M.compositionStart ? u === M.compositionEnd && T && (c = T.getData()) : T = v.getPooled(t)); + var l = m.getPooled(u, n, r); + if (c) l.data = c; + else { + var p = s(r); + null !== p && (l.data = p) + } + return f.accumulateTwoPhaseDispatches(l), l + } + + function c(e, t) { + switch (e) { + case w.topCompositionEnd: + return s(t); + case w.topKeyPress: + var n = t.which; + return n !== R ? null : (x = !0, D); + case w.topTextInput: + var r = t.data; + return r === D && x ? null : r; + default: + return null + } + } + + function l(e, t) { + if (T) { + if (e === w.topCompositionEnd || i(e, t)) { + var n = T.getData(); + return v.release(T), T = null, n + } + return null + } + switch (e) { + case w.topPaste: + return null; + case w.topKeyPress: + return t.which && !r(t) ? String.fromCharCode(t.which) : null; + case w.topCompositionEnd: + return O ? null : t.data; + default: + return null + } + } + + function p(e, t, n, r) { + var o; + if (o = N ? c(e, r) : l(e, r), !o) return null; + var a = y.getPooled(M.beforeInput, n, r); + return a.data = o, f.accumulateTwoPhaseDispatches(a), a + } + var d = e("./EventConstants"), + f = e("./EventPropagators"), + h = e("./ExecutionEnvironment"), + v = e("./FallbackCompositionState"), + m = e("./SyntheticCompositionEvent"), + y = e("./SyntheticInputEvent"), + g = e("./keyOf"), + E = [9, 13, 27, 32], + C = 229, + b = h.canUseDOM && "CompositionEvent" in window, + _ = null; + h.canUseDOM && "documentMode" in document && (_ = document.documentMode); + var N = h.canUseDOM && "TextEvent" in window && !_ && !n(), + O = h.canUseDOM && (!b || _ && _ > 8 && 11 >= _), + R = 32, + D = String.fromCharCode(R), + w = d.topLevelTypes, + M = { + beforeInput: { + phasedRegistrationNames: { + bubbled: g({ + onBeforeInput: null + }), + captured: g({ + onBeforeInputCapture: null + }) + }, + dependencies: [w.topCompositionEnd, w.topKeyPress, w.topTextInput, w.topPaste] + }, + compositionEnd: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionEnd: null + }), + captured: g({ + onCompositionEndCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionEnd, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + }, + compositionStart: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionStart: null + }), + captured: g({ + onCompositionStartCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionStart, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + }, + compositionUpdate: { + phasedRegistrationNames: { + bubbled: g({ + onCompositionUpdate: null + }), + captured: g({ + onCompositionUpdateCapture: null + }) + }, + dependencies: [w.topBlur, w.topCompositionUpdate, w.topKeyDown, w.topKeyPress, w.topKeyUp, w.topMouseDown] + } + }, + x = !1, + T = null, + P = { + eventTypes: M, + extractEvents: function(e, t, n, r) { + return [u(e, t, n, r), p(e, t, n, r)] + } + }; + t.exports = P + }, { + "./EventConstants": 22, + "./EventPropagators": 27, + "./ExecutionEnvironment": 28, + "./FallbackCompositionState": 29, + "./SyntheticCompositionEvent": 113, + "./SyntheticInputEvent": 117, + "./keyOf": 164 + }], + 10: [function(e, t) { + (function(n) { + var r = e("./invariant"), + o = { + addClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), 'CSSCore.addClass takes only a single class name. "%s" contains multiple classes.', t) : r(!/\s/.test(t)), t && (e.classList ? e.classList.add(t) : o.hasClass(e, t) || (e.className = e.className + " " + t)), e + }, + removeClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), 'CSSCore.removeClass takes only a single class name. "%s" contains multiple classes.', t) : r(!/\s/.test(t)), t && (e.classList ? e.classList.remove(t) : o.hasClass(e, t) && (e.className = e.className.replace(new RegExp("(^|\\s)" + t + "(?:\\s|$)", "g"), "$1").replace(/\s+/g, " ").replace(/^\s*|\s*$/g, ""))), e + }, + conditionClass: function(e, t, n) { + return (n ? o.addClass : o.removeClass)(e, t) + }, + hasClass: function(e, t) { + return "production" !== n.env.NODE_ENV ? r(!/\s/.test(t), "CSS.hasClass takes only a single class name.") : r(!/\s/.test(t)), e.classList ? !!t && e.classList.contains(t) : (" " + e.className + " ").indexOf(" " + t + " ") > -1 + } + }; + t.exports = o + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 11: [function(e, t) { + "use strict"; + + function n(e, t) { + return e + t.charAt(0).toUpperCase() + t.substring(1) + } + var r = { + boxFlex: !0, + boxFlexGroup: !0, + columnCount: !0, + flex: !0, + flexGrow: !0, + flexShrink: !0, + fontWeight: !0, + lineClamp: !0, + lineHeight: !0, + opacity: !0, + order: !0, + orphans: !0, + widows: !0, + zIndex: !0, + zoom: !0, + fillOpacity: !0, + strokeOpacity: !0 + }, + o = ["Webkit", "ms", "Moz", "O"]; + Object.keys(r).forEach(function(e) { + o.forEach(function(t) { + r[n(t, e)] = r[e] + }) + }); + var a = { + background: { + backgroundImage: !0, + backgroundPosition: !0, + backgroundRepeat: !0, + backgroundColor: !0 + }, + border: { + borderWidth: !0, + borderStyle: !0, + borderColor: !0 + }, + borderBottom: { + borderBottomWidth: !0, + borderBottomStyle: !0, + borderBottomColor: !0 + }, + borderLeft: { + borderLeftWidth: !0, + borderLeftStyle: !0, + borderLeftColor: !0 + }, + borderRight: { + borderRightWidth: !0, + borderRightStyle: !0, + borderRightColor: !0 + }, + borderTop: { + borderTopWidth: !0, + borderTopStyle: !0, + borderTopColor: !0 + }, + font: { + fontStyle: !0, + fontVariant: !0, + fontWeight: !0, + fontSize: !0, + lineHeight: !0, + fontFamily: !0 + } + }, + i = { + isUnitlessNumber: r, + shorthandPropertyExpansions: a + }; + t.exports = i + }, {}], + 12: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./CSSProperty"), + o = e("./ExecutionEnvironment"), + a = e("./camelizeStyleName"), + i = e("./dangerousStyleValue"), + s = e("./hyphenateStyleName"), + u = e("./memoizeStringOnly"), + c = e("./warning"), + l = u(function(e) { + return s(e) + }), + p = "cssFloat"; + if (o.canUseDOM && void 0 === document.documentElement.style.cssFloat && (p = "styleFloat"), "production" !== n.env.NODE_ENV) var d = /^(?:webkit|moz|o)[A-Z]/, + f = /;\s*$/, + h = {}, + v = {}, + m = function(e) { + h.hasOwnProperty(e) && h[e] || (h[e] = !0, "production" !== n.env.NODE_ENV ? c(!1, "Unsupported style property %s. Did you mean %s?", e, a(e)) : null) + }, + y = function(e) { + h.hasOwnProperty(e) && h[e] || (h[e] = !0, "production" !== n.env.NODE_ENV ? c(!1, "Unsupported vendor-prefixed style property %s. Did you mean %s?", e, e.charAt(0).toUpperCase() + e.slice(1)) : null) + }, + g = function(e, t) { + v.hasOwnProperty(t) && v[t] || (v[t] = !0, "production" !== n.env.NODE_ENV ? c(!1, 'Style property values shouldn\'t contain a semicolon. Try "%s: %s" instead.', e, t.replace(f, "")) : null) + }, + E = function(e, t) { + e.indexOf("-") > -1 ? m(e) : d.test(e) ? y(e) : f.test(t) && g(e, t) + }; + var C = { + createMarkupForStyles: function(e) { + var t = ""; + for (var r in e) + if (e.hasOwnProperty(r)) { + var o = e[r]; + "production" !== n.env.NODE_ENV && E(r, o), null != o && (t += l(r) + ":", t += i(r, o) + ";") + } return t || null + }, + setValueForStyles: function(e, t) { + var o = e.style; + for (var a in t) + if (t.hasOwnProperty(a)) { + "production" !== n.env.NODE_ENV && E(a, t[a]); + var s = i(a, t[a]); + if ("float" === a && (a = p), s) o[a] = s; + else { + var u = r.shorthandPropertyExpansions[a]; + if (u) + for (var c in u) o[c] = ""; + else o[a] = "" + } + } + } + }; + t.exports = C + }).call(this, e("_process")) + }, { + "./CSSProperty": 11, + "./ExecutionEnvironment": 28, + "./camelizeStyleName": 128, + "./dangerousStyleValue": 135, + "./hyphenateStyleName": 155, + "./memoizeStringOnly": 166, + "./warning": 178, + _process: 2 + }], + 13: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this._callbacks = null, this._contexts = null + } + var o = e("./PooledClass"), + a = e("./Object.assign"), + i = e("./invariant"); + a(r.prototype, { + enqueue: function(e, t) { + this._callbacks = this._callbacks || [], this._contexts = this._contexts || [], this._callbacks.push(e), this._contexts.push(t) + }, + notifyAll: function() { + var e = this._callbacks, + t = this._contexts; + if (e) { + "production" !== n.env.NODE_ENV ? i(e.length === t.length, "Mismatched list of contexts in callback queue") : i(e.length === t.length), this._callbacks = null, this._contexts = null; + for (var r = 0, o = e.length; o > r; r++) e[r].call(t[r]); + e.length = 0, t.length = 0 + } + }, + reset: function() { + this._callbacks = null, this._contexts = null + }, + destructor: function() { + this.reset() + } + }), o.addPoolingTo(r), t.exports = r + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./PooledClass": 36, + "./invariant": 157, + _process: 2 + }], + 14: [function(e, t) { + "use strict"; + + function n(e) { + return "SELECT" === e.nodeName || "INPUT" === e.nodeName && "file" === e.type + } + + function r(e) { + var t = _.getPooled(w.change, x, e); + E.accumulateTwoPhaseDispatches(t), b.batchedUpdates(o, t) + } + + function o(e) { + g.enqueueEvents(e), g.processEventQueue() + } + + function a(e, t) { + M = e, x = t, M.attachEvent("onchange", r) + } + + function i() { + M && (M.detachEvent("onchange", r), M = null, x = null) + } + + function s(e, t, n) { + return e === D.topChange ? n : void 0 + } + + function u(e, t, n) { + e === D.topFocus ? (i(), a(t, n)) : e === D.topBlur && i() + } + + function c(e, t) { + M = e, x = t, T = e.value, P = Object.getOwnPropertyDescriptor(e.constructor.prototype, "value"), Object.defineProperty(M, "value", k), M.attachEvent("onpropertychange", p) + } + + function l() { + M && (delete M.value, M.detachEvent("onpropertychange", p), M = null, x = null, T = null, P = null) + } + + function p(e) { + if ("value" === e.propertyName) { + var t = e.srcElement.value; + t !== T && (T = t, r(e)) + } + } + + function d(e, t, n) { + return e === D.topInput ? n : void 0 + } + + function f(e, t, n) { + e === D.topFocus ? (l(), c(t, n)) : e === D.topBlur && l() + } + + function h(e) { + return e !== D.topSelectionChange && e !== D.topKeyUp && e !== D.topKeyDown || !M || M.value === T ? void 0 : (T = M.value, x) + } + + function v(e) { + return "INPUT" === e.nodeName && ("checkbox" === e.type || "radio" === e.type) + } + + function m(e, t, n) { + return e === D.topClick ? n : void 0 + } + var y = e("./EventConstants"), + g = e("./EventPluginHub"), + E = e("./EventPropagators"), + C = e("./ExecutionEnvironment"), + b = e("./ReactUpdates"), + _ = e("./SyntheticEvent"), + N = e("./isEventSupported"), + O = e("./isTextInputElement"), + R = e("./keyOf"), + D = y.topLevelTypes, + w = { + change: { + phasedRegistrationNames: { + bubbled: R({ + onChange: null + }), + captured: R({ + onChangeCapture: null + }) + }, + dependencies: [D.topBlur, D.topChange, D.topClick, D.topFocus, D.topInput, D.topKeyDown, D.topKeyUp, D.topSelectionChange] + } + }, + M = null, + x = null, + T = null, + P = null, + I = !1; + C.canUseDOM && (I = N("change") && (!("documentMode" in document) || document.documentMode > 8)); + var S = !1; + C.canUseDOM && (S = N("input") && (!("documentMode" in document) || document.documentMode > 9)); + var k = { + get: function() { + return P.get.call(this) + }, + set: function(e) { + T = "" + e, P.set.call(this, e) + } + }, + A = { + eventTypes: w, + extractEvents: function(e, t, r, o) { + var a, i; + if (n(t) ? I ? a = s : i = u : O(t) ? S ? a = d : (a = h, i = f) : v(t) && (a = m), a) { + var c = a(e, t, r); + if (c) { + var l = _.getPooled(w.change, c, o); + return E.accumulateTwoPhaseDispatches(l), l + } + } + i && i(e, t, r) + } + }; + t.exports = A + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./EventPropagators": 27, + "./ExecutionEnvironment": 28, + "./ReactUpdates": 106, + "./SyntheticEvent": 115, + "./isEventSupported": 158, + "./isTextInputElement": 160, + "./keyOf": 164 + }], + 15: [function(e, t) { + "use strict"; + var n = 0, + r = { + createReactRootIndex: function() { + return n++ + } + }; + t.exports = r + }, {}], + 16: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, n) { + e.insertBefore(t, e.childNodes[n] || null) + } + var o = e("./Danger"), + a = e("./ReactMultiChildUpdateTypes"), + i = e("./setTextContent"), + s = e("./invariant"), + u = { + dangerouslyReplaceNodeWithMarkup: o.dangerouslyReplaceNodeWithMarkup, + updateTextContent: i, + processUpdates: function(e, t) { + for (var u, c = null, l = null, p = 0; p < e.length; p++) + if (u = e[p], u.type === a.MOVE_EXISTING || u.type === a.REMOVE_NODE) { + var d = u.fromIndex, + f = u.parentNode.childNodes[d], + h = u.parentID; + "production" !== n.env.NODE_ENV ? s(f, "processUpdates(): Unable to find child %s of element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a when using tables, nesting tags like
,

, or , or using non-SVG elements in an parent. Try inspecting the child nodes of the element with React ID `%s`.", d, h) : s(f), c = c || {}, c[h] = c[h] || [], c[h][d] = f, l = l || [], l.push(f) + } var v = o.dangerouslyRenderMarkup(t); + if (l) + for (var m = 0; m < l.length; m++) l[m].parentNode.removeChild(l[m]); + for (var y = 0; y < e.length; y++) switch (u = e[y], u.type) { + case a.INSERT_MARKUP: + r(u.parentNode, v[u.markupIndex], u.toIndex); + break; + case a.MOVE_EXISTING: + r(u.parentNode, c[u.parentID][u.fromIndex], u.toIndex); + break; + case a.TEXT_CONTENT: + i(u.parentNode, u.textContent); + break; + case a.REMOVE_NODE: + } + } + }; + t.exports = u + }).call(this, e("_process")) + }, { + "./Danger": 19, + "./ReactMultiChildUpdateTypes": 85, + "./invariant": 157, + "./setTextContent": 172, + _process: 2 + }], + 17: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + return (e & t) === t + } + var o = e("./invariant"), + a = { + MUST_USE_ATTRIBUTE: 1, + MUST_USE_PROPERTY: 2, + HAS_SIDE_EFFECTS: 4, + HAS_BOOLEAN_VALUE: 8, + HAS_NUMERIC_VALUE: 16, + HAS_POSITIVE_NUMERIC_VALUE: 48, + HAS_OVERLOADED_BOOLEAN_VALUE: 64, + injectDOMPropertyConfig: function(e) { + var t = e.Properties || {}, + i = e.DOMAttributeNames || {}, + u = e.DOMPropertyNames || {}, + c = e.DOMMutationMethods || {}; + e.isCustomAttribute && s._isCustomAttributeFunctions.push(e.isCustomAttribute); + for (var l in t) { + "production" !== n.env.NODE_ENV ? o(!s.isStandardName.hasOwnProperty(l), "injectDOMPropertyConfig(...): You're trying to inject DOM property '%s' which has already been injected. You may be accidentally injecting the same DOM property config twice, or you may be injecting two configs that have conflicting property names.", l) : o(!s.isStandardName.hasOwnProperty(l)), s.isStandardName[l] = !0; + var p = l.toLowerCase(); + if (s.getPossibleStandardName[p] = l, i.hasOwnProperty(l)) { + var d = i[l]; + s.getPossibleStandardName[d] = l, s.getAttributeName[l] = d + } else s.getAttributeName[l] = p; + s.getPropertyName[l] = u.hasOwnProperty(l) ? u[l] : l, s.getMutationMethod[l] = c.hasOwnProperty(l) ? c[l] : null; + var f = t[l]; + s.mustUseAttribute[l] = r(f, a.MUST_USE_ATTRIBUTE), s.mustUseProperty[l] = r(f, a.MUST_USE_PROPERTY), s.hasSideEffects[l] = r(f, a.HAS_SIDE_EFFECTS), s.hasBooleanValue[l] = r(f, a.HAS_BOOLEAN_VALUE), s.hasNumericValue[l] = r(f, a.HAS_NUMERIC_VALUE), s.hasPositiveNumericValue[l] = r(f, a.HAS_POSITIVE_NUMERIC_VALUE), s.hasOverloadedBooleanValue[l] = r(f, a.HAS_OVERLOADED_BOOLEAN_VALUE), "production" !== n.env.NODE_ENV ? o(!s.mustUseAttribute[l] || !s.mustUseProperty[l], "DOMProperty: Cannot require using both attribute and property: %s", l) : o(!s.mustUseAttribute[l] || !s.mustUseProperty[l]), "production" !== n.env.NODE_ENV ? o(s.mustUseProperty[l] || !s.hasSideEffects[l], "DOMProperty: Properties that have side effects must use property: %s", l) : o(s.mustUseProperty[l] || !s.hasSideEffects[l]), "production" !== n.env.NODE_ENV ? o(!!s.hasBooleanValue[l] + !!s.hasNumericValue[l] + !!s.hasOverloadedBooleanValue[l] <= 1, "DOMProperty: Value can be one of boolean, overloaded boolean, or numeric value, but not a combination: %s", l) : o(!!s.hasBooleanValue[l] + !!s.hasNumericValue[l] + !!s.hasOverloadedBooleanValue[l] <= 1) + } + } + }, + i = {}, + s = { + ID_ATTRIBUTE_NAME: "data-reactid", + isStandardName: {}, + getPossibleStandardName: {}, + getAttributeName: {}, + getPropertyName: {}, + getMutationMethod: {}, + mustUseAttribute: {}, + mustUseProperty: {}, + hasSideEffects: {}, + hasBooleanValue: {}, + hasNumericValue: {}, + hasPositiveNumericValue: {}, + hasOverloadedBooleanValue: {}, + _isCustomAttributeFunctions: [], + isCustomAttribute: function(e) { + for (var t = 0; t < s._isCustomAttributeFunctions.length; t++) { + var n = s._isCustomAttributeFunctions[t]; + if (n(e)) return !0 + } + return !1 + }, + getDefaultValueForProperty: function(e, t) { + var n, r = i[e]; + return r || (i[e] = r = {}), t in r || (n = document.createElement(e), r[t] = n[t]), r[t] + }, + injection: a + }; + t.exports = s + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 18: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + return null == t || o.hasBooleanValue[e] && !t || o.hasNumericValue[e] && isNaN(t) || o.hasPositiveNumericValue[e] && 1 > t || o.hasOverloadedBooleanValue[e] && t === !1 + } + var o = e("./DOMProperty"), + a = e("./quoteAttributeValueForBrowser"), + i = e("./warning"); + if ("production" !== n.env.NODE_ENV) var s = { + children: !0, + dangerouslySetInnerHTML: !0, + key: !0, + ref: !0 + }, + u = {}, + c = function(e) { + if (!(s.hasOwnProperty(e) && s[e] || u.hasOwnProperty(e) && u[e])) { + u[e] = !0; + var t = e.toLowerCase(), + r = o.isCustomAttribute(t) ? t : o.getPossibleStandardName.hasOwnProperty(t) ? o.getPossibleStandardName[t] : null; + "production" !== n.env.NODE_ENV ? i(null == r, "Unknown DOM property %s. Did you mean %s?", e, r) : null + } + }; + var l = { + createMarkupForID: function(e) { + return o.ID_ATTRIBUTE_NAME + "=" + a(e) + }, + createMarkupForProperty: function(e, t) { + if (o.isStandardName.hasOwnProperty(e) && o.isStandardName[e]) { + if (r(e, t)) return ""; + var i = o.getAttributeName[e]; + return o.hasBooleanValue[e] || o.hasOverloadedBooleanValue[e] && t === !0 ? i : i + "=" + a(t) + } + return o.isCustomAttribute(e) ? null == t ? "" : e + "=" + a(t) : ("production" !== n.env.NODE_ENV && c(e), null) + }, + setValueForProperty: function(e, t, a) { + if (o.isStandardName.hasOwnProperty(t) && o.isStandardName[t]) { + var i = o.getMutationMethod[t]; + if (i) i(e, a); + else if (r(t, a)) this.deleteValueForProperty(e, t); + else if (o.mustUseAttribute[t]) e.setAttribute(o.getAttributeName[t], "" + a); + else { + var s = o.getPropertyName[t]; + o.hasSideEffects[t] && "" + e[s] == "" + a || (e[s] = a) + } + } else o.isCustomAttribute(t) ? null == a ? e.removeAttribute(t) : e.setAttribute(t, "" + a) : "production" !== n.env.NODE_ENV && c(t) + }, + deleteValueForProperty: function(e, t) { + if (o.isStandardName.hasOwnProperty(t) && o.isStandardName[t]) { + var r = o.getMutationMethod[t]; + if (r) r(e, void 0); + else if (o.mustUseAttribute[t]) e.removeAttribute(o.getAttributeName[t]); + else { + var a = o.getPropertyName[t], + i = o.getDefaultValueForProperty(e.nodeName, a); + o.hasSideEffects[t] && "" + e[a] === i || (e[a] = i) + } + } else o.isCustomAttribute(t) ? e.removeAttribute(t) : "production" !== n.env.NODE_ENV && c(t) + } + }; + t.exports = l + }).call(this, e("_process")) + }, { + "./DOMProperty": 17, + "./quoteAttributeValueForBrowser": 170, + "./warning": 178, + _process: 2 + }], + 19: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return e.substring(1, e.indexOf(" ")) + } + var o = e("./ExecutionEnvironment"), + a = e("./createNodesFromMarkup"), + i = e("./emptyFunction"), + s = e("./getMarkupWrap"), + u = e("./invariant"), + c = /^(<[^ \/>]+)/, + l = "data-danger-index", + p = { + dangerouslyRenderMarkup: function(e) { + "production" !== n.env.NODE_ENV ? u(o.canUseDOM, "dangerouslyRenderMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.") : u(o.canUseDOM); + for (var t, p = {}, d = 0; d < e.length; d++) "production" !== n.env.NODE_ENV ? u(e[d], "dangerouslyRenderMarkup(...): Missing markup.") : u(e[d]), t = r(e[d]), t = s(t) ? t : "*", p[t] = p[t] || [], p[t][d] = e[d]; + var f = [], + h = 0; + for (t in p) + if (p.hasOwnProperty(t)) { + var v, m = p[t]; + for (v in m) + if (m.hasOwnProperty(v)) { + var y = m[v]; + m[v] = y.replace(c, "$1 " + l + '="' + v + '" ') + } for (var g = a(m.join(""), i), E = 0; E < g.length; ++E) { + var C = g[E]; + C.hasAttribute && C.hasAttribute(l) ? (v = +C.getAttribute(l), C.removeAttribute(l), "production" !== n.env.NODE_ENV ? u(!f.hasOwnProperty(v), "Danger: Assigning to an already-occupied result index.") : u(!f.hasOwnProperty(v)), f[v] = C, h += 1) : "production" !== n.env.NODE_ENV && console.error("Danger: Discarding unexpected node:", C) + } + } return "production" !== n.env.NODE_ENV ? u(h === f.length, "Danger: Did not assign to every index of resultList.") : u(h === f.length), "production" !== n.env.NODE_ENV ? u(f.length === e.length, "Danger: Expected markup to render %s nodes, but rendered %s.", e.length, f.length) : u(f.length === e.length), f + }, + dangerouslyReplaceNodeWithMarkup: function(e, t) { + "production" !== n.env.NODE_ENV ? u(o.canUseDOM, "dangerouslyReplaceNodeWithMarkup(...): Cannot render markup in a worker thread. Make sure `window` and `document` are available globally before requiring React when unit testing or use React.renderToString for server rendering.") : u(o.canUseDOM), "production" !== n.env.NODE_ENV ? u(t, "dangerouslyReplaceNodeWithMarkup(...): Missing markup.") : u(t), "production" !== n.env.NODE_ENV ? u("html" !== e.tagName.toLowerCase(), "dangerouslyReplaceNodeWithMarkup(...): Cannot replace markup of the node. This is because browser quirks make this unreliable and/or slow. If you want to render to the root you must use server rendering. See React.renderToString().") : u("html" !== e.tagName.toLowerCase()); + var r = a(t, i)[0]; + e.parentNode.replaceChild(r, e) + } + }; + t.exports = p + }).call(this, e("_process")) + }, { + "./ExecutionEnvironment": 28, + "./createNodesFromMarkup": 133, + "./emptyFunction": 136, + "./getMarkupWrap": 149, + "./invariant": 157, + _process: 2 + }], + 20: [function(e, t) { + "use strict"; + var n = e("./keyOf"), + r = [n({ + ResponderEventPlugin: null + }), n({ + SimpleEventPlugin: null + }), n({ + TapEventPlugin: null + }), n({ + EnterLeaveEventPlugin: null + }), n({ + ChangeEventPlugin: null + }), n({ + SelectEventPlugin: null + }), n({ + BeforeInputEventPlugin: null + }), n({ + AnalyticsEventPlugin: null + }), n({ + MobileSafariClickEventPlugin: null + })]; + t.exports = r + }, { + "./keyOf": 164 + }], + 21: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./EventPropagators"), + o = e("./SyntheticMouseEvent"), + a = e("./ReactMount"), + i = e("./keyOf"), + s = n.topLevelTypes, + u = a.getFirstReactDOM, + c = { + mouseEnter: { + registrationName: i({ + onMouseEnter: null + }), + dependencies: [s.topMouseOut, s.topMouseOver] + }, + mouseLeave: { + registrationName: i({ + onMouseLeave: null + }), + dependencies: [s.topMouseOut, s.topMouseOver] + } + }, + l = [null, null], + p = { + eventTypes: c, + extractEvents: function(e, t, n, i) { + if (e === s.topMouseOver && (i.relatedTarget || i.fromElement)) return null; + if (e !== s.topMouseOut && e !== s.topMouseOver) return null; + var p; + if (t.window === t) p = t; + else { + var d = t.ownerDocument; + p = d ? d.defaultView || d.parentWindow : window + } + var f, h; + if (e === s.topMouseOut ? (f = t, h = u(i.relatedTarget || i.toElement) || p) : (f = p, h = t), f === h) return null; + var v = f ? a.getID(f) : "", + m = h ? a.getID(h) : "", + y = o.getPooled(c.mouseLeave, v, i); + y.type = "mouseleave", y.target = f, y.relatedTarget = h; + var g = o.getPooled(c.mouseEnter, m, i); + return g.type = "mouseenter", g.target = h, g.relatedTarget = f, r.accumulateEnterLeaveDispatches(y, g, v, m), l[0] = y, l[1] = g, l + } + }; + t.exports = p + }, { + "./EventConstants": 22, + "./EventPropagators": 27, + "./ReactMount": 83, + "./SyntheticMouseEvent": 119, + "./keyOf": 164 + }], + 22: [function(e, t) { + "use strict"; + var n = e("./keyMirror"), + r = n({ + bubbled: null, + captured: null + }), + o = n({ + topBlur: null, + topChange: null, + topClick: null, + topCompositionEnd: null, + topCompositionStart: null, + topCompositionUpdate: null, + topContextMenu: null, + topCopy: null, + topCut: null, + topDoubleClick: null, + topDrag: null, + topDragEnd: null, + topDragEnter: null, + topDragExit: null, + topDragLeave: null, + topDragOver: null, + topDragStart: null, + topDrop: null, + topError: null, + topFocus: null, + topInput: null, + topKeyDown: null, + topKeyPress: null, + topKeyUp: null, + topLoad: null, + topMouseDown: null, + topMouseMove: null, + topMouseOut: null, + topMouseOver: null, + topMouseUp: null, + topPaste: null, + topReset: null, + topScroll: null, + topSelectionChange: null, + topSubmit: null, + topTextInput: null, + topTouchCancel: null, + topTouchEnd: null, + topTouchMove: null, + topTouchStart: null, + topWheel: null + }), + a = { + topLevelTypes: o, + PropagationPhases: r + }; + t.exports = a + }, { + "./keyMirror": 163 + }], + 23: [function(e, t) { + (function(n) { + var r = e("./emptyFunction"), + o = { + listen: function(e, t, n) { + return e.addEventListener ? (e.addEventListener(t, n, !1), { + remove: function() { + e.removeEventListener(t, n, !1) + } + }) : e.attachEvent ? (e.attachEvent("on" + t, n), { + remove: function() { + e.detachEvent("on" + t, n) + } + }) : void 0 + }, + capture: function(e, t, o) { + return e.addEventListener ? (e.addEventListener(t, o, !0), { + remove: function() { + e.removeEventListener(t, o, !0) + } + }) : ("production" !== n.env.NODE_ENV && console.error("Attempted to listen to events during the capture phase on a browser that does not support the capture phase. Your application will not receive some events."), { + remove: r + }) + }, + registerDefault: function() {} + }; + t.exports = o + }).call(this, e("_process")) + }, { + "./emptyFunction": 136, + _process: 2 + }], + 24: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + var e = d && d.traverseTwoPhase && d.traverseEnterLeave; + "production" !== n.env.NODE_ENV ? u(e, "InstanceHandle not injected before use!") : u(e) + } + var o = e("./EventPluginRegistry"), + a = e("./EventPluginUtils"), + i = e("./accumulateInto"), + s = e("./forEachAccumulated"), + u = e("./invariant"), + c = {}, + l = null, + p = function(e) { + if (e) { + var t = a.executeDispatch, + n = o.getPluginModuleForEvent(e); + n && n.executeDispatch && (t = n.executeDispatch), a.executeDispatchesInOrder(e, t), e.isPersistent() || e.constructor.release(e) + } + }, + d = null, + f = { + injection: { + injectMount: a.injection.injectMount, + injectInstanceHandle: function(e) { + d = e, "production" !== n.env.NODE_ENV && r() + }, + getInstanceHandle: function() { + return "production" !== n.env.NODE_ENV && r(), d + }, + injectEventPluginOrder: o.injectEventPluginOrder, + injectEventPluginsByName: o.injectEventPluginsByName + }, + eventNameDispatchConfigs: o.eventNameDispatchConfigs, + registrationNameModules: o.registrationNameModules, + putListener: function(e, t, r) { + "production" !== n.env.NODE_ENV ? u(!r || "function" == typeof r, "Expected %s listener to be a function, instead got type %s", t, typeof r) : u(!r || "function" == typeof r); + var o = c[t] || (c[t] = {}); + o[e] = r + }, + getListener: function(e, t) { + var n = c[t]; + return n && n[e] + }, + deleteListener: function(e, t) { + var n = c[t]; + n && delete n[e] + }, + deleteAllListeners: function(e) { + for (var t in c) delete c[t][e] + }, + extractEvents: function(e, t, n, r) { + for (var a, s = o.plugins, u = 0, c = s.length; c > u; u++) { + var l = s[u]; + if (l) { + var p = l.extractEvents(e, t, n, r); + p && (a = i(a, p)) + } + } + return a + }, + enqueueEvents: function(e) { + e && (l = i(l, e)) + }, + processEventQueue: function() { + var e = l; + l = null, s(e, p), "production" !== n.env.NODE_ENV ? u(!l, "processEventQueue(): Additional events were enqueued while processing an event queue. Support for this has not yet been implemented.") : u(!l) + }, + __purge: function() { + c = {} + }, + __getListenerBank: function() { + return c + } + }; + t.exports = f + }).call(this, e("_process")) + }, { + "./EventPluginRegistry": 25, + "./EventPluginUtils": 26, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + "./invariant": 157, + _process: 2 + }], + 25: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + if (s) + for (var e in u) { + var t = u[e], + r = s.indexOf(e); + if ("production" !== n.env.NODE_ENV ? i(r > -1, "EventPluginRegistry: Cannot inject event plugins that do not exist in the plugin ordering, `%s`.", e) : i(r > -1), !c.plugins[r]) { + "production" !== n.env.NODE_ENV ? i(t.extractEvents, "EventPluginRegistry: Event plugins must implement an `extractEvents` method, but `%s` does not.", e) : i(t.extractEvents), c.plugins[r] = t; + var a = t.eventTypes; + for (var l in a) "production" !== n.env.NODE_ENV ? i(o(a[l], t, l), "EventPluginRegistry: Failed to publish event `%s` for plugin `%s`.", l, e) : i(o(a[l], t, l)) + } + } + } + + function o(e, t, r) { + "production" !== n.env.NODE_ENV ? i(!c.eventNameDispatchConfigs.hasOwnProperty(r), "EventPluginHub: More than one plugin attempted to publish the same event name, `%s`.", r) : i(!c.eventNameDispatchConfigs.hasOwnProperty(r)), c.eventNameDispatchConfigs[r] = e; + var o = e.phasedRegistrationNames; + if (o) { + for (var s in o) + if (o.hasOwnProperty(s)) { + var u = o[s]; + a(u, t, r) + } return !0 + } + return e.registrationName ? (a(e.registrationName, t, r), !0) : !1 + } + + function a(e, t, r) { + "production" !== n.env.NODE_ENV ? i(!c.registrationNameModules[e], "EventPluginHub: More than one plugin attempted to publish the same registration name, `%s`.", e) : i(!c.registrationNameModules[e]), c.registrationNameModules[e] = t, c.registrationNameDependencies[e] = t.eventTypes[r].dependencies + } + var i = e("./invariant"), + s = null, + u = {}, + c = { + plugins: [], + eventNameDispatchConfigs: {}, + registrationNameModules: {}, + registrationNameDependencies: {}, + injectEventPluginOrder: function(e) { + "production" !== n.env.NODE_ENV ? i(!s, "EventPluginRegistry: Cannot inject event plugin ordering more than once. You are likely trying to load more than one copy of React.") : i(!s), s = Array.prototype.slice.call(e), r() + }, + injectEventPluginsByName: function(e) { + var t = !1; + for (var o in e) + if (e.hasOwnProperty(o)) { + var a = e[o]; + u.hasOwnProperty(o) && u[o] === a || ("production" !== n.env.NODE_ENV ? i(!u[o], "EventPluginRegistry: Cannot inject two different event plugins using the same name, `%s`.", o) : i(!u[o]), u[o] = a, t = !0) + } t && r() + }, + getPluginModuleForEvent: function(e) { + var t = e.dispatchConfig; + if (t.registrationName) return c.registrationNameModules[t.registrationName] || null; + for (var n in t.phasedRegistrationNames) + if (t.phasedRegistrationNames.hasOwnProperty(n)) { + var r = c.registrationNameModules[t.phasedRegistrationNames[n]]; + if (r) return r + } return null + }, + _resetEventPlugins: function() { + s = null; + for (var e in u) u.hasOwnProperty(e) && delete u[e]; + c.plugins.length = 0; + var t = c.eventNameDispatchConfigs; + for (var n in t) t.hasOwnProperty(n) && delete t[n]; + var r = c.registrationNameModules; + for (var o in r) r.hasOwnProperty(o) && delete r[o] + } + }; + t.exports = c + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 26: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return e === y.topMouseUp || e === y.topTouchEnd || e === y.topTouchCancel + } + + function o(e) { + return e === y.topMouseMove || e === y.topTouchMove + } + + function a(e) { + return e === y.topMouseDown || e === y.topTouchStart + } + + function i(e, t) { + var r = e._dispatchListeners, + o = e._dispatchIDs; + if ("production" !== n.env.NODE_ENV && f(e), Array.isArray(r)) + for (var a = 0; a < r.length && !e.isPropagationStopped(); a++) t(e, r[a], o[a]); + else r && t(e, r, o) + } + + function s(e, t, n) { + e.currentTarget = m.Mount.getNode(n); + var r = t(e, n); + return e.currentTarget = null, r + } + + function u(e, t) { + i(e, t), e._dispatchListeners = null, e._dispatchIDs = null + } + + function c(e) { + var t = e._dispatchListeners, + r = e._dispatchIDs; + if ("production" !== n.env.NODE_ENV && f(e), Array.isArray(t)) { + for (var o = 0; o < t.length && !e.isPropagationStopped(); o++) + if (t[o](e, r[o])) return r[o] + } else if (t && t(e, r)) return r; + return null + } + + function l(e) { + var t = c(e); + return e._dispatchIDs = null, e._dispatchListeners = null, t + } + + function p(e) { + "production" !== n.env.NODE_ENV && f(e); + var t = e._dispatchListeners, + r = e._dispatchIDs; + "production" !== n.env.NODE_ENV ? v(!Array.isArray(t), "executeDirectDispatch(...): Invalid `event`.") : v(!Array.isArray(t)); + var o = t ? t(e, r) : null; + return e._dispatchListeners = null, e._dispatchIDs = null, o + } + + function d(e) { + return !!e._dispatchListeners + } + var f, h = e("./EventConstants"), + v = e("./invariant"), + m = { + Mount: null, + injectMount: function(e) { + m.Mount = e, "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? v(e && e.getNode, "EventPluginUtils.injection.injectMount(...): Injected Mount module is missing getNode.") : v(e && e.getNode)) + } + }, + y = h.topLevelTypes; + "production" !== n.env.NODE_ENV && (f = function(e) { + var t = e._dispatchListeners, + r = e._dispatchIDs, + o = Array.isArray(t), + a = Array.isArray(r), + i = a ? r.length : r ? 1 : 0, + s = o ? t.length : t ? 1 : 0; + "production" !== n.env.NODE_ENV ? v(a === o && i === s, "EventPluginUtils: Invalid `event`.") : v(a === o && i === s) + }); + var g = { + isEndish: r, + isMoveish: o, + isStartish: a, + executeDirectDispatch: p, + executeDispatch: s, + executeDispatchesInOrder: u, + executeDispatchesInOrderStopAtTrue: l, + hasDispatches: d, + injection: m, + useTouchEvents: !1 + }; + t.exports = g + }).call(this, e("_process")) + }, { + "./EventConstants": 22, + "./invariant": 157, + _process: 2 + }], + 27: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, n) { + var r = t.dispatchConfig.phasedRegistrationNames[n]; + return m(e, r) + } + + function o(e, t, o) { + if ("production" !== n.env.NODE_ENV && !e) throw new Error("Dispatching id must not be null"); + var a = t ? v.bubbled : v.captured, + i = r(e, o, a); + i && (o._dispatchListeners = f(o._dispatchListeners, i), o._dispatchIDs = f(o._dispatchIDs, e)) + } + + function a(e) { + e && e.dispatchConfig.phasedRegistrationNames && d.injection.getInstanceHandle().traverseTwoPhase(e.dispatchMarker, o, e) + } + + function i(e, t, n) { + if (n && n.dispatchConfig.registrationName) { + var r = n.dispatchConfig.registrationName, + o = m(e, r); + o && (n._dispatchListeners = f(n._dispatchListeners, o), n._dispatchIDs = f(n._dispatchIDs, e)) + } + } + + function s(e) { + e && e.dispatchConfig.registrationName && i(e.dispatchMarker, null, e) + } + + function u(e) { + h(e, a) + } + + function c(e, t, n, r) { + d.injection.getInstanceHandle().traverseEnterLeave(n, r, i, e, t) + } + + function l(e) { + h(e, s) + } + var p = e("./EventConstants"), + d = e("./EventPluginHub"), + f = e("./accumulateInto"), + h = e("./forEachAccumulated"), + v = p.PropagationPhases, + m = d.getListener, + y = { + accumulateTwoPhaseDispatches: u, + accumulateDirectDispatches: l, + accumulateEnterLeaveDispatches: c + }; + t.exports = y + }).call(this, e("_process")) + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + _process: 2 + }], + 28: [function(e, t) { + "use strict"; + var n = !("undefined" == typeof window || !window.document || !window.document.createElement), + r = { + canUseDOM: n, + canUseWorkers: "undefined" != typeof Worker, + canUseEventListeners: n && !(!window.addEventListener && !window.attachEvent), + canUseViewport: n && !!window.screen, + isInWorker: !n + }; + t.exports = r + }, {}], + 29: [function(e, t) { + "use strict"; + + function n(e) { + this._root = e, this._startText = this.getText(), this._fallbackText = null + } + var r = e("./PooledClass"), + o = e("./Object.assign"), + a = e("./getTextContentAccessor"); + o(n.prototype, { + getText: function() { + return "value" in this._root ? this._root.value : this._root[a()] + }, + getData: function() { + if (this._fallbackText) return this._fallbackText; + var e, t, n = this._startText, + r = n.length, + o = this.getText(), + a = o.length; + for (e = 0; r > e && n[e] === o[e]; e++); + var i = r - e; + for (t = 1; i >= t && n[r - t] === o[a - t]; t++); + var s = t > 1 ? 1 - t : void 0; + return this._fallbackText = o.slice(e, s), this._fallbackText + } + }), r.addPoolingTo(n), t.exports = n + }, { + "./Object.assign": 35, + "./PooledClass": 36, + "./getTextContentAccessor": 152 + }], + 30: [function(e, t) { + "use strict"; + var n, r = e("./DOMProperty"), + o = e("./ExecutionEnvironment"), + a = r.injection.MUST_USE_ATTRIBUTE, + i = r.injection.MUST_USE_PROPERTY, + s = r.injection.HAS_BOOLEAN_VALUE, + u = r.injection.HAS_SIDE_EFFECTS, + c = r.injection.HAS_NUMERIC_VALUE, + l = r.injection.HAS_POSITIVE_NUMERIC_VALUE, + p = r.injection.HAS_OVERLOADED_BOOLEAN_VALUE; + if (o.canUseDOM) { + var d = document.implementation; + n = d && d.hasFeature && d.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") + } + var f = { + isCustomAttribute: RegExp.prototype.test.bind(/^(data|aria)-[a-z_][a-z\d_.\-]*$/), + Properties: { + accept: null, + acceptCharset: null, + accessKey: null, + action: null, + allowFullScreen: a | s, + allowTransparency: a, + alt: null, + async: s, + autoComplete: null, + autoPlay: s, + cellPadding: null, + cellSpacing: null, + charSet: a, + checked: i | s, + classID: a, + className: n ? a : i, + cols: a | l, + colSpan: null, + content: null, + contentEditable: null, + contextMenu: a, + controls: i | s, + coords: null, + crossOrigin: null, + data: null, + dateTime: a, + defer: s, + dir: null, + disabled: a | s, + download: p, + draggable: null, + encType: null, + form: a, + formAction: a, + formEncType: a, + formMethod: a, + formNoValidate: s, + formTarget: a, + frameBorder: a, + headers: null, + height: a, + hidden: a | s, + href: null, + hrefLang: null, + htmlFor: null, + httpEquiv: null, + icon: null, + id: i, + label: null, + lang: null, + list: a, + loop: i | s, + manifest: a, + marginHeight: null, + marginWidth: null, + max: null, + maxLength: a, + media: a, + mediaGroup: null, + method: null, + min: null, + multiple: i | s, + muted: i | s, + name: null, + noValidate: s, + open: s, + pattern: null, + placeholder: null, + poster: null, + preload: null, + radioGroup: null, + readOnly: i | s, + rel: null, + required: s, + role: a, + rows: a | l, + rowSpan: null, + sandbox: null, + scope: null, + scrolling: null, + seamless: a | s, + selected: i | s, + shape: null, + size: a | l, + sizes: a, + span: l, + spellCheck: null, + src: null, + srcDoc: i, + srcSet: a, + start: c, + step: null, + style: null, + tabIndex: null, + target: null, + title: null, + type: null, + useMap: null, + value: i | u, + width: a, + wmode: a, + autoCapitalize: null, + autoCorrect: null, + itemProp: a, + itemScope: a | s, + itemType: a, + itemID: a, + itemRef: a, + property: null + }, + DOMAttributeNames: { + acceptCharset: "accept-charset", + className: "class", + htmlFor: "for", + httpEquiv: "http-equiv" + }, + DOMPropertyNames: { + autoCapitalize: "autocapitalize", + autoComplete: "autocomplete", + autoCorrect: "autocorrect", + autoFocus: "autofocus", + autoPlay: "autoplay", + encType: "encoding", + hrefLang: "hreflang", + radioGroup: "radiogroup", + spellCheck: "spellcheck", + srcDoc: "srcdoc", + srcSet: "srcset" + } + }; + t.exports = f + }, { + "./DOMProperty": 17, + "./ExecutionEnvironment": 28 + }], + 31: [function(e, t) { + "use strict"; + var n = e("./ReactLink"), + r = e("./ReactStateSetters"), + o = { + linkState: function(e) { + return new n(this.state[e], r.createStateKeySetter(this, e)) + } + }; + t.exports = o + }, { + "./ReactLink": 81, + "./ReactStateSetters": 100 + }], + 32: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + "production" !== n.env.NODE_ENV ? c(null == e.props.checkedLink || null == e.props.valueLink, "Cannot provide a checkedLink and a valueLink. If you want to use checkedLink, you probably don't want to use valueLink and vice versa.") : c(null == e.props.checkedLink || null == e.props.valueLink) + } + + function o(e) { + r(e), "production" !== n.env.NODE_ENV ? c(null == e.props.value && null == e.props.onChange, "Cannot provide a valueLink and a value or onChange event. If you want to use value or onChange, you probably don't want to use valueLink.") : c(null == e.props.value && null == e.props.onChange) + } + + function a(e) { + r(e), "production" !== n.env.NODE_ENV ? c(null == e.props.checked && null == e.props.onChange, "Cannot provide a checkedLink and a checked property or onChange event. If you want to use checked or onChange, you probably don't want to use checkedLink") : c(null == e.props.checked && null == e.props.onChange) + } + + function i(e) { + this.props.valueLink.requestChange(e.target.value) + } + + function s(e) { + this.props.checkedLink.requestChange(e.target.checked) + } + var u = e("./ReactPropTypes"), + c = e("./invariant"), + l = { + button: !0, + checkbox: !0, + image: !0, + hidden: !0, + radio: !0, + reset: !0, + submit: !0 + }, + p = { + Mixin: { + propTypes: { + value: function(e, t) { + return !e[t] || l[e.type] || e.onChange || e.readOnly || e.disabled ? null : new Error("You provided a `value` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultValue`. Otherwise, set either `onChange` or `readOnly`.") + }, + checked: function(e, t) { + return !e[t] || e.onChange || e.readOnly || e.disabled ? null : new Error("You provided a `checked` prop to a form field without an `onChange` handler. This will render a read-only field. If the field should be mutable use `defaultChecked`. Otherwise, set either `onChange` or `readOnly`.") + }, + onChange: u.func + } + }, + getValue: function(e) { + return e.props.valueLink ? (o(e), e.props.valueLink.value) : e.props.value + }, + getChecked: function(e) { + return e.props.checkedLink ? (a(e), e.props.checkedLink.value) : e.props.checked + }, + getOnChange: function(e) { + return e.props.valueLink ? (o(e), i) : e.props.checkedLink ? (a(e), s) : e.props.onChange + } + }; + t.exports = p + }).call(this, e("_process")) + }, { + "./ReactPropTypes": 92, + "./invariant": 157, + _process: 2 + }], + 33: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + e.remove() + } + var o = e("./ReactBrowserEventEmitter"), + a = e("./accumulateInto"), + i = e("./forEachAccumulated"), + s = e("./invariant"), + u = { + trapBubbledEvent: function(e, t) { + "production" !== n.env.NODE_ENV ? s(this.isMounted(), "Must be mounted to trap events") : s(this.isMounted()); + var r = this.getDOMNode(); + "production" !== n.env.NODE_ENV ? s(r, "LocalEventTrapMixin.trapBubbledEvent(...): Requires node to be rendered.") : s(r); + var i = o.trapBubbledEvent(e, t, r); + this._localEventListeners = a(this._localEventListeners, i) + }, + componentWillUnmount: function() { + this._localEventListeners && i(this._localEventListeners, r) + } + }; + t.exports = u + }).call(this, e("_process")) + }, { + "./ReactBrowserEventEmitter": 39, + "./accumulateInto": 125, + "./forEachAccumulated": 142, + "./invariant": 157, + _process: 2 + }], + 34: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./emptyFunction"), + o = n.topLevelTypes, + a = { + eventTypes: null, + extractEvents: function(e, t, n, a) { + if (e === o.topTouchStart) { + var i = a.target; + i && !i.onclick && (i.onclick = r) + } + } + }; + t.exports = a + }, { + "./EventConstants": 22, + "./emptyFunction": 136 + }], + 35: [function(e, t) { + "use strict"; + + function n(e) { + if (null == e) throw new TypeError("Object.assign target cannot be null or undefined"); + for (var t = Object(e), n = Object.prototype.hasOwnProperty, r = 1; r < arguments.length; r++) { + var o = arguments[r]; + if (null != o) { + var a = Object(o); + for (var i in a) n.call(a, i) && (t[i] = a[i]) + } + } + return t + } + t.exports = n + }, {}], + 36: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./invariant"), + o = function(e) { + var t = this; + if (t.instancePool.length) { + var n = t.instancePool.pop(); + return t.call(n, e), n + } + return new t(e) + }, + a = function(e, t) { + var n = this; + if (n.instancePool.length) { + var r = n.instancePool.pop(); + return n.call(r, e, t), r + } + return new n(e, t) + }, + i = function(e, t, n) { + var r = this; + if (r.instancePool.length) { + var o = r.instancePool.pop(); + return r.call(o, e, t, n), o + } + return new r(e, t, n) + }, + s = function(e, t, n, r, o) { + var a = this; + if (a.instancePool.length) { + var i = a.instancePool.pop(); + return a.call(i, e, t, n, r, o), i + } + return new a(e, t, n, r, o) + }, + u = function(e) { + var t = this; + "production" !== n.env.NODE_ENV ? r(e instanceof t, "Trying to release an instance into a pool of a different type.") : r(e instanceof t), e.destructor && e.destructor(), t.instancePool.length < t.poolSize && t.instancePool.push(e) + }, + c = 10, + l = o, + p = function(e, t) { + var n = e; + return n.instancePool = [], n.getPooled = t || l, n.poolSize || (n.poolSize = c), n.release = u, n + }, + d = { + addPoolingTo: p, + oneArgumentPooler: o, + twoArgumentPooler: a, + threeArgumentPooler: i, + fiveArgumentPooler: s + }; + t.exports = d + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 37: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./EventPluginUtils"), + o = e("./ReactChildren"), + a = e("./ReactComponent"), + i = e("./ReactClass"), + s = e("./ReactContext"), + u = e("./ReactCurrentOwner"), + c = e("./ReactElement"), + l = e("./ReactElementValidator"), + p = e("./ReactDOM"), + d = e("./ReactDOMTextComponent"), + f = e("./ReactDefaultInjection"), + h = e("./ReactInstanceHandles"), + v = e("./ReactMount"), + m = e("./ReactPerf"), + y = e("./ReactPropTypes"), + g = e("./ReactReconciler"), + E = e("./ReactServerRendering"), + C = e("./Object.assign"), + b = e("./findDOMNode"), + _ = e("./onlyChild"); + f.inject(); + var N = c.createElement, + O = c.createFactory, + R = c.cloneElement; + "production" !== n.env.NODE_ENV && (N = l.createElement, O = l.createFactory, R = l.cloneElement); + var D = m.measure("React", "render", v.render), + w = { + Children: { + map: o.map, + forEach: o.forEach, + count: o.count, + only: _ + }, + Component: a, + DOM: p, + PropTypes: y, + initializeTouchEvents: function(e) { + r.useTouchEvents = e + }, + createClass: i.createClass, + createElement: N, + cloneElement: R, + createFactory: O, + createMixin: function(e) { + return e + }, + constructAndRenderComponent: v.constructAndRenderComponent, + constructAndRenderComponentByID: v.constructAndRenderComponentByID, + findDOMNode: b, + render: D, + renderToString: E.renderToString, + renderToStaticMarkup: E.renderToStaticMarkup, + unmountComponentAtNode: v.unmountComponentAtNode, + isValidElement: c.isValidElement, + withContext: s.withContext, + __spread: C + }; + if ("undefined" != typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && "function" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject && __REACT_DEVTOOLS_GLOBAL_HOOK__.inject({ + CurrentOwner: u, + InstanceHandles: h, + Mount: v, + Reconciler: g, + TextComponent: d + }), "production" !== n.env.NODE_ENV) { + var M = e("./ExecutionEnvironment"); + if (M.canUseDOM && window.top === window.self) { + navigator.userAgent.indexOf("Chrome") > -1 && "undefined" == typeof __REACT_DEVTOOLS_GLOBAL_HOOK__ && console.debug("Download the React DevTools for a better development experience: http://fb.me/react-devtools"); + for (var x = [Array.isArray, Array.prototype.every, Array.prototype.forEach, Array.prototype.indexOf, Array.prototype.map, Date.now, Function.prototype.bind, Object.keys, String.prototype.split, String.prototype.trim, Object.create, Object.freeze], T = 0; T < x.length; T++) + if (!x[T]) { + console.error("One or more ES5 shim/shams expected by React are not available: http://fb.me/react-warning-polyfills"); + break + } + } + } + w.version = "0.13.1", t.exports = w + }).call(this, e("_process")) + }, { + "./EventPluginUtils": 26, + "./ExecutionEnvironment": 28, + "./Object.assign": 35, + "./ReactChildren": 43, + "./ReactClass": 44, + "./ReactComponent": 45, + "./ReactContext": 50, + "./ReactCurrentOwner": 51, + "./ReactDOM": 52, + "./ReactDOMTextComponent": 63, + "./ReactDefaultInjection": 66, + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./ReactInstanceHandles": 78, + "./ReactMount": 83, + "./ReactPerf": 88, + "./ReactPropTypes": 92, + "./ReactReconciler": 95, + "./ReactServerRendering": 98, + "./findDOMNode": 139, + "./onlyChild": 167, + _process: 2 + }], + 38: [function(e, t) { + "use strict"; + var n = e("./findDOMNode"), + r = { + getDOMNode: function() { + return n(this) + } + }; + t.exports = r + }, { + "./findDOMNode": 139 + }], + 39: [function(e, t) { + "use strict"; + + function n(e) { + return Object.prototype.hasOwnProperty.call(e, h) || (e[h] = d++, l[e[h]] = {}), l[e[h]] + } + var r = e("./EventConstants"), + o = e("./EventPluginHub"), + a = e("./EventPluginRegistry"), + i = e("./ReactEventEmitterMixin"), + s = e("./ViewportMetrics"), + u = e("./Object.assign"), + c = e("./isEventSupported"), + l = {}, + p = !1, + d = 0, + f = { + topBlur: "blur", + topChange: "change", + topClick: "click", + topCompositionEnd: "compositionend", + topCompositionStart: "compositionstart", + topCompositionUpdate: "compositionupdate", + topContextMenu: "contextmenu", + topCopy: "copy", + topCut: "cut", + topDoubleClick: "dblclick", + topDrag: "drag", + topDragEnd: "dragend", + topDragEnter: "dragenter", + topDragExit: "dragexit", + topDragLeave: "dragleave", + topDragOver: "dragover", + topDragStart: "dragstart", + topDrop: "drop", + topFocus: "focus", + topInput: "input", + topKeyDown: "keydown", + topKeyPress: "keypress", + topKeyUp: "keyup", + topMouseDown: "mousedown", + topMouseMove: "mousemove", + topMouseOut: "mouseout", + topMouseOver: "mouseover", + topMouseUp: "mouseup", + topPaste: "paste", + topScroll: "scroll", + topSelectionChange: "selectionchange", + topTextInput: "textInput", + topTouchCancel: "touchcancel", + topTouchEnd: "touchend", + topTouchMove: "touchmove", + topTouchStart: "touchstart", + topWheel: "wheel" + }, + h = "_reactListenersID" + String(Math.random()).slice(2), + v = u({}, i, { + ReactEventListener: null, + injection: { + injectReactEventListener: function(e) { + e.setHandleTopLevel(v.handleTopLevel), v.ReactEventListener = e + } + }, + setEnabled: function(e) { + v.ReactEventListener && v.ReactEventListener.setEnabled(e) + }, + isEnabled: function() { + return !(!v.ReactEventListener || !v.ReactEventListener.isEnabled()) + }, + listenTo: function(e, t) { + for (var o = t, i = n(o), s = a.registrationNameDependencies[e], u = r.topLevelTypes, l = 0, p = s.length; p > l; l++) { + var d = s[l]; + i.hasOwnProperty(d) && i[d] || (d === u.topWheel ? c("wheel") ? v.ReactEventListener.trapBubbledEvent(u.topWheel, "wheel", o) : c("mousewheel") ? v.ReactEventListener.trapBubbledEvent(u.topWheel, "mousewheel", o) : v.ReactEventListener.trapBubbledEvent(u.topWheel, "DOMMouseScroll", o) : d === u.topScroll ? c("scroll", !0) ? v.ReactEventListener.trapCapturedEvent(u.topScroll, "scroll", o) : v.ReactEventListener.trapBubbledEvent(u.topScroll, "scroll", v.ReactEventListener.WINDOW_HANDLE) : d === u.topFocus || d === u.topBlur ? (c("focus", !0) ? (v.ReactEventListener.trapCapturedEvent(u.topFocus, "focus", o), v.ReactEventListener.trapCapturedEvent(u.topBlur, "blur", o)) : c("focusin") && (v.ReactEventListener.trapBubbledEvent(u.topFocus, "focusin", o), v.ReactEventListener.trapBubbledEvent(u.topBlur, "focusout", o)), i[u.topBlur] = !0, i[u.topFocus] = !0) : f.hasOwnProperty(d) && v.ReactEventListener.trapBubbledEvent(d, f[d], o), i[d] = !0) + } + }, + trapBubbledEvent: function(e, t, n) { + return v.ReactEventListener.trapBubbledEvent(e, t, n) + }, + trapCapturedEvent: function(e, t, n) { + return v.ReactEventListener.trapCapturedEvent(e, t, n) + }, + ensureScrollValueMonitoring: function() { + if (!p) { + var e = s.refreshScrollValues; + v.ReactEventListener.monitorScrollValue(e), p = !0 + } + }, + eventNameDispatchConfigs: o.eventNameDispatchConfigs, + registrationNameModules: o.registrationNameModules, + putListener: o.putListener, + getListener: o.getListener, + deleteListener: o.deleteListener, + deleteAllListeners: o.deleteAllListeners + }); + t.exports = v + }, { + "./EventConstants": 22, + "./EventPluginHub": 24, + "./EventPluginRegistry": 25, + "./Object.assign": 35, + "./ReactEventEmitterMixin": 73, + "./ViewportMetrics": 124, + "./isEventSupported": 158 + }], + 40: [function(e, t) { + "use strict"; + var n = e("./React"), + r = e("./Object.assign"), + o = n.createFactory(e("./ReactTransitionGroup")), + a = n.createFactory(e("./ReactCSSTransitionGroupChild")), + i = n.createClass({ + displayName: "ReactCSSTransitionGroup", + propTypes: { + transitionName: n.PropTypes.string.isRequired, + transitionAppear: n.PropTypes.bool, + transitionEnter: n.PropTypes.bool, + transitionLeave: n.PropTypes.bool + }, + getDefaultProps: function() { + return { + transitionAppear: !1, + transitionEnter: !0, + transitionLeave: !0 + } + }, + _wrapChild: function(e) { + return a({ + name: this.props.transitionName, + appear: this.props.transitionAppear, + enter: this.props.transitionEnter, + leave: this.props.transitionLeave + }, e) + }, + render: function() { + return o(r({}, this.props, { + childFactory: this._wrapChild + })) + } + }); + t.exports = i + }, { + "./Object.assign": 35, + "./React": 37, + "./ReactCSSTransitionGroupChild": 41, + "./ReactTransitionGroup": 104 + }], + 41: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./React"), + o = e("./CSSCore"), + a = e("./ReactTransitionEvents"), + i = e("./onlyChild"), + s = e("./warning"), + u = 17, + c = 5e3, + l = null; + "production" !== n.env.NODE_ENV && (l = function() { + "production" !== n.env.NODE_ENV ? s(!1, "transition(): tried to perform an animation without an animationend or transitionend event after timeout (%sms). You should either disable this transition in JS or add a CSS animation/transition.", c) : null + }); + var p = r.createClass({ + displayName: "ReactCSSTransitionGroupChild", + transition: function(e, t) { + var r = this.getDOMNode(), + i = this.props.name + "-" + e, + s = i + "-active", + u = null, + p = function(e) { + e && e.target !== r || ("production" !== n.env.NODE_ENV && clearTimeout(u), o.removeClass(r, i), o.removeClass(r, s), a.removeEndEventListener(r, p), t && t()) + }; + a.addEndEventListener(r, p), o.addClass(r, i), this.queueClass(s), "production" !== n.env.NODE_ENV && (u = setTimeout(l, c)) + }, + queueClass: function(e) { + this.classNameQueue.push(e), this.timeout || (this.timeout = setTimeout(this.flushClassNameQueue, u)) + }, + flushClassNameQueue: function() { + this.isMounted() && this.classNameQueue.forEach(o.addClass.bind(o, this.getDOMNode())), this.classNameQueue.length = 0, this.timeout = null + }, + componentWillMount: function() { + this.classNameQueue = [] + }, + componentWillUnmount: function() { + this.timeout && clearTimeout(this.timeout) + }, + componentWillAppear: function(e) { + this.props.appear ? this.transition("appear", e) : e() + }, + componentWillEnter: function(e) { + this.props.enter ? this.transition("enter", e) : e() + }, + componentWillLeave: function(e) { + this.props.leave ? this.transition("leave", e) : e() + }, + render: function() { + return i(this.props.children) + } + }); + t.exports = p + }).call(this, e("_process")) + }, { + "./CSSCore": 10, + "./React": 37, + "./ReactTransitionEvents": 103, + "./onlyChild": 167, + "./warning": 178, + _process: 2 + }], + 42: [function(e, t) { + "use strict"; + var n = e("./ReactReconciler"), + r = e("./flattenChildren"), + o = e("./instantiateReactComponent"), + a = e("./shouldUpdateReactComponent"), + i = { + instantiateChildren: function(e) { + var t = r(e); + for (var n in t) + if (t.hasOwnProperty(n)) { + var a = t[n], + i = o(a, null); + t[n] = i + } return t + }, + updateChildren: function(e, t, i, s) { + var u = r(t); + if (!u && !e) return null; + var c; + for (c in u) + if (u.hasOwnProperty(c)) { + var l = e && e[c], + p = l && l._currentElement, + d = u[c]; + if (a(p, d)) n.receiveComponent(l, d, i, s), u[c] = l; + else { + l && n.unmountComponent(l, c); + var f = o(d, null); + u[c] = f + } + } for (c in e) !e.hasOwnProperty(c) || u && u.hasOwnProperty(c) || n.unmountComponent(e[c]); + return u + }, + unmountChildren: function(e) { + for (var t in e) { + var r = e[t]; + n.unmountComponent(r) + } + } + }; + t.exports = i + }, { + "./ReactReconciler": 95, + "./flattenChildren": 140, + "./instantiateReactComponent": 156, + "./shouldUpdateReactComponent": 174 + }], + 43: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + this.forEachFunction = e, this.forEachContext = t + } + + function o(e, t, n, r) { + var o = e; + o.forEachFunction.call(o.forEachContext, t, r) + } + + function a(e, t, n) { + if (null == e) return e; + var a = r.getPooled(t, n); + f(e, o, a), r.release(a) + } + + function i(e, t, n) { + this.mapResult = e, this.mapFunction = t, this.mapContext = n + } + + function s(e, t, r, o) { + var a = e, + i = a.mapResult, + s = !i.hasOwnProperty(r); + if ("production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? h(s, "ReactChildren.map(...): Encountered two children with the same key, `%s`. Child keys must be unique; when two children share a key, only the first child will be used.", r) : null), s) { + var u = a.mapFunction.call(a.mapContext, t, o); + i[r] = u + } + } + + function u(e, t, n) { + if (null == e) return e; + var r = {}, + o = i.getPooled(r, t, n); + return f(e, s, o), i.release(o), d.create(r) + } + + function c() { + return null + } + + function l(e) { + return f(e, c, null) + } + var p = e("./PooledClass"), + d = e("./ReactFragment"), + f = e("./traverseAllChildren"), + h = e("./warning"), + v = p.twoArgumentPooler, + m = p.threeArgumentPooler; + p.addPoolingTo(r, v), p.addPoolingTo(i, m); + var y = { + forEach: a, + map: u, + count: l + }; + t.exports = y + }).call(this, e("_process")) + }, { + "./PooledClass": 36, + "./ReactFragment": 75, + "./traverseAllChildren": 176, + "./warning": 178, + _process: 2 + }], + 44: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t, r) { + for (var o in t) t.hasOwnProperty(o) && ("production" !== n.env.NODE_ENV ? R("function" == typeof t[o], "%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.", e.displayName || "ReactClass", E[r], o) : null) + } + + function o(e, t) { + var r = x.hasOwnProperty(t) ? x[t] : null; + I.hasOwnProperty(t) && ("production" !== n.env.NODE_ENV ? _(r === w.OVERRIDE_BASE, "ReactClassInterface: You are attempting to override `%s` from your class specification. Ensure that your method names do not overlap with React methods.", t) : _(r === w.OVERRIDE_BASE)), e.hasOwnProperty(t) && ("production" !== n.env.NODE_ENV ? _(r === w.DEFINE_MANY || r === w.DEFINE_MANY_MERGED, "ReactClassInterface: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.", t) : _(r === w.DEFINE_MANY || r === w.DEFINE_MANY_MERGED)) + } + + function a(e, t) { + if (t) { + "production" !== n.env.NODE_ENV ? _("function" != typeof t, "ReactClass: You're attempting to use a component class as a mixin. Instead, just use a regular object.") : _("function" != typeof t), "production" !== n.env.NODE_ENV ? _(!h.isValidElement(t), "ReactClass: You're attempting to use a component as a mixin. Instead, just use a regular object.") : _(!h.isValidElement(t)); + var r = e.prototype; + t.hasOwnProperty(D) && T.mixins(e, t.mixins); + for (var a in t) + if (t.hasOwnProperty(a) && a !== D) { + var i = t[a]; + if (o(r, a), T.hasOwnProperty(a)) T[a](e, i); + else { + var s = x.hasOwnProperty(a), + l = r.hasOwnProperty(a), + p = i && i.__reactDontBind, + d = "function" == typeof i, + f = d && !s && !l && !p; + if (f) r.__reactAutoBindMap || (r.__reactAutoBindMap = {}), r.__reactAutoBindMap[a] = i, r[a] = i; + else if (l) { + var v = x[a]; + "production" !== n.env.NODE_ENV ? _(s && (v === w.DEFINE_MANY_MERGED || v === w.DEFINE_MANY), "ReactClass: Unexpected spec policy %s for key %s when mixing in component specs.", v, a) : _(s && (v === w.DEFINE_MANY_MERGED || v === w.DEFINE_MANY)), v === w.DEFINE_MANY_MERGED ? r[a] = u(r[a], i) : v === w.DEFINE_MANY && (r[a] = c(r[a], i)) + } else r[a] = i, "production" !== n.env.NODE_ENV && "function" == typeof i && t.displayName && (r[a].displayName = t.displayName + "_" + a) + } + } + } + } + + function i(e, t) { + if (t) + for (var r in t) { + var o = t[r]; + if (t.hasOwnProperty(r)) { + var a = r in T; + "production" !== n.env.NODE_ENV ? _(!a, 'ReactClass: You are attempting to define a reserved property, `%s`, that shouldn\'t be on the "statics" key. Define it as an instance property instead; it will still be accessible on the constructor.', r) : _(!a); + var i = r in e; + "production" !== n.env.NODE_ENV ? _(!i, "ReactClass: You are attempting to define `%s` on your component more than once. This conflict may be due to a mixin.", r) : _(!i), e[r] = o + } + } + } + + function s(e, t) { + "production" !== n.env.NODE_ENV ? _(e && t && "object" == typeof e && "object" == typeof t, "mergeIntoWithNoDuplicateKeys(): Cannot merge non-objects.") : _(e && t && "object" == typeof e && "object" == typeof t); + for (var r in t) t.hasOwnProperty(r) && ("production" !== n.env.NODE_ENV ? _(void 0 === e[r], "mergeIntoWithNoDuplicateKeys(): Tried to merge two objects with the same key: `%s`. This conflict may be due to a mixin; in particular, this may be caused by two getInitialState() or getDefaultProps() methods returning objects with clashing keys.", r) : _(void 0 === e[r]), e[r] = t[r]); + return e + } + + function u(e, t) { + return function() { + var n = e.apply(this, arguments), + r = t.apply(this, arguments); + if (null == n) return r; + if (null == r) return n; + var o = {}; + return s(o, n), s(o, r), o + } + } + + function c(e, t) { + return function() { + e.apply(this, arguments), t.apply(this, arguments) + } + } + + function l(e, t) { + var r = t.bind(e); + if ("production" !== n.env.NODE_ENV) { + r.__reactBoundContext = e, r.__reactBoundMethod = t, r.__reactBoundArguments = null; + var o = e.constructor.displayName, + a = r.bind; + r.bind = function(i) { + for (var s = [], u = 1, c = arguments.length; c > u; u++) s.push(arguments[u]); + if (i !== e && null !== i) "production" !== n.env.NODE_ENV ? R(!1, "bind(): React component methods may only be bound to the component instance. See %s", o) : null; + else if (!s.length) return "production" !== n.env.NODE_ENV ? R(!1, "bind(): You are binding a component method to the component. React does this for you automatically in a high-performance way, so you can safely remove this call. See %s", o) : null, r; + var l = a.apply(r, arguments); + return l.__reactBoundContext = e, l.__reactBoundMethod = t, l.__reactBoundArguments = s, l + } + } + return r + } + + function p(e) { + for (var t in e.__reactAutoBindMap) + if (e.__reactAutoBindMap.hasOwnProperty(t)) { + var n = e.__reactAutoBindMap[t]; + e[t] = l(e, v.guard(n, e.constructor.displayName + "." + t)) + } + } + var d = e("./ReactComponent"), + f = e("./ReactCurrentOwner"), + h = e("./ReactElement"), + v = e("./ReactErrorUtils"), + m = e("./ReactInstanceMap"), + y = e("./ReactLifeCycle"), + g = e("./ReactPropTypeLocations"), + E = e("./ReactPropTypeLocationNames"), + C = e("./ReactUpdateQueue"), + b = e("./Object.assign"), + _ = e("./invariant"), + N = e("./keyMirror"), + O = e("./keyOf"), + R = e("./warning"), + D = O({ + mixins: null + }), + w = N({ + DEFINE_ONCE: null, + DEFINE_MANY: null, + OVERRIDE_BASE: null, + DEFINE_MANY_MERGED: null + }), + M = [], + x = { + mixins: w.DEFINE_MANY, + statics: w.DEFINE_MANY, + propTypes: w.DEFINE_MANY, + contextTypes: w.DEFINE_MANY, + childContextTypes: w.DEFINE_MANY, + getDefaultProps: w.DEFINE_MANY_MERGED, + getInitialState: w.DEFINE_MANY_MERGED, + getChildContext: w.DEFINE_MANY_MERGED, + render: w.DEFINE_ONCE, + componentWillMount: w.DEFINE_MANY, + componentDidMount: w.DEFINE_MANY, + componentWillReceiveProps: w.DEFINE_MANY, + shouldComponentUpdate: w.DEFINE_ONCE, + componentWillUpdate: w.DEFINE_MANY, + componentDidUpdate: w.DEFINE_MANY, + componentWillUnmount: w.DEFINE_MANY, + updateComponent: w.OVERRIDE_BASE + }, + T = { + displayName: function(e, t) { + e.displayName = t + }, + mixins: function(e, t) { + if (t) + for (var n = 0; n < t.length; n++) a(e, t[n]) + }, + childContextTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.childContext), e.childContextTypes = b({}, e.childContextTypes, t) + }, + contextTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.context), e.contextTypes = b({}, e.contextTypes, t) + }, + getDefaultProps: function(e, t) { + e.getDefaultProps = e.getDefaultProps ? u(e.getDefaultProps, t) : t; + + }, + propTypes: function(e, t) { + "production" !== n.env.NODE_ENV && r(e, t, g.prop), e.propTypes = b({}, e.propTypes, t) + }, + statics: function(e, t) { + i(e, t) + } + }, + P = { + enumerable: !1, + get: function() { + var e = this.displayName || this.name || "Component"; + return "production" !== n.env.NODE_ENV ? R(!1, "%s.type is deprecated. Use %s directly to access the class.", e, e) : null, Object.defineProperty(this, "type", { + value: this + }), this + } + }, + I = { + replaceState: function(e, t) { + C.enqueueReplaceState(this, e), t && C.enqueueCallback(this, t) + }, + isMounted: function() { + if ("production" !== n.env.NODE_ENV) { + var e = f.current; + null !== e && ("production" !== n.env.NODE_ENV ? R(e._warnedAboutRefsInRender, "%s is accessing isMounted inside its render() function. render() should be a pure function of props and state. It should never access something that requires stale data from the previous render, such as refs. Move this logic to componentDidMount and componentDidUpdate instead.", e.getName() || "A component") : null, e._warnedAboutRefsInRender = !0) + } + var t = m.get(this); + return t && t !== y.currentlyMountingInstance + }, + setProps: function(e, t) { + C.enqueueSetProps(this, e), t && C.enqueueCallback(this, t) + }, + replaceProps: function(e, t) { + C.enqueueReplaceProps(this, e), t && C.enqueueCallback(this, t) + } + }, + S = function() {}; + b(S.prototype, d.prototype, I); + var k = { + createClass: function(e) { + var t = function(e, r) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? R(this instanceof t, "Something is calling a React component directly. Use a factory or JSX instead. See: http://fb.me/react-legacyfactory") : null), this.__reactAutoBindMap && p(this), this.props = e, this.context = r, this.state = null; + var o = this.getInitialState ? this.getInitialState() : null; + "production" !== n.env.NODE_ENV && "undefined" == typeof o && this.getInitialState._isMockFunction && (o = null), "production" !== n.env.NODE_ENV ? _("object" == typeof o && !Array.isArray(o), "%s.getInitialState(): must return an object or null", t.displayName || "ReactCompositeComponent") : _("object" == typeof o && !Array.isArray(o)), this.state = o + }; + t.prototype = new S, t.prototype.constructor = t, M.forEach(a.bind(null, t)), a(t, e), t.getDefaultProps && (t.defaultProps = t.getDefaultProps()), "production" !== n.env.NODE_ENV && (t.getDefaultProps && (t.getDefaultProps.isReactClassApproved = {}), t.prototype.getInitialState && (t.prototype.getInitialState.isReactClassApproved = {})), "production" !== n.env.NODE_ENV ? _(t.prototype.render, "createClass(...): Class specification must implement a `render` method.") : _(t.prototype.render), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? R(!t.prototype.componentShouldUpdate, "%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", e.displayName || "A component") : null); + for (var r in x) t.prototype[r] || (t.prototype[r] = null); + if (t.type = t, "production" !== n.env.NODE_ENV) try { + Object.defineProperty(t, "type", P) + } catch (o) {} + return t + }, + injection: { + injectMixin: function(e) { + M.push(e) + } + } + }; + t.exports = k + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./ReactComponent": 45, + "./ReactCurrentOwner": 51, + "./ReactElement": 69, + "./ReactErrorUtils": 72, + "./ReactInstanceMap": 79, + "./ReactLifeCycle": 80, + "./ReactPropTypeLocationNames": 90, + "./ReactPropTypeLocations": 91, + "./ReactUpdateQueue": 105, + "./invariant": 157, + "./keyMirror": 163, + "./keyOf": 164, + "./warning": 178, + _process: 2 + }], + 45: [function(e, t) { + (function(n) { + "use strict"; + + function r(e, t) { + this.props = e, this.context = t + } + var o = e("./ReactUpdateQueue"), + a = e("./invariant"), + i = e("./warning"); + if (r.prototype.setState = function(e, t) { + "production" !== n.env.NODE_ENV ? a("object" == typeof e || "function" == typeof e || null == e, "setState(...): takes an object of state variables to update or a function which returns an object of state variables.") : a("object" == typeof e || "function" == typeof e || null == e), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? i(null != e, "setState(...): You passed an undefined or null state object; instead, use forceUpdate().") : null), o.enqueueSetState(this, e), t && o.enqueueCallback(this, t) + }, r.prototype.forceUpdate = function(e) { + o.enqueueForceUpdate(this), e && o.enqueueCallback(this, e) + }, "production" !== n.env.NODE_ENV) { + var s = { + getDOMNode: "getDOMNode", + isMounted: "isMounted", + replaceProps: "replaceProps", + replaceState: "replaceState", + setProps: "setProps" + }, + u = function(e, t) { + try { + Object.defineProperty(r.prototype, e, { + get: function() { + return void("production" !== n.env.NODE_ENV ? i(!1, "%s(...) is deprecated in plain JavaScript React classes.", t) : null) + } + }) + } catch (o) {} + }; + for (var c in s) s.hasOwnProperty(c) && u(c, s[c]) + } + t.exports = r + }).call(this, e("_process")) + }, { + "./ReactUpdateQueue": 105, + "./invariant": 157, + "./warning": 178, + _process: 2 + }], + 46: [function(e, t) { + "use strict"; + var n = e("./ReactDOMIDOperations"), + r = e("./ReactMount"), + o = { + processChildrenUpdates: n.dangerouslyProcessChildrenUpdates, + replaceNodeWithMarkupByID: n.dangerouslyReplaceNodeWithMarkupByID, + unmountIDFromEnvironment: function(e) { + r.purgeID(e) + } + }; + t.exports = o + }, { + "./ReactDOMIDOperations": 56, + "./ReactMount": 83 + }], + 47: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./invariant"), + o = !1, + a = { + unmountIDFromEnvironment: null, + replaceNodeWithMarkupByID: null, + processChildrenUpdates: null, + injection: { + injectEnvironment: function(e) { + "production" !== n.env.NODE_ENV ? r(!o, "ReactCompositeComponent: injectEnvironment() can only be called once.") : r(!o), a.unmountIDFromEnvironment = e.unmountIDFromEnvironment, a.replaceNodeWithMarkupByID = e.replaceNodeWithMarkupByID, a.processChildrenUpdates = e.processChildrenUpdates, o = !0 + } + } + }; + t.exports = a + }).call(this, e("_process")) + }, { + "./invariant": 157, + _process: 2 + }], + 48: [function(e, t) { + "use strict"; + var n = e("./shallowEqual"), + r = { + shouldComponentUpdate: function(e, t) { + return !n(this.props, e) || !n(this.state, t) + } + }; + t.exports = r + }, { + "./shallowEqual": 173 + }], + 49: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + var t = e._currentElement._owner || null; + if (t) { + var n = t.getName(); + if (n) return " Check the render method of `" + n + "`." + } + return "" + } + var o = e("./ReactComponentEnvironment"), + a = e("./ReactContext"), + i = e("./ReactCurrentOwner"), + s = e("./ReactElement"), + u = e("./ReactElementValidator"), + c = e("./ReactInstanceMap"), + l = e("./ReactLifeCycle"), + p = e("./ReactNativeComponent"), + d = e("./ReactPerf"), + f = e("./ReactPropTypeLocations"), + h = e("./ReactPropTypeLocationNames"), + v = e("./ReactReconciler"), + m = e("./ReactUpdates"), + y = e("./Object.assign"), + g = e("./emptyObject"), + E = e("./invariant"), + C = e("./shouldUpdateReactComponent"), + b = e("./warning"), + _ = 1, + N = { + construct: function(e) { + this._currentElement = e, this._rootNodeID = null, this._instance = null, this._pendingElement = null, this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1, this._renderedComponent = null, this._context = null, this._mountOrder = 0, this._isTopLevel = !1, this._pendingCallbacks = null + }, + mountComponent: function(e, t, r) { + this._context = r, this._mountOrder = _++, this._rootNodeID = e; + var o = this._processProps(this._currentElement.props), + a = this._processContext(this._currentElement._context), + i = p.getComponentClassForElement(this._currentElement), + s = new i(o, a); + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b(null != s.render, "%s(...): No `render` method found on the returned component instance: you may have forgotten to define `render` in your component or you may have accidentally tried to render an element whose type is a function that isn't a React component.", i.displayName || i.name || "Component") : null), s.props = o, s.context = a, s.refs = g, this._instance = s, c.set(s, this), "production" !== n.env.NODE_ENV && this._warnIfContextsDiffer(this._currentElement._context, r), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b(!s.getInitialState || s.getInitialState.isReactClassApproved, "getInitialState was defined on %s, a plain JavaScript class. This is only supported for classes created using React.createClass. Did you mean to define a state property instead?", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b(!s.propTypes, "propTypes was defined as an instance property on %s. Use a static property to define propTypes instead.", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b(!s.contextTypes, "contextTypes was defined as an instance property on %s. Use a static property to define contextTypes instead.", this.getName() || "a component") : null, "production" !== n.env.NODE_ENV ? b("function" != typeof s.componentShouldUpdate, "%s has a method called componentShouldUpdate(). Did you mean shouldComponentUpdate()? The name is phrased as a question because the function is expected to return a value.", this.getName() || "A component") : null); + var u = s.state; + void 0 === u && (s.state = u = null), "production" !== n.env.NODE_ENV ? E("object" == typeof u && !Array.isArray(u), "%s.state: must be set to an object or null", this.getName() || "ReactCompositeComponent") : E("object" == typeof u && !Array.isArray(u)), this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1; + var d, f = l.currentlyMountingInstance; + l.currentlyMountingInstance = this; + try { + s.componentWillMount && (s.componentWillMount(), this._pendingStateQueue && (s.state = this._processPendingState(s.props, s.context))), d = this._renderValidatedComponent() + } finally { + l.currentlyMountingInstance = f + } + this._renderedComponent = this._instantiateReactComponent(d, this._currentElement.type); + var h = v.mountComponent(this._renderedComponent, e, t, this._processChildContext(r)); + return s.componentDidMount && t.getReactMountReady().enqueue(s.componentDidMount, s), h + }, + unmountComponent: function() { + var e = this._instance; + if (e.componentWillUnmount) { + var t = l.currentlyUnmountingInstance; + l.currentlyUnmountingInstance = this; + try { + e.componentWillUnmount() + } finally { + l.currentlyUnmountingInstance = t + } + } + v.unmountComponent(this._renderedComponent), this._renderedComponent = null, this._pendingStateQueue = null, this._pendingReplaceState = !1, this._pendingForceUpdate = !1, this._pendingCallbacks = null, this._pendingElement = null, this._context = null, this._rootNodeID = null, c.remove(e) + }, + _setPropsInternal: function(e, t) { + var n = this._pendingElement || this._currentElement; + this._pendingElement = s.cloneAndReplaceProps(n, y({}, n.props, e)), m.enqueueUpdate(this, t) + }, + _maskContext: function(e) { + var t = null; + if ("string" == typeof this._currentElement.type) return g; + var n = this._currentElement.type.contextTypes; + if (!n) return g; + t = {}; + for (var r in n) t[r] = e[r]; + return t + }, + _processContext: function(e) { + var t = this._maskContext(e); + if ("production" !== n.env.NODE_ENV) { + var r = p.getComponentClassForElement(this._currentElement); + r.contextTypes && this._checkPropTypes(r.contextTypes, t, f.context) + } + return t + }, + _processChildContext: function(e) { + var t = this._instance, + r = t.getChildContext && t.getChildContext(); + if (r) { + "production" !== n.env.NODE_ENV ? E("object" == typeof t.constructor.childContextTypes, "%s.getChildContext(): childContextTypes must be defined in order to use getChildContext().", this.getName() || "ReactCompositeComponent") : E("object" == typeof t.constructor.childContextTypes), "production" !== n.env.NODE_ENV && this._checkPropTypes(t.constructor.childContextTypes, r, f.childContext); + for (var o in r) "production" !== n.env.NODE_ENV ? E(o in t.constructor.childContextTypes, '%s.getChildContext(): key "%s" is not defined in childContextTypes.', this.getName() || "ReactCompositeComponent", o) : E(o in t.constructor.childContextTypes); + return y({}, e, r) + } + return e + }, + _processProps: function(e) { + if ("production" !== n.env.NODE_ENV) { + var t = p.getComponentClassForElement(this._currentElement); + t.propTypes && this._checkPropTypes(t.propTypes, e, f.prop) + } + return e + }, + _checkPropTypes: function(e, t, o) { + var a = this.getName(); + for (var i in e) + if (e.hasOwnProperty(i)) { + var s; + try { + "production" !== n.env.NODE_ENV ? E("function" == typeof e[i], "%s: %s type `%s` is invalid; it must be a function, usually from React.PropTypes.", a || "React class", h[o], i) : E("function" == typeof e[i]), s = e[i](t, i, a, o) + } catch (u) { + s = u + } + if (s instanceof Error) { + var c = r(this); + o === f.prop ? "production" !== n.env.NODE_ENV ? b(!1, "Failed Composite propType: %s%s", s.message, c) : null : "production" !== n.env.NODE_ENV ? b(!1, "Failed Context Types: %s%s", s.message, c) : null + } + } + }, + receiveComponent: function(e, t, n) { + var r = this._currentElement, + o = this._context; + this._pendingElement = null, this.updateComponent(t, r, e, o, n) + }, + performUpdateIfNecessary: function(e) { + null != this._pendingElement && v.receiveComponent(this, this._pendingElement || this._currentElement, e, this._context), (null !== this._pendingStateQueue || this._pendingForceUpdate) && ("production" !== n.env.NODE_ENV && u.checkAndWarnForMutatedProps(this._currentElement), this.updateComponent(e, this._currentElement, this._currentElement, this._context, this._context)) + }, + _warnIfContextsDiffer: function(e, t) { + e = this._maskContext(e), t = this._maskContext(t); + for (var r = Object.keys(t).sort(), o = this.getName() || "ReactCompositeComponent", a = 0; a < r.length; a++) { + var i = r[a]; + "production" !== n.env.NODE_ENV ? b(e[i] === t[i], "owner-based and parent-based contexts differ (values: `%s` vs `%s`) for key (%s) while mounting %s (see: http://fb.me/react-context-by-parent)", e[i], t[i], i, o) : null + } + }, + updateComponent: function(e, t, r, o, a) { + var i = this._instance, + s = i.context, + u = i.props; + t !== r && (s = this._processContext(r._context), u = this._processProps(r.props), "production" !== n.env.NODE_ENV && null != a && this._warnIfContextsDiffer(r._context, a), i.componentWillReceiveProps && i.componentWillReceiveProps(u, s)); + var c = this._processPendingState(u, s), + l = this._pendingForceUpdate || !i.shouldComponentUpdate || i.shouldComponentUpdate(u, c, s); + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? b("undefined" != typeof l, "%s.shouldComponentUpdate(): Returned undefined instead of a boolean value. Make sure to return true or false.", this.getName() || "ReactCompositeComponent") : null), l ? (this._pendingForceUpdate = !1, this._performComponentUpdate(r, u, c, s, e, a)) : (this._currentElement = r, this._context = a, i.props = u, i.state = c, i.context = s) + }, + _processPendingState: function(e, t) { + var n = this._instance, + r = this._pendingStateQueue, + o = this._pendingReplaceState; + if (this._pendingReplaceState = !1, this._pendingStateQueue = null, !r) return n.state; + for (var a = y({}, o ? r[0] : n.state), i = o ? 1 : 0; i < r.length; i++) { + var s = r[i]; + y(a, "function" == typeof s ? s.call(n, a, e, t) : s) + } + return a + }, + _performComponentUpdate: function(e, t, n, r, o, a) { + var i = this._instance, + s = i.props, + u = i.state, + c = i.context; + i.componentWillUpdate && i.componentWillUpdate(t, n, r), this._currentElement = e, this._context = a, i.props = t, i.state = n, i.context = r, this._updateRenderedComponent(o, a), i.componentDidUpdate && o.getReactMountReady().enqueue(i.componentDidUpdate.bind(i, s, u, c), i) + }, + _updateRenderedComponent: function(e, t) { + var n = this._renderedComponent, + r = n._currentElement, + o = this._renderValidatedComponent(); + if (C(r, o)) v.receiveComponent(n, o, e, this._processChildContext(t)); + else { + var a = this._rootNodeID, + i = n._rootNodeID; + v.unmountComponent(n), this._renderedComponent = this._instantiateReactComponent(o, this._currentElement.type); + var s = v.mountComponent(this._renderedComponent, a, e, t); + this._replaceNodeWithMarkupByID(i, s) + } + }, + _replaceNodeWithMarkupByID: function(e, t) { + o.replaceNodeWithMarkupByID(e, t) + }, + _renderValidatedComponentWithoutOwnerOrContext: function() { + var e = this._instance, + t = e.render(); + return "production" !== n.env.NODE_ENV && "undefined" == typeof t && e.render._isMockFunction && (t = null), t + }, + _renderValidatedComponent: function() { + var e, t = a.current; + a.current = this._processChildContext(this._currentElement._context), i.current = this; + try { + e = this._renderValidatedComponentWithoutOwnerOrContext() + } finally { + a.current = t, i.current = null + } + return "production" !== n.env.NODE_ENV ? E(null === e || e === !1 || s.isValidElement(e), "%s.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.", this.getName() || "ReactCompositeComponent") : E(null === e || e === !1 || s.isValidElement(e)), e + }, + attachRef: function(e, t) { + var n = this.getPublicInstance(), + r = n.refs === g ? n.refs = {} : n.refs; + r[e] = t.getPublicInstance() + }, + detachRef: function(e) { + var t = this.getPublicInstance().refs; + delete t[e] + }, + getName: function() { + var e = this._currentElement.type, + t = this._instance && this._instance.constructor; + return e.displayName || t && t.displayName || e.name || t && t.name || null + }, + getPublicInstance: function() { + return this._instance + }, + _instantiateReactComponent: null + }; + d.measureMethods(N, "ReactCompositeComponent", { + mountComponent: "mountComponent", + updateComponent: "updateComponent", + _renderValidatedComponent: "_renderValidatedComponent" + }); + var O = { + Mixin: N + }; + t.exports = O + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./ReactComponentEnvironment": 47, + "./ReactContext": 50, + "./ReactCurrentOwner": 51, + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./ReactInstanceMap": 79, + "./ReactLifeCycle": 80, + "./ReactNativeComponent": 86, + "./ReactPerf": 88, + "./ReactPropTypeLocationNames": 90, + "./ReactPropTypeLocations": 91, + "./ReactReconciler": 95, + "./ReactUpdates": 106, + "./emptyObject": 137, + "./invariant": 157, + "./shouldUpdateReactComponent": 174, + "./warning": 178, + _process: 2 + }], + 50: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./Object.assign"), + o = e("./emptyObject"), + a = e("./warning"), + i = !1, + s = { + current: o, + withContext: function(e, t) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? a(i, "withContext is deprecated and will be removed in a future version. Use a wrapper component with getChildContext instead.") : null, i = !0); + var o, u = s.current; + s.current = r({}, u, e); + try { + o = t() + } finally { + s.current = u + } + return o + } + }; + t.exports = s + }).call(this, e("_process")) + }, { + "./Object.assign": 35, + "./emptyObject": 137, + "./warning": 178, + _process: 2 + }], + 51: [function(e, t) { + "use strict"; + var n = { + current: null + }; + t.exports = n + }, {}], + 52: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + return "production" !== n.env.NODE_ENV ? a.createFactory(e) : o.createFactory(e) + } + var o = e("./ReactElement"), + a = e("./ReactElementValidator"), + i = e("./mapObject"), + s = i({ + a: "a", + abbr: "abbr", + address: "address", + area: "area", + article: "article", + aside: "aside", + audio: "audio", + b: "b", + base: "base", + bdi: "bdi", + bdo: "bdo", + big: "big", + blockquote: "blockquote", + body: "body", + br: "br", + button: "button", + canvas: "canvas", + caption: "caption", + cite: "cite", + code: "code", + col: "col", + colgroup: "colgroup", + data: "data", + datalist: "datalist", + dd: "dd", + del: "del", + details: "details", + dfn: "dfn", + dialog: "dialog", + div: "div", + dl: "dl", + dt: "dt", + em: "em", + embed: "embed", + fieldset: "fieldset", + figcaption: "figcaption", + figure: "figure", + footer: "footer", + form: "form", + h1: "h1", + h2: "h2", + h3: "h3", + h4: "h4", + h5: "h5", + h6: "h6", + head: "head", + header: "header", + hr: "hr", + html: "html", + i: "i", + iframe: "iframe", + img: "img", + input: "input", + ins: "ins", + kbd: "kbd", + keygen: "keygen", + label: "label", + legend: "legend", + li: "li", + link: "link", + main: "main", + map: "map", + mark: "mark", + menu: "menu", + menuitem: "menuitem", + meta: "meta", + meter: "meter", + nav: "nav", + noscript: "noscript", + object: "object", + ol: "ol", + optgroup: "optgroup", + option: "option", + output: "output", + p: "p", + param: "param", + picture: "picture", + pre: "pre", + progress: "progress", + q: "q", + rp: "rp", + rt: "rt", + ruby: "ruby", + s: "s", + samp: "samp", + script: "script", + section: "section", + select: "select", + small: "small", + source: "source", + span: "span", + strong: "strong", + style: "style", + sub: "sub", + summary: "summary", + sup: "sup", + table: "table", + tbody: "tbody", + td: "td", + textarea: "textarea", + tfoot: "tfoot", + th: "th", + thead: "thead", + time: "time", + title: "title", + tr: "tr", + track: "track", + u: "u", + ul: "ul", + "var": "var", + video: "video", + wbr: "wbr", + circle: "circle", + defs: "defs", + ellipse: "ellipse", + g: "g", + line: "line", + linearGradient: "linearGradient", + mask: "mask", + path: "path", + pattern: "pattern", + polygon: "polygon", + polyline: "polyline", + radialGradient: "radialGradient", + rect: "rect", + stop: "stop", + svg: "svg", + text: "text", + tspan: "tspan" + }, r); + t.exports = s + }).call(this, e("_process")) + }, { + "./ReactElement": 69, + "./ReactElementValidator": 70, + "./mapObject": 165, + _process: 2 + }], + 53: [function(e, t) { + "use strict"; + var n = e("./AutoFocusMixin"), + r = e("./ReactBrowserComponentMixin"), + o = e("./ReactClass"), + a = e("./ReactElement"), + i = e("./keyMirror"), + s = a.createFactory("button"), + u = i({ + onClick: !0, + onDoubleClick: !0, + onMouseDown: !0, + onMouseMove: !0, + onMouseUp: !0, + onClickCapture: !0, + onDoubleClickCapture: !0, + onMouseDownCapture: !0, + onMouseMoveCapture: !0, + onMouseUpCapture: !0 + }), + c = o.createClass({ + displayName: "ReactDOMButton", + tagName: "BUTTON", + mixins: [n, r], + render: function() { + var e = {}; + for (var t in this.props) !this.props.hasOwnProperty(t) || this.props.disabled && u[t] || (e[t] = this.props[t]); + return s(e, this.props.children) + } + }); + t.exports = c + }, { + "./AutoFocusMixin": 8, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69, + "./keyMirror": 163 + }], + 54: [function(e, t) { + (function(n) { + "use strict"; + + function r(e) { + e && (null != e.dangerouslySetInnerHTML && ("production" !== n.env.NODE_ENV ? y(null == e.children, "Can only set one of `children` or `props.dangerouslySetInnerHTML`.") : y(null == e.children), "production" !== n.env.NODE_ENV ? y(null != e.dangerouslySetInnerHTML.__html, "`props.dangerouslySetInnerHTML` must be in the form `{__html: ...}`. Please visit http://fb.me/react-invariant-dangerously-set-inner-html for more information.") : y(null != e.dangerouslySetInnerHTML.__html)), "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? C(null == e.innerHTML, "Directly setting property `innerHTML` is not permitted. For more information, lookup documentation on `dangerouslySetInnerHTML`.") : null, "production" !== n.env.NODE_ENV ? C(!e.contentEditable || null == e.children, "A component is `contentEditable` and contains `children` managed by React. It is now your responsibility to guarantee that none of those nodes are unexpectedly modified or duplicated. This is probably not intentional.") : null), "production" !== n.env.NODE_ENV ? y(null == e.style || "object" == typeof e.style, "The `style` prop expects a mapping from style properties to values, not a string. For example, style={{marginRight: spacing + 'em'}} when using JSX.") : y(null == e.style || "object" == typeof e.style)) + } + + function o(e, t, r, o) { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? C("onScroll" !== t || g("scroll", !0), "This browser doesn't support the `onScroll` event") : null); + var a = d.findReactContainerForID(e); + if (a) { + var i = a.nodeType === D ? a.ownerDocument : a; + _(t, i) + } + o.getPutListenerQueue().enqueuePutListener(e, t, r) + } + + function a(e) { + P.call(T, e) || ("production" !== n.env.NODE_ENV ? y(x.test(e), "Invalid tag: %s", e) : y(x.test(e)), T[e] = !0) + } + + function i(e) { + a(e), this._tag = e, this._renderedChildren = null, this._previousStyleCopy = null, this._rootNodeID = null + } + var s = e("./CSSPropertyOperations"), + u = e("./DOMProperty"), + c = e("./DOMPropertyOperations"), + l = e("./ReactBrowserEventEmitter"), + p = e("./ReactComponentBrowserEnvironment"), + d = e("./ReactMount"), + f = e("./ReactMultiChild"), + h = e("./ReactPerf"), + v = e("./Object.assign"), + m = e("./escapeTextContentForBrowser"), + y = e("./invariant"), + g = e("./isEventSupported"), + E = e("./keyOf"), + C = e("./warning"), + b = l.deleteListener, + _ = l.listenTo, + N = l.registrationNameModules, + O = { + string: !0, + number: !0 + }, + R = E({ + style: null + }), + D = 1, + w = null, + M = { + area: !0, + base: !0, + br: !0, + col: !0, + embed: !0, + hr: !0, + img: !0, + input: !0, + keygen: !0, + link: !0, + meta: !0, + param: !0, + source: !0, + track: !0, + wbr: !0 + }, + x = /^[a-zA-Z][a-zA-Z:_\.\-\d]*$/, + T = {}, + P = {}.hasOwnProperty; + i.displayName = "ReactDOMComponent", i.Mixin = { + construct: function(e) { + this._currentElement = e + }, + mountComponent: function(e, t, n) { + this._rootNodeID = e, r(this._currentElement.props); + var o = M[this._tag] ? "" : ""; + return this._createOpenTagMarkupAndPutListeners(t) + this._createContentMarkup(t, n) + o + }, + _createOpenTagMarkupAndPutListeners: function(e) { + var t = this._currentElement.props, + n = "<" + this._tag; + for (var r in t) + if (t.hasOwnProperty(r)) { + var a = t[r]; + if (null != a) + if (N.hasOwnProperty(r)) o(this._rootNodeID, r, a, e); + else { + r === R && (a && (a = this._previousStyleCopy = v({}, t.style)), a = s.createMarkupForStyles(a)); + var i = c.createMarkupForProperty(r, a); + i && (n += " " + i) + } + } if (e.renderToStaticMarkup) return n + ">"; + var u = c.createMarkupForID(this._rootNodeID); + return n + " " + u + ">" + }, + _createContentMarkup: function(e, t) { + var n = ""; + ("listing" === this._tag || "pre" === this._tag || "textarea" === this._tag) && (n = "\n"); + var r = this._currentElement.props, + o = r.dangerouslySetInnerHTML; + if (null != o) { + if (null != o.__html) return n + o.__html + } else { + var a = O[typeof r.children] ? r.children : null, + i = null != a ? null : r.children; + if (null != a) return n + m(a); + if (null != i) { + var s = this.mountChildren(i, e, t); + return n + s.join("") + } + } + return n + }, + receiveComponent: function(e, t, n) { + var r = this._currentElement; + this._currentElement = e, this.updateComponent(t, r, e, n) + }, + updateComponent: function(e, t, n, o) { + r(this._currentElement.props), this._updateDOMProperties(t.props, e), this._updateDOMChildren(t.props, e, o) + }, + _updateDOMProperties: function(e, t) { + var n, r, a, i = this._currentElement.props; + for (n in e) + if (!i.hasOwnProperty(n) && e.hasOwnProperty(n)) + if (n === R) { + var s = this._previousStyleCopy; + for (r in s) s.hasOwnProperty(r) && (a = a || {}, a[r] = ""); + this._previousStyleCopy = null + } else N.hasOwnProperty(n) ? b(this._rootNodeID, n) : (u.isStandardName[n] || u.isCustomAttribute(n)) && w.deletePropertyByID(this._rootNodeID, n); + for (n in i) { + var c = i[n], + l = n === R ? this._previousStyleCopy : e[n]; + if (i.hasOwnProperty(n) && c !== l) + if (n === R) + if (c && (c = this._previousStyleCopy = v({}, c)), l) { + for (r in l) !l.hasOwnProperty(r) || c && c.hasOwnProperty(r) || (a = a || {}, a[r] = ""); + for (r in c) c.hasOwnProperty(r) && l[r] !== c[r] && (a = a || {}, a[r] = c[r]) + } else a = c; + else N.hasOwnProperty(n) ? o(this._rootNodeID, n, c, t) : (u.isStandardName[n] || u.isCustomAttribute(n)) && w.updatePropertyByID(this._rootNodeID, n, c) + } + a && w.updateStylesByID(this._rootNodeID, a) + }, + _updateDOMChildren: function(e, t, n) { + var r = this._currentElement.props, + o = O[typeof e.children] ? e.children : null, + a = O[typeof r.children] ? r.children : null, + i = e.dangerouslySetInnerHTML && e.dangerouslySetInnerHTML.__html, + s = r.dangerouslySetInnerHTML && r.dangerouslySetInnerHTML.__html, + u = null != o ? null : e.children, + c = null != a ? null : r.children, + l = null != o || null != i, + p = null != a || null != s; + null != u && null == c ? this.updateChildren(null, t, n) : l && !p && this.updateTextContent(""), null != a ? o !== a && this.updateTextContent("" + a) : null != s ? i !== s && w.updateInnerHTMLByID(this._rootNodeID, s) : null != c && this.updateChildren(c, t, n) + }, + unmountComponent: function() { + this.unmountChildren(), l.deleteAllListeners(this._rootNodeID), p.unmountIDFromEnvironment(this._rootNodeID), this._rootNodeID = null + } + }, h.measureMethods(i, "ReactDOMComponent", { + mountComponent: "mountComponent", + updateComponent: "updateComponent" + }), v(i.prototype, i.Mixin, f.Mixin), i.injection = { + injectIDOperations: function(e) { + i.BackendIDOperations = w = e + } + }, t.exports = i + }).call(this, e("_process")) + }, { + "./CSSPropertyOperations": 12, + "./DOMProperty": 17, + "./DOMPropertyOperations": 18, + "./Object.assign": 35, + "./ReactBrowserEventEmitter": 39, + "./ReactComponentBrowserEnvironment": 46, + "./ReactMount": 83, + "./ReactMultiChild": 84, + "./ReactPerf": 88, + "./escapeTextContentForBrowser": 138, + "./invariant": 157, + "./isEventSupported": 158, + "./keyOf": 164, + "./warning": 178, + _process: 2 + }], + 55: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("form"), + u = a.createClass({ + displayName: "ReactDOMForm", + tagName: "FORM", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topReset, "reset"), this.trapBubbledEvent(n.topLevelTypes.topSubmit, "submit") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 56: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./CSSPropertyOperations"), + o = e("./DOMChildrenOperations"), + a = e("./DOMPropertyOperations"), + i = e("./ReactMount"), + s = e("./ReactPerf"), + u = e("./invariant"), + c = e("./setInnerHTML"), + l = { + dangerouslySetInnerHTML: "`dangerouslySetInnerHTML` must be set using `updateInnerHTMLByID()`.", + style: "`style` must be set using `updateStylesByID()`." + }, + p = { + updatePropertyByID: function(e, t, r) { + var o = i.getNode(e); + "production" !== n.env.NODE_ENV ? u(!l.hasOwnProperty(t), "updatePropertyByID(...): %s", l[t]) : u(!l.hasOwnProperty(t)), null != r ? a.setValueForProperty(o, t, r) : a.deleteValueForProperty(o, t) + }, + deletePropertyByID: function(e, t, r) { + var o = i.getNode(e); + "production" !== n.env.NODE_ENV ? u(!l.hasOwnProperty(t), "updatePropertyByID(...): %s", l[t]) : u(!l.hasOwnProperty(t)), a.deleteValueForProperty(o, t, r) + }, + updateStylesByID: function(e, t) { + var n = i.getNode(e); + r.setValueForStyles(n, t) + }, + updateInnerHTMLByID: function(e, t) { + var n = i.getNode(e); + c(n, t) + }, + updateTextContentByID: function(e, t) { + var n = i.getNode(e); + o.updateTextContent(n, t) + }, + dangerouslyReplaceNodeWithMarkupByID: function(e, t) { + var n = i.getNode(e); + o.dangerouslyReplaceNodeWithMarkup(n, t) + }, + dangerouslyProcessChildrenUpdates: function(e, t) { + for (var n = 0; n < e.length; n++) e[n].parentNode = i.getNode(e[n].parentID); + o.processUpdates(e, t) + } + }; + s.measureMethods(p, "ReactDOMIDOperations", { + updatePropertyByID: "updatePropertyByID", + deletePropertyByID: "deletePropertyByID", + updateStylesByID: "updateStylesByID", + updateInnerHTMLByID: "updateInnerHTMLByID", + updateTextContentByID: "updateTextContentByID", + dangerouslyReplaceNodeWithMarkupByID: "dangerouslyReplaceNodeWithMarkupByID", + dangerouslyProcessChildrenUpdates: "dangerouslyProcessChildrenUpdates" + }), t.exports = p + }).call(this, e("_process")) + }, { + "./CSSPropertyOperations": 12, + "./DOMChildrenOperations": 16, + "./DOMPropertyOperations": 18, + "./ReactMount": 83, + "./ReactPerf": 88, + "./invariant": 157, + "./setInnerHTML": 171, + _process: 2 + }], + 57: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("iframe"), + u = a.createClass({ + displayName: "ReactDOMIframe", + tagName: "IFRAME", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topLoad, "load") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 58: [function(e, t) { + "use strict"; + var n = e("./EventConstants"), + r = e("./LocalEventTrapMixin"), + o = e("./ReactBrowserComponentMixin"), + a = e("./ReactClass"), + i = e("./ReactElement"), + s = i.createFactory("img"), + u = a.createClass({ + displayName: "ReactDOMImg", + tagName: "IMG", + mixins: [o, r], + render: function() { + return s(this.props) + }, + componentDidMount: function() { + this.trapBubbledEvent(n.topLevelTypes.topLoad, "load"), this.trapBubbledEvent(n.topLevelTypes.topError, "error") + } + }); + t.exports = u + }, { + "./EventConstants": 22, + "./LocalEventTrapMixin": 33, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69 + }], + 59: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this.isMounted() && this.forceUpdate() + } + var o = e("./AutoFocusMixin"), + a = e("./DOMPropertyOperations"), + i = e("./LinkedValueUtils"), + s = e("./ReactBrowserComponentMixin"), + u = e("./ReactClass"), + c = e("./ReactElement"), + l = e("./ReactMount"), + p = e("./ReactUpdates"), + d = e("./Object.assign"), + f = e("./invariant"), + h = c.createFactory("input"), + v = {}, + m = u.createClass({ + displayName: "ReactDOMInput", + tagName: "INPUT", + mixins: [o, i.Mixin, s], + getInitialState: function() { + var e = this.props.defaultValue; + return { + initialChecked: this.props.defaultChecked || !1, + initialValue: null != e ? e : null + } + }, + render: function() { + var e = d({}, this.props); + e.defaultChecked = null, e.defaultValue = null; + var t = i.getValue(this); + e.value = null != t ? t : this.state.initialValue; + var n = i.getChecked(this); + return e.checked = null != n ? n : this.state.initialChecked, e.onChange = this._handleChange, h(e, this.props.children) + }, + componentDidMount: function() { + var e = l.getID(this.getDOMNode()); + v[e] = this + }, + componentWillUnmount: function() { + var e = this.getDOMNode(), + t = l.getID(e); + delete v[t] + }, + componentDidUpdate: function() { + var e = this.getDOMNode(); + null != this.props.checked && a.setValueForProperty(e, "checked", this.props.checked || !1); + var t = i.getValue(this); + null != t && a.setValueForProperty(e, "value", "" + t) + }, + _handleChange: function(e) { + var t, o = i.getOnChange(this); + o && (t = o.call(this, e)), p.asap(r, this); + var a = this.props.name; + if ("radio" === this.props.type && null != a) { + for (var s = this.getDOMNode(), u = s; u.parentNode;) u = u.parentNode; + for (var c = u.querySelectorAll("input[name=" + JSON.stringify("" + a) + '][type="radio"]'), d = 0, h = c.length; h > d; d++) { + var m = c[d]; + if (m !== s && m.form === s.form) { + var y = l.getID(m); + "production" !== n.env.NODE_ENV ? f(y, "ReactDOMInput: Mixing React and non-React radio inputs with the same `name` is not supported.") : f(y); + var g = v[y]; + "production" !== n.env.NODE_ENV ? f(g, "ReactDOMInput: Unknown radio button ID %s.", y) : f(g), p.asap(r, g) + } + } + } + return t + } + }); + t.exports = m + }).call(this, e("_process")) + }, { + "./AutoFocusMixin": 8, + "./DOMPropertyOperations": 18, + "./LinkedValueUtils": 32, + "./Object.assign": 35, + "./ReactBrowserComponentMixin": 38, + "./ReactClass": 44, + "./ReactElement": 69, + "./ReactMount": 83, + "./ReactUpdates": 106, + "./invariant": 157, + _process: 2 + }], + 60: [function(e, t) { + (function(n) { + "use strict"; + var r = e("./ReactBrowserComponentMixin"), + o = e("./ReactClass"), + a = e("./ReactElement"), + i = e("./warning"), + s = a.createFactory("option"), + u = o.createClass({ + displayName: "ReactDOMOption", + tagName: "OPTION", + mixins: [r], + componentWillMount: function() { + "production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? i(null == this.props.selected, "Use the `defaultValue` or `value` props on " + r + "" + }, + receiveComponent: function(e) { + if (e !== this._currentElement) { + this._currentElement = e; + var t = "" + e; + t !== this._stringText && (this._stringText = t, o.BackendIDOperations.updateTextContentByID(this._rootNodeID, t)) + } + }, + unmountComponent: function() { + r.unmountIDFromEnvironment(this._rootNodeID) + } + }), t.exports = s + }, { + "./DOMPropertyOperations": 18, + "./Object.assign": 35, + "./ReactComponentBrowserEnvironment": 46, + "./ReactDOMComponent": 54, + "./escapeTextContentForBrowser": 138 + }], + 64: [function(e, t) { + (function(n) { + "use strict"; + + function r() { + this.isMounted() && this.forceUpdate() + } + var o = e("./AutoFocusMixin"), + a = e("./DOMPropertyOperations"), + i = e("./LinkedValueUtils"), + s = e("./ReactBrowserComponentMixin"), + u = e("./ReactClass"), + c = e("./ReactElement"), + l = e("./ReactUpdates"), + p = e("./Object.assign"), + d = e("./invariant"), + f = e("./warning"), + h = c.createFactory("textarea"), + v = u.createClass({ + displayName: "ReactDOMTextarea", + tagName: "TEXTAREA", + mixins: [o, i.Mixin, s], + getInitialState: function() { + var e = this.props.defaultValue, + t = this.props.children; + null != t && ("production" !== n.env.NODE_ENV && ("production" !== n.env.NODE_ENV ? f(!1, "Use the `defaultValue` or `value` props instead of setting children on -

- - - - - - - -
- - - Something went wrong with that request. Please try again. -
- - - - diff --git a/DS4Windows/HidLibrary/NativeMethods.cs b/DS4Windows/HidLibrary/NativeMethods.cs index 7a9b25c3ef..bd0c00ae87 100644 --- a/DS4Windows/HidLibrary/NativeMethods.cs +++ b/DS4Windows/HidLibrary/NativeMethods.cs @@ -1,8 +1,12 @@ using System; using System.Runtime.InteropServices; +using System.Security; +using System.Text; using Microsoft.Win32.SafeHandles; + namespace DS4Windows { + [SuppressUnmanagedCodeSecurity] internal static class NativeMethods { [StructLayout(LayoutKind.Sequential)] @@ -22,44 +26,55 @@ internal struct BLUETOOTH_FIND_RADIO_PARAMS internal extern static bool BluetoothFindRadioClose(IntPtr hFind); [DllImport("kernel32.dll", SetLastError = true)] - internal static extern Boolean DeviceIoControl(IntPtr DeviceHandle, Int32 IoControlCode, ref long InBuffer, Int32 InBufferSize, IntPtr OutBuffer, Int32 OutBufferSize, ref Int32 BytesReturned, IntPtr Overlapped); + internal static extern Boolean DeviceIoControl(IntPtr DeviceHandle, UInt32 IoControlCode, ref long InBuffer, Int32 InBufferSize, IntPtr OutBuffer, Int32 OutBufferSize, ref Int32 BytesReturned, IntPtr Overlapped); + + [DllImport("kernel32.dll", SetLastError = true, EntryPoint = "DeviceIoControl")] + internal static extern Boolean DeviceIoControl(IntPtr DeviceHandle, UInt32 IoControlCode, IntPtr InBuffer, Int32 InBufferSize, IntPtr OutBuffer, Int32 OutBufferSize, ref Int32 BytesReturned, IntPtr Overlapped); [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true, CharSet = CharSet.Auto)] internal static extern bool CloseHandle(IntPtr hObject); - internal const int FILE_FLAG_OVERLAPPED = 0x40000000; - internal const short FILE_SHARE_READ = 0x1; - internal const short FILE_SHARE_WRITE = 0x2; - internal const uint GENERIC_READ = 0x80000000; - internal const uint GENERIC_WRITE = 0x40000000; + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true, EntryPoint = "QueryDosDeviceW")] + internal static extern uint QueryDosDevice(string lpDeviceName, StringBuilder lpTargetPath, int ucchMax); + + internal const uint FILE_ATTRIBUTE_NORMAL = 0x80; + internal const int FILE_FLAG_OVERLAPPED = 0x40000000; + internal const uint FILE_FLAG_NO_BUFFERING = 0x20000000; + internal const uint FILE_FLAG_WRITE_THROUGH = 0x80000000; + internal const uint FILE_ATTRIBUTE_TEMPORARY = 0x100; + + internal const short FILE_SHARE_READ = 0x1; + internal const short FILE_SHARE_WRITE = 0x2; + internal const uint GENERIC_READ = 0x80000000; + internal const uint GENERIC_WRITE = 0x40000000; internal const Int32 FileShareRead = 1; internal const Int32 FileShareWrite = 2; internal const Int32 OpenExisting = 3; - internal const int ACCESS_NONE = 0; - internal const int INVALID_HANDLE_VALUE = -1; - internal const short OPEN_EXISTING = 3; - internal const int WAIT_TIMEOUT = 0x102; - internal const uint WAIT_OBJECT_0 = 0; - internal const uint WAIT_FAILED = 0xffffffff; - - internal const int WAIT_INFINITE = 0xffff; - [StructLayout(LayoutKind.Sequential)] - internal struct OVERLAPPED - { - public int Internal; - public int InternalHigh; - public int Offset; - public int OffsetHigh; - public int hEvent; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct SECURITY_ATTRIBUTES - { - public int nLength; - public IntPtr lpSecurityDescriptor; - public bool bInheritHandle; - } + internal const int ACCESS_NONE = 0; + internal const int INVALID_HANDLE_VALUE = -1; + internal const short OPEN_EXISTING = 3; + internal const int WAIT_TIMEOUT = 0x102; + internal const uint WAIT_OBJECT_0 = 0; + internal const uint WAIT_FAILED = 0xffffffff; + + internal const int WAIT_INFINITE = 0xffff; + [StructLayout(LayoutKind.Sequential)] + internal struct OVERLAPPED + { + public int Internal; + public int InternalHigh; + public int Offset; + public int OffsetHigh; + public int hEvent; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct SECURITY_ATTRIBUTES + { + public int nLength; + public IntPtr lpSecurityDescriptor; + public bool bInheritHandle; + } [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true, CharSet = CharSet.Auto)] static internal extern bool CancelIo(IntPtr hFile); @@ -70,130 +85,137 @@ internal struct SECURITY_ATTRIBUTES [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true, CharSet = CharSet.Auto)] static internal extern bool CancelSynchronousIo(IntPtr hObject); - [DllImport("kernel32.dll", CharSet = CharSet.Auto)] - static internal extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES securityAttributes, int bManualReset, int bInitialState, string lpName); + [DllImport("kernel32.dll", CharSet = CharSet.Auto)] + static internal extern IntPtr CreateEvent(ref SECURITY_ATTRIBUTES securityAttributes, int bManualReset, int bInitialState, string lpName); - [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - static internal extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, int dwFlagsAndAttributes, int hTemplateFile); + [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] + static internal extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, int dwShareMode, ref SECURITY_ATTRIBUTES lpSecurityAttributes, int dwCreationDisposition, uint dwFlagsAndAttributes, int hTemplateFile); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] - internal static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, Int32 dwShareMode, IntPtr lpSecurityAttributes, Int32 dwCreationDisposition, Int32 dwFlagsAndAttributes, Int32 hTemplateFile); + internal static extern SafeFileHandle CreateFile(String lpFileName, UInt32 dwDesiredAccess, Int32 dwShareMode, IntPtr lpSecurityAttributes, Int32 dwCreationDisposition, UInt32 dwFlagsAndAttributes, Int32 hTemplateFile); [DllImport("kernel32.dll", SetLastError = true)] static internal extern bool ReadFile(IntPtr hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped); - [DllImport("kernel32.dll")] - static internal extern uint WaitForSingleObject(IntPtr hHandle, int dwMilliseconds); + [DllImport("kernel32.dll")] + static internal extern uint WaitForSingleObject(IntPtr hHandle, int dwMilliseconds); [DllImport("kernel32.dll")] static internal extern bool WriteFile(IntPtr hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, [In] ref System.Threading.NativeOverlapped lpOverlapped); - internal const int DBT_DEVICEARRIVAL = 0x8000; - internal const int DBT_DEVICEREMOVECOMPLETE = 0x8004; - internal const int DBT_DEVTYP_DEVICEINTERFACE = 5; - internal const int DBT_DEVTYP_HANDLE = 6; - internal const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 4; - internal const int DEVICE_NOTIFY_SERVICE_HANDLE = 1; - internal const int DEVICE_NOTIFY_WINDOW_HANDLE = 0; - internal const int WM_DEVICECHANGE = 0x219; - internal const short DIGCF_PRESENT = 0x2; - internal const short DIGCF_DEVICEINTERFACE = 0x10; - internal const int DIGCF_ALLCLASSES = 0x4; + internal const int DBT_DEVICEARRIVAL = 0x8000; + internal const int DBT_DEVICEREMOVECOMPLETE = 0x8004; + internal const int DBT_DEVTYP_DEVICEINTERFACE = 5; + internal const int DBT_DEVTYP_HANDLE = 6; + internal const int DEVICE_NOTIFY_ALL_INTERFACE_CLASSES = 4; + internal const int DEVICE_NOTIFY_SERVICE_HANDLE = 1; + internal const int DEVICE_NOTIFY_WINDOW_HANDLE = 0; + internal const int WM_DEVICECHANGE = 0x219; + internal const short DIGCF_DEFAULT = 0x1; + internal const short DIGCF_PRESENT = 0x2; + internal const short DIGCF_PROFILE = 0x8; + internal const short DIGCF_DEVICEINTERFACE = 0x10; + internal const int DIGCF_ALLCLASSES = 0x4; internal const int DICS_ENABLE = 1; internal const int DICS_DISABLE = 2; internal const int DICS_FLAG_GLOBAL = 1; internal const int DIF_PROPERTYCHANGE = 0x12; internal const int MAX_DEV_LEN = 1000; - internal const int SPDRP_ADDRESS = 0x1c; - internal const int SPDRP_BUSNUMBER = 0x15; - internal const int SPDRP_BUSTYPEGUID = 0x13; - internal const int SPDRP_CAPABILITIES = 0xf; - internal const int SPDRP_CHARACTERISTICS = 0x1b; - internal const int SPDRP_CLASS = 7; - internal const int SPDRP_CLASSGUID = 8; - internal const int SPDRP_COMPATIBLEIDS = 2; - internal const int SPDRP_CONFIGFLAGS = 0xa; - internal const int SPDRP_DEVICE_POWER_DATA = 0x1e; - internal const int SPDRP_DEVICEDESC = 0; - internal const int SPDRP_DEVTYPE = 0x19; - internal const int SPDRP_DRIVER = 9; - internal const int SPDRP_ENUMERATOR_NAME = 0x16; - internal const int SPDRP_EXCLUSIVE = 0x1a; - internal const int SPDRP_FRIENDLYNAME = 0xc; - internal const int SPDRP_HARDWAREID = 1; - internal const int SPDRP_LEGACYBUSTYPE = 0x14; - internal const int SPDRP_LOCATION_INFORMATION = 0xd; - internal const int SPDRP_LOWERFILTERS = 0x12; - internal const int SPDRP_MFG = 0xb; - internal const int SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0xe; - internal const int SPDRP_REMOVAL_POLICY = 0x1f; - internal const int SPDRP_REMOVAL_POLICY_HW_DEFAULT = 0x20; - internal const int SPDRP_REMOVAL_POLICY_OVERRIDE = 0x21; - internal const int SPDRP_SECURITY = 0x17; - internal const int SPDRP_SECURITY_SDS = 0x18; - internal const int SPDRP_SERVICE = 4; - internal const int SPDRP_UI_NUMBER = 0x10; - internal const int SPDRP_UI_NUMBER_DESC_FORMAT = 0x1d; + internal const int SPDRP_ADDRESS = 0x1c; + internal const int SPDRP_BUSNUMBER = 0x15; + internal const int SPDRP_BUSTYPEGUID = 0x13; + internal const int SPDRP_CAPABILITIES = 0xf; + internal const int SPDRP_CHARACTERISTICS = 0x1b; + internal const int SPDRP_CLASS = 7; + internal const int SPDRP_CLASSGUID = 8; + internal const int SPDRP_COMPATIBLEIDS = 2; + internal const int SPDRP_CONFIGFLAGS = 0xa; + internal const int SPDRP_DEVICE_POWER_DATA = 0x1e; + internal const int SPDRP_DEVICEDESC = 0; + internal const int SPDRP_DEVTYPE = 0x19; + internal const int SPDRP_DRIVER = 9; + internal const int SPDRP_ENUMERATOR_NAME = 0x16; + internal const int SPDRP_EXCLUSIVE = 0x1a; + internal const int SPDRP_FRIENDLYNAME = 0xc; + internal const int SPDRP_HARDWAREID = 1; + internal const int SPDRP_LEGACYBUSTYPE = 0x14; + internal const int SPDRP_LOCATION_INFORMATION = 0xd; + internal const int SPDRP_LOWERFILTERS = 0x12; + internal const int SPDRP_MFG = 0xb; + internal const int SPDRP_PHYSICAL_DEVICE_OBJECT_NAME = 0xe; + internal const int SPDRP_REMOVAL_POLICY = 0x1f; + internal const int SPDRP_REMOVAL_POLICY_HW_DEFAULT = 0x20; + internal const int SPDRP_REMOVAL_POLICY_OVERRIDE = 0x21; + internal const int SPDRP_SECURITY = 0x17; + internal const int SPDRP_SECURITY_SDS = 0x18; + internal const int SPDRP_SERVICE = 4; + internal const int SPDRP_UI_NUMBER = 0x10; + internal const int SPDRP_UI_NUMBER_DESC_FORMAT = 0x1d; + + internal const uint CM_LOCATE_DEVNODE_NORMAL = 0x00; + internal const uint CM_LOCATE_DEVNODE_PHANTOM = 0x01; + internal const uint CM_LOCATE_DEVNODE_CANCELREMOVE = 0x02; + internal const int SPDRP_UPPERFILTERS = 0x11; - [StructLayout(LayoutKind.Sequential)] - internal class DEV_BROADCAST_DEVICEINTERFACE - { - internal int dbcc_size; - internal int dbcc_devicetype; - internal int dbcc_reserved; - internal Guid dbcc_classguid; - internal short dbcc_name; - } - - [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] - internal class DEV_BROADCAST_DEVICEINTERFACE_1 - { - internal int dbcc_size; - internal int dbcc_devicetype; - internal int dbcc_reserved; - [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 16)] - internal byte[] dbcc_classguid; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] - internal char[] dbcc_name; - } - - [StructLayout(LayoutKind.Sequential)] - internal class DEV_BROADCAST_HANDLE - { - internal int dbch_size; - internal int dbch_devicetype; - internal int dbch_reserved; - internal int dbch_handle; - internal int dbch_hdevnotify; - } - - [StructLayout(LayoutKind.Sequential)] - internal class DEV_BROADCAST_HDR - { - internal int dbch_size; - internal int dbch_devicetype; - internal int dbch_reserved; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct SP_DEVICE_INTERFACE_DATA - { - internal int cbSize; - internal System.Guid InterfaceClassGuid; - internal int Flags; - internal IntPtr Reserved; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct SP_DEVINFO_DATA - { - internal int cbSize; - internal Guid ClassGuid; - internal int DevInst; - internal IntPtr Reserved; - } + [StructLayout(LayoutKind.Sequential)] + internal class DEV_BROADCAST_DEVICEINTERFACE + { + internal int dbcc_size; + internal int dbcc_devicetype; + internal int dbcc_reserved; + internal Guid dbcc_classguid; + internal short dbcc_name; + } + + [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] + internal class DEV_BROADCAST_DEVICEINTERFACE_1 + { + internal int dbcc_size; + internal int dbcc_devicetype; + internal int dbcc_reserved; + [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.U1, SizeConst = 16)] + internal byte[] dbcc_classguid; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 255)] + internal char[] dbcc_name; + } + + [StructLayout(LayoutKind.Sequential)] + internal class DEV_BROADCAST_HANDLE + { + internal int dbch_size; + internal int dbch_devicetype; + internal int dbch_reserved; + internal int dbch_handle; + internal int dbch_hdevnotify; + } + + [StructLayout(LayoutKind.Sequential)] + internal class DEV_BROADCAST_HDR + { + internal int dbch_size; + internal int dbch_devicetype; + internal int dbch_reserved; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct SP_DEVICE_INTERFACE_DATA + { + internal int cbSize; + internal System.Guid InterfaceClassGuid; + internal int Flags; + internal IntPtr Reserved; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct SP_DEVINFO_DATA + { + internal int cbSize; + internal Guid ClassGuid; + internal int DevInst; + internal IntPtr Reserved; + } [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Auto)] internal struct SP_DEVICE_INTERFACE_DETAIL_DATA @@ -210,6 +232,48 @@ internal struct DEVPROPKEY public ulong pid; } + [Flags] + internal enum DEVPROPTYPE : ulong + { + DEVPROP_TYPEMOD_ARRAY = 0x00001000, + DEVPROP_TYPEMOD_LIST = 0x00002000, + + DEVPROP_TYPE_EMPTY = 0x00000000, // nothing, no property data + DEVPROP_TYPE_NULL = 0x00000001, // null property data + DEVPROP_TYPE_SBYTE = 0x00000002, // 8-bit signed int (SBYTE) + DEVPROP_TYPE_BYTE = 0x00000003, // 8-bit unsigned int (BYTE) + DEVPROP_TYPE_INT16 = 0x00000004, // 16-bit signed int (SHORT) + DEVPROP_TYPE_UINT16 = 0x00000005, // 16-bit unsigned int (USHORT) + DEVPROP_TYPE_INT32 = 0x00000006, // 32-bit signed int (LONG) + DEVPROP_TYPE_UINT32 = 0x00000007, // 32-bit unsigned int (ULONG) + DEVPROP_TYPE_INT64 = 0x00000008, // 64-bit signed int (LONG64) + DEVPROP_TYPE_UINT64 = 0x00000009, // 64-bit unsigned int (ULONG64) + DEVPROP_TYPE_FLOAT = 0x0000000A, // 32-bit floating-point (FLOAT) + DEVPROP_TYPE_DOUBLE = 0x0000000B, // 64-bit floating-point (DOUBLE) + DEVPROP_TYPE_DECIMAL = 0x0000000C, // 128-bit data (DECIMAL) + DEVPROP_TYPE_GUID = 0x0000000D, // 128-bit unique identifier (GUID) + DEVPROP_TYPE_CURRENCY = 0x0000000E, // 64 bit signed int currency value (CURRENCY) + DEVPROP_TYPE_DATE = 0x0000000F, // date (DATE) + DEVPROP_TYPE_FILETIME = 0x00000010, // filetime (FILETIME) + DEVPROP_TYPE_BOOLEAN = 0x00000011, // 8-bit boolean (DEVPROP_BOOLEAN) + DEVPROP_TYPE_STRING = 0x00000012, // null-terminated string + DEVPROP_TYPE_STRING_LIST = (DEVPROP_TYPE_STRING | DEVPROP_TYPEMOD_LIST), // multi-sz string list + DEVPROP_TYPE_SECURITY_DESCRIPTOR = 0x00000013, // self-relative binary SECURITY_DESCRIPTOR + DEVPROP_TYPE_SECURITY_DESCRIPTOR_STRING = 0x00000014, // security descriptor string (SDDL format) + DEVPROP_TYPE_DEVPROPKEY = 0x00000015, // device property key (DEVPROPKEY) + DEVPROP_TYPE_DEVPROPTYPE = 0x00000016, // device property type (DEVPROPTYPE) + DEVPROP_TYPE_BINARY = (DEVPROP_TYPE_BYTE | DEVPROP_TYPEMOD_ARRAY), // custom binary data + DEVPROP_TYPE_ERROR = 0x00000017, // 32-bit Win32 system error code + DEVPROP_TYPE_NTSTATUS = 0x00000018, // 32-bit NTSTATUS code + DEVPROP_TYPE_STRING_INDIRECT = 0x00000019, // string resource (@[path\],-) + + MAX_DEVPROP_TYPE = 0x00000019, + MAX_DEVPROP_TYPEMOD = 0x00002000, + + DEVPROP_MASK_TYPE = 0x00000FFF, + DEVPROP_MASK_TYPEMOD = 0x0000F000 + } + [StructLayout(LayoutKind.Sequential)] internal struct SP_CLASSINSTALL_HEADER { @@ -229,35 +293,78 @@ internal struct SP_PROPCHANGE_PARAMS internal static DEVPROPKEY DEVPKEY_Device_BusReportedDeviceDesc = new DEVPROPKEY { fmtid = new Guid(0x540b947e, 0x8b40, 0x45bc, 0xa8, 0xa2, 0x6a, 0x0b, 0x89, 0x4c, 0xbd, 0xa2), pid = 4 }; - [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDeviceRegistryProperty")] + internal static DEVPROPKEY DEVPKEY_Device_DeviceDesc = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 2 }; + + internal static DEVPROPKEY DEVPKEY_Device_HardwareIds = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 3 }; + + internal static DEVPROPKEY DEVPKEY_Device_UINumber = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 18 }; + + internal static DEVPROPKEY DEVPKEY_Device_DriverVersion = + new DEVPROPKEY { fmtid = new Guid(0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6), pid = 3 }; + + internal static DEVPROPKEY DEVPKEY_Device_Manufacturer = + new DEVPROPKEY { fmtid = new Guid(0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0), pid = 13 }; + + internal static DEVPROPKEY DEVPKEY_Device_Provider = + new DEVPROPKEY { fmtid = new Guid(0xa8b865dd, 0x2e3d, 0x4094, 0xad, 0x97, 0xe5, 0x93, 0xa7, 0xc, 0x75, 0xd6), pid = 9 }; + + internal static DEVPROPKEY DEVPKEY_Device_Parent = + new DEVPROPKEY { fmtid = new Guid(0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7), pid = 8 }; + + internal static DEVPROPKEY DEVPKEY_Device_Siblings = + new DEVPROPKEY { fmtid = new Guid(0x4340a6c5, 0x93fa, 0x4706, 0x97, 0x2c, 0x7b, 0x64, 0x80, 0x08, 0xa5, 0xa7), pid = 10 }; + + internal static DEVPROPKEY DEVPKEY_Device_InstanceId = + new DEVPROPKEY { fmtid = new Guid(0x78c34fc8, 0x104a, 0x4aca, 0x9e, 0xa4, 0x52, 0x4d, 0x52, 0x99, 0x6e, 0x57), pid = 256 }; + + [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDeviceRegistryProperty")] public static extern bool SetupDiGetDeviceRegistryProperty(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, int propertyVal, ref int propertyRegDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize); - + [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDevicePropertyW", SetLastError = true)] public static extern bool SetupDiGetDeviceProperty(IntPtr deviceInfo, ref SP_DEVINFO_DATA deviceInfoData, ref DEVPROPKEY propkey, ref ulong propertyDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize, uint flags); - [DllImport("setupapi.dll")] - static internal extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, int memberIndex, ref SP_DEVINFO_DATA deviceInfoData); + [DllImport("setupapi.dll", EntryPoint = "SetupDiGetDeviceInterfacePropertyW", SetLastError = true)] + public static extern bool SetupDiGetDeviceInterfaceProperty(IntPtr deviceInfo, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, + ref DEVPROPKEY propkey, ref ulong propertyDataType, byte[] propertyBuffer, int propertyBufferSize, ref int requiredSize, uint flags); + + [DllImport("setupapi.dll")] + static internal extern bool SetupDiEnumDeviceInfo(IntPtr deviceInfoSet, int memberIndex, ref SP_DEVINFO_DATA deviceInfoData); - [DllImport("user32.dll", CharSet = CharSet.Auto)] - static internal extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr notificationFilter, Int32 flags); + [DllImport("user32.dll", CharSet = CharSet.Auto)] + static internal extern IntPtr RegisterDeviceNotification(IntPtr hRecipient, IntPtr notificationFilter, Int32 flags); [DllImport("setupapi.dll")] internal static extern int SetupDiCreateDeviceInfoList(ref Guid classGuid, int hwndParent); - [DllImport("setupapi.dll")] - static internal extern int SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet); + [DllImport("setupapi.dll")] + internal static extern IntPtr SetupDiCreateDeviceInfoList(IntPtr guid, int hwndParent); + + [DllImport("setupapi.dll")] + static internal extern int SetupDiDestroyDeviceInfoList(IntPtr deviceInfoSet); - [DllImport("setupapi.dll")] + [DllImport("setupapi.dll")] + internal static extern bool SetupDiOpenDeviceInfo(IntPtr deviceInfoSet, string deviceInstanceId, IntPtr parent, uint flags, ref SP_DEVINFO_DATA deviceInfoData); + + [DllImport("setupapi.dll")] static internal extern bool SetupDiEnumDeviceInterfaces(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData); - [DllImport("setupapi.dll", CharSet = CharSet.Auto)] + [DllImport("setupapi.dll")] + static internal extern bool SetupDiEnumDeviceInterfaces(IntPtr deviceInfoSet, IntPtr deviceInfoData, ref Guid interfaceClassGuid, int memberIndex, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData); + + [DllImport("setupapi.dll", CharSet = CharSet.Auto)] static internal extern IntPtr SetupDiGetClassDevs(ref System.Guid classGuid, string enumerator, int hwndParent, int flags); + [DllImport("setupapi.dll", CharSet = CharSet.Auto)] + static internal extern IntPtr SetupDiGetClassDevs(IntPtr classGuid, string enumerator, int hwndParent, int flags); + [DllImport("setupapi.dll", CharSet = CharSet.Auto, EntryPoint = "SetupDiGetDeviceInterfaceDetail")] static internal extern bool SetupDiGetDeviceInterfaceDetailBuffer(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, IntPtr deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, ref int requiredSize, IntPtr deviceInfoData); - [DllImport("setupapi.dll", CharSet = CharSet.Auto)] - static internal extern bool SetupDiGetDeviceInterfaceDetail(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, ref int requiredSize, IntPtr deviceInfoData); + [DllImport("setupapi.dll", CharSet = CharSet.Auto)] + static internal extern bool SetupDiGetDeviceInterfaceDetail(IntPtr deviceInfoSet, ref SP_DEVICE_INTERFACE_DATA deviceInterfaceData, ref SP_DEVICE_INTERFACE_DETAIL_DATA deviceInterfaceDetailData, int deviceInterfaceDetailDataSize, ref int requiredSize, IntPtr deviceInfoData); [DllImport("setupapi.dll", CharSet = CharSet.Auto)] static internal extern bool SetupDiSetClassInstallParams(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, ref SP_PROPCHANGE_PARAMS classInstallParams, int classInstallParamsSize); @@ -268,116 +375,122 @@ internal struct SP_PROPCHANGE_PARAMS [DllImport("setupapi.dll", CharSet = CharSet.Auto)] static internal extern bool SetupDiGetDeviceInstanceId(IntPtr deviceInfoSet, ref SP_DEVINFO_DATA deviceInfoData, char[] deviceInstanceId, Int32 deviceInstanceIdSize, ref int requiredSize); + [DllImport("setupapi.dll", SetLastError = true)] + static internal extern bool SetupDiClassGuidsFromName(string ClassName, ref Guid ClassGuidArray1stItem, UInt32 ClassGuidArraySize, out UInt32 RequiredSize); + + [DllImport("cfgmgr32.dll", CharSet = CharSet.Unicode)] + static internal extern uint CM_Get_Device_Interface_Property(string pszDeviceInterface, ref DEVPROPKEY PropertyKey, out DEVPROPTYPE PropertyType, byte[] PropertyBuffer, ref uint PropertyBufferSize, uint ulFlags); + [DllImport("user32.dll")] - static internal extern bool UnregisterDeviceNotification(IntPtr handle); - - internal const short HIDP_INPUT = 0; - internal const short HIDP_OUTPUT = 1; - - internal const short HIDP_FEATURE = 2; - [StructLayout(LayoutKind.Sequential)] - internal struct HIDD_ATTRIBUTES - { - internal int Size; - internal ushort VendorID; - internal ushort ProductID; - internal short VersionNumber; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct HIDP_CAPS - { - internal short Usage; - internal short UsagePage; - internal short InputReportByteLength; - internal short OutputReportByteLength; - internal short FeatureReportByteLength; - [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] - internal short[] Reserved; - internal short NumberLinkCollectionNodes; - internal short NumberInputButtonCaps; - internal short NumberInputValueCaps; - internal short NumberInputDataIndices; - internal short NumberOutputButtonCaps; - internal short NumberOutputValueCaps; - internal short NumberOutputDataIndices; - internal short NumberFeatureButtonCaps; - internal short NumberFeatureValueCaps; - internal short NumberFeatureDataIndices; - } - - [StructLayout(LayoutKind.Sequential)] - internal struct HIDP_VALUE_CAPS - { - internal short UsagePage; - internal byte ReportID; - internal int IsAlias; - internal short BitField; - internal short LinkCollection; - internal short LinkUsage; - internal short LinkUsagePage; - internal int IsRange; - internal int IsStringRange; - internal int IsDesignatorRange; - internal int IsAbsolute; - internal int HasNull; - internal byte Reserved; - internal short BitSize; - internal short ReportCount; - internal short Reserved2; - internal short Reserved3; - internal short Reserved4; - internal short Reserved5; - internal short Reserved6; - internal int LogicalMin; - internal int LogicalMax; - internal int PhysicalMin; - internal int PhysicalMax; - internal short UsageMin; - internal short UsageMax; - internal short StringMin; - internal short StringMax; - internal short DesignatorMin; - internal short DesignatorMax; - internal short DataIndexMin; - internal short DataIndexMax; - } - - [DllImport("hid.dll")] - static internal extern bool HidD_FlushQueue(IntPtr hidDeviceObject); + static internal extern bool UnregisterDeviceNotification(IntPtr handle); + + internal const short HIDP_INPUT = 0; + internal const short HIDP_OUTPUT = 1; + + internal const short HIDP_FEATURE = 2; + [StructLayout(LayoutKind.Sequential)] + internal struct HIDD_ATTRIBUTES + { + internal int Size; + internal ushort VendorID; + internal ushort ProductID; + internal short VersionNumber; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct HIDP_CAPS + { + internal ushort Usage; + internal ushort UsagePage; + internal short InputReportByteLength; + internal short OutputReportByteLength; + internal short FeatureReportByteLength; + [MarshalAs(UnmanagedType.ByValArray, SizeConst = 17)] + internal short[] Reserved; + internal short NumberLinkCollectionNodes; + internal short NumberInputButtonCaps; + internal short NumberInputValueCaps; + internal short NumberInputDataIndices; + internal short NumberOutputButtonCaps; + internal short NumberOutputValueCaps; + internal short NumberOutputDataIndices; + internal short NumberFeatureButtonCaps; + internal short NumberFeatureValueCaps; + internal short NumberFeatureDataIndices; + } + + [StructLayout(LayoutKind.Sequential)] + internal struct HIDP_VALUE_CAPS + { + internal short UsagePage; + internal byte ReportID; + internal int IsAlias; + internal short BitField; + internal short LinkCollection; + internal short LinkUsage; + internal short LinkUsagePage; + internal int IsRange; + internal int IsStringRange; + internal int IsDesignatorRange; + internal int IsAbsolute; + internal int HasNull; + internal byte Reserved; + internal short BitSize; + internal short ReportCount; + internal short Reserved2; + internal short Reserved3; + internal short Reserved4; + internal short Reserved5; + internal short Reserved6; + internal int LogicalMin; + internal int LogicalMax; + internal int PhysicalMin; + internal int PhysicalMax; + internal short UsageMin; + internal short UsageMax; + internal short StringMin; + internal short StringMax; + internal short DesignatorMin; + internal short DesignatorMax; + internal short DataIndexMin; + internal short DataIndexMax; + } + + [DllImport("hid.dll")] + static internal extern bool HidD_FlushQueue(IntPtr hidDeviceObject); [DllImport("hid.dll")] static internal extern bool HidD_FlushQueue(SafeFileHandle hidDeviceObject); - [DllImport("hid.dll")] - static internal extern bool HidD_GetAttributes(IntPtr hidDeviceObject, ref HIDD_ATTRIBUTES attributes); + [DllImport("hid.dll")] + static internal extern bool HidD_GetAttributes(IntPtr hidDeviceObject, ref HIDD_ATTRIBUTES attributes); - [DllImport("hid.dll")] - static internal extern bool HidD_GetFeature(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); + [DllImport("hid.dll")] + static internal extern bool HidD_GetFeature(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); [DllImport("hid.dll", SetLastError = true)] internal static extern Boolean HidD_GetInputReport(SafeFileHandle HidDeviceObject, Byte[] lpReportBuffer, Int32 ReportBufferLength); - [DllImport("hid.dll")] - static internal extern void HidD_GetHidGuid(ref Guid hidGuid); + [DllImport("hid.dll")] + static internal extern void HidD_GetHidGuid(ref Guid hidGuid); - [DllImport("hid.dll")] - static internal extern bool HidD_GetNumInputBuffers(IntPtr hidDeviceObject, ref int numberBuffers); + [DllImport("hid.dll")] + static internal extern bool HidD_GetNumInputBuffers(IntPtr hidDeviceObject, ref int numberBuffers); - [DllImport("hid.dll")] - static internal extern bool HidD_GetPreparsedData(IntPtr hidDeviceObject, ref IntPtr preparsedData); + [DllImport("hid.dll")] + static internal extern bool HidD_GetPreparsedData(IntPtr hidDeviceObject, ref IntPtr preparsedData); - [DllImport("hid.dll")] - static internal extern bool HidD_FreePreparsedData(IntPtr preparsedData); + [DllImport("hid.dll")] + static internal extern bool HidD_FreePreparsedData(IntPtr preparsedData); - [DllImport("hid.dll")] + [DllImport("hid.dll")] static internal extern bool HidD_SetFeature(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); [DllImport("hid.dll")] static internal extern bool HidD_SetFeature(SafeFileHandle hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); - [DllImport("hid.dll")] - static internal extern bool HidD_SetNumInputBuffers(IntPtr hidDeviceObject, int numberBuffers); + [DllImport("hid.dll")] + static internal extern bool HidD_SetNumInputBuffers(IntPtr hidDeviceObject, int numberBuffers); [DllImport("hid.dll")] static internal extern bool HidD_SetOutputReport(IntPtr hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); @@ -385,13 +498,18 @@ internal struct HIDP_VALUE_CAPS [DllImport("hid.dll", SetLastError = true)] static internal extern bool HidD_SetOutputReport(SafeFileHandle hidDeviceObject, byte[] lpReportBuffer, int reportBufferLength); - [DllImport("hid.dll")] - static internal extern int HidP_GetCaps(IntPtr preparsedData, ref HIDP_CAPS capabilities); + [DllImport("hid.dll")] + static internal extern int HidP_GetCaps(IntPtr preparsedData, ref HIDP_CAPS capabilities); - [DllImport("hid.dll")] - static internal extern int HidP_GetValueCaps(short reportType, ref byte valueCaps, ref short valueCapsLength, IntPtr preparsedData); + [DllImport("hid.dll")] + static internal extern int HidP_GetValueCaps(short reportType, ref byte valueCaps, ref short valueCapsLength, IntPtr preparsedData); +#if WIN64 [DllImport("hid.dll")] static internal extern bool HidD_GetSerialNumberString(IntPtr HidDeviceObject, byte[] Buffer, ulong BufferLength); +#else + [DllImport("hid.dll")] + static internal extern bool HidD_GetSerialNumberString(IntPtr HidDeviceObject, byte[] Buffer, uint BufferLength); +#endif } } diff --git a/DS4Windows/LogItem.cs b/DS4Windows/LogItem.cs new file mode 100644 index 0000000000..1f3f7e0324 --- /dev/null +++ b/DS4Windows/LogItem.cs @@ -0,0 +1,44 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS4WinWPF +{ + public class LogItem + { + private DateTime datetime; + private string message; + private bool warning; + + public DateTime Datetime { get => datetime; set => datetime = value; } + public string Message { get => message; set => message = value; } + public bool Warning { get => warning; set => warning = value; } + public string Color + { + get + { + return warning ? "Red" : "Black"; + } + } + } +} diff --git a/DS4Windows/LogWriter.cs b/DS4Windows/LogWriter.cs new file mode 100644 index 0000000000..6bfe948be7 --- /dev/null +++ b/DS4Windows/LogWriter.cs @@ -0,0 +1,55 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System.Collections.Generic; +using System.IO; + +namespace DS4WinWPF +{ + public class LogWriter + { + private string filename; + private List logCol; + + public LogWriter(string filename, List col) + { + this.filename = filename; + logCol = col; + } + + public void Process() + { + List outputLines = new List(); + foreach(LogItem item in logCol) + { + outputLines.Add($"{item.Datetime}: {item.Message}"); + } + + try + { + StreamWriter stream = new StreamWriter(filename); + foreach(string line in outputLines) + { + stream.WriteLine(line); + } + stream.Close(); + } + catch { } + } + } +} diff --git a/DS4Windows/LoggerHolder.cs b/DS4Windows/LoggerHolder.cs new file mode 100644 index 0000000000..a9b861c16a --- /dev/null +++ b/DS4Windows/LoggerHolder.cs @@ -0,0 +1,71 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using DS4Windows; +using NLog; +using NLog.Targets.Wrappers; + +namespace DS4WinWPF +{ + public class LoggerHolder + { + private Logger logger;// = LogManager.GetCurrentClassLogger(); + public Logger Logger { get => logger; } + private ReaderWriterLockSlim logLock = new ReaderWriterLockSlim(); + + public LoggerHolder(DS4Windows.ControlService service) + { + var configuration = LogManager.Configuration; + var wrapTarget = configuration.FindTargetByName("logfile") as WrapperTargetBase; + var fileTarget = wrapTarget.WrappedTarget as NLog.Targets.FileTarget; + fileTarget.FileName = $@"{DS4Windows.Global.appdatapath}\Logs\ds4windows_log.txt"; + fileTarget.ArchiveFileName = $@"{DS4Windows.Global.appdatapath}\Logs\ds4windows_log_{{#}}.txt"; + LogManager.Configuration = configuration; + LogManager.ReconfigExistingLoggers(); + + logger = LogManager.GetCurrentClassLogger(); + + service.Debug += WriteToLog; + DS4Windows.AppLogger.GuiLog += WriteToLog; + } + + private void WriteToLog(object sender, DS4Windows.DebugEventArgs e) + { + if (e.Temporary) + { + return; + } + + using WriteLocker locker = new WriteLocker(logLock); + if (!e.Warning) + { + logger.Info(e.Data); + } + else + { + logger.Warn(e.Data); + } + } + } +} diff --git a/DS4Windows/NLog.config b/DS4Windows/NLog.config new file mode 100644 index 0000000000..897152450a --- /dev/null +++ b/DS4Windows/NLog.config @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/DS4Windows/OneEuroFilter.cs b/DS4Windows/OneEuroFilter.cs new file mode 100644 index 0000000000..ba0e070f06 --- /dev/null +++ b/DS4Windows/OneEuroFilter.cs @@ -0,0 +1,105 @@ +using System; +using System.Collections.Generic; +using System.Text; +using System.Diagnostics; + +namespace Sensorit.Base +{ + public class OneEuroFilter + { + public OneEuroFilter(double minCutoff, double beta) + { + firstTime = true; + this.minCutoff = minCutoff; + this.beta = beta; + + xFilt = new LowpassFilter(); + dxFilt = new LowpassFilter(); + dcutoff = 1; + } + + protected bool firstTime; + protected double minCutoff; + protected double beta; + protected LowpassFilter xFilt; + protected LowpassFilter dxFilt; + protected double dcutoff; + + public double MinCutoff + { + get { return minCutoff; } + set { minCutoff = value; } + } + + public double Beta + { + get { return beta; } + set { beta = value; } + } + + public double Filter(double x, double rate) + { + double dx = firstTime ? 0 : (x - xFilt.Last()) * rate; + if (firstTime) + { + firstTime = false; + } + + var edx = dxFilt.Filter(dx, Alpha(rate, dcutoff)); + var cutoff = minCutoff + beta * Math.Abs(edx); + + return xFilt.Filter(x, Alpha(rate, cutoff)); + } + + protected double Alpha(double rate, double cutoff) + { + var tau = 1.0 / (2 * Math.PI * cutoff); + var te = 1.0 / rate; + return 1.0 / (1.0 + tau / te); + } + + public void Reset() + { + xFilt.Reset(); + dxFilt.Reset(); + } + } + + public class LowpassFilter + { + public LowpassFilter() + { + firstTime = true; + } + + protected bool firstTime; + protected double hatXPrev; + + public double Last() + { + return hatXPrev; + } + + public double Filter(double x, double alpha) + { + double hatX = 0; + if (firstTime) + { + firstTime = false; + hatX = x; + } + else + hatX = alpha * x + (1 - alpha) * hatXPrev; + + hatXPrev = hatX; + + return hatX; + } + + public void Reset() + { + firstTime = true; + hatXPrev = 0.0; + } + } +} diff --git a/DS4Windows/ProfileEntity.cs b/DS4Windows/ProfileEntity.cs new file mode 100644 index 0000000000..3b0c00915a --- /dev/null +++ b/DS4Windows/ProfileEntity.cs @@ -0,0 +1,89 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace DS4WinWPF +{ + public class ProfileEntity + { + private string name; + public string Name + { + get => name; + set + { + if (name == value) return; + name = value; + NameChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler NameChanged; + public event EventHandler ProfileSaved; + public event EventHandler ProfileDeleted; + + public void DeleteFile() + { + if (!string.IsNullOrWhiteSpace(name)) + { + string filepath = DS4Windows.Global.appdatapath + @"\Profiles\" + name + ".xml"; + if (File.Exists(filepath)) + { + File.Delete(filepath); + ProfileDeleted?.Invoke(this, EventArgs.Empty); + } + } + } + + public void SaveProfile(int deviceNum) + { + if (!string.IsNullOrWhiteSpace(name)) + { + DS4Windows.Global.SaveProfile(deviceNum, name); + DS4Windows.Global.CacheExtraProfileInfo(deviceNum); + } + } + + public void FireSaved() + { + ProfileSaved?.Invoke(this, EventArgs.Empty); + } + + public void RenameProfile(string newProfileName) + { + string oldFilePath = Path.Combine(DS4Windows.Global.appdatapath, + "Profiles", $"{name}.xml"); + + string newFilePath = Path.Combine(DS4Windows.Global.appdatapath, + "Profiles", $"{newProfileName}.xml"); + + if (File.Exists(oldFilePath) && !File.Exists(newFilePath)) + { + File.Move(oldFilePath, newFilePath); + // Send NameChanged event so controls get updated with new name + Name = newProfileName; + } + } + } +} diff --git a/DS4Windows/ProfileList.cs b/DS4Windows/ProfileList.cs new file mode 100644 index 0000000000..7a6adddbc3 --- /dev/null +++ b/DS4Windows/ProfileList.cs @@ -0,0 +1,92 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.IO; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using System.Windows.Data; + +namespace DS4WinWPF +{ + public class ProfileList + { + private object _proLockobj = new object(); + private ObservableCollection profileListCol = + new ObservableCollection(); + + public ObservableCollection ProfileListCol { get => profileListCol; set => profileListCol = value; } + + public ProfileList() + { + BindingOperations.EnableCollectionSynchronization(profileListCol, _proLockobj); + } + + public void Refresh() + { + profileListCol.Clear(); + string[] profiles = Directory.GetFiles(DS4Windows.Global.appdatapath + @"\Profiles\"); + foreach (string s in profiles) + { + if (s.EndsWith(".xml")) + { + ProfileEntity item = new ProfileEntity() + { + Name = Path.GetFileNameWithoutExtension(s) + }; + + profileListCol.Add(item); + } + } + } + + public void AddProfileSort(string profilename) + { + int idx = 0; + bool inserted = false; + foreach (ProfileEntity entry in profileListCol) + { + if (entry.Name.CompareTo(profilename) > 0) + { + profileListCol.Insert(idx, new ProfileEntity() { Name = profilename }); + inserted = true; + break; + } + idx++; + } + + if (!inserted) + { + profileListCol.Add(new ProfileEntity() { Name = profilename }); + } + } + + public void RemoveProfile(string profile) + { + var selectedEntity = profileListCol.SingleOrDefault(x => x.Name == profile); + if (selectedEntity != null) + { + int selectedIndex = profileListCol.IndexOf(selectedEntity); + profileListCol.RemoveAt(selectedIndex); + } + } + } +} diff --git a/DS4Windows/Program.cs b/DS4Windows/Program.cs deleted file mode 100644 index b03b573c11..0000000000 --- a/DS4Windows/Program.cs +++ /dev/null @@ -1,159 +0,0 @@ -using System; -using System.Windows.Forms; -using System.Threading; -using System.Runtime.InteropServices; -using System.Diagnostics; -using System.ComponentModel; -using System.Globalization; - -namespace DS4Windows -{ - static class Program - { - [DllImport("user32.dll")] - [return: MarshalAs(UnmanagedType.Bool)] - static extern bool SetForegroundWindow(IntPtr hWnd); - - [DllImport("user32.dll")] - private static extern IntPtr GetForegroundWindow(); - // Add "global\" in front of the EventName, then only one instance is allowed on the - // whole system, including other users. But the application can not be brought - // into view, of course. - private static String SingleAppComEventName = "{a52b5b20-d9ee-4f32-8518-307fa14aa0c6}"; - static Mutex mutex = new Mutex(true, "{FI329DM2-DS4W-J2K2-HYES-92H21B3WJARG}"); - private static BackgroundWorker singleAppComThread = null; - private static EventWaitHandle threadComEvent = null; - public static ControlService rootHub; - - /// - /// The main entry point for the application. - /// - [STAThread] - static void Main(string[] args) - { - //Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo("he"); - for (int i = 0; i < args.Length; i++) - { - string s = args[i]; - if (s == "driverinstall" || s == "-driverinstall") - { - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new WelcomeDialog()); - return; - } - else if (s == "re-enabledevice" || s == "-re-enabledevice") - { - try - { - i++; - string deviceInstanceId = args[i]; - DS4Devices.reEnableDevice(deviceInstanceId); - Environment.ExitCode = 0; - return; - } - catch (Exception) - { - Environment.ExitCode = Marshal.GetLastWin32Error(); - return; - } - } - } - System.Runtime.GCSettings.LatencyMode = System.Runtime.GCLatencyMode.LowLatency; - try - { - Process.GetCurrentProcess().PriorityClass = System.Diagnostics.ProcessPriorityClass.High; - } - catch - { - // Ignore problems raising the priority. - } - try - { - // another instance is already running if OpenExsting succeeds. - threadComEvent = EventWaitHandle.OpenExisting(SingleAppComEventName); - threadComEvent.Set(); // signal the other instance. - threadComEvent.Close(); - return; // return immediatly. - } - catch { /* don't care about errors */ } - // Create the Event handle - threadComEvent = new EventWaitHandle(false, EventResetMode.AutoReset, SingleAppComEventName); - CreateInterAppComThread(); - - if (mutex.WaitOne(TimeSpan.Zero, true)) - { - rootHub = new ControlService(); - Application.EnableVisualStyles(); - Application.SetCompatibleTextRenderingDefault(false); - Application.Run(new DS4Form(args)); - mutex.ReleaseMutex(); - } - - // End the communication thread. - singleAppComThread.CancelAsync(); - while (singleAppComThread.IsBusy) - Thread.Sleep(50); - threadComEvent.Close(); - } - - static private void CreateInterAppComThread() - { - singleAppComThread = new BackgroundWorker(); - singleAppComThread.WorkerReportsProgress = false; - singleAppComThread.WorkerSupportsCancellation = true; - singleAppComThread.DoWork += new DoWorkEventHandler(singleAppComThread_DoWork); - singleAppComThread.RunWorkerAsync(); - } - - static private void singleAppComThread_DoWork(object sender, DoWorkEventArgs e) - { - BackgroundWorker worker = sender as BackgroundWorker; - WaitHandle[] waitHandles = new WaitHandle[] { threadComEvent }; - - while (!worker.CancellationPending) - { - // check every second for a signal. - if (WaitHandle.WaitAny(waitHandles, 1000) == 0) - { - // The user tried to start another instance. We can't allow that, - // so bring the other instance back into view and enable that one. - // That form is created in another thread, so we need some thread sync magic. - if (Application.OpenForms.Count > 0) - { - Form mainForm = Application.OpenForms[0]; - mainForm.Invoke(new SetFormVisableDelegate(ThreadFormVisable), mainForm); - } - } - } - } - - - /// - /// When this method is called using a Invoke then this runs in the thread - /// that created the form, which is nice. - /// - /// - private delegate void SetFormVisableDelegate(Form frm); - static private void ThreadFormVisable(Form frm) - { - if (frm != null) - { - if (frm is DS4Form) - { - // display the form and bring to foreground. - frm.WindowState = FormWindowState.Normal; - frm.Focus(); - } - else - { - WinProgs wp = (WinProgs)frm; - wp.form.mAllowVisible = true; - wp.ShowMainWindow(); - SetForegroundWindow(wp.form.Handle); - } - } - SetForegroundWindow(frm.Handle); - } - } -} \ No newline at end of file diff --git a/DS4Windows/Properties/AssemblyInfo.cs b/DS4Windows/Properties/AssemblyInfo.cs index 89532d7d85..98a8e29c98 100644 --- a/DS4Windows/Properties/AssemblyInfo.cs +++ b/DS4Windows/Properties/AssemblyInfo.cs @@ -1,36 +1,11 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; +using System.Windows; -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("DS4Windows")] -[assembly: AssemblyDescription("Sony DualShock 4 to Microsoft Xinput controller mapper")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("DS4Windows")] -[assembly: AssemblyCopyright("Copyright © Scarlet.Crush Productions 2012, 2013; InhexSTER, HecticSeptic, electrobrains 2013, 2014; Jays2Kings 2013, 2014, 2015")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("a52b5b20-d9ee-4f32-8518-307fa14aa0c6")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.4.52")] -[assembly: AssemblyFileVersion("1.4.52")] +[assembly: ThemeInfo( + ResourceDictionaryLocation.None, //where theme specific resource dictionaries are located + //(used if a resource is not found in the page, + // or application resource dictionaries) + ResourceDictionaryLocation.SourceAssembly //where the generic resource dictionary is located + //(used if a resource is not found in the page, + // app, or any theme specific resource dictionaries) +)] diff --git a/DS4Windows/Properties/Resources.Designer.cs b/DS4Windows/Properties/Resources.Designer.cs index 8c205c4354..dc3ac6f4bc 100644 --- a/DS4Windows/Properties/Resources.Designer.cs +++ b/DS4Windows/Properties/Resources.Designer.cs @@ -8,7 +8,7 @@ // //------------------------------------------------------------------------------ -namespace DS4Windows.Properties { +namespace DS4WinWPF.Properties { using System; @@ -19,10 +19,10 @@ namespace DS4Windows.Properties { // class via a tool like ResGen or Visual Studio. // To add or remove a member, edit your .ResX file then rerun ResGen // with the /str option, or rebuild your VS project. - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - internal class Resources { + public class Resources { private static global::System.Resources.ResourceManager resourceMan; @@ -36,10 +36,10 @@ internal Resources() { /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Resources.ResourceManager ResourceManager { + public static global::System.Resources.ResourceManager ResourceManager { get { if (object.ReferenceEquals(resourceMan, null)) { - global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4Windows.Properties.Resources", typeof(Resources).Assembly); + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4WinWPF.Properties.Resources", typeof(Resources).Assembly); resourceMan = temp; } return resourceMan; @@ -51,7 +51,7 @@ internal Resources() { /// resource lookups using this strongly typed resource class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] - internal static global::System.Globalization.CultureInfo Culture { + public static global::System.Globalization.CultureInfo Culture { get { return resourceCulture; } @@ -60,50 +60,10 @@ internal Resources() { } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _360_highlight { - get { - object obj = ResourceManager.GetObject("_360_highlight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _360_map { - get { - object obj = ResourceManager.GetObject("_360_map", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap _checked { - get { - object obj = ResourceManager.GetObject("_checked", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap A { - get { - object obj = ResourceManager.GetObject("A", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Name of this action already exists. /// - internal static string ActionExists { + public static string ActionExists { get { return ResourceManager.GetString("ActionExists", resourceCulture); } @@ -112,7 +72,7 @@ internal static string ActionExists { /// /// Looks up a localized string similar to Adding to list.... /// - internal static string AddingToList { + public static string AddingToList { get { return ResourceManager.GetString("AddingToList", resourceCulture); } @@ -121,7 +81,7 @@ internal static string AddingToList { /// /// Looks up a localized string similar to Add Programs. /// - internal static string AddPrograms { + public static string AddPrograms { get { return ResourceManager.GetString("AddPrograms", resourceCulture); } @@ -130,7 +90,7 @@ internal static string AddPrograms { /// /// Looks up a localized string similar to A location must be picked to continue. /// - internal static string ALocactionNeeded { + public static string ALocactionNeeded { get { return ResourceManager.GetString("ALocactionNeeded", resourceCulture); } @@ -139,7 +99,7 @@ internal static string ALocactionNeeded { /// /// Looks up a localized string similar to Always Rainbow Mode. /// - internal static string AlwaysRainbow { + public static string AlwaysRainbow { get { return ResourceManager.GetString("AlwaysRainbow", resourceCulture); } @@ -148,36 +108,25 @@ internal static string AlwaysRainbow { /// /// Looks up a localized string similar to Assign to Controller *number*. /// - internal static string AssignProfile { + public static string AssignProfile { get { return ResourceManager.GetString("AssignProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). /// - internal static System.Drawing.Bitmap B { + public static string AutoProfilePathAndWindowTitleEditTip { get { - object obj = ResourceManager.GetObject("B", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap BACK { - get { - object obj = ResourceManager.GetObject("BACK", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("AutoProfilePathAndWindowTitleEditTip", resourceCulture); } } /// /// Looks up a localized string similar to Battery: *number*%. /// - internal static string Battery { + public static string Battery { get { return ResourceManager.GetString("Battery", resourceCulture); } @@ -186,7 +135,7 @@ internal static string Battery { /// /// Looks up a localized string similar to Best used with right side as a mouse function. /// - internal static string BestUsedRightSide { + public static string BestUsedRightSide { get { return ResourceManager.GetString("BestUsedRightSide", resourceCulture); } @@ -195,26 +144,25 @@ internal static string BestUsedRightSide { /// /// Looks up a localized string similar to Browse.... /// - internal static string Browse { + public static string Browse { get { return ResourceManager.GetString("Browse", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Determines the poll rate used for the DS4 hardware when connected via Bluetooth. (Applies on profile save). /// - internal static System.Drawing.Bitmap BT { + public static string BTPollRate { get { - object obj = ResourceManager.GetObject("BT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("BTPollRate", resourceCulture); } } /// /// Looks up a localized string similar to Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows". /// - internal static string CannotMoveFiles { + public static string CannotMoveFiles { get { return ResourceManager.GetString("CannotMoveFiles", resourceCulture); } @@ -223,7 +171,7 @@ internal static string CannotMoveFiles { /// /// Looks up a localized string similar to Cannot write at current location. Copy Settings to appdata?. /// - internal static string CannotWriteHere { + public static string CannotWriteHere { get { return ResourceManager.GetString("CannotWriteHere", resourceCulture); } @@ -232,7 +180,7 @@ internal static string CannotWriteHere { /// /// Looks up a localized string similar to Charge the battery. /// - internal static string ChargeController { + public static string ChargeController { get { return ResourceManager.GetString("ChargeController", resourceCulture); } @@ -241,7 +189,7 @@ internal static string ChargeController { /// /// Looks up a localized string similar to Charged. /// - internal static string Charged { + public static string Charged { get { return ResourceManager.GetString("Charged", resourceCulture); } @@ -250,7 +198,7 @@ internal static string Charged { /// /// Looks up a localized string similar to Charging: *number*%. /// - internal static string Charging { + public static string Charging { get { return ResourceManager.GetString("Charging", resourceCulture); } @@ -259,25 +207,34 @@ internal static string Charging { /// /// Looks up a localized string similar to Check Battery. /// - internal static string CheckBattery { + public static string CheckBattery { get { return ResourceManager.GetString("CheckBattery", resourceCulture); } } + /// + /// Looks up a localized string similar to This will disconnect all your connected controllers. Proceed?. + /// + public static string CloseConfirm { + get { + return ResourceManager.GetString("CloseConfirm", resourceCulture); + } + } + /// /// Looks up a localized string similar to Close DS4Windows?. /// - internal static string CloseDS4W { + public static string CloseDS4W { get { return ResourceManager.GetString("CloseDS4W", resourceCulture); } } /// - /// Looks up a localized string similar to Close DS4Windows via the notification icon. + /// Looks up a localized string similar to Closing main window minimizes app. Quitting app will be done via the notification icon. /// - internal static string CloseMinimize { + public static string CloseMinimize { get { return ResourceManager.GetString("CloseMinimize", resourceCulture); } @@ -286,25 +243,34 @@ internal static string CloseMinimize { /// /// Looks up a localized string similar to Color. /// - internal static string Color { + public static string Color { get { return ResourceManager.GetString("Color", resourceCulture); } } /// - /// Looks up a localized string similar to Color by Battey %. + /// Looks up a localized string similar to Color by Battery %. /// - internal static string ColorByBattery { + public static string ColorByBattery { get { return ResourceManager.GetString("ColorByBattery", resourceCulture); } } + /// + /// Looks up a localized string similar to Confirm.... + /// + public static string Confirm { + get { + return ResourceManager.GetString("Confirm", resourceCulture); + } + } + /// /// Looks up a localized string similar to Connecting.... /// - internal static string Connecting { + public static string Connecting { get { return ResourceManager.GetString("Connecting", resourceCulture); } @@ -313,7 +279,7 @@ internal static string Connecting { /// /// Looks up a localized string similar to Edit Profile for Controller *number*. /// - internal static string ContextEdit { + public static string ContextEdit { get { return ResourceManager.GetString("ContextEdit", resourceCulture); } @@ -322,7 +288,7 @@ internal static string ContextEdit { /// /// Looks up a localized string similar to Make Profile for Controller *number*. /// - internal static string ContextNew { + public static string ContextNew { get { return ResourceManager.GetString("ContextNew", resourceCulture); } @@ -331,26 +297,16 @@ internal static string ContextNew { /// /// Looks up a localized string similar to Controller *Mac address* was removed or lost connection. /// - internal static string ControllerWasRemoved { + public static string ControllerWasRemoved { get { return ResourceManager.GetString("ControllerWasRemoved", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap copy { - get { - object obj = ResourceManager.GetObject("copy", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Copy complete, please relaunch DS4Windows and remove settings from Program Directory. /// - internal static string CopyComplete { + public static string CopyComplete { get { return ResourceManager.GetString("CopyComplete", resourceCulture); } @@ -359,7 +315,7 @@ internal static string CopyComplete { /// /// Looks up a localized string similar to Click to copy the full color. /// - internal static string CopyFullColor { + public static string CopyFullColor { get { return ResourceManager.GetString("CopyFullColor", resourceCulture); } @@ -368,7 +324,7 @@ internal static string CopyFullColor { /// /// Looks up a localized string similar to Warning: Could not open DS4 *Mac address* exclusively.. /// - internal static string CouldNotOpenDS4 { + public static string CouldNotOpenDS4 { get { return ResourceManager.GetString("CouldNotOpenDS4", resourceCulture); } @@ -377,7 +333,7 @@ internal static string CouldNotOpenDS4 { /// /// Looks up a localized string similar to day. /// - internal static string Day { + public static string Day { get { return ResourceManager.GetString("Day", resourceCulture); } @@ -386,53 +342,34 @@ internal static string Day { /// /// Looks up a localized string similar to days. /// - internal static string Days { + public static string Days { get { return ResourceManager.GetString("Days", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap delete { - get { - object obj = ResourceManager.GetObject("delete", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Delete Profile?. /// - internal static string DeleteProfile { + public static string DeleteProfile { get { return ResourceManager.GetString("DeleteProfile", resourceCulture); } } /// - /// Looks up a localized string similar to Dim by Battey %. + /// Looks up a localized string similar to Dim by Battery %. /// - internal static string DimByBattery { + public static string DimByBattery { get { return ResourceManager.GetString("DimByBattery", resourceCulture); } } - /// - /// Looks up a localized string similar to Turn off X360 input and only use the DS4's native input, hide ds4 must be off (Wired Only). - /// - internal static string DinputOnly { - get { - return ResourceManager.GetString("DinputOnly", resourceCulture); - } - } - /// /// Looks up a localized string similar to Disconnect BT. /// - internal static string DisconnectBT { + public static string DisconnectBT { get { return ResourceManager.GetString("DisconnectBT", resourceCulture); } @@ -441,26 +378,16 @@ internal static string DisconnectBT { /// /// Looks up a localized string similar to Disconnected. /// - internal static string Disconnected { + public static string Disconnected { get { return ResourceManager.GetString("Disconnected", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DOWN { - get { - object obj = ResourceManager.GetObject("DOWN", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Downloading *number*%. /// - internal static string Downloading { + public static string Downloading { get { return ResourceManager.GetString("Downloading", resourceCulture); } @@ -469,7 +396,7 @@ internal static string Downloading { /// /// Looks up a localized string similar to Download Version *number* now?. /// - internal static string DownloadVersion { + public static string DownloadVersion { get { return ResourceManager.GetString("DownloadVersion", resourceCulture); } @@ -478,7 +405,7 @@ internal static string DownloadVersion { /// /// Looks up a localized string similar to Down. /// - internal static string DownText { + public static string DownText { get { return ResourceManager.GetString("DownText", resourceCulture); } @@ -487,257 +414,17 @@ internal static string DownText { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4 { + public static System.Drawing.Icon DS4 { get { object obj = ResourceManager.GetObject("DS4", resourceCulture); return ((System.Drawing.Icon)(obj)); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config { - get { - object obj = ResourceManager.GetObject("DS4_Config", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Circle { - get { - object obj = ResourceManager.GetObject("DS4_Config_Circle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Cross { - get { - object obj = ResourceManager.GetObject("DS4_Config_Cross", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Down { - get { - object obj = ResourceManager.GetObject("DS4_Config_Down", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_L1 { - get { - object obj = ResourceManager.GetObject("DS4_Config_L1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_L2 { - get { - object obj = ResourceManager.GetObject("DS4_Config_L2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Left { - get { - object obj = ResourceManager.GetObject("DS4_Config_Left", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_LS { - get { - object obj = ResourceManager.GetObject("DS4_Config_LS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Options { - get { - object obj = ResourceManager.GetObject("DS4_Config_Options", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_PS { - get { - object obj = ResourceManager.GetObject("DS4_Config_PS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_R1 { - get { - object obj = ResourceManager.GetObject("DS4_Config_R1", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_R2 { - get { - object obj = ResourceManager.GetObject("DS4_Config_R2", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Right { - get { - object obj = ResourceManager.GetObject("DS4_Config_Right", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_RS { - get { - object obj = ResourceManager.GetObject("DS4_Config_RS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Share { - get { - object obj = ResourceManager.GetObject("DS4_Config_Share", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Square { - get { - object obj = ResourceManager.GetObject("DS4_Config_Square", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchLeft { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchLeft", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchMulti { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchMulti", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchRight { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchRight", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_TouchUpper { - get { - object obj = ResourceManager.GetObject("DS4_Config_TouchUpper", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Triangle { - get { - object obj = ResourceManager.GetObject("DS4_Config_Triangle", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Config_Up { - get { - object obj = ResourceManager.GetObject("DS4_Config_Up", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_Controller { - get { - object obj = ResourceManager.GetObject("DS4_Controller", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap DS4_lightbar { - get { - object obj = ResourceManager.GetObject("DS4_lightbar", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to DS4Windows Update Available!. /// - internal static string DS4Update { + public static string DS4Update { get { return ResourceManager.GetString("DS4Update", resourceCulture); } @@ -746,7 +433,7 @@ internal static string DS4Update { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4W { + public static System.Drawing.Icon DS4W { get { object obj = ResourceManager.GetObject("DS4W", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -756,7 +443,7 @@ internal static System.Drawing.Icon DS4W { /// /// Looks up a localized resource of type System.Drawing.Icon similar to (Icon). /// - internal static System.Drawing.Icon DS4W___White { + public static System.Drawing.Icon DS4W___White { get { object obj = ResourceManager.GetObject("DS4W___White", resourceCulture); return ((System.Drawing.Icon)(obj)); @@ -766,54 +453,34 @@ internal static System.Drawing.Icon DS4W___White { /// /// Looks up a localized string similar to DS4Windows cannot edit settings here, This will now close. /// - internal static string DS4WindowsCannotEditHere { + public static string DS4WindowsCannotEditHere { get { return ResourceManager.GetString("DS4WindowsCannotEditHere", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap edit { - get { - object obj = ResourceManager.GetObject("edit", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Edit. /// - internal static string EditProfile { + public static string EditProfile { get { return ResourceManager.GetString("EditProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.IO.UnmanagedMemoryStream similar to System.IO.MemoryStream. - /// - internal static System.IO.UnmanagedMemoryStream EE { - get { - return ResourceManager.GetStream("EE", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Allow touchpad mouse function to get toggled with PS + Touchpad Click.. /// - internal static System.Drawing.Bitmap export { + public static string EnableTouchToggle { get { - object obj = ResourceManager.GetObject("export", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("EnableTouchToggle", resourceCulture); } } /// /// Looks up a localized string similar to Fall Back. /// - internal static string FallBack { + public static string FallBack { get { return ResourceManager.GetString("FallBack", resourceCulture); } @@ -822,7 +489,7 @@ internal static string FallBack { /// /// Looks up a localized string similar to Fall Back to *button*. /// - internal static string FallBackTo { + public static string FallBackTo { get { return ResourceManager.GetString("FallBackTo", resourceCulture); } @@ -831,7 +498,7 @@ internal static string FallBackTo { /// /// Looks up a localized string similar to 5th Mouse Button Down. /// - internal static string FifthMouseDown { + public static string FifthMouseDown { get { return ResourceManager.GetString("FifthMouseDown", resourceCulture); } @@ -840,7 +507,7 @@ internal static string FifthMouseDown { /// /// Looks up a localized string similar to 5th Mouse Button Up. /// - internal static string FifthMouseUp { + public static string FifthMouseUp { get { return ResourceManager.GetString("FifthMouseUp", resourceCulture); } @@ -849,7 +516,7 @@ internal static string FifthMouseUp { /// /// Looks up a localized string similar to Click to change flash color. Black = default color. /// - internal static string FlashAtTip { + public static string FlashAtTip { get { return ResourceManager.GetString("FlashAtTip", resourceCulture); } @@ -858,7 +525,7 @@ internal static string FlashAtTip { /// /// Looks up a localized string similar to Flush HID. /// - internal static string FlushHID { + public static string FlushHID { get { return ResourceManager.GetString("FlushHID", resourceCulture); } @@ -867,7 +534,7 @@ internal static string FlushHID { /// /// Looks up a localized string similar to Flush HID Queue after each reading. /// - internal static string FlushHIDTip { + public static string FlushHIDTip { get { return ResourceManager.GetString("FlushHIDTip", resourceCulture); } @@ -876,7 +543,7 @@ internal static string FlushHIDTip { /// /// Looks up a localized string similar to Found Controller:. /// - internal static string FoundController { + public static string FoundController { get { return ResourceManager.GetString("FoundController", resourceCulture); } @@ -885,7 +552,7 @@ internal static string FoundController { /// /// Looks up a localized string similar to 4th Mouse Button Down. /// - internal static string FourthMouseDown { + public static string FourthMouseDown { get { return ResourceManager.GetString("FourthMouseDown", resourceCulture); } @@ -894,7 +561,7 @@ internal static string FourthMouseDown { /// /// Looks up a localized string similar to 4th Mouse Button Up. /// - internal static string FourthMouseUp { + public static string FourthMouseUp { get { return ResourceManager.GetString("FourthMouseUp", resourceCulture); } @@ -903,7 +570,7 @@ internal static string FourthMouseUp { /// /// Looks up a localized string similar to Full. /// - internal static string Full { + public static string Full { get { return ResourceManager.GetString("Full", resourceCulture); } @@ -912,16 +579,25 @@ internal static string Full { /// /// Looks up a localized string similar to Click to see readout of Sixaxis Gyro. /// - internal static string GyroReadout { + public static string GyroReadout { get { return ResourceManager.GetString("GyroReadout", resourceCulture); } } + /// + /// Looks up a localized string similar to Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active.. + /// + public static string GyroTriggerBehavior { + get { + return ResourceManager.GetString("GyroTriggerBehavior", resourceCulture); + } + } + /// /// Looks up a localized string similar to GyroX, Left and Right Tilt. /// - internal static string GyroX { + public static string GyroX { get { return ResourceManager.GetString("GyroX", resourceCulture); } @@ -930,7 +606,7 @@ internal static string GyroX { /// /// Looks up a localized string similar to GyroY, Forward and Back Tilt. /// - internal static string GyroY { + public static string GyroY { get { return ResourceManager.GetString("GyroY", resourceCulture); } @@ -939,7 +615,7 @@ internal static string GyroY { /// /// Looks up a localized string similar to GyroZ, Up and Down Tilt. /// - internal static string GyroZ { + public static string GyroZ { get { return ResourceManager.GetString("GyroZ", resourceCulture); } @@ -948,7 +624,7 @@ internal static string GyroZ { /// /// Looks up a localized string similar to hour. /// - internal static string Hour { + public static string Hour { get { return ResourceManager.GetString("Hour", resourceCulture); } @@ -957,7 +633,7 @@ internal static string Hour { /// /// Looks up a localized string similar to hours. /// - internal static string Hours { + public static string Hours { get { return ResourceManager.GetString("Hours", resourceCulture); } @@ -966,7 +642,7 @@ internal static string Hours { /// /// Looks up a localized string similar to Hover over items to see description or more about. /// - internal static string HoverOverItems { + public static string HoverOverItems { get { return ResourceManager.GetString("HoverOverItems", resourceCulture); } @@ -975,26 +651,16 @@ internal static string HoverOverItems { /// /// Looks up a localized string similar to If removing DS4Windows, You can delete the settings following the profile folder link. /// - internal static string IfRemovingDS4Windows { + public static string IfRemovingDS4Windows { get { return ResourceManager.GetString("IfRemovingDS4Windows", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap import { - get { - object obj = ResourceManager.GetObject("import", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to Input Delay: *number*ms. + /// Looks up a localized string similar to Input Delay: {0:0.##} ms. /// - internal static string InputDelay { + public static string InputDelay { get { return ResourceManager.GetString("InputDelay", resourceCulture); } @@ -1003,7 +669,7 @@ internal static string InputDelay { /// /// Looks up a localized string similar to Install Complete. /// - internal static string InstallComplete { + public static string InstallComplete { get { return ResourceManager.GetString("InstallComplete", resourceCulture); } @@ -1012,7 +678,7 @@ internal static string InstallComplete { /// /// Looks up a localized string similar to Install Drivers here. /// - internal static string InstallDriver { + public static string InstallDriver { get { return ResourceManager.GetString("InstallDriver", resourceCulture); } @@ -1021,7 +687,7 @@ internal static string InstallDriver { /// /// Looks up a localized string similar to Install Failed, Please Retry. /// - internal static string InstallFailed { + public static string InstallFailed { get { return ResourceManager.GetString("InstallFailed", resourceCulture); } @@ -1030,7 +696,7 @@ internal static string InstallFailed { /// /// Looks up a localized string similar to Installing.... /// - internal static string Installing { + public static string Installing { get { return ResourceManager.GetString("Installing", resourceCulture); } @@ -1039,7 +705,7 @@ internal static string Installing { /// /// Looks up a localized string similar to Use Sixaxis to help calculate touchpad movement. /// - internal static string Jitter { + public static string Jitter { get { return ResourceManager.GetString("Jitter", resourceCulture); } @@ -1048,73 +714,52 @@ internal static string Jitter { /// /// Looks up a localized string similar to Keep this window size after closing. /// - internal static string KeepThisSize { + public static string KeepThisSize { get { return ResourceManager.GetString("KeepThisSize", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number*'s latency now under 10ms. - /// - internal static string LatencyNotOverTen { - get { - return ResourceManager.GetString("LatencyNotOverTen", resourceCulture); - } - } - - /// - /// Looks up a localized string similar to Controller *number*'s latency over 10ms. + /// Looks up a localized string similar to Language pack change will take effect after DS4Windows application is restarted.. /// - internal static string LatencyOverTen { + public static string LanguagePackApplyRestartRequired { get { - return ResourceManager.GetString("LatencyOverTen", resourceCulture); + return ResourceManager.GetString("LanguagePackApplyRestartRequired", resourceCulture); } } /// - /// Looks up a localized string similar to Launch *program*. - /// - internal static string LaunchProgram { - get { - return ResourceManager.GetString("LaunchProgram", resourceCulture); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Controller *number*'s latency now under 10ms. /// - internal static System.Drawing.Bitmap LB { + public static string LatencyNotOverTen { get { - object obj = ResourceManager.GetObject("LB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LatencyNotOverTen", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Controller {0}'s latency over 10ms ({1} ms). /// - internal static System.Drawing.Bitmap LEFT { + public static string LatencyOverTen { get { - object obj = ResourceManager.GetObject("LEFT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LatencyOverTen", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Launch *program*. /// - internal static System.Drawing.Bitmap left_touch { + public static string LaunchProgram { get { - object obj = ResourceManager.GetObject("left_touch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("LaunchProgram", resourceCulture); } } /// - /// Looks up a localized string similar to Also dim light by idle timeout if on. + /// Looks up a localized string similar to Also dim light by idle timeout if enabled when DS4 is fully charged. /// - internal static string LightByBatteryTip { + public static string LightByBatteryTip { get { return ResourceManager.GetString("LightByBatteryTip", resourceCulture); } @@ -1123,7 +768,7 @@ internal static string LightByBatteryTip { /// /// Looks up a localized string similar to Loading.... /// - internal static string Loading { + public static string Loading { get { return ResourceManager.GetString("Loading", resourceCulture); } @@ -1132,113 +777,88 @@ internal static string Loading { /// /// Looks up a localized string similar to Load *profile*. /// - internal static string LoadProfile { + public static string LoadProfile { get { return ResourceManager.GetString("LoadProfile", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap LS { - get { - object obj = ResourceManager.GetObject("LS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Macro. /// - internal static System.Drawing.Bitmap LSD { + public static string Macro { get { - object obj = ResourceManager.GetObject("LSD", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("Macro", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Keep the last key state when macro execution is completed (ie. if a key is left in down state then it is not automatically reset back to default state). /// - internal static System.Drawing.Bitmap LSL { + public static string MacroKeepKeyStateTip { get { - object obj = ResourceManager.GetObject("LSL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroKeepKeyStateTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Macro Recorded. /// - internal static System.Drawing.Bitmap LSR { + public static string MacroRecorded { get { - object obj = ResourceManager.GetObject("LSR", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRecorded", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Repeat a macro while the trigger key is held down. /// - internal static System.Drawing.Bitmap LSU { + public static string MacroRepeatTip { get { - object obj = ResourceManager.GetObject("LSU", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRepeatTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Run a macro on the trigger key release. /// - internal static System.Drawing.Bitmap LT { + public static string MacroRunOnReleaseTip { get { - object obj = ResourceManager.GetObject("LT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("MacroRunOnReleaseTip", resourceCulture); } } /// - /// Looks up a localized string similar to Macro. + /// Looks up a localized string similar to Use a scan code value of keyboard keys in a macro. /// - internal static string Macro { + public static string MacroScanCodeTip { get { - return ResourceManager.GetString("Macro", resourceCulture); + return ResourceManager.GetString("MacroScanCodeTip", resourceCulture); } } /// - /// Looks up a localized string similar to Macro Recorded. + /// Looks up a localized string similar to Run multiple macros in synchronized order if the same trigger has several macros (key down macro completed before key release macro is run). /// - internal static string MacroRecorded { + public static string MacroSynchronizedRunTip { get { - return ResourceManager.GetString("MacroRecorded", resourceCulture); + return ResourceManager.GetString("MacroSynchronizedRunTip", resourceCulture); } } /// /// Looks up a localized string similar to Make a New Profile. /// - internal static string MakeNewProfile { + public static string MakeNewProfile { get { return ResourceManager.GetString("MakeNewProfile", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap mouse { - get { - object obj = ResourceManager.GetObject("mouse", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Mutli-Action Button. /// - internal static string MultiAction { + public static string MultiAction { get { return ResourceManager.GetString("MultiAction", resourceCulture); } @@ -1247,7 +867,7 @@ internal static string MultiAction { /// /// Looks up a localized string similar to N/A. /// - internal static string NA { + public static string NA { get { return ResourceManager.GetString("NA", resourceCulture); } @@ -1256,45 +876,25 @@ internal static string NA { /// /// Looks up a localized string similar to New. /// - internal static string New { + public static string New { get { return ResourceManager.GetString("New", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap newprofile { - get { - object obj = ResourceManager.GetObject("newprofile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to No macro was recorded. /// - internal static string NoMacroRecorded { + public static string NoMacroRecorded { get { return ResourceManager.GetString("NoMacroRecorded", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap none { - get { - object obj = ResourceManager.GetObject("none", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to (none). /// - internal static string noneProfile { + public static string noneProfile { get { return ResourceManager.GetString("noneProfile", resourceCulture); } @@ -1303,7 +903,7 @@ internal static string noneProfile { /// /// Looks up a localized string similar to none. /// - internal static string NoneText { + public static string NoneText { get { return ResourceManager.GetString("NoneText", resourceCulture); } @@ -1312,16 +912,16 @@ internal static string NoneText { /// /// Looks up a localized string similar to No Profile Loaded. /// - internal static string NoProfileLoaded { + public static string NoProfileLoaded { get { return ResourceManager.GetString("NoProfileLoaded", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number* is not using a profile. + /// Looks up a localized string similar to Controller {0} is not using a profile. Battery level is {1}%. /// - internal static string NotUsingProfile { + public static string NotUsingProfile { get { return ResourceManager.GetString("NotUsingProfile", resourceCulture); } @@ -1330,7 +930,7 @@ internal static string NotUsingProfile { /// /// Looks up a localized string similar to Not valid. /// - internal static string NotValid { + public static string NotValid { get { return ResourceManager.GetString("NotValid", resourceCulture); } @@ -1339,7 +939,7 @@ internal static string NotValid { /// /// Looks up a localized string similar to Opening Installer. /// - internal static string OpeningInstaller { + public static string OpeningInstaller { get { return ResourceManager.GetString("OpeningInstaller", resourceCulture); } @@ -1348,35 +948,34 @@ internal static string OpeningInstaller { /// /// Looks up a localized string similar to Please Open ScpDriver.exe. /// - internal static string OpenScpDriver { + public static string OpenScpDriver { get { return ResourceManager.GetString("OpenScpDriver", resourceCulture); } } /// - /// Looks up a localized string similar to , other location files will be deleted. + /// Looks up a localized string similar to Enable OSC Server. Listen to port on all addresses.. /// - internal static string OtherFileLocation { + public static string OscServer { get { - return ResourceManager.GetString("OtherFileLocation", resourceCulture); + return ResourceManager.GetString("OscServer", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to , other location files will be deleted. /// - internal static System.Drawing.Bitmap Pairmode { + public static string OtherFileLocation { get { - object obj = ResourceManager.GetObject("Pairmode", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("OtherFileLocation", resourceCulture); } } /// - /// Looks up a localized string similar to Please Download the Updater now, and place it in the programs folder, then check for update again. + /// Looks up a localized string similar to Please Download the Updater now, place it in the programs folder and rename to DS4Updater.exe if on x86, then check for update again. DS4Windows will attempt to open DS4Updater Release page when this window is closed.. /// - internal static string PleaseDownloadUpdater { + public static string PleaseDownloadUpdater { get { return ResourceManager.GetString("PleaseDownloadUpdater", resourceCulture); } @@ -1385,7 +984,7 @@ internal static string PleaseDownloadUpdater { /// /// Looks up a localized string similar to Please import or make a profile. /// - internal static string PleaseImport { + public static string PleaseImport { get { return ResourceManager.GetString("PleaseImport", resourceCulture); } @@ -1394,7 +993,7 @@ internal static string PleaseImport { /// /// Looks up a localized string similar to New Profile. /// - internal static string PlusNewProfile { + public static string PlusNewProfile { get { return ResourceManager.GetString("PlusNewProfile", resourceCulture); } @@ -1403,7 +1002,7 @@ internal static string PlusNewProfile { /// /// Looks up a localized string similar to *Profile name* cannot be restored.. /// - internal static string ProfileCannotRestore { + public static string ProfileCannotRestore { get { return ResourceManager.GetString("ProfileCannotRestore", resourceCulture); } @@ -1412,7 +1011,7 @@ internal static string ProfileCannotRestore { /// /// Looks up a localized string similar to Profile Folder Moved to program folder. /// - internal static string ProfileFolderMoved { + public static string ProfileFolderMoved { get { return ResourceManager.GetString("ProfileFolderMoved", resourceCulture); } @@ -1421,172 +1020,124 @@ internal static string ProfileFolderMoved { /// /// Looks up a localized string similar to Programs. /// - internal static string Programs { + public static string Programs { get { return ResourceManager.GetString("Programs", resourceCulture); } } /// - /// Looks up a localized string similar to EXPERIMENTAL: Auto-Disable BT when conencting to USB. + /// Looks up a localized string similar to Auto-Disable BT when connecting to USB. /// - internal static string QuickCharge { + public static string QuickCharge { get { return ResourceManager.GetString("QuickCharge", resourceCulture); } } /// - /// Looks up a localized string similar to You must quit other applications like Steam, Uplay before activating the 'Hide DS4 Controller' option.". + /// Looks up a localized string similar to You must quit other applications like UWP apps (Netflix), Steam, Uplay, Edge, NVIDIA IN-GAME before activating the 'Hide DS4 Controller' option. For more info check https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues. /// - internal static string QuitOtherPrograms { + public static string QuitOtherPrograms { get { return ResourceManager.GetString("QuitOtherPrograms", resourceCulture); } } - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap rainbow { - get { - object obj = ResourceManager.GetObject("rainbow", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap rainbowC { - get { - object obj = ResourceManager.GetObject("rainbowC", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RB { - get { - object obj = ResourceManager.GetObject("RB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - /// /// Looks up a localized string similar to Record. /// - internal static string RecordText { + public static string RecordText { get { return ResourceManager.GetString("RecordText", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap RIGHT { - get { - object obj = ResourceManager.GetObject("RIGHT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Right Click to set presets for a set of controls. /// - internal static System.Drawing.Bitmap right_touch { + public static string RightClickPresets { get { - object obj = ResourceManager.GetObject("right_touch", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("RightClickPresets", resourceCulture); } } /// - /// Looks up a localized string similar to Right Click to set presets for a set of controls. + /// Looks up a localized string similar to Tells Windows to start DS4Windows after login. /// - internal static string RightClickPresets { + public static string RunAtStartup { get { - return ResourceManager.GetString("RightClickPresets", resourceCulture); + return ResourceManager.GetString("RunAtStartup", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Calibration of sixaxis wheel emulation. /// - internal static System.Drawing.Bitmap RS { + public static string SASteeringWheelEmulationCalibrate { get { - object obj = ResourceManager.GetObject("RS", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrate", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to All calibraton points are set when lightbar color turns to green. While turning the controller the lightbar color flashes when the controller is at calibration point. Accept calibration with OK button. /// - internal static System.Drawing.Bitmap RSD { + public static string SASteeringWheelEmulationCalibrateInstruction { get { - object obj = ResourceManager.GetObject("RSD", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (1) Center the controller, hold it steady and press "X". /// - internal static System.Drawing.Bitmap RSL { + public static string SASteeringWheelEmulationCalibrateInstruction1 { get { - object obj = ResourceManager.GetObject("RSL", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction1", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (2) Turn to 90° left (or right) position and press "X". /// - internal static System.Drawing.Bitmap RSR { + public static string SASteeringWheelEmulationCalibrateInstruction2 { get { - object obj = ResourceManager.GetObject("RSR", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction2", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to (3) Turn to 90° right (or left) position and press "X". /// - internal static System.Drawing.Bitmap RSU { + public static string SASteeringWheelEmulationCalibrateInstruction3 { get { - object obj = ResourceManager.GetObject("RSU", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateInstruction3", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Cannot calibrate gyro (sixaxis) steering wheel emulation values without a controller. Connect a controller via bluetooth or usb. /// - internal static System.Drawing.Bitmap RT { + public static string SASteeringWheelEmulationCalibrateNoControllerError { get { - object obj = ResourceManager.GetObject("RT", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateNoControllerError", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Gyro steering wheel emulation axis option is set to NONE (emulation is not used). Please select an axis option before calibrating the sixaxis gyro steering wheel emulation. /// - internal static System.Drawing.Bitmap saveprofile { + public static string SASteeringWheelEmulationCalibrateNoneAxisError { get { - object obj = ResourceManager.GetObject("saveprofile", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SASteeringWheelEmulationCalibrateNoneAxisError", resourceCulture); } } /// /// Looks up a localized string similar to Save Recorded Macro?. /// - internal static string SaveRecordedMacro { + public static string SaveRecordedMacro { get { return ResourceManager.GetString("SaveRecordedMacro", resourceCulture); } @@ -1595,16 +1146,16 @@ internal static string SaveRecordedMacro { /// /// Looks up a localized string similar to Scan Code. /// - internal static string ScanCode { + public static string ScanCode { get { return ResourceManager.GetString("ScanCode", resourceCulture); } } /// - /// Looks up a localized string similar to Searching for controllers…. + /// Looks up a localized string similar to Searching for controllers.... /// - internal static string SearchingController { + public static string SearchingController { get { return ResourceManager.GetString("SearchingController", resourceCulture); } @@ -1613,7 +1164,7 @@ internal static string SearchingController { /// /// Looks up a localized string similar to Select an action for *action*. /// - internal static string SelectActionTitle { + public static string SelectActionTitle { get { return ResourceManager.GetString("SelectActionTitle", resourceCulture); } @@ -1622,7 +1173,7 @@ internal static string SelectActionTitle { /// /// Looks up a localized string similar to Select a macro. /// - internal static string SelectMacro { + public static string SelectMacro { get { return ResourceManager.GetString("SelectMacro", resourceCulture); } @@ -1631,7 +1182,7 @@ internal static string SelectMacro { /// /// Looks up a localized string similar to Set Regular Trigger. /// - internal static string SetRegularTrigger { + public static string SetRegularTrigger { get { return ResourceManager.GetString("SetRegularTrigger", resourceCulture); } @@ -1640,7 +1191,7 @@ internal static string SetRegularTrigger { /// /// Looks up a localized string similar to Set Unload Trigger. /// - internal static string SetUnloadTrigger { + public static string SetUnloadTrigger { get { return ResourceManager.GetString("SetUnloadTrigger", resourceCulture); } @@ -1649,45 +1200,43 @@ internal static string SetUnloadTrigger { /// /// Looks up a localized string similar to Shortcuts. /// - internal static string Shortcuts { + public static string Shortcuts { get { return ResourceManager.GetString("Shortcuts", resourceCulture); } } /// - /// Looks up a localized string similar to Click for advanced Sixaxis reading. + /// Looks up a localized string similar to If enabled then Log tab page shows detailed messages of auto-profile events.. /// - internal static string SixAxisReading { + public static string ShowAutoProfileDebugLogTip { get { - return ResourceManager.GetString("SixAxisReading", resourceCulture); + return ResourceManager.GetString("ShowAutoProfileDebugLogTip", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Click for advanced Sixaxis reading. /// - internal static System.Drawing.Bitmap size { + public static string SixAxisReading { get { - object obj = ResourceManager.GetObject("size", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SixAxisReading", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Roundness of Square Stick corners. /// - internal static System.Drawing.Bitmap START { + public static string SquareStickRoundness { get { - object obj = ResourceManager.GetObject("START", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("SquareStickRoundness", resourceCulture); } } /// /// Looks up a localized string similar to Starting.... /// - internal static string Starting { + public static string Starting { get { return ResourceManager.GetString("Starting", resourceCulture); } @@ -1696,16 +1245,16 @@ internal static string Starting { /// /// Looks up a localized string similar to Start. /// - internal static string StartText { + public static string StartText { get { return ResourceManager.GetString("StartText", resourceCulture); } } /// - /// Looks up a localized string similar to Step 1: Install the DS4 Driver. + /// Looks up a localized string similar to Step 1: Install the ViGEmBus Driver. /// - internal static string Step1 { + public static string Step1 { get { return ResourceManager.GetString("Step1", resourceCulture); } @@ -1714,7 +1263,7 @@ internal static string Step1 { /// /// Looks up a localized string similar to Stop Heavy. /// - internal static string StopHText { + public static string StopHText { get { return ResourceManager.GetString("StopHText", resourceCulture); } @@ -1723,7 +1272,7 @@ internal static string StopHText { /// /// Looks up a localized string similar to Stop Light. /// - internal static string StopLText { + public static string StopLText { get { return ResourceManager.GetString("StopLText", resourceCulture); } @@ -1732,25 +1281,25 @@ internal static string StopLText { /// /// Looks up a localized string similar to Stopped DS4Windows. /// - internal static string StoppedDS4Windows { + public static string StoppedDS4Windows { get { return ResourceManager.GetString("StoppedDS4Windows", resourceCulture); } } /// - /// Looks up a localized string similar to Stopping DS4 Controllers. + /// Looks up a localized string similar to Stopping DS4 Input Controllers. /// - internal static string StoppingDS4 { + public static string StoppingDS4 { get { return ResourceManager.GetString("StoppingDS4", resourceCulture); } } /// - /// Looks up a localized string similar to Stopping X360 Controllers. + /// Looks up a localized string similar to Stopping Virtual Output Controllers. /// - internal static string StoppingX360 { + public static string StoppingX360 { get { return ResourceManager.GetString("StoppingX360", resourceCulture); } @@ -1759,7 +1308,7 @@ internal static string StoppingX360 { /// /// Looks up a localized string similar to Stop. /// - internal static string StopText { + public static string StopText { get { return ResourceManager.GetString("StopText", resourceCulture); } @@ -1768,7 +1317,7 @@ internal static string StopText { /// /// Looks up a localized string similar to Swipe Down. /// - internal static string SwipeDown { + public static string SwipeDown { get { return ResourceManager.GetString("SwipeDown", resourceCulture); } @@ -1777,7 +1326,7 @@ internal static string SwipeDown { /// /// Looks up a localized string similar to Swipe Left. /// - internal static string SwipeLeft { + public static string SwipeLeft { get { return ResourceManager.GetString("SwipeLeft", resourceCulture); } @@ -1786,7 +1335,7 @@ internal static string SwipeLeft { /// /// Looks up a localized string similar to Swipe Right. /// - internal static string SwipeRight { + public static string SwipeRight { get { return ResourceManager.GetString("SwipeRight", resourceCulture); } @@ -1795,7 +1344,7 @@ internal static string SwipeRight { /// /// Looks up a localized string similar to Swipe Touchpad to change profiles. /// - internal static string SwipeTouchpad { + public static string SwipeTouchpad { get { return ResourceManager.GetString("SwipeTouchpad", resourceCulture); } @@ -1804,7 +1353,7 @@ internal static string SwipeTouchpad { /// /// Looks up a localized string similar to Swipe Up. /// - internal static string SwipeUp { + public static string SwipeUp { get { return ResourceManager.GetString("SwipeUp", resourceCulture); } @@ -1813,7 +1362,7 @@ internal static string SwipeUp { /// /// Looks up a localized string similar to Tap and hold to drag, slight delay with single taps. /// - internal static string TapAndHold { + public static string TapAndHold { get { return ResourceManager.GetString("TapAndHold", resourceCulture); } @@ -1822,7 +1371,7 @@ internal static string TapAndHold { /// /// Looks up a localized string similar to Test Heavy. /// - internal static string TestHText { + public static string TestHText { get { return ResourceManager.GetString("TestHText", resourceCulture); } @@ -1831,7 +1380,7 @@ internal static string TestHText { /// /// Looks up a localized string similar to Test Light. /// - internal static string TestLText { + public static string TestLText { get { return ResourceManager.GetString("TestLText", resourceCulture); } @@ -1840,7 +1389,7 @@ internal static string TestLText { /// /// Looks up a localized string similar to Test. /// - internal static string TestText { + public static string TestText { get { return ResourceManager.GetString("TestText", resourceCulture); } @@ -1849,7 +1398,7 @@ internal static string TestText { /// /// Looks up a localized string similar to Text Document (*.txt). /// - internal static string TextDocs { + public static string TextDocs { get { return ResourceManager.GetString("TextDocs", resourceCulture); } @@ -1858,7 +1407,7 @@ internal static string TextDocs { /// /// Looks up a localized string similar to Tilt Down. /// - internal static string TiltDown { + public static string TiltDown { get { return ResourceManager.GetString("TiltDown", resourceCulture); } @@ -1867,7 +1416,7 @@ internal static string TiltDown { /// /// Looks up a localized string similar to Tilt Left. /// - internal static string TiltLeft { + public static string TiltLeft { get { return ResourceManager.GetString("TiltLeft", resourceCulture); } @@ -1876,7 +1425,7 @@ internal static string TiltLeft { /// /// Looks up a localized string similar to Tilt Right. /// - internal static string TiltRight { + public static string TiltRight { get { return ResourceManager.GetString("TiltRight", resourceCulture); } @@ -1885,7 +1434,7 @@ internal static string TiltRight { /// /// Looks up a localized string similar to Tilt Up. /// - internal static string TiltUp { + public static string TiltUp { get { return ResourceManager.GetString("TiltUp", resourceCulture); } @@ -1894,7 +1443,7 @@ internal static string TiltUp { /// /// Looks up a localized string similar to Touchpad Movement is now Off. /// - internal static string TouchpadMovementOff { + public static string TouchpadMovementOff { get { return ResourceManager.GetString("TouchpadMovementOff", resourceCulture); } @@ -1903,7 +1452,7 @@ internal static string TouchpadMovementOff { /// /// Looks up a localized string similar to Touchpad Movement is now On. /// - internal static string TouchpadMovementOn { + public static string TouchpadMovementOn { get { return ResourceManager.GetString("TouchpadMovementOn", resourceCulture); } @@ -1912,7 +1461,7 @@ internal static string TouchpadMovementOn { /// /// Looks up a localized string similar to Re-enable by pressing PS+Touchpad. /// - internal static string TouchpadOffTip { + public static string TouchpadOffTip { get { return ResourceManager.GetString("TouchpadOffTip", resourceCulture); } @@ -1921,7 +1470,7 @@ internal static string TouchpadOffTip { /// /// Looks up a localized string similar to 2 finger touchpad swipe left or right. /// - internal static string TwoFingerSwipe { + public static string TwoFingerSwipe { get { return ResourceManager.GetString("TwoFingerSwipe", resourceCulture); } @@ -1930,7 +1479,7 @@ internal static string TwoFingerSwipe { /// /// Looks up a localized string similar to type new name here. /// - internal static string TypeNewName { + public static string TypeNewName { get { return ResourceManager.GetString("TypeNewName", resourceCulture); } @@ -1939,81 +1488,88 @@ internal static string TypeNewName { /// /// Looks up a localized string similar to type profile name here. /// - internal static string TypeProfileName { + public static string TypeProfileName { get { return ResourceManager.GetString("TypeProfileName", resourceCulture); } } /// - /// Looks up a localized string similar to Unassigned. + /// Looks up a localized string similar to You need to run DS4Windows as the Administrator in order to activate this mode.. /// - internal static string Unassigned { + public static string UACTask { get { - return ResourceManager.GetString("Unassigned", resourceCulture); + return ResourceManager.GetString("UACTask", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Enable UDP server. Server listen address and port. Address value options: 127.0.0.1 localhost only | 0.0.0.0 all addresses | Specific host name or IP address.. /// - internal static System.Drawing.Bitmap UP { + public static string UdpServer { get { - object obj = ResourceManager.GetObject("UP", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("UdpServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unassigned. + /// + public static string Unassigned { + get { + return ResourceManager.GetString("Unassigned", resourceCulture); } } /// /// Looks up a localized string similar to Up. /// - internal static string UpText { + public static string UpText { get { return ResourceManager.GetString("UpText", resourceCulture); } } /// - /// Looks up a localized string similar to You are up to date. + /// Looks up a localized string similar to DS4Windows application is up-to-date.. /// - internal static string UpToDate { + public static string UpToDate { get { return ResourceManager.GetString("UpToDate", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to You can also use your controller to change controls. /// - internal static System.Drawing.Bitmap USB { + public static string UseControllerForMapping { get { - object obj = ResourceManager.GetObject("USB", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); + return ResourceManager.GetString("UseControllerForMapping", resourceCulture); } } /// - /// Looks up a localized string similar to You can also use your controller to change controls. + /// Looks up a localized string similar to Controller {0} is using temp Profile "{1}". /// - internal static string UseControllerForMapping { + public static string UsingAutoTempProfile { get { - return ResourceManager.GetString("UseControllerForMapping", resourceCulture); + return ResourceManager.GetString("UsingAutoTempProfile", resourceCulture); } } /// /// Looks up a localized string similar to Using Exclusive Mode. /// - internal static string UsingExclusive { + public static string UsingExclusive { get { return ResourceManager.GetString("UsingExclusive", resourceCulture); } } /// - /// Looks up a localized string similar to Controller *number* is using Profile “*Profile name*". + /// Looks up a localized string similar to Controller {0} is using Profile "{1}". Battery level is {2}%. /// - internal static string UsingProfile { + public static string UsingProfile { get { return ResourceManager.GetString("UsingProfile", resourceCulture); } @@ -2022,7 +1578,7 @@ internal static string UsingProfile { /// /// Looks up a localized string similar to Using Shared Mode. /// - internal static string UsingShared { + public static string UsingShared { get { return ResourceManager.GetString("UsingShared", resourceCulture); } @@ -2031,7 +1587,7 @@ internal static string UsingShared { /// /// Looks up a localized string similar to This disables the Touchpad as a mouse. /// - internal static string UsingTPSwipes { + public static string UsingTPSwipes { get { return ResourceManager.GetString("UsingTPSwipes", resourceCulture); } @@ -2040,7 +1596,7 @@ internal static string UsingTPSwipes { /// /// Looks up a localized string similar to Please enter a valid name. /// - internal static string ValidName { + public static string ValidName { get { return ResourceManager.GetString("ValidName", resourceCulture); } @@ -2049,7 +1605,7 @@ internal static string ValidName { /// /// Looks up a localized string similar to Wait *number*ms. /// - internal static string WaitMS { + public static string WaitMS { get { return ResourceManager.GetString("WaitMS", resourceCulture); } @@ -2058,48 +1614,28 @@ internal static string WaitMS { /// /// Looks up a localized string similar to Will Keep. /// - internal static string WillKeep { + public static string WillKeep { get { return ResourceManager.GetString("WillKeep", resourceCulture); } } /// - /// Looks up a localized resource of type System.Drawing.Bitmap. + /// Looks up a localized string similar to Actions.xml file was corrupt. Starting from scratch.. /// - internal static System.Drawing.Bitmap X { + public static string XMLActionsCorrupt { get { - object obj = ResourceManager.GetObject("X", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } - - /// - /// Looks up a localized string similar to Use higher ports if you get conflicts in other emulating X360 programs, such as SCP's tool. - /// - internal static string XinputPorts { - get { - return ResourceManager.GetString("XinputPorts", resourceCulture); + return ResourceManager.GetString("XMLActionsCorrupt", resourceCulture); } } /// /// Looks up a localized string similar to XML Files (*.xml). /// - internal static string XMLFiles { + public static string XMLFiles { get { return ResourceManager.GetString("XMLFiles", resourceCulture); } } - - /// - /// Looks up a localized resource of type System.Drawing.Bitmap. - /// - internal static System.Drawing.Bitmap Y { - get { - object obj = ResourceManager.GetObject("Y", resourceCulture); - return ((System.Drawing.Bitmap)(obj)); - } - } } } diff --git a/DS4Windows/Properties/Resources.ar.resx b/DS4Windows/Properties/Resources.ar.resx deleted file mode 100644 index b088123e0c..0000000000 --- a/DS4Windows/Properties/Resources.ar.resx +++ /dev/null @@ -1,543 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - اسم هذا الإجراء مستخدم - - - إضافة إلى القائمة... - - - أضف برنامج - - - يجب أن تختار مسارا للإستمرار - - - دائما في نمط قوس قزح - - - عين إلي يد *number* - - - البطارية: *number*% - - - يفضل استخدامه مع الجهة اليمنى كفأرة - - - تصفح... - - - لا يمكن نقل الملفات لموقع جديد، الرجاء إعادة تسمية ملف DS4Tool إلى "DS4Windows" - - - لا يمكن الكتابة في الموقع الحالي, نسخ الإعدادات إلى ملف appdata؟ - - - اشحن البطارية - - - مشحون - - - يتم الشحن: *number*% - - - تحقق من البطارية - - - أغلق البرنامج؟ - - - أغلق البرنامج عن طريق رمز التنبيه - - - لون - - - اللون بمستوى الشحن % - - - توصيل... - - - تعديل السجل لليد *number* - - - إنشاء سجل لليد *number* - - - يد *Mac address* تم إزالتها أو فقد الإتصال - - - اكتمل النسخ، الرجاء إعادة تشغيل البرنامج و إزالة الإعدادات من ملف البرنامج - - - انقر لنسخ اللون كاملا - - - تحذير: لا يمكن تشغيل يد *Mac address* بشكل حصري - - - يوم - - - أيام - - - حذف السجل؟ - - - تعتيم بحسب البطارية % - - - أغلق إدخال 360 و استخدم إدخال يد البلاي ستايشن 4 فقط، إخفاء يد البلاي ستايشن 4 يجب أن يكون مغلقا (فقط للموصل بالسلك) - - - افصل البلوتوث - - - انفصل - - - تحميل *number*% - - - تحميل اصدار *number* الآن؟ - - - تحت - - - يوجد تحديث متاح! - - - البرنامج لا يستطيع تعديل الإعدادات هنا، هذا سيغلق الآن - - - تعديل - - - العودة - - - العودة إلى *button* - - - زر الفأرة الخامس للأسفل - - - زر الفأرة الخامس للأعلى - - - نقر لتغيير لون الإيماض، الأسود = اللون الإفتراضي - - - حذف HID - - - حذف سلسلة HID بعد كل قراءة - - - وجد يد: - - - زر الفأرة الرابع للأسفل - - - زر الفأرة الرابع للأعلى - - - كامل - - - انقر لرؤية قراءات الحساسات - - - دوام السين، المليان لليمين و اليسار - - - دوّام الصاد، المليان للأمام و الخلف - - - دوّام العين، المليان للأعلى و الأسفل - - - ساعة - - - ساعات - - - ضع الفأرة على البنود لترى الوصف و التعليمات - - - عند إزالة البرنامج، تستطيع حذف الإعدادات عن طريق تتبع رابط ملف السجلات - - - تأخر الإدخال: *number* مللي ثانية - - - تم التثبيت - - - ثبت المعرفات هنا - - - فشل التثبيت، الرجاء إعادة المحاولة - - - يتم التثبيت... - - - استخدم Sixaxis لحساب حركة شاشة اللمس - - - أبق حجم الصفحة بعد الغلق - - - تأخر اليد *number* أقل من 10 مللي ثانية - - - تأخر اليد *number* أكثر من 10 مللي ثانية - - - شغل *program* - - - و عتم الضوء بعد الكمون لو كان مشغلا - - - تحميل... - - - تحميل *profile* - - - ماكرو - - - إنشاء سجل جديد - - - لا يوجد - - - جديد - - - لا يوجد ماكرو مسجل - - - لا يوجد - - - لا يوجد - - - لا سجل محمل - - - اليد *number* لا تستخدم سجل - - - غير صالح - - - فتح المثبت - - - الرجاء تشغيل ScpDriver.exe - - - ، الملفات في الأماكن الأخرى ستحذف - - - الرجاء تحميل المحدِّث الآن، و وضعه في ملف البرنامج، ثم تحقق من وجود تحديث مرة أخرى - - - الرجاء إنشاء أو استيراد سجل - - - سجل جديد - - - لا يمكن استعادة *Profile name* - - - ملف السجل نقل إلى ملف البرنامج - - - البرامج - - - تجريبي: فصل البلوتوث بشكل تلقائي عند التوصيل بالسلك - - - يجب إغلاق البرامج الأخرى مثل ستيم و اليو-بلاي قبل تفعيل خيار "إخفاء يد البلاي ستايشن 4" - - - تسجيل - - - النقر باليمين لوضع مجهّز لعدة تحكم - - - حفظ الماكرو المسجل؟ - - - سكان كود - - - البحث عن أيادي... - - - اختر أمر لـ *action* - - - تحديد كزناد عادي - - - تحديد كزناد ملغى - - - إختصارات - - - انقر لقراءات متقدمة لـ Sixaxis - - - يبدأ... - - - بداية - - - الخطوة 1: تثبيت معرّف يد البلاي ستايشن 4 - - - إيقاف القوي - - - إيقاف الضعيف - - - أوقف البرنامج - - - يتم ايقاف ايادي البلاي ستايشن 4 - - - يتم ايقاف ايادي 360 - - - ايقاف - - - مسح للأسفل - - - مسح لليسار - - - مسح لليمين - - - ميح شاشة اللمس لتغيير السجل - - - مسح للأعلى - - - اللمس للسحب، تأخر طفيف للنقرات المنفردة - - - تجريب القوي - - - تجريب الضعيف - - - تجريب - - - ميلان للأسفل - - - ميلان للأعلى - - - ميلن لليسار - - - مليان لليمين - - - حركة شاشة اللمس معطلة - - - حركة شاشة اللمس مفعلة - - - أعد التفعيل بضغط زر البلاي ستايشن + شاشة اللمس - - - المسح بإصبعين لليسار و اليمين - - - اكتب اسم جديد هنا - - - اكتب اسم للسجل هنا - - - اعلى - - - البرنامج في أحدث إصدار - - - تستطيع استخدام اليد لتغيير التحكم - - - يتم استخدام النمط الحصري - - - اليد *number* تستخدم السجل “*Profile name*" - - - يتم استخدام نمط المشاركة - - - هذا يعطل عمل شاشة اللمس كفأرة - - - ارجاء إدخال اسم صالح - - - انتظار *number* مللي ثانية - - - سيبقى - - - استخدم خانات أعلى لو حصل تعارض مع برامج محاكاة 360 أخرى مثل برنامج SCP's tool - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.cs.resx b/DS4Windows/Properties/Resources.cs.resx deleted file mode 100644 index 4eb7aee9f5..0000000000 --- a/DS4Windows/Properties/Resources.cs.resx +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Akce s tímto názvem již existuje - - - Přidávám do seznamu... - - - Přidat programy - - - Test - - - Textový dokument (*.txt) - - - Pohyb touhpadu je vypnutý - - - Pohyb touhpadu je zapnutý - - - Znovu aktivujte stisknutím tlačítka PS+Touchpadu - - - zadejte nový název - - - zadejte nový název profilu - - - Nepřiřazeno - - - Nahoru - - - Máte aktuální verzi - - - Ovladač můžete použít pro změnu ovládání - - - Exkluzivní režim je používán - - - Ovladač *number* používá profil "*Profile name*" - - - Sdílený režim je používán - - - Tímto vypnete chování touchpadu jako myši - - - Prosím, zadejte platný název - - - Počkat *number*ms - - - Ponechat - - - Při konfliktu s jinými programy na emulaci X360 (například SCP) použijte vyšší porty - - - XML soubory (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.de-DE.resx b/DS4Windows/Properties/Resources.de-DE.resx deleted file mode 100644 index a35ea6140e..0000000000 --- a/DS4Windows/Properties/Resources.de-DE.resx +++ /dev/null @@ -1,564 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Name dieser Aktion existiert bereits - - - Zur Liste Hinzufügen ... - - - Programme Hinzufügen - - - Ein Ort muss angegeben werden, um fortzufahren. - - - Permanenter Regenbogen Modus - - - Controller *number* zuweisen - - - Batterie: *number*% - - - Wird am besten mit der rechten Seite als Mausfunktion verwendet. - - - Durchsuchen ... - - - Kann im aktuellen Verzeichnis nicht speichern. Sollen die Einstellungen nach Appdata kopiert werden? - - - Aufgeladen - - - Wird aufgeladen: *number*% - - - Batterie prüfen - - - DS4Windows schließen? - - - Beende DS4Windows über das Benachrichtigungssymbol - - - Farbe - - - Farbe wird nach der Akkulaufzeit eingestellt - - - Verbinde ... - - - Bearbeite Profil für Controller *number* - - - Erstelle Profil für Controller *number* - - - Controller *Mac address* wurde entfernt oder hat die Verbindung verloren. - - - Kopieren abgeschlossen, bitte DS4Windows neustarten und Einstellungen aus dem Programmverzeichnis entfernen. - - - Klicken um Farbe zu kopieren - - - Warnung: Konnte DS4 *Mac address* nicht exklusiv öffnen. - - - Tag - - - Tage - - - Profil löschen? - - - Dimmen, wenn der Akku weniger als % hat. - - - Schalte X360 Eingabemethode aus und benutze nur DS4's systemeigene Eingabemethode. "Verstecke DS4 Controller" muss bei Kabelverbindung deaktiviert sein. - - - Bluetooth-Verbindung trennen - - - Getrennt - - - Lade herunter *number*% - - - Version *number* herunterladen? - - - Unten - - - DS4Windows Aktualisierung verfügbar! - - - DS4Windows kann hier nicht die Einstellungen bearbeiten. Fenster wird nun geschlossen. - - - Ändern - - - Zurückfallen - - - 5. Maustaste runter - - - 5. Maustaste hoch - - - Klicken, um die Farbe des Lichtbalkens zu ändern. Schwarz = Standardfarbe - - - Leere HID - - - HID Queue nach jeder Auslesung leeren - - - Controller gefunden: - - - 4. Maustaste unten - - - 4. Maustaste hoch - - - Voll - - - Klicken, um die Sixaxis Gyro Auslesung anzuzeigen - - - GyroX, links und rechts neigen - - - GyroY, vorwärts und rückwärts neigen - - - GyroZ, hoch und runter neigen - - - Stunde - - - Stunden - - - Fahre über die Elemente, um die Beschreibung zu sehen. - - - Wenn du DS4Windows entfernst, kannst du die Einstellungen löschen. Folge dazu dem Link zum Profilordner. - - - Eingabeverzögerung: *number*ms - - - Installation abgeschlossen - - - Treiber hier installieren - - - Installiere ... - - - Verwende Sixaxis, um die Berechnung der Touchpad-Bewegung zu verbessern. - - - Fenstergröße speichern - - - Latenz von Controller *number* ist nun unter 10ms - - - Latenz von Controller *number* ist über 10ms - - - Starte *program* - - - Bei Leerlauf Licht dimmen EIN - - - Lade ... - - - Lade *profile* - - - Makro - - - Erstelle ein neues Profil - - - N/A - - - Neu - - - Es wurde kein Makro aufgezeichnet. - - - (nichts) - - - leer - - - Kein Profil geladen - - - Controller *number* benutzt kein Profil - - - Ungültig - - - Starte Installationsprogramm - - - Bitte ScpDrivers.exe starten - - - , Dateien an anderen Speicherorten werden gelöscht - - - Lade bitte den Updater herunter und kopiere ihn dann ins Programmverzeichnis. Suche anschließend erneut nach einer Aktualisierung. - - - Bitte erstelle oder importiere ein Profil - - - Neues Profil - - - *Profile name* kann nicht wiederhergestellt werden. - - - Profilordner wurde in den Programmordner verschoben. - - - Programme - - - Experimentell: Deaktiviere die Bluetooth-Verbindung automatisch, wenn per USB verbunden wird. - - - Du musst andere Programme wie Steam oder Uplay beenden, bevor du die Option, "Verstecke DS4 Controller" aktivierst. - - - Aufnehmen - - - Rechtsklick, um eine Voreinstellung für eine Reihe von Steuerungen zu setzen. - - - Aufgezeichnetes Makro speichern? - - - Scancode - - - Suche nach Controllern ... - - - Wähle eine Aktion für *action* - - - Normalen-Auslöser setzen - - - Entfernungsauslöser setzen - - - Tastenkürzel - - - Klicken, für erweiterterte Sixaxis Auslesung - - - Starte ... - - - Starten - - - Schritt 1: Installiere den DS4 Treiber - - - starke stoppen - - - schwache stoppen - - - DS4Windows beendet - - - Beende DS4 Controller - - - Beende X360 Controller - - - Stoppen - - - nach unten streichen - - - nach links streichen - - - nach rechts streichen - - - Streiche über das Touchpad, um das Profil zu wechseln. - - - nach oben streichen - - - Tippe und halte zum Ziehen - leichte Verzögerung bei einzelnen tips - - - starke testen - - - schwache testen - - - Neigung nach Unten - - - Neigung nach Links - - - Neigung nach Rechts - - - Neigung nach Oben - - - Touchpad Bewegung ist jetzt Aus - - - Touchpad Bewegung ist jetzt An - - - Zum Reaktivieren, drücke PS + Touchpad. - - - Streichgeste mit 2 Fingern nach links oder rechts - - - Neuen Namen hier eingeben - - - Profilnamen hier eingeben - - - Hoch - - - DS4Windows ist auf dem neuesten Stand - - - Du kannst auch den Controller verwenden, um die Bedienung zu ändern. - - - Benutze exklusiven Modus - - - Controller *number* benutzt jetzt Profil "*Profile name*" - - - Benutze geteilten Modus - - - Dies deaktiviert, dass das Touchpad als Maus benutzt werden kann. - - - Bitte gültigen Namen eingeben - - - Warte *number*ms - - - Wird gehalten - - - Verwende höher liegende Ports, wenn Konflikte mit anderen X360 Simulationsprogrammen, wie SCP's Serviceprogramm, auftreten. - - - DS4Windows beendet - - - Text Dokument (*.txt) - - - Die Batterie aufladen - - - Installation fehlgeschlagen, bitte erneut versuchen - - - XML Dateien (*.xml) - - - Nicht Zugewiesen - - - Makro aufgezeichnet - - - Multi-Aktions Knopf - - - Wähle ein Makro aus - - - Test - - - Dateien können nicht zu neuem Ziel bewegt werden. Bitte ändern Sie den Namen des DS4Tool Verzeichnisses zu "DS4Windows" - - - Falle zurück zu *button* - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.el.resx b/DS4Windows/Properties/Resources.el.resx deleted file mode 100644 index c60e50306f..0000000000 --- a/DS4Windows/Properties/Resources.el.resx +++ /dev/null @@ -1,222 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ανάθεση σε χειριστήριο *number* - - - Μπαταρία: *number*% - - - μέρα - - - μέρες - - - Διαγραφή προφιλ; - - - Αποσυνδεδεμένο Bluetooth - - - Αποσυνδεδεμένο - - - Επεξεργασία - - - Επιστροφή - - - Επιστροφή στο *button* - - - Πλήρες - - - ώρα - - - ώρες - - - Εγκατάσταση... - - - Φόρτωση... - - - Διακοπή Φωτισμού - - - Διακοπή DS4Windows - - - Διακοπή DS4 Χειριστηρίου - - - Σταμάτημα Χειριστήριου X360 - - - Παύση - - - Σύρετε προς τα κάτω - - - Σύρετε προς τα αριστερά - - - Σύρετε προς τα δεξιά - - - Σύρετε το Touchpad για να αλλάξετε προφίλ - - - Σύρετε προς τα πάνω - - - Βαριά Δοκιμή - - - Ελαφριά Δοκιμή - - - Δοκιμή - - - Έγγραφο κειμένου (*.txt) - - - Το Touchpad είναι απενεργοποιημένο - - - Το Touchpad είναι ενεργοποιημένο - - - Πάνω - - - Έχετε την τελευταία έκδοση - - - Aρχεία XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.es.resx b/DS4Windows/Properties/Resources.es.resx deleted file mode 100644 index f27f10d012..0000000000 --- a/DS4Windows/Properties/Resources.es.resx +++ /dev/null @@ -1,549 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Agregar a la lista - - - Agregar programas - - - Siempre Modo Alcoiris - - - Asignar a Controlador *number* - - - Batería: *number*% - - - Preferible usar lado derecho como función del mouse. - - - Buscar... - - - No se puede modificar este archivo. ¿Mover preferencias a "appdata"? - - - Cargado - - - Cargando: *number*% - - - Color - - - Color por % de Batería - - - Conectando... - - - Editar perfil para el Controlador *number* - - - Crear perfil para el Controlador *number* - - - Controlador *Mac address* perdió la conexión o fue desconectado - - - Copia completa, por favor reinicia DS4Windows y elimina preferencias del directorio de programa - - - Haz click para copiar todo el color. - - - Advertencia: No se puede abrir DS4 *Mac address* exclusivamente. - - - día - - - días - - - Borrar perfil? - - - Apagar la entrada X360 y utilizar solo la entrada nativa DS4, ocultar ds4 debe estar apagado - - - Desconectado - - - Descargando *number*% - - - Descargar version *number* ahora? - - - Abajo - - - DS4Windows tiene una actualización disponible! - - - DS4Windows no puede editar la configuración aquí, Esto se cerrará ahora - - - Editar - - - Brillar HID - - - Controlador Encontrado: - - - Completo - - - hora - - - horas - - - Si borras DS4Windows, puedes eliminar la configuración siguiendo el enlace Carpeta de Perfil - - - Retraso de entrada: *number*ms - - - Instalación Completada - - - Instalar Drivers aquí - - - Instalando... - - - Mantener este tamaño de ventana después de cerrar - - - Cargando... - - - Crear un Nuevo Perfil - - - N/A - - - Nuevo - - - Ningún macro fue grabado - - - (ninguno) - - - ninguno - - - Ningún perfil cargado - - - No válido - - - Abriendo Instalador - - - Por favor abre ScpDriver.exe - - - Por favor importa o crea un perfil - - - *Profile name* no puede ser restaurado. - - - Carpeta de Perfil se ha movido a Carpeta de Programa - - - Debes salir de otras aplicaciones como Steam, Uplay antes de activar la opción "Ocultar controlador DS4" - - - Grabar - - - Guardar Macro grabado? - - - Buscando controladores... - - - Selecciona una acción para *action* - - - Iniciando... - - - Inicio - - - Paso 1: Instala el Driver DS4 - - - Detener Vib. Pesada - - - Detener Vib. Ligera - - - DS4Windows detenido - - - Deteniendo Controladores DS4 - - - Deteniendo Controladores X360 - - - Detener - - - Desliza el Panel Táctil para cambiar perfiles - - - Mantenga pulsado para arrastrar, ligero retraso con toques simples - - - Prueba Vib. Pesada - - - Prueba Vib. Ligera - - - Inclinacion Abajo - - - Inclinacion Izquierda - - - Inclinacion Derecha - - - Inclinacion Arriba - - - Movimiento de Panel Táctil Apagado - - - Movimiento de Panel Táctil Encendido - - - escriba nuevo nombre aquí - - - escriba nombre de perfil aquí - - - Arriba - - - Actualizado - - - También puedes utilizar tu controlador para cambiar controles - - - Usando Modo Exclusivo - - - Controlador *number* está usando perfil "*Profile name*" - - - Usando Modo Compartido - - - Por favor ingresa un nombre válido - - - Espere *number*ms - - - Se mantendrá - - - Nuevo Perfil - - - El nombre de esta acción ya existe - - - Una ubicación tiene que ser elegida para continuar - - - Verificar la batería - - - Cerrar DS4Windows? - - - Cierra DS4Windows vía el icono de notificación - - - Atenuar al % de la batería - - - Desconecta BT - - - Retroceder - - - 5º Botón del Ratón Abajo - - - 5º Botón del Ratón Arriba - - - Haz click para cambiar el color del flash. Negro = Color por defecto - - - Brillar HID después de cada lectura - - - 4º Botón del Ratón Abajo - - - 4º Botón del Ratón Arriba - - - Haz click para ver la lectura de Sixaxis Gyro - - - GyroX, Inclinación Izquierda y Derecha - - - GyroY, Inclinación hacia Delante y Atrás - - - GyroZ, Inclinación hacia Arriba y Abajo - - - Pasa el ratón sobre los elementos para ver la descripción o más sobre el - - - Utiliza Sixaxis para ayudar a calcular el movimiento del Panel Táctil - - - Controlador *number* tiene menos de 10ms de latencia - - - Controlador *number* tiene más de 10ms de latencia - - - Abrir *program* - - - También atenuar la luz por tiempo de inactividad, si está encendida - - - Cargar *profile* - - - Macro - - - Controlador *number* no está utilizando un perfil - - - , otros archivos de localización serán eliminados - - - Por favor Descarga el Actualizador ahora, colócalo en la carpeta programas, y luego busca si hay nuevas actualizaciones - - - Programas - - - EXPERIMENTAL: Auto-desactiva BT cuando se conecta a USB - - - Click Derecho para configurar ajustes preestablecidos para un conjunto de controles - - - Código de escaneo - - - Establece Gatillo Regular - - - Establece descarga de Gatillo - - - Atajos - - - Haz click para leer Sixaxis avanzado - - - DS4Windows detenido - - - Desliza hacia Abajo - - - Desliza hacia la Izquierda - - - Desliza hacia la Derecha - - - Desliza hacia Arriba - - - Inclinacion Abajo - - - Rehabilita pulsando PS+Panel Táctil - - - 2 dedos en el Panel Táctil desliza derecha o izquierda - - - Esto desactiva el panel táctil como un ratón - - - No se pueden mover los archivos a otra ubicación, por favor, renombre la carpeta de DS4Tool a "DS4Windows" - - - Cargar la batería - - - Retroceder a *button* - - - La instalación ha fallado, por favor vuelva a intentarlo - - - Test - - - Utiliza puertos más altos si tienes conflictos en otros programas de emulación X360, como la herramienta SCP - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.fi.resx b/DS4Windows/Properties/Resources.fi.resx deleted file mode 100644 index e314f7d712..0000000000 --- a/DS4Windows/Properties/Resources.fi.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Samanniminen toiminto on jo olemassa - - - Lisätään listaan... - - - Lisää ohjelmia - - - Kohde on valittava jatkaaksesi - - - Käytä aina sateenkaari-tilaa - - - Aseta ohjaimeen *number* - - - Akun tila: *number*% - - - Toimii parhaiten jos oikeaa puolta käytetään hiirenä - - - Selaa... - - - Tiedostoja ei voida siirtää. Nimeä DS4Tool-kansio "DS4Windows"-kansioksi - - - Kohteeseen ei voida kirjoittaa. Kopioi asetukset appdataan-kansioon? - - - Lataa akku - - - Ladattu - - - Ladataan: *number*% - - - Tarkista akku - - - Sulje DS4Windows? - - - Sulje DS4Windows ilmoituspalkista. - - - Väri - - - Väri akun tilan mukaan - - - Yhdistetään... - - - Muokkaa profiilia ohjaimelle *number* - - - Uusi profiili ohjaimelle *number* - - - Ohjain *Mac address* yhteys katkesi - - - Kopiointi valmis. Käynnistä DS4Windows uudelleen ja poista asetukset ohjelma-kansiosta - - - Klikkaa kopioidaksesi väri - - - Varoitus: Ei voitu avata DS4 *Mac address* exclusive modessa. - - - päivä - - - päivää - - - Poista profiili? - - - Himmennä akun tilan mukaan - - - Kytke pois X360 inputlaite ja käytä vain DS4-natiivisyöttötietoja. DS4:n piilotus täytyy olla pois päältä (Vain langallinen) - - - Kytke Bluetooth pois päältä - - - Ei yhteyttä - - - Ladataan *number*% - - - Lataa versio *number* nyt? - - - Alas - - - DS4Windows päivitys saatavilla! - - - DS4Windows ei voi muokata asetuksia täällä. Suljetaan. - - - Muokkaa - - - Palaa - - - Palaa tähän: *button* - - - Paina hiiren 5. näppäintä - - - Nosta hiiren 5. näppäin - - - Klikkaa vaihtaaksesi väri. Perusväri = Musta - - - Tyhjennä HID - - - Tyhjennä HID lukukertojen välissä - - - Ohjain löytyi - - - Paina hiiren 4. näppäintä - - - Nosta hiiren 4. näppäin - - - Täynnä - - - Klikkaa nähdäksesi Sixaxis gyroskoopin tiedot - - - GyroX, oikealle ja vasemmalle - - - GyroY, eteen ja taakse - - - GyroZ, ylös ja alas - - - tunti - - - tuntia - - - Vie hiiren osoitin asetuksen päälle nähdäksesi kuvaksen tai tarkemmat tiedot - - - Jos poistat DS4Windows:in, voit poistaa myös asetukset kansiolinkistä - - - Viive: *number*ms - - - Asennus valmis - - - Asenna ajurit tästä - - - Asennus epäonnistui, kokeile uudelleen - - - Asennetaan... - - - Käytä Sixaxista auttamaan koskestuslevyn kalibroinnissa - - - Pidä ikkunan koko sulkemisen jälkeen - - - Ohjain *number* viive alle 10ms - - - Ohjain *number* viive yli 10ms - - - Käynnistä *program* - - - Himmennä valo jos ohjain ei ole käytössä - - - Ladataan... - - - Lataa *profile* - - - Macro - - - Uusi profiili - - - N/A - - - Uusi - - - Macroa ei nauhoitettu - - - (tyhjä) - - - tyhjä - - - Profiilia ei ladattu - - - Ohjain *number* profiilia ei ole käytössä - - - Ei kelpaa - - - Avataan asennusohjelmaa - - - Avaa ScpDriver.exe - - - , muut tiedostot poistetaan - - - Lataa päivitysohjelma nyt, siirrä se asennuskansioon ja tarkista päivitykset uudelleen - - - Tuo tai tee uusi profiili - - - Uusi profiili - - - *Profile name* ei voitu palauttaa - - - Profiilikansio siirrettiin ohjelmakansioon - - - Ohjelmat - - - KOKEELLINEN: Kytke Bluetooth automaattisesti pois kun ohjain liitetään USB:hen - - - Sinun täytyy poistua ohjelmista kuten Steam/Uplay ennenkuin aktivoit "piilota DS4-ohjain2" asetuksen - - - Nauhoita - - - Klikkaa hiiren oikealla napilla nähdäksesi esimääritellyt ohjainasetukset - - - Tallenna macro? - - - Scan code - - - Etsitään ohjaimia... - - - Valitse toiminto *action*lle - - - Aseta aktivointipainike - - - Aseta poiskytkentäpainike - - - Pikakuvakkeet - - - Klikkaa lisätietoja Sixaxiksesta - - - Käynnistetään - - - Käynnistä - - - Kohta 1: Asenna DS4 ajuri - - - Lopeta - - - Lopeta - - - DS4Windows suljettiiin - - - DS4 ohjaimet lopetetaan - - - X360 ohjaimet lopetetaan - - - Lopeta - - - Pyyhkäisy alas - - - Pyyhkäisy vasemmalle - - - Pyyhkäisy oikealle - - - Pyyhkäise kosketuslevyä vaihtaaksesi profiilia - - - Hipaisu ylös - - - Osoittimella vetäminen. Pieni viive yksittäisillä napautuksilla. - - - Testaa voimakas - - - Testaa hiljainen - - - Testaa - - - Tekstidokumentti (*.txt) - - - Kallistus alas - - - Kallistus vasemmalle - - - Kallistus oikealle - - - Kallistus ylös - - - Kosketuslevy pois päältä - - - Kosketuslevy päällä - - - Aktivoi uudelleen painamalla PS-näppäintä ja kosketuslevyä - - - 2 sormen pyyhkäisy vasemmalle tai oikealle - - - kirjoita uusi nimi tähän - - - kirjoita profiilin nimi tähän - - - Ei asetettu - - - Ylös - - - Sinulla on viimeisin versio - - - Voit myös vaihtaa kontrolleja suoraan ohjaimella - - - Exclusive mode käytössä - - - Ohjain *number* käyttää profiilia "*Profile name*" - - - Jaettu tila käytössä - - - Kosketuslevy ei toimi hiirenä - - - Aseta kelpaava nimi - - - Odota *number*ms - - - Pidetään - - - Käytä suurempaa porttinumeroa jos ohjelma ei toimi muiden X360 emulointiohjelmien kuten SCP toolin kanssa. - - - XML-tiedostot (*xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.fr-FR.resx b/DS4Windows/Properties/Resources.fr-FR.resx deleted file mode 100644 index fba058b234..0000000000 --- a/DS4Windows/Properties/Resources.fr-FR.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Le nom de cette action existe déja - - - Ajout à la liste... - - - Ajouter des Programmes - - - Un emplacement doit être choisi pour continuer - - - Toujours Mode Arc-en-ciel - - - Assigner à la Manette *number* - - - Batterie: *number*% - - - Conseillé d'utiliser avec le côté droit telle une souris - - - Parcourir... - - - Écriture impossible ici. Copier les paramètres vers Appdata? - - - Rechargée - - - Rechargement: *number*% - - - Verifiez la batterie - - - Fermer DS4Windows ? - - - Fermer DS4Windows via l'icone de notification - - - Couleur - - - Couleur selon le % de batterie - - - Connexion... - - - Éditer le Profil de la Manette *number* - - - Faire le Profil de la Manette *number* - - - La manette *Mac address* a été déconnectée ou la connexion a été perdue - - - Copie terminée, merci de relancer DS4Windows et supprimer les paramètres du Répertoire de l'Application - - - Cliquer pour copier la couleur entiere - - - Attention: Ouverture impossible de la DS4 *Mac Address* - - - jour - - - jours - - - Supprimer le profil? - - - Assombrir selon le % de batterie - - - Eteindre les entrées X360 et utiliser seulement DS4 en natif, Cacher ds4 Doit être éteint (uniquement en filaire) - - - Déconnecter Bluetooth - - - Déconnecté - - - Téléchargement *number*% - - - Télécharger la version *number* maintenant ? - - - Bas - - - Mise à jour de DS4Windows disponible ! - - - DS4Windows ne peut editer les paramètres ici, fermeture imminente. - - - Éditer - - - 5ème Bouton de Souris Bas - - - 5ème Bouton de Souris Haut - - - Cliquer pour changer la couleur du clignotement. Noir = couleur par défaut - - - Vider HID - - - Vider la file d'attente HID aprés chaque lecture - - - Manette trouvée: - - - 4ème Bouton de Souris Haut - - - 4ème Bouton de Souris Bas - - - Rempli - - - Cliquer pour voir les valeurs du Gyroscope Sixaxis - - - GyroX, Inclinaison Gauche et Droite - - - GyroY, Inclinaison Avant et Arriere - - - GyroZ, InclinaisonHaut et Bas - - - heure - - - heures - - - Survoler avec la souris pour voir une description ou plus d'infos - - - Si suppression de DS4Windows, vous pouvez supprimer les paramètres en suivant le lien du dossier de profil - - - Input Delay: *number*ms - - - Installation terminée - - - Installer les pilotes ici - - - Installation ... - - - Utiliser Sixaxis pour aider au calcul des mouvements du pavé tactile - - - Garder les dimensions de la fenêtre après fermeture - - - Manette *number* latence inférieure à 10 ms - - - Manette *number* latence supérieure à 10 ms - - - Démarrer *program* - - - Baisser la luminosité lors de la mise en veille - - - Chargement... - - - Charger *profile* - - - Macro - - - Créer un nouveau profil - - - N/A - - - Nouveau - - - Aucune macro enregistrée - - - (aucun) - - - aucun - - - Pas de profil chargé - - - Manette *number* n'a pas de profile - - - Invalide - - - Ouverture de l'installateur - - - Veuillez ouvrir ScpDriver.exe - - - , les fichiers à un autre endroit seront effacés - - - Veuillez télécharger le centre de mises à jour maintenant, placer le dans le dossier de l'application, puis vérifier de nouveau la disponibilité d'une mise à jour - - - Veuillez importer ou créer un profil - - - Nouveau Profile - - - *Profile Name* ne peut être restauré - - - Dossier du Profil déplacé vers le dossier contenant l'application - - - Programmes - - - EXPERIMENTAL : Déconnexion automatique du BT lors du branchement d'un cable USB - - - Vous devez quitter les autres applications telles que Steam, Uplay avant d'activer l'option "Cacher la manette DS4" - - - Enregistrer - - - Click droit pour choisir les pré-réglages d'une série de contrôles - - - Sauvegarder le macro enregistré? - - - Scannez le code - - - Cherche des manettes... - - - Sélectionner une action pour *action* - - - Raccourcis - - - Cliquer pour les valeurs avancées du Sixaxis - - - Ouverture... - - - Démarrer - - - Étape 1: Installez les pilotes DS4 - - - Arrêtez fort - - - Arrêtez léger - - - Arrêt de DS4Windows - - - Arrêt des manettes DS4 - - - Arrêt des manettes X360 - - - Arrêter - - - Glisser vers le bas - - - Glisser vers la gauche - - - Glisser vers la droite - - - Glisser sur la pavé tactile pour changer de profil - - - Glisser vers le haut - - - Appuyer et maintenir pour glisser, léger retard avec les simples pressions - - - Test fort - - - Test léger - - - Tilt Bas - - - Tilt Gauche - - - Tilt Droite - - - Tilt Haut - - - Reconnaissance de mouvement du pavé tactile est Désactivée - - - Reconnaissance de mouvement du pavé tactile est Activée - - - Relancez en appuyant sur PS + Pavé tactile - - - Glisser avec 2 doigts gauche ou droit sur le pavé tactile - - - écrire un nouveau nom ici - - - écrire un nom de profil ici - - - Haut - - - Votre version de DS4Windows est à jour - - - Vous pouvez également utiliser votre manette pour modifier les touches - - - Utilisation du mode Exclusif - - - La manette *number* utilise le profil "*Profile name*" - - - Utilisation du mode Partagé - - - Désactivation du pavé tactile comme souris - - - Veuillez insérer un nom valide - - - Attendre *number**ms* - - - Sera Garder - - - Arrêt de DS4Windows - - - Document Text (*.txt) - - - Fichiers XML (*.xml) - - - Impossible de deplacer les fichiers, Renommez le dossier DS4Tool à "DS4Windows" - - - Recharger la batterie - - - Retourner - - - Retourner a "bouton" - - - Installation échouée, Veuillez Réessayer - - - Definir Gachette Normale - - - Definir Gachette Decharger - - - Test - - - Non Assigner - - - Utilisez des ports plus hauts si vous rencontrer des conflits avec d'autres programmes, tels que l'outil SCP - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.he.resx b/DS4Windows/Properties/Resources.he.resx deleted file mode 100644 index f36bc1002a..0000000000 --- a/DS4Windows/Properties/Resources.he.resx +++ /dev/null @@ -1,495 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - שם הפעולה כבר קיים - - - הוספה לרשימה... - - - הוסף תוכניות - - - הוסף מיקום כדי להמשיך - - - תמיד במצב צבעוני - - - הגדר בבקר *number* - - - סוללה: %*number* - - - הצד הימני בשימוש הכי טוב עם פעולת עכבר - - - דפדף... - - - אין אפשרות להעביר את הקבצים למיקום החדש. שנה את שם ה-DS4Tool ל-"DS4Windows" - - - אין אפשרות לכתוב את המיקום הנוכחי. להעתיק הגדרות ל-%AppData%? - - - שנה את הסוללה - - - שונה - - - טוען: %*number* - - - בדוק מצב סוללה - - - לסגור את DS4Windows? - - - סגור את DS4Windows באמצעות סמל ההתראה - - - צבע - - - צבע לפי אחוזי סוללה - - - מתחבר - - - ערוך פרופיל של בקר *number* - - - צור פרופיל עבור בקר *number* - - - בקר *Mac address* הוסר או נותק - - - ההעתקה הושלמה. הפעל מחדש את DS4Windows והסר את ההגדרות מתיקיית התוכנית - - - לחץ להעתקת הצבע המלא - - - אזהרה: אי אפשר לפתוח את בקר *Mac address* בלעדית - - - יום - - - ימים - - - למחוק פרופיל? - - - תכהה כאשר מצב הסוללה הוא באחוז - - - כבה את קלט בקר ה-Xbox 360 והשתמש רק בקלט של בקר ה-DS4. הסתרת ה-DS4 חייבת להיות כבויה, כלומר הבקר צריך להיות מחובר חוטית - - - נתק Bluetooth - - - נותק - - - מוריד %*number* - - - למטה - - - עדכון זמין עבור DS4Windows - - - DS4Windows לא יכול לערוך את ההגדרות פה. החלון ייסגר - - - ערוך - - - לחץ לשינוי צבע האור. ברירת מחדל = שחור - - - בקר נמצא: - - - מלא - - - שעה - - - שעות - - - העבר את היכבר מעל פריטים כדי לראות את תיאורם - - - אם אתה מסיר את DS4Windows, אתה יכול למחוק את ההגדרות של הפרופיל - - - זמן המתנה בין פקודות: *number* מילישניות - - - התקנה הושלמה - - - תתקין את ההתקנים פה - - - התקנה נכשלה. נסה שוב - - - מתקין... - - - השתמש ב-Sixaxis בכדי לסייע לחישוב תזוזת משטח המגע - - - שמור על גודל החלון לאחר סגירתו - - - מהירות התגובה של בקר *number* היא מתחת 10 מילישניות - - - מהירות התגובה של בקר *number* היא מעל 10 מילישניות - - - פתח את *program* - - - גם, אם זמן השהייה הופעל והגיע למגבלתו, תכהה את האור במשטח - - - טוען... - - - טען *profile - - - צור פרופיל חדש - - - חדש - - - לא הוקלט Macro - - - לא נטענו פרופילים - - - בקר *number* לא משתמש בפרופיל - - - לא תקין - - - פותח התקנה - - - פתח ScpDriver.exe - - - . מיקומי קבצים אחרים יימחקו - - - תוריד את ה-Updater ושים אותו בתיקיית התוכנה. לאחר מכן, בדוק עבור עדכונים שוב - - - ייבא או צור פרופיל - - - צור פרופיל חדש - - - *Profile name* לא יכול להיות משוחזר. - - - תיקיית הפרופיל הועברה לתיקיית התוכנה - - - תוכנות - - - ניסיוני: בטל Bluetooth אוטומטית בעת התחברות ל-USB - - - אתה חייב לסגור תוכנות כמו Steam ו-Uplay לפני הפעלת האפשרות "הסתר בקר" - - - הקלט - - - קליק-ימני בשביל להגדיר תבניות לסטים של מקשים - - - לשמור הקלטת Macro? - - - סרוק קוד - - - מחפש בקרים... - - - בחר פעולה עבור *action* - - - קיצורי דרך - - - לחץ לקריאת Sixaxis מתקדמת - - - מתחיל... - - - התחלה - - - צעד 1: תתקין את התקן ה-DS4 - - - הפסק רטט כבד - - - הפסק אור - - - DS4Windows הופסק - - - מפסיק בקרי DS4 - - - מפסיק בקרי Xbox 360 - - - הפסק - - - החלק למטה - - - החלק שמאלה - - - החלק ימינה - - - החלק על משטח המגע כדי לשנות פרופילים - - - החלק למעלה - - - בשביל לגרור, לחץ והחזק או גע והמתן זמן קצר - - - נסה רטט כבד - - - נסה רטט קל - - - ניסיון - - - מסמך טקסט (txt.*) - - - הטה מטה - - - הטה שמאלה - - - הטה ימינה - - - הטה מעלה - - - תזוזת משטח המגע כבויה - - - תזוזת משטח המגע פעילה - - - הפעל מחדש על-ידי החזקה של מקש ה-PlayStation ובו-זמנית נגיעה במשטח המגע - - - החלק שתי אצבעות ימינה או שמאלה על משטח המגע - - - רשום שם חדש - - - רשום שם פרופיל חדש - - - לא הוגדר - - - מעלה - - - ברשותך גרסת התוכנה העדכנית ביותר - - - באפשרותך להשתמש בבקר בכדי לשנות מקשים - - - באמצעות "מצב בלעדי" - - - בקר *number* משתמש בפרופיל "*Profile name*" - - - משתמש ב"מצב שיתוף" - - - זה מבטל את השימוש במשטח המגע כעכבר - - - הכנס שם תקין - - - חכה *number* מילישניות - - - יישמר - - - תשתמש בפורטים גבוהים יותר במידה ואימולטור של Xbox 360 נתקל בקונפליקט עם תוכנה זו - - - קבצי XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.hu.resx b/DS4Windows/Properties/Resources.hu.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.hu.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.id.resx b/DS4Windows/Properties/Resources.id.resx deleted file mode 100644 index 496f9d4fb6..0000000000 --- a/DS4Windows/Properties/Resources.id.resx +++ /dev/null @@ -1,135 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Versi Terbaru terpasang - - - Controller *number* menggunakan profil "*Profile name*" - - - Masukkan nama yang benar - - - Tunggu *number*ms - - - File XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.it-IT.resx b/DS4Windows/Properties/Resources.it-IT.resx deleted file mode 100644 index 4d6914cd85..0000000000 --- a/DS4Windows/Properties/Resources.it-IT.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Il Nome di questa azione esiste già - - - Aggiungendo alla lista... - - - Aggiungi Programmi - - - Una locazione deve essere scelta per continuare - - - Sempre Modalità Arcobaleno - - - Assegna al Controller *number* - - - Batteria: *number*% - - - Consigliato usare con la parte destra come funzione del mouse - - - Sfoglia... - - - Non è possibile scrivere alla locazione corrente. Copiare le Impostazioni in appdata? - - - Carica - - - In carica: *number*% - - - Chiudere DS4Windows? - - - Chiudi DS4Windows via icona di notifica - - - Colore - - - Colore per % Batteria - - - Collegamento... - - - Modifica Profilo per il Controller *number* - - - Crea Profilo per il Controller *number* - - - Il Controller *Mac address* è stato rimosso oppure ha perso la connessione - - - Copia completa, per favore rilancia DS4Windows e rimuovi le impostazioni dalla Directory del Programma - - - Clicca per copiare il colore - - - Attenzione: Non è stato possibile aprire DS4 *Mac address* esclusivamente - - - giorno - - - giorni - - - Cancellare Profilo? - - - Ottenuare quando % Batteria - - - Spegnere X360 input e usare solo l'input nativo di DS4, nascondi ds4 deve essere disattivato (Solo tramite cavo) - - - Disconnetti BT - - - Disconnesso - - - In Download *number*% - - - Scaricare la Versione *number* ora? - - - Giù - - - Aggiornamento DS4Windows Disponibile! - - - DS4Windows non può modificare le impostazioni qui, Questo verrà ora chiuso - - - Modifica - - - Torna Indietro - - - 5° Pulsante del Mouse Giù - - - 5° Pulsante del Mouse Su - - - Clicka per cambiare il colore del lampeggio. Nero = colore di default - - - Flush HID - - - Flush Coda HID dopo ogni lettura - - - Trovato Controller: - - - 4° Pulsante del Mouse Giù - - - 4° Pulsante del Mouse Su - - - Piena - - - Clicka per vedere readout del Sixaxis Gyro - - - GyroX, Inclinazione Sinistra e Destra - - - GyroY, Inclinazione Avanti e Indietro - - - GyroZ, Inclinazione Su e Giù - - - ora - - - ore - - - Passa sopra le voci per vederne la descrizione o più dettagli - - - Se rimuovi DS4Windows, puoi cancellare le impostazioni seguendo il link alla cartella profilo - - - Ritardo Input: *number*ms - - - Installazione Completata - - - Installa Driver qui - - - Installazione... - - - Usa Sixaxis per aiutare a calcolare i movimenti touchpad - - - Mantieni questa dimensione della finestra dopo la chiusura - - - Lancia *program* - - - Oscura luminosità anche dopo un tempo di inattività se ON - - - Caricamento... - - - Carica *profile* - - - Macro - - - Crea un Nuovo Profilo - - - N/A - - - Nuovo - - - Nessuna macro registrata - - - (nessuno) - - - nessuno - - - Nessun Profilo Caricato - - - Non valido - - - Apertura Installer - - - Per favore Aprire ScpDriver.exe - - - , i file nelle altre cartelle verranno cancellati - - - Per favore Scarica l'Uploader ora, e posizionalo nella cartella del programma, poi controlla per aggiornamenti nuovamente - - - Per favore importa o crea un profilo - - - Nuovo Profilo - - - *Profile name* non può essere ripristinato. - - - Cartella del Profilo spostata nella cartella del programma - - - Programmi - - - SPERIMENTALE: Auto-Disabilita BT quando ci si connette con USB - - - Devi chiudere le altre applicazioni come Steam, Uplay prima di attivare l'opzione 'Nascondi Controller DS4'. - - - Registra - - - Click Destro per impostare presets per un set di controlli - - - Salvare Macro Registrata? - - - Scansiona Codice - - - In cerca di controller... - - - Seleziona un'azione per *action* - - - Imposta Trigger Regolare - - - Imposta Trigger Unload - - - Scorciatoie - - - Clicka per letture avanzate del Sixaxis - - - Inizio... - - - Inizia - - - Passo 1: Installa il Driver DS4 - - - Arresto Pesante - - - Arresto Leggero - - - DS4Windows Arrestato - - - Controller DS4 in arresto - - - X360 Controller in arresto - - - Arresta - - - Swipe Giù - - - Swipe Sinistra - - - Swipe Destra - - - Effettuare Swipe sul Touchpad per cambiare profili - - - Swipe Su - - - Tap e mantenere per trascinare, piccolo ritardo con tap singoli - - - Test Pesante - - - Test Leggero - - - Inclina Giù - - - Inclina a Sx - - - Inclina a Dx - - - Inclina Su - - - Movimenti Touchpad sono ora Disattivati - - - Movimenti Touchpad sono ora Attivati - - - Ri-abilita premendo PS+Touchpad - - - Swipe Touchpad a 2 dita a sinistra o a destra - - - Scrivi nuovo nome qui - - - Scrivi nome profilo qui - - - Su - - - Sei aggiornato - - - Puoi anche usare il tuo controller per cambiare i controlli - - - Utilizzando Modalità Esclusiva - - - Il Controller *number* sta usando il Profilo "*Profile name*" - - - Utilizzando Modalità Condivisa - - - Questo disabilita il Touchpad come mouse - - - Per favore immettere un nome valido - - - Aspetta *number**ms* - - - Mantenere - - - Usa porte più alte se ricevi conflitti in altri programmi emulatori X360, come il tool SCP - - - Latenza del Controller *number* ora inferiore a 10ms - - - Latenza del Controller *number* superiore a 10ms - - - Il Controller *number* non sta utilizzando alcun profilo - - - Controlla Batteria - - - DS4Windows Arrestato - - - Documento di Testo (*.txt) - - - Impossibile spostare i file in un nuova cartella. Rinomina la cartella DS4Tool in "DS4Windows" - - - Carica la Batteria - - - Installazione Fallita. Riprova - - - Test - - - Non Assegnato - - - File XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ja.resx b/DS4Windows/Properties/Resources.ja.resx index d58980a38d..3a2f2b950a 100644 --- a/DS4Windows/Properties/Resources.ja.resx +++ b/DS4Windows/Properties/Resources.ja.resx @@ -1,4 +1,4 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 이 동작의 이름이 이미 존재합니다 - - - 리스트로 추가.. - - - 프로그램 추가 - - - 진행을 위해선 경로를 지정해야 합니다 - - - 항상 레인보우 모드로 - - - 컨트롤러 *number* 로 지정 - - - 배터리: *number*% - - - 마우스로 오른편 사용시 제일 좋음 - - - 찾아보기 - - - 새로운 경로로 이동할 수 없습니다, DS4Tool 폴더이름를 "DS4Windows"로 바꿔주세요 - - - 현재 경로에 쓸 수 없습니다. 설정을 appdata로 복사 할까요? - - - 배터리 충전 - - - 충전 완료 - - - 충전 중 : *number*% - - - 배터리 체크 - - - DS4Windows를 종료 하시겠습니까? - - - 작업 표시줄 아이콘으로 닫기 - - - - - - 배터리가  %일때 색 - - - 연결중... - - - 컨트롤러 *number* 의 프로파일을 편집 - - - 컨트롤러 *number* 의 프로파일을 만들기 - - - 컨트롤러 *Mac address*가 해제되었거나 연결이 끊겼습니다 - - - 복사 완료, DS4Windows를 다시시작 하시고 프로그램 경로의 세팅을 삭제해 주시기 바랍니다 - - - 선택하여 모든 색을 복사 - - - 주의: DS4 *Mac address*를 단독으로 열 수 없었습니다 - - - - - - - - - 프로파일을 삭제할까요? - - - 배터리 %에 따라 어두워짐 - - - X360 입력을 끄시고 DS4의 기본 입력만 사용해주세요, 숨겨진 DS4는 꺼져있어야 합니다. (무선) - - - 블루투스 연결 해제 - - - 연결 해제됨 - - - 다운로드 중 *number*% - - - 버젼 *number*을 다운로드 할까요? - - - 아래 - - - DS4Windows의 업데이트가 가능합니다! - - - 여기선 DS4Windows의 설정이 불가합니다. 창이 닫힙니다. - - - 편집 - - - 되돌리기 - - - *button*까지 되돌리기 - - - 마우스 5버튼 아래 - - - 마우스 5버튼 위 - - - 눌러서 반짝이는 색을 바꿉니다. 검은색 = 기본 - - - HID 초기화 - - - 매 읽기 후 HID열을 초기화 - - - 컨트롤러 발견함: - - - 마우스 4버튼 아래 - - - 마우스 4버튼 위 - - - 꽉참 - - - 클릭하여 육축 자이로 센서의  정보를 봅니다. - - - 자이로X, 왼쪽 오른쪽 기울기 - - - 자이로Y, 앞 뒤 기울기 - - - 자이로Z, 위 아래 기울기 - - - 시간 - - - 시간 - - - 마우스 포인터를 올려놓아 내용을 봅니다 - - - DS4Windows를 삭제할시, 당신은 다음 프로파일 폴더 링크에서 세팅을 지울 수 있습니다 - - - 입력 지연: *number*ms - - - 설치 완료 - - - 여기에 드라이버를 설치하세요 - - - 설치 실패, 다시 시도해 주세요 - - - 설치중... - - - 육축센서를 통해 터치패드 동작 계산을 도와주세요. - - - 종료 후에도 창 사이즈를 기억함 - - - 컨트롤러 *number*의 지연이 10ms 이하 입니다. - - - 컨트롤러 *number*의 지연이 10ms를 넘었습니다. - - - *program* 실행 - - - 키면 미사용시 라이트도 같이 꺼짐 - - - 로딩중... - - - *profile* 로드 - - - 메크로 - - - 새로운 프로파일 만들기 - - - N/A - - - 새로 만들기 - - - 녹화된 메크로가 없습니다 - - - (없음) - - - 없음 - - - 로드된 프로파일이 없습니다 - - - 컨트롤러 *number*가 프로파일을 사용하고 있지 않습니다 - - - 무효 - - - 인스톨러 여는중 - - - ScpDriver.exe를 실행해주세요 - - - , 다른 경로의 파일은 삭제될 것입니다 - - - 업데이터를 다운해서 프로그램 폴더에 넣은 후 다시 업데이트를 체크해주세요 - - - 들여오기 혹은 프로파일을 만들어주세요 - - - 새로운 프로파일 - - - *Profile name* 은(는) 복원이 불가합니다 - - - 프로파일 폴더가 프로그램 폴더로 욺겨졌습니다 - - - 프로그램 - - - 실험 버전: USB로 연결될때 자동으로 블루투스 연결 해제 - - - DS4 컨트롤러 숨기기' 항목을 실행하기 전 스팀, 유플레이등의 프로그램을 반드시 끄셔야합니다. - - - 녹화 - - - 오른 클릭으로 컨트롤의 프리셋을 정함 - - - 녹화된 메크로를 저장할까요? - - - 코드 스캔 - - - 컨트롤러 검색중... - - - *action*의 동작을 선택하세요 - - - 기본 트리거 설정 - - - 언로드 트리거 설정 - - - 숏컷 - - - 눌러서 고급 육축센서 수치를 봅니다 - - - 시작중... - - - 시작 - - - 첫번째 : DS4 드라이버를 설치한다 - - - 강한 진동 정지 - - - 약한 진동 정지 - - - DS4Windows를 중지했습니다 - - - DS4 Controllers를 중지하는 중 - - - X360 Controllers를 중지하는 중 - - - 중지 - - - 아래로 스와이프 - - - 왼쪽으로 스와이프 - - - 오른쪽으로 스와이프 - - - 터치패드를 스와이프하여 프로파일을 바꿉니다 - - - 위로 스와이프 - - - 탭한 상태로 드래그, 탭할시 약간의 지연이 있습니다 - - - 강한 진동 테스트 - - - 약한 진동 테스트 - - - 테스트 - - - 텍스트 파일 (*.txt) - - - 아래로 기울기 - - - 왼쪽으로기울기 - - - 오른쪽으로 기울기 - - - 위로 기울기 - - - 터치패드 동작이 꺼졌습니다 - - - 터치패드 동작이 켜졌습니다 - - - PS+터치패드를 눌러 다시 활성화 시킵니다 - - - 두 손가락으로 터치패드에서 왼쪽 혹은 오른쪽으로 스와이프 - - - 새로운 이름을 써주세요 - - - 프로파일 이름을 써주세요 - - - 미지정 - - - - - - 이미 최신버전입니다. - - - 당신의 컨트롤러로 컨트롤을 바꿀수도 있습니다. - - - 독립모드 실행 - - - 컨트롤러 *number* 이 프로파일 “*Profile name*" 을 사용하고 있습니다 - - - 공유모드 사용 - - - 이것은 터치패드 마우스 조작을  끕니다. - - - 알맞은 이름을 써주세요 - - - *number*ms동안 기다려주세요 - - - 유지함 - - - 만약 다른 X360 에뮬레이팅 프로그램(예: SCP's tool)과 충돌이 일어난다면 더 높은 포트를 사용해주세요. - - - XML 파일 (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.nl.resx b/DS4Windows/Properties/Resources.nl.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.nl.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.pl.resx b/DS4Windows/Properties/Resources.pl.resx deleted file mode 100644 index 325010fed0..0000000000 --- a/DS4Windows/Properties/Resources.pl.resx +++ /dev/null @@ -1,516 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Nazwa tej akcji już istnieje - - - Dodawanie do listy... - - - Dodaj programy - - - Lokalizacja musi zostać wybrana aby kontynuować - - - Zawsze w Trybie Tęczy - - - Przypisz do Kontrolera *numer* - - - Bateria: *numer*% - - - Najlepiej używać prawej strony jako funkcje w myszce - - - Wyszukaj... - - - Nie mozna zapisac w obecnej lokalizacji. Kopiuj ustawienia do "appdata"? - - - Naładowany - - - Ładowanie *number*% - - - Sprawdź baterie - - - Zamknąć DS4Windows? - - - Zamknij zminimalizowane - - - Kolor - - - Kolor baterii % - - - Łączenie... - - - Edytuj profil dla Kontrolera *number* - - - Stwórz profil dla Kontrolera *number* - - - Kontroler *Mac address* został usunięty lub utracił połączenie - - - Kliknij, żeby skopiować pełen kolor - - - Ostrzeżenie: Nie można otworzyć DS4 *Mac address*. - - - dzień - - - dni - - - Usunąć profil? - - - Przyciemnij baterie o % - - - Wyłącz wejście X360 i używaj tylko standardowego wejścia DS4, opcja ukryj ds4 musi zostać wyłączona (tylko przewodowo) - - - Rozłącz Bluetooth - - - Rozłączono - - - Pobieranie *number*% - - - Chcesz teraz pobrać wersję *number*? - - - Dół - - - Dostępna aktualizacja dla DS4Windows! - - - DS4Windows nie może edytować tu ustawień, Okno zostanie zamknięte - - - Edytuj - - - Wycofaj - - - 5 Przycisk Myszy Wciśnięty - - - 5 Przycisk Myszy Puszczony - - - Znaleziono Kontroler: - - - 5 Przycisk Myszy Wciśnięty - - - 5 Przycisk Myszy Puszczony - - - Naładowany - - - Godzina - - - Godziny - - - Opóźnienie wejścia: *number*ms - - - Instalacja zakonczona - - - Zainstaluj tutaj sterowniki - - - Instalacja... - - - Zapamiętaj rozmiar okna po zamknięciu - - - Uruchom *program* - - - Wczytywanie... - - - Wczytaj *profile* - - - Macro - - - Stwórz nowy profil - - - Niedostępne - - - Nowy - - - Nie zapisano makra - - - (brak) - - - brak - - - Nie załadowano profilu - - - Kontroler *number* nie używa profilu - - - Nieprawidłowy - - - Otwieranie instalatora - - - Proszę otworzyć ScpDriver.exe - - - Proszę zimportować lub stworzyć profil - - - Nowy profil - - - *Profile name* nie mógł zostać przywrócony - - - Folder z profilem został przeniesiony do foldera z programem - - - Programy - - - Szybkie ładowanie - - - Zamknij programy takie jak Steam, Uplay przed aktywowaniem opcji "Ukryj kontroler DS4" - - - Nagrywanie - - - Zapisać nagrane Macro? - - - Szukanie kontrolerów... - - - Wybierz działanie dla *action* - - - Skróty - - - Uruchamianie... - - - Start - - - Krok 1: Zainstaluj DS4 Driver - - - Wstrzymaj słabe - - - Zatrzymano DS4Windows - - - Zatrzymano DS4Windows - - - Zatrzymywanie Kontrolerów DS4 - - - Zatrzymywanie Kontrolerów X360 - - - Stop - - - Przesuń w dół - - - Przesuń w lewo - - - Przesuń po panelu dotykowym aby zmienić profil - - - Przesunięcie dwoma palcami na panelu dotykowym w lewo lub prawo - - - Wpisz tutaj nową nazwę - - - Wpisz tutaj nową nazwę profilu - - - Góra - - - Posiadasz najnowszą wersje oprogramowania - - - Możesz także użyć swojego kontrolera aby zmienić sterowanie - - - Tryb wyłączności - - - Kontroler *number* używa profilu "*Profile name*" - - - Zablokowanie używania panelu dotykowego jako myszy - - - Zostanie zachowane - - - Czekaj *number**ms* - - - Kliknij aby uzyskać zaawansowane odczyty Sixaxis - - - Wstrzymaj silne - - - Przesuń w prawo - - - Przesuń w górę - - - Testuj silne - - - Testuj słabe - - - Test - - - Pliki tekstowe (*.txt) - - - Wychyl w dół - - - Wychyl w lewo - - - Wychyl w prawo - - - Wychyl w górę - - - Poruszanie się panelem dotykowym jest teraz WYŁĄCZONE - - - Poruszanie się panelem dotykowym jest teraz WŁĄCZONE - - - Włącz ponownie przez wciśnięcie przycisku PS i panelu dotykowego - - - Nieprzypisany - - - Tryb udostępniania - - - Wpisz prawidłową nazwe - - - Użyj kolejnych portów, jeśli pojawiają się konflikty z innymi programami emulującymi X360 jak SCP's tool - - - Pliki XML (*.xml) - - - Nie można przenieś plików do nowej lokacij, zmień nazwę folderu DS4Tool na "DS4Windows" - - - Ładowanie bateri - - - Kopiowanie kompletne, zrestartuj DS4Windows i usuń ustawienia z folderu programu - - - Cofnij do *przycisk* - - - Kliknij to zmieny koloru diody kontrolera. Czarny = domyślny kolor - - - Instalacja zakończona niepomyślnie, Proszę spróbować ponownie - - - Użyj Sixaxis dla lepszego kalkulowania ruchów touchpada - - - Kontroler *number* opoźnienie poniżej 10ms - - - Kontroler *number* opoźnienei ponad 10ms - - - Macro zapisane - - - Klawisz wielofunkcyjny - - - Wybierz macro - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.pt-BR.resx b/DS4Windows/Properties/Resources.pt-BR.resx deleted file mode 100644 index e33d53330d..0000000000 --- a/DS4Windows/Properties/Resources.pt-BR.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - O nome desta ação já existe - - - A adicionar à Lista... - - - Adicionar Programas - - - Sempre em Modo Arco-Íris - - - Atribuir ao Controlador *number* - - - Bateria: *number*% - - - Melhor usado com o lado direito como função do rato - - - Procurar... - - - Impossivel Copiar Para Local Atual. Copiar para AppData? - - - Carregado - - - A carregar: *number*% - - - Fechar o DS4Windows através do ícone de notificação - - - Cor - - - Cor por % de Bateria - - - A Conectar... - - - Editar Perfil para Controlo *number* - - - Criar Perfil para Controlo *number* - - - Conexão do controlador *Mac address* foi perdida ou removida - - - Cópia completa, por favor reinicie o DS4Windows e elimine as configurações do Diretório do Programa - - - Clicar para copiar a cor - - - Atenção: Não foi possível abrir exclusivamente o *Mac address* do DS4 - - - Dia - - - Dias - - - Eliminar Perfil? - - - Dissipar por % de Bateria - - - Desligue a entrada X360 e use apenas o input nativo do DS4, função de Esconder DS4 deve estar Desligada (Por Cabo apenas) - - - Desconectado - - - A Transferir *number*% - - - Transferir Versão *number* agora? - - - Para Baixo - - - Atualização do DS4Windows Disponível! - - - O DS4Windows não conseguiu editar as definições aqui, isto vai agora fechar - - - Editar - - - 5ª Botão do Rato para baixo - - - 5ª Botão do Rato para cima - - - Despejar HID - - - Controlo Encontrado: - - - 4ª Botão do Rato para baixo - - - 4ª Botão do Rato para cima - - - Cheio - - - hora - - - horas - - - Se remover o DS4Windows, pode apagar as definições seguindo o link da pasta de Perfil - - - Atraso de Entrada: *number*ms - - - Instalação Completa - - - Instalar Drives aqui - - - A instalar... - - - Manter o tamanho da janela após fechar - - - Executar *program* - - - A Carregar... - - - Carregar *profile* - - - Criar um Novo Perfil - - - Não Disponível - - - Novo - - - Nenhum Macro foi Gravado - - - (nenhum) - - - nenhum - - - Nemhum Perfil Carregado - - - Inválido - - - A abrir o Instalador - - - Por favor, abra o ScpDriver.exe - - - Por favor, transfira o Updater agora, coloque-o na pasta Programas e depois procure por atualizações outra vez - - - Por favor, importe ou crie um Perfil - - - *Profile name* não pode ser restaurado. - - - Pasta de Perfil movida para a pasta Programas - - - É necessário sair de outras aplicações, como a Steam ou a Uplay, antes de ativar a opção 'Ocultar o Controlo DS4'. - - - Gravar - - - Clicar com o botão direito do rato para definir padrões para um set de comandos - - - Gravar Macro Gravada? - - - À procura de controlos... - - - Selecione uma ação para *action* - - - Definir Gatilho Regular - - - Definir Gatilho de Descarregar - - - A Iniciar... - - - Iniciar - - - Passo 1: Instalar a Drive do DS4 - - - Parar Vibração Pesada/Forte - - - Parar Vibração Leve/Ligeira - - - O DS4Windows foi parado - - - A parar os Controlos DS4 - - - A parar os Controlos X360 - - - Parar - - - Deslizar no Painel de Toque para mudar Perfis - - - Toque e segure para arrastar, ligeiro atraso com cliques únicos - - - Testar Vibração Pesada/Forte - - - Testar Vibração Leve/Ligeira - - - Inclinar para Baixo - - - Inclinar para a Esquerda - - - Inclinar para a Direita - - - Inclinar para Cima - - - Movimento no Painel de Toque está agora Desligado - - - Movimento no Painel de Toque está agora Ligado - - - Deslize de 2 dedos no Painel de Toque para a Esquerda/Direita - - - Escrever novo nome aqui - - - Escrever Nome de Perfil aqui - - - Cima - - - Está com a versão mais recente - - - Também é possível usar o comando para mudar os controlos - - - A usar o modo Exclusivo - - - Controlo *number* está a usar o Perfil “*Profile name*" - - - A usar o modo Partilhado - - - Por favor, insira um nome válido - - - Por favor, espere *number*ms - - - Manter - - - Novo Perfil - - - Uma localização precisa ser escolhida para continuar - - - Ver Bateria - - - Fechar o DS4Windows? - - - Desconectar BT - - - Clique para mudar a cor da luz de flash. Preto = cor padrão - - - Eixo X, Incinação Esquerda/Direita - - - Eixo Y, Inclinação Frente/Trás - - - Eixo Z, Inclinação Cima/Baixo - - - Passe o rato por cima de itens para visualizar funções e descrições - - - Use o Sixaxis para ajudar a calcular o movimento do Painel de Toque - - - A latência do Controlo *number* está abaixo de 10ms - - - A latência do Controlo *number* está acima de 10ms - - - Macro - - - Controlo *number* não está a usar um Perfil - - - , ficheiros de outras localizações serão eliminados - - - Programas - - - EXPERIMENTAL: Auto-desabilitar o BT quando conectar através de USB - - - Código de digitalização - - - Atalhos - - - DS4Windows Parou - - - Deslizar para Baixo - - - Deslizar para a Esquerda - - - Deslizar para a Direita - - - Deslizar para Cima - - - Documento de Texto (*.txt) - - - Re-habilitar pressionando PS+Painel de Toque - - - Isto desabilita o controle do Painel de Toque como rato - - - Use portas mais altas se houver conflitos com outros programas de emulação de X360, como por exemplo a ferramenta do SCP - - - Impossível mover ficheiros para a nova localização, por favor renomeie a pasta de DS4Tool para DS4Windows - - - Carregar a Bateria - - - Fall Back - - - Fall Back para *button* - - - Despejar Fila de HID depois de cada leitura - - - Clicar para ler sobre o Giroscópio Sixaxis - - - Instalação Falhada, por favor volte a tentar - - - Também diminuir a luz por inactividade quando Ligado - - - Clicar para leitura avançada do Sixaxis - - - Testar - - - Não Atribuído - - - Ficheiros XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.resx b/DS4Windows/Properties/Resources.resx index 2cc05e50bf..cb9c6ab616 100644 --- a/DS4Windows/Properties/Resources.resx +++ b/DS4Windows/Properties/Resources.resx @@ -117,129 +117,17 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - ..\Resources\mouse.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\rainbow.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\rainbowC.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4 Controller.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\Pairmode.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\shell32_copy.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\shell32_new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\delete.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\imageres_new.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\BT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\none.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\USB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\export.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\imageres_import.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\saveprofile.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\A.PNG;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\B.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\BACK.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DOWN.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LEFT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSD.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSR.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LSU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\LT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RB.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RIGHT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSD.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSL.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSR.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RSU.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\RT.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\START.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\UP.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\X.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Name of this action already exists - - ..\Resources\Y.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Adding to list... - - ..\Resources\size.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Add Programs - - ..\Resources\checked.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + A location must be picked to continue Always Rainbow Mode @@ -253,17 +141,47 @@ Best used with right side as a mouse function + + Browse... + + + Determines the poll rate used for the DS4 hardware when connected via Bluetooth. (Applies on profile save) + + + Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows" + Cannot write at current location. Copy Settings to appdata? + + Charge the battery + Charged Charging: *number*% + + Check Battery + + + This will disconnect all your connected controllers. Proceed? + + + Close DS4Windows? + + + Closing main window minimizes app. Quitting app will be done via the notification icon + + + Color + - Color by Battey % + Color by Battery % + + + Confirm... Connecting... @@ -296,7 +214,10 @@ Delete Profile? - Dim by Battey % + Dim by Battery % + + + Disconnect BT Disconnected @@ -307,24 +228,49 @@ Download Version *number* now? + + Down + + + + ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows Update Available! + + ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows cannot edit settings here, This will now close + + ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Edit + + Fall Back + + + Fall Back to *button* + 5th Mouse Button Down 5th Mouse Button Up + + Click to change flash color. Black = default color + Flush HID + + Flush HID Queue after each reading + Found Controller: @@ -337,24 +283,87 @@ Full + + Click to see readout of Sixaxis Gyro + + + Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active. + + + GyroX, Left and Right Tilt + + + GyroY, Forward and Back Tilt + + + GyroZ, Up and Down Tilt + hour hours + + Hover over items to see description or more about + If removing DS4Windows, You can delete the settings following the profile folder link + + Input Delay: {0:0.##} ms + Install Complete + + Install Drivers here + + + Install Failed, Please Retry + + + Installing... + + + Use Sixaxis to help calculate touchpad movement + + + Keep this window size after closing + + + Language pack change will take effect after DS4Windows application is restarted. + + + Controller *number*'s latency now under 10ms + + + Controller {0}'s latency over 10ms ({1} ms) + + + Launch *program* + + + Also dim light by idle timeout if enabled when DS4 is fully charged + Loading... + + Load *profile* + + + Macro + + + Macro Recorded + Make a New Profile + + Mutli-Action Button + N/A @@ -373,6 +382,9 @@ No Profile Loaded + + Controller {0} is not using a profile. Battery level is {1}% + Not valid @@ -382,146 +394,116 @@ Please Open ScpDriver.exe + + , other location files will be deleted + - Please Download the Updater now, and place it in the programs folder, then check for update again + Please Download the Updater now, place it in the programs folder and rename to DS4Updater.exe if on x86, then check for update again. DS4Windows will attempt to open DS4Updater Release page when this window is closed. Please import or make a profile + + New Profile + *Profile name* cannot be restored. Profile Folder Moved to program folder - - You must quit other applications like Steam, Uplay before activating the 'Hide DS4 Controller' option." - - - Save Recorded Macro? - - - Searching for controllers… - - - Select an action for *action* - - - Starting... - - - Start - - - Stopping DS4 Controllers - - - Stopping X360 Controllers + + Programs - - Stop + + Auto-Disable BT when connecting to USB - - Swipe Touchpad to change profiles + + You must quit other applications like UWP apps (Netflix), Steam, Uplay, Edge, NVIDIA IN-GAME before activating the 'Hide DS4 Controller' option. For more info check https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues - - Tap and hold to drag, slight delay with single taps + + Record - - Touchpad Movement is now Off + + Right Click to set presets for a set of controls - - Touchpad Movement is now On + + Tells Windows to start DS4Windows after login - - type new name here + + Save Recorded Macro? - - type profile name here + + Scan Code - - You can also use your controller to change controls + + Searching for controllers... - - Using Exclusive Mode + + Select an action for *action* - - Using Shared Mode + + Select a macro - - Please enter a valid name + + Set Regular Trigger - - Wait *number*ms + + Set Unload Trigger - - Will Keep + + Shortcuts - - 2 finger touchpad swipe left or right + + Calibration of sixaxis wheel emulation - - You are up to date + + (1) Center the controller, hold it steady and press "X" - - Adding to list... + + (2) Turn to 90° left (or right) position and press "X" - - Add Programs + + (3) Turn to 90° right (or left) position and press "X" - - Browse... + + All calibraton points are set when lightbar color turns to green. While turning the controller the lightbar color flashes when the controller is at calibration point. Accept calibration with OK button - - Color + + Cannot calibrate gyro (sixaxis) steering wheel emulation values without a controller. Connect a controller via bluetooth or usb - - Down + + Gyro steering wheel emulation axis option is set to NONE (emulation is not used). Please select an axis option before calibrating the sixaxis gyro steering wheel emulation - - Input Delay: *number*ms + + Click for advanced Sixaxis reading - - Keep this window size after closing + + Starting... - - Record + + Start - Step 1: Install the DS4 Driver - - - Up - - - Turn off X360 input and only use the DS4's native input, hide ds4 must be off (Wired Only) - - - Install Drivers here - - - Tilt Down + Step 1: Install the ViGEmBus Driver - - Tilt Left - - - Tilt Right + + Stop Heavy - - Tilt Up + + Stop Light - - Installing... + + Stopped DS4Windows - - ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Stopping DS4 Input Controllers - - ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Stopping Virtual Output Controllers - - Install Failed, Please Retry + + Stop Swipe Down @@ -532,14 +514,14 @@ Swipe Right + + Swipe Touchpad to change profiles + Swipe Up - - Stop Heavy - - - Stop Light + + Tap and hold to drag, slight delay with single taps Test Heavy @@ -547,232 +529,118 @@ Test Light - - EXPERIMENTAL: Auto-Disable BT when conencting to USB - Test - - Cannot move files to new location, Please rename the DS4Tool folder to "DS4Windows" - - - Use higher ports if you get conflicts in other emulating X360 programs, such as SCP's tool - - - Name of this action already exists - - - Launch *program* - - - Load *profile* - - - Set Regular Trigger - - - Set Unload Trigger - - - Close DS4Windows via the notification icon - - - Right Click to set presets for a set of controls - - - Disconnect BT - - - New Profile - - - Fall Back to *button* - - - Click to change flash color. Black = default color - - - Flush HID Queue after each reading - - - Click to see readout of Sixaxis Gyro - - - GyroX, Left and Right Tilt - - - GyroY, Forward and Back Tilt - - - GyroZ, Up and Down Tilt - - - Hover over items to see description or more about - - - Use Sixaxis to help calculate touchpad movement + + Text Document (*.txt) - - Also dim light by idle timeout if on + + Tilt Down - - Macro + + Tilt Left - - Programs + + Tilt Right - - Scan Code + + Tilt Up - - Shortcuts + + Touchpad Movement is now Off - - Click for advanced Sixaxis reading + + Touchpad Movement is now On Re-enable by pressing PS+Touchpad - - This disables the Touchpad as a mouse - - - Fall Back - - - A location must be picked to continue + + 2 finger touchpad swipe left or right - - Close DS4Windows? + + type new name here - - , other location files will be deleted + + type profile name here - - ..\Resources\EE.wav;System.IO.MemoryStream, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + You need to run DS4Windows as the Administrator in order to activate this mode. - - Stopped DS4Windows + + Unassigned - - Controller *number*'s latency now under 10ms + + Up - - Controller *number*'s latency over 10ms + + DS4Windows application is up-to-date. - - Controller *number* is not using a profile + + You can also use your controller to change controls - - Check Battery + + Using Exclusive Mode - Controller *number* is using Profile “*Profile name*" - - - Charge the battery - - - ..\Resources\DS4 Config.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Circle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Cross.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Down.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_L1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_L2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Left.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_RS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_ptionss.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_PS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_R1.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_R2.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Right.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Controller {0} is using Profile "{1}". Battery level is {2}% - - ..\Resources\DS4-Config_LS.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Share.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Resources\DS4-Config_Square.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Using Shared Mode - - ..\Resources\DS4-Config_TouchLeft.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + This disables the Touchpad as a mouse - - ..\Resources\DS4-Config_TouchMulti.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Please enter a valid name - - ..\Resources\DS4-Config_TouchRight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Wait *number*ms - - ..\Resources\DS4-Config_TouchUpper.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Will Keep - - ..\Resources\DS4-Config_Triangle.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + XML Files (*.xml) - - ..\Resources\DS4-Config_Up.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Allow touchpad mouse function to get toggled with PS + Touchpad Click. - - ..\Resources\DS4 lightbar.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Enable UDP server. Server listen address and port. Address value options: 127.0.0.1 localhost only | 0.0.0.0 all addresses | Specific host name or IP address. - - Text Document (*.txt) + + ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) - - XML Files (*.xml) + + If enabled then Log tab page shows detailed messages of auto-profile events. - - Unassigned + + Use a scan code value of keyboard keys in a macro - - ..\Resources\left touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Run a macro on the trigger key release - - ..\Resources\right touch.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Run multiple macros in synchronized order if the same trigger has several macros (key down macro completed before key release macro is run) - - ..\Resources\360 highlight.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Repeat a macro while the trigger key is held down - - ..\Resources\360 map.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Keep the last key state when macro execution is completed (ie. if a key is left in down state then it is not automatically reset back to default state) - - ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + Roundness of Square Stick corners - - Mutli-Action Button + + Actions.xml file was corrupt. Starting from scratch. - - Macro Recorded + + Enable OSC Server. Listen to port on all addresses. - - Select a macro + + Controller {0} is using temp Profile "{1}" \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ro-RO.resx b/DS4Windows/Properties/Resources.ro-RO.resx deleted file mode 100644 index b92cfae753..0000000000 --- a/DS4Windows/Properties/Resources.ro-RO.resx +++ /dev/null @@ -1,525 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Numele acestei acțiuni există deja - - - Se adugă în listă... - - - Adaugă programe - - - O locație trebuie aleasă pentru a continua - - - Modul mereu curcubeu - - - Atribuie manetei *number* - - - Baterie: *number*% - - - Folosit cel mai bine cu partea din dreapta ca funcția de mouse - - - Caută - - - Nu poate fi scris în locația curentă. Copiez setările în appdata? - - - Încărcat - - - Se încarcă - - - Verifică bateria - - - Închide DS4Windows? - - - Închideți DS4Windows prin icoana de notificări - - - Culoare - - - Culoare în funcție de % bateriei - - - Se conectează... - - - Editează profilul pentru maneta *number* - - - Creează profilul pentru maneta *number* - - - Maneta *Mac address* a fost deconectată sau conexiunea a fost pierdută - - - Copiere completă, vă rugăm să deschideți DS4Windows și să ștergeți setările din Program Directory - - - Click pentru a copia întreaga culoare - - - Avertizare: Nu s-a reușit pornirea DS4 *Mac address* în modul exclusiv - - - zi - - - zile - - - Șterge profilul? - - - Întunecă în funție de % bateriei - - - Opriți X360 metodă de introducere și folosiți doar metoda de introducere prestabilită a DS4-ului, ascundeți DS4 trebuie să fie off (Doar pentru Cablu) - - - Deconectare BT - - - Deconectat - - - Descărcare *number*% - - - Doriți descărcarea versiunii *number* acum? - - - Jos - - - Actualizare la DS4Windows disponibilă! - - - DS4Windows nu poate edita setările aici, acum se va închide - - - Editează - - - Rămâi in urma - - - Butonul 5 de pe mouse în jos - - - Butonul 5 de pe mouse Buton în sus - - - Click pentru a schimba culoarea luminării intense. Negru = culoarea implicită - - - Golește HID - - - Golește coada HID după fiecare citire - - - Manetă găsită - - - Butonul 4 de pe mouse în jos - - - Butonul 4 de pe mouse în jos - - - Plin - - - Click pentru a vedea citirea de la giroscopul Sixaxis - - - GyroX, înclinare spre stânga și dreapta - - - GyroY, înclinare în față și în spate - - - GyroZ, înclinare în sus și în jos - - - oră - - - ore - - - Țineți cursorul deasupra obiectelor pentru a vedea o descriere sau mai multe despre - - - Dacă ștergeți DS4Windows, puteți șterge setările urmărind profilul folderului link - - - Întârziere la intrare: *number*ms - - - Instalare completă - - - Instalează drivere-le aici - - - Se instalează... - - - Folosește Sixaxis pentru a ajuta calculul mișcării pe touchpad - - - Păstreză această mărime a ferestrei după închidere - - - Latența manetei *number* este acum sub 10ms - - - Latența manetei *number* este peste 10ms - - - Lansează *program* - - - Se încarcă... - - - Încarcă *profile* - - - Macro - - - Creează un profil nou - - - N/A - - - Nou - - - Niciun Macro nu a fost înregistrat - - - (niciun) - - - niciun - - - Niciun profil încărcat - - - Maneta *number* nu folosește niciun profil - - - Invalid - - - Se deschide programul de instalare - - - Vă rog să deschideți ScpDriver.exe - - - , fișierele din altă locație for fi șterse - - - Vă rog să descărcați Actualizatorul acum, și plasați-l in folderul cu programe, apoi verficați din nou pentru actualizări - - - Vă rog să importați sau creați un profil - - - Profil nou - - - *Profile name* nu poate fi reface - - - Folderul cu profile mutat în folderul programului - - - Programe - - - EXPERIMENTAL: Deazactivare automată a BT la conectarea la USB - - - Înregistrează - - - Click dreapta pentru a seta presetările pentru un set de controale - - - Salvează Macro-ul înregistrat? - - - Scanează codul - - - Caut manete... - - - Selectează o acțiune pentru *action* - - - Setare declanșator normal - - - Setare declanșator de descărcare - - - Scurtături - - - Click pentru citire avansată de la Sixaxis - - - În curs de pornire... - - - Pornește - - - Pasul 1: Instalează driver-ul DS4 - - - Oprește Intens - - - Oprește Slab - - - DS4Windows a fost oprit - - - Se opresc manetele DS4 - - - Se opresc manetele X360 - - - Oprire - - - Glisare în jos - - - Glisare spre stânga - - - Glisare spre dreapta - - - Glisați pe touchpad pentru a schimba profilele - - - Glisare în sus - - - Apasă și ține apăsat pentru a trage, puțină întârziere cu apăsări individuale - - - Testează intens - - - Testează slab - - - Înclinare în jos - - - Înclinare la stânga - - - Înclinare la dreapta - - - Înclinare în sus - - - Mișcare pe touchpad oprită - - - Mișcare pe touchpad pornită - - - Reactivează apăsând PS+Touchpad - - - Glisare spre stânga sau dreapta cu 2 degete pe touchpad - - - scrie noul nume aici - - - scrie numele profilului aici - - - Sus - - - Actualizările sunt la zi! - - - Puteți folosi și maneta pentru a schimba controalele - - - Folosind modul exclusiv - - - Maneta *number* folosește profilul "*Profile name*" - - - Folosind modul partajat - - - Acesta dezactivează touchpad-ul ca mouse - - - Vă rog, introduceți un nume valid - - - Asteaptă *number*ms - - - Se va păstra - - - DS4Windows a fost oprit - - - Înclinare în jos - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.ru-RU.resx b/DS4Windows/Properties/Resources.ru.resx similarity index 72% rename from DS4Windows/Properties/Resources.ru-RU.resx rename to DS4Windows/Properties/Resources.ru.resx index deacf82aa3..7d2d300ad8 100644 --- a/DS4Windows/Properties/Resources.ru-RU.resx +++ b/DS4Windows/Properties/Resources.ru.resx @@ -144,9 +144,18 @@ Обзор… + + Определяет частоту опроса, используемую для оборудования DS4 при подключении через Bluetooth. (Применяется при сохранении профиля) + + + Невозможно переместить файлы в новое место. Пожалуйста переименуйте папку с DS4Tool в "DS4Windows" + Невозможно записать в текущее местоположение. Скопировать настройки в AppData? + + Зарядите батарею + Заряжено @@ -156,6 +165,9 @@ Проверить аккумулятор + + Это действие отключит подключенные контроллеры. Продолжить? + Закрыть DS4Windows? @@ -168,6 +180,9 @@ Цвет от заряда % + + Подтвердить... + Подключение... @@ -202,7 +217,7 @@ Затемнение от заряда % - Выключить режим XInput и использовать только DInput. Настройка "Скрыть контроллер DS4" должна быть выключена! + Отключите ввод X360 и используйте только собственный ввод DS4, скрыть ds4 должно быть отключено (только по проводу) Отключить Bluetooth @@ -219,18 +234,31 @@ Вниз + + + ..\Resources\DS4.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Доступна новая версия DS4Windows! + + ..\Resources\DS4W.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + DS4Windows не может изменить настройки! Это приведёт сейчас к закрытию! + + ..\Resources\DS4W - White.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + Редактировать Вернуть + + Вернуть на *button* + 5-я кнопка мыши Вниз @@ -256,11 +284,14 @@ 4-я кнопка мыши Вверх - Заряжена + Заряжен Нажмите для просмотра текущих назначений гироскопа + + Check to have gyro active while trigger is active. Uncheck to disable gyro while trigger is active. + Гиро X, наклон влево и вправо @@ -283,14 +314,17 @@ При удалении DS4Windows, вы можете удалить параметры настройки в папке профиля программы - Задержка ввода: *number*мс + Задержка ввода: {0} мс - Установка завершена! + Установка завершена Установите этот драйвер + + Установка не удалась. Пожалуйста повторите + Установка... @@ -300,17 +334,20 @@ Запоминать размер окна после закрытия + + Выбранный языковой пакет будет применен после перезапуска приложения DS4Windows. + Задержка *number*-го контроллера сейчас меньше 10 мс - Задержка *number*-го контроллера больше 10 мс + Задержка {0}-го контроллера больше 10 мс ({1} мс) Запустить *program* - Также затенять по времени простоя + Также затенять по времени простоя если DS4 полностью заряжен Загрузка... @@ -321,9 +358,15 @@ Макрос + + Макрос записан + Создать новый профиль + + Mutli-Action Button + Н/Д @@ -342,9 +385,6 @@ Профиль не загружен - - *number*-й контроллер не использует профиль - Недопустимая операция @@ -358,7 +398,7 @@ , старые настройки из другой папки будут удалены - Пожалуйста, скачайте Updater, поместите его в папку с программой и запустите снова + Пожалуйста, скачайте Updater, поместите его в папку с программой, переименуйте в DS4Updater.exe для x86 и снова проверьте наличие обновлений Импортируйте или создайте профиль @@ -379,7 +419,8 @@ Автоотключение Bluetooth при подключении по USB - Перед активацией функции "Спрятать DS4" вы должны выйти из игровых клиентов, таких как Steam, Uplay, Origin и пр. + Перед активацией функции "Спрятать DS4" вы должны выйти из игровых клиентов, таких как Steam, Uplay, Origin и пр. + Подробности на https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues Запись @@ -387,6 +428,9 @@ Правый клик для выбора пресета + + Windows запустит DS4Windows после входа + Сохранить записанный макрос? @@ -399,6 +443,9 @@ Выберите действие для *action* + + Выберите макрос + Назначить регулярный триггер @@ -408,6 +455,27 @@ Ярлыки + + Калибровка эмуляции шестиосного колеса + + + (1) Отцентрируйте контроллер, удерживайте его и нажмите "X" + + + (2) Поверните на 90° влево (или вправо) и нажмите "X" + + + (3) Поверните на 90° вправо (или влево) и нажмите "X" + + + Все точки калибровки устанавливаются, когда цвет светлой полосы становится зеленым. При повороте контроллера цвет индикатора мигает, когда контроллер находится в точке калибровки. Подтвердите калибровку кнопкой ОК + + + Невозможно откалибровать значения эмуляции гироскопического (шестиосного) рулевого колеса без контроллера. Подключите контроллер через Bluetooth или USB + + + Опция оси эмуляции рулевого колеса гироскопа установлена на НЕТ (эмуляция не используется). Пожалуйста, выберите опцию оси перед калибровкой эмуляции шестиосного гироскопа + Нажмите для считывания дополнительных возможностей Sixaxis @@ -462,6 +530,12 @@ Тест. лёгкого + + Проверка + + + Текстовый документ (*.txt) + Накл. вниз @@ -484,7 +558,7 @@ Повторное включение нажатием PS + Touchpad - Проведение двумя пальцами по тачпаду влево или вправо + 2 пальцевый жест по тачпаду влево или вправо введите сюда новое имя @@ -492,6 +566,12 @@ введите сюда имя профиля + + Вам нужно запустить DS4Windows от имени Администратора, чтобы активировать этот режим. + + + Не назначено + Вверх @@ -504,9 +584,6 @@ Включен приоритетный режим - - Для *number*-го контроллера задействован профиль "*Profile name*" - Включен совместный режим @@ -522,34 +599,49 @@ Удержание - - Используйте иной порт, если у вас возникла проблема с другой программой эмулятора контроллера X360, такой как SCP's tool + + XML-файлы (*.xml) - - Остановлена работа DS4Windows + + Выберите тип выходного виртуального контроллера (Применяется при сохранении профиля) - - Текстовый документ (*.txt) + + Разрешить переключение функции мыши тачпада по нажатию PS + Touchpad. - - Невозможно переместить файлы в новое место. Пожалуйста переименуйте папку с DS4Tool в "DS4Windows" + + Включить сервер UDP. Сервер прослушивает адрес и порт. Параметры значения адреса: 127.0.0.1 только localhost | 0.0.0.0 все адреса | Определенное имя хоста или IP-адрес. - - Зарядите батарею + + ^ ABC = Совпадение в начале строки (^) | ABC $ = совпадение в конце строки ($) | * ABC = Содержит строку (*) - - Вернуть на *button* + + Если этот параметр включен, на вкладке «Журнал» отображаются подробные сообщения о событиях автоматического профиля. - - Установка не удалась. Пожалуйста повторите + + Использовать значение кода сканирования клавиш клавиатуры в макросе - - Не назначено + + Запустить макрос при отпускании триггерной клавиши - - XML-файлы (*.xml) + + Запускать несколько макросов в синхронизированном порядке, если один и тот же триггер имеет несколько макросов (макрос нажатия клавиши завершен до запуска макроса освобождения ключа) - - Проверка + + Повторить макрос, удерживая нажатой триггерную клавишу + + + Сохранять последнее состояние ключа, когда выполнение макроса завершено (т.е. если ключ отключен, он не будет автоматически возвращен в состояние по умолчанию) + + + Округлость квадратного стика + + + Файл Actions.xml поврежден. Начните с нуля. + + + Включить сервер OSC. Слушать порт на всех адресах. + + + Контроллер {0} использует временный профиль "{1}" \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.sl.resx b/DS4Windows/Properties/Resources.sl.resx deleted file mode 100644 index 19a7433d2b..0000000000 --- a/DS4Windows/Properties/Resources.sl.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ime tega dejanja že obstaja - - - Dodajam k seznamu... - - - Dodaj programe - - - Mesto mora biti izbrano za nadaljevanje - - - Vednno Mavrični način - - - Dodeli Krmilniku *number* - - - Baterija: *number*% - - - Najbolje uporabljeno z desno stranjo, kot funkcijo miške - - - Brskanje... - - - Premik datotek na novo mesto ni mogoč, prosim preimenujte DS4Orodje mapo v "DS4Windows - - - Zapis na trenutnem mestu ni mogoč. Kopiraj nastavitve v podatke aplikacije? - - - Napolnite baterijo - - - Napolnjeno - - - Polnem: *number*% - - - Preglej baterijo - - - Zapri DS4Windows? - - - Zapri DS4Windows preko obvestilne ikone - - - Barva - - - Barva glede na baterijo % - - - Povezujem... - - - Uredi račun za Krmilnik *number* - - - Naredi račun za Krmilnik *number* - - - Krmilnik *Mac adress* je bil odstranjen ali je izgubil povezavo - - - Kopiranje je končano, prosim ponovno zaženite DS4Windows in odstranite nastavitve iz programskega imenika - - - Klik za kopiranje celotne barve - - - Opozorilo: odpiranje *Mac address* izključno ni mogoče - - - dan - - - dni - - - Izbriši račun? - - - Zatemni glede na baterijo % - - - Izklopi X360 vhod in uporabi le DS4-jev vhod, skrij DS4 mora biti izključeno (samo preko USB kabla) - - - Odklopi BT - - - Odklopljeno - - - Prenašam *number*% - - - Prenesi verzijo *number* sedaj? - - - Dol - - - Posodobitev za DS4Windows je na voljo! - - - DS4Windows tukaj ne more urediti nastavitev, to se bo sedaj zaprlo - - - Uredi - - - Pojdi nazaj - - - Pojdi nazaj na *button* - - - 5. gumb miške dol - - - 5. gumb miške gor - - - Klik za spremembo barve bliskanja. Črna = prednastavljena barva - - - Prečisti HID - - - Prečisti HID vrsto po vsakem branju - - - Najden Krmilnik: - - - 4. gumb miške dol - - - 4. gumb miške gor - - - Polno - - - Klik za ogled odčitavanja Sixaxis gyro - - - GyroX, naklon levo in desno - - - GyroY, naklon naprej in nazaj - - - GyroZ, naklon gor in dol - - - ura - - - ur - - - Lebdite nad predmeti, za pojasnitev - - - Ob odstranitvi DS4Windows, lahko izbrišete nastavitve, ki sledijo povezavi z mapo z računi - - - Zakasnitev ob vhodu: *number*ms - - - Namestitev je končana - - - Tukaj namestite gonilnike - - - Namestitev ni uspela; prosim, poskusite ponovno - - - Nameščam... - - - Uporabi SIxaxis za pomoč pri računanju premikanja po Touchpad-u - - - Obdrži to velikost okna po zaprtju - - - Krmilnik *number*-ova zakasnitev je sedaj pod 10ms - - - Krmilnik *number* - - - Zaženi *program* - - - Tudi zatemnjena luč ob nedejavnosti, če vključeno - - - Nalagam... - - - Naloži *profile* - - - Macro - - - Naredi nov račun - - - N/A - - - Nov - - - Noben Macro ni bil zapisan - - - (noben) - - - noben - - - Ni naloženega računa - - - Krmilnik *number* ne uporablja računa - - - Ni veljavno - - - Odpiram program za namestitev - - - Prosim odprite ScpDriver.exe - - - , druga mesta datotek bodo izbrisana - - - Prosim prenesite Posodobljevalnik in ga namestite v mapo z programi, nato spet preglejte za posodobitev - - - Prosim uvozite ali naredite račun - - - Nov račun - - - *Profile name* ne more biti obnovljen - - - Mapa z računi premaknjena v mapo z programi - - - Programi - - - EKSPERIMENTALNO: Auto-onemogoči BT, ko je povezan USB kabel - - - Potreben je izhod iz drugih aplikacij, kot je Steam ali Uplay pred aktiviranjem 'Skrij DS4 Krmilnik' možnosti." - - - Zapis - - - Desni klik za prednastavitev za vse Krmilnike - - - Shrani zapisani Macro? - - - Skeniraj kodo - - - Iskanje Krmilnikov... - - - Izberi dejanje za *action* - - - Nastavi navaden sprožilec - - - Nastavi sprožilec za odnaložitev - - - Bližnjice - - - Klik za napredno Sixaxis branje - - - Zaganjam.. - - - Zaženi - - - Prvi korak: Namesti DS4 gonilnik - - - Ustavi težko - - - Ustavi lahko - - - Ustavitev DS4 Windows - - - Ustavljanje DS4 Krmilnikov - - - Ustavljanje X360 Krmilnikov - - - Ustavi - - - Podrsaj dol - - - Podrsaj levo - - - Podrsaj desno - - - Podrsaj po Touchpad-u za zamenjavo računa - - - Podrsaj gor - - - Pritisni in drži za povlek, krajša zamuda z enojnimi pritiski na gumb - - - Preizkusi težko - - - Preizkusi lahko - - - Preizkus - - - Besedni dokument (*.txt) - - - nagibaj dol - - - Nagibaj levo - - - Nagibaj desno - - - Nagibaj gor - - - Touchpad premikanje je onemogočeno - - - Touchpad premikanje je omogočeno - - - Ponovno omogoči s pritiskom PS+Touchpad - - - 2 prsta na Touchpad-u podrsaj levo ali desno - - - Sem vtipkajte novo ime - - - Sem vtipkajte ime računa - - - Nedefinirano - - - Gor - - - Posodobljeni ste - - - Lahko uporabiš Krmilnik za zamenjanje barv - - - Uporabljam ekskluziven način - - - Krmilnik *number* uporablja račun *Profile name* - - - Uporabljam način skupne uporabe - - - To onemogoči Touchpad, kot miško - - - Prosim vstavite veljavno ime - - - Počakaj *number*ms - - - Bo še naprej - - - Uporabi višje vhode, če se pojavi odpor z drugimi X360 posnemalnimi programi, kot je SCP-jevo orodje - - - XML Datoteke (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.sv.resx b/DS4Windows/Properties/Resources.sv.resx deleted file mode 100644 index d58980a38d..0000000000 --- a/DS4Windows/Properties/Resources.sv.resx +++ /dev/null @@ -1,120 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.tr.resx b/DS4Windows/Properties/Resources.tr.resx deleted file mode 100644 index a020175f76..0000000000 --- a/DS4Windows/Properties/Resources.tr.resx +++ /dev/null @@ -1,534 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Bu eylem için yazdığınız isim zaten mevcut - - - Listeye ekleniyor... - - - Program Ekle - - - Devam etmek için bir konum seçilmelidir. - - - Kalıcı Gökkuşağı Modu - - - *number* 'a Kolu Ata - - - Pil Durumu: %*number* - - - Sağ tarafı en verimli fare işlevi olarak kullanın - - - Gözat... - - - Geçerli konuma yazılamıyor. Ayarlar appdata'ya kopyalansın mı? - - - Şarj oldu - - - Şarj oluyor %*number* - - - Pili Kontrol Et - - - DS4Windows'u kapat? - - - DS4Windows'u bildirim ikonundan kapat - - - Renk - - - Pil yüzdesine göre renk - - - Bağlanıyor... - - - Kol *number* Için Profili Düzenle - - - Kol *number* Için Profil Oluştur - - - *Mac address* adresli kol çıkarıldı veya bağlantısı koptu - - - Kopyalama tamamlandı, lütfen DS4Windows'u yeniden başlatın ve program klasöründen ayarları silin - - - Rengi kopyalamak için tıklayın - - - Uyarı: Sadece DS4 *Mac address* açılamıyor. - - - Gün - - - Gün - - - Profili Sil? - - - Pil durumuna göre ışığı karar - - - X360 girişini kapatın ve sadece DS4'e özgü girişi kullanın, DS4'ü gizleme kapalı olmalı(Yalnızca Kablolu Bağlantı İçin) - - - BT bağlantısını kopar - - - Bağlantı Koptu - - - İndiriliyor %*number* - - - Versiyon *number* şimdi indirilsin mi? - - - Asağı - - - DS4Windows Güncellemesi Mevcut! - - - DS4Windows burda ayarlarınızı düzenleyemiyor. Bu pencere şimdi kapanacak. - - - Dznl - - - Geri Düşme - - - 5. Fare Butonu Aşağı - - - 5. Fare Butonu Yukarı - - - Yanıp Sönen rengi değiştirmek için tıkla. Siyah = varsayılan renk - - - Boş HID - - - HID sırasını her okumadan sonra boşalt - - - Bulunan Kol: - - - 4. Fare Butonu Aşağı - - - 4. Fare Butonu Aşağı - - - Dolu - - - Sixaxis Gyro çıktısını görmek için tıkla - - - GyroX, Sola ve Sağa yatır - - - GyroY, İleri ve Geri yatır - - - GyroZ, Yukarı ve Aşağı eğ - - - Saat - - - Saat - - - Açıklama görmek için için fareyi seçenekler üstünde tutun - - - Eğer DS4Windows'u kaldırıyorsanız, profil klasöründen ayarları silebilirsiniz - - - Girdi Gecikmesi: *number*ms - - - Kurulum Tamamlandı - - - Driverları Kur - - - Kuruluyor - - - Touchpad hareketinin hesaplanmasına yardımcı olmak için Sixaxis kullan - - - Bu pencere boyutunu hatırla - - - *number* numaralı kolun gecikmesi 10ms'ten az - - - *number* numaralı kolun gecikmesi 10ms'ten fazla - - - Şunu başlat: *program* - - - Ayrıca ışığı şu kadar süre boşta kalırsa karart: - - - Yükleniyor... - - - Şunu yükle: *profile* - - - Makro - - - Yeni Profil Oluştur - - - Kullanılamaz - - - Yeni - - - Hiç makro kayıt edilmedi - - - (hiç) - - - hiç - - - Hiçbir profil yüklenmedi - - - Kol *number* bir profil kullanmıyor - - - Geçerli değil - - - Kurucu Açılıyor - - - Lütfen ScpDriver.exe'yi açınız - - - , diğer konular silinecektir - - - Lütfen Şimdi Güncelleyiciyi indirin ve programlar klasörüne kaydedin ardından tekrar güncelleme için kontrol edin. - - - Lütfen bir profili içeri aktarın veya yeni bir tane oluşturun - - - Yeni Profil - - - *Profil name* onarılamadı. - - - Pofil Klasörü program klasörüne taşındı. - - - Programlar - - - DENEYSEL: BT bağlantısını kablo takılırsa otomatik olarak devre dışı bırak - - - DS4'ü Gizle' opsiyonunu aktif hale getirmeden önce Steam, Uplay gibi uygulamalardan çıkış yapmalısınız. - - - Kayıt - - - Sağ tıklayarak kontrol önayarlarını seçiniz - - - Makroyu kaydet? - - - Tarama Kodu - - - Kol aranıyor... - - - *action* için bir eylem seç - - - Normal tetiğe ayarla - - - Boş tetiğe ayarla - - - Kısayollar - - - Gelişmiş Sixaxis çıktısı için tıklayın - - - Başlıyor... - - - Başla - - - Adım 1: Driver'ı yükle - - - Ağır Durdur - - - Hafif Durdur - - - DS4Windows durduruluyor - - - DS4 Kolu durduruluyor - - - x360 Kolu durduruluyor - - - Durdur - - - Asağı Kaydır - - - Sola Kaydır - - - Sağa Kaydır - - - Profiller arası geçiş için touchpad'de kaydır - - - Yukarı Kaydır - - - Uzun basarak sürükle, kısa aralıklarla tek tıkla - - - Ağır Test - - - Hafif Test - - - Aşağı Eğ - - - Yukarı Eğ - - - Sağa Yatır - - - Sola Yatır - - - Touchpad Hareketi şuan Kapalı - - - Touchpad Hareketi şuan Açık - - - PS+Touchpad kombinasyonu ile yeniden etkinleştir - - - Touchpad'de 2 Parmak ile sağa yada sola kaydır - - - Yeni ismi buraya yazın - - - Profil ismini buraya yazın - - - Yukarı - - - Güncelsiniz - - - Kolu kontrölleri değiştirmek için de kullanabilirsiniz - - - Özgün Mod Kullanılıyor - - - Kol *number* "*Profil name*" adlı profili kullanıyor - - - Paylaşımlı Mod Kullanılıyor - - - Bu touchpadi etkisizleştiri - - - Lütfen geçerli bir isim girin - - - *number*ms bekleyin - - - Hatırlanacak - - - Eğer X360 programları ile çakışmalar yaşıyorsanız, SCP's Tool gibi, daha yüksek portları kullanın. - - - DS4Windows durduruluyor - - - Aşağı Eğ - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.uk.resx b/DS4Windows/Properties/Resources.uk.resx deleted file mode 100644 index 80ccf33a12..0000000000 --- a/DS4Windows/Properties/Resources.uk.resx +++ /dev/null @@ -1,552 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Ім'я для цієї дії вже існує - - - Додавання до списку... - - - Додати програми - - - Для продовження потрібно вказати місцезнаходження - - - Завжди режим Веселки - - - Призначити контролеру *number* - - - Батарея: *number*% - - - Найкраще використовувати праву сторону як функцію миші - - - Огляд... - - - Неможливо перемістити файли до нової локації, будь ласка, змініть назву папки DS4Tool на "DS4Windows" - - - Неможливо записати в обране місце. Скопіювати налаштування до appdata? - - - Зарядіть батарею - - - Заряджено - - - Заряджається: *number*% - - - Перевірка батареї - - - Зачинити DS4Windows? - - - Зачинити DS4Windows через значок в треї - - - Колір - - - Колір від заряду батареї - - - Підключення... - - - Редагувати профіль для контролера *number* - - - Створити профіль для контролера *number* - - - Контролер *Mac address* було вилучено або втрачено зв'язок - - - Копіювання завершено, будь ласка перезапустіть DS4Windows і видаліть налаштування з папки програми - - - Клацніть, щоб скопіювати повний колір - - - Застереження: Не вдалося ексклюзивно відкрити DS4 *Mac address*. - - - день - - - днів - - - Видалити профіль? - - - Тьмяніти від заряду батареї - - - Вимкнути X360 керування і залишити лише рідне DS4, приховування DS4 має бути вимкнено (тільки з'єднання кабелем) - - - Відключити BT - - - Відключено - - - Завантаження *number*% - - - Завантажити версію *number*? - - - Вниз - - - DS4Windows наявне оновлення! - - - DS4Windows неможливо налаштувати, це зараз закриється - - - Редагувати - - - Відступити - - - Відступити до *button* - - - 5-та Клавіша миші натиснена - - - 5-та Клавіша миші відпущена - - - Клацніть для зміни кольору мерехтіння. Чорний - за замовчуванням - - - Очистити HID - - - Очистити HID-чергу після кожного читання - - - Знайдено контролер: - - - 4-та Клавіша миші натиснена - - - 4-та Клавіша миші відпущена - - - Повний - - - Клацніть для перегляду зчитування Sixaxis гіроскопу - - - GyroX, гойдання вліво і вправо - - - GyroY, гойдання вперед і назад - - - GyroZ, гойдання вгору і вниз - - - година - - - години - - - Наведіть на речі, щоб побачити опис чи більше інформації - - - При видаленні DS4Windows, ви можете видалити налаштування в папці профілю - - - Затримка введення: *number*мс - - - Встановлення завершено - - - Встановлення драйверів - - - Встановлення не вдалося. Будь ласка, спробуйте знову - - - Встановлення... - - - Використовуйте Sixaxis щоб допомогти вирахувати рухи тачпаду - - - Зберегти розмір вікна після закриття - - - Контролер *number* - частота зараз менша 10мс - - - Контролер *number* - частота більша 10мс - - - Запустити *program* - - - Також тьмяніти якщо тайм-аут простою увімкнено - - - Завантаження... - - - Завантажити *profile* - - - Макрос - - - Створити новий профіль - - - Н/Д - - - Новий - - - Новий макрос було записано - - - (нічого) - - - нічого - - - Ніякого профілю не завантажено - - - Контролер *number* не використовує профіль - - - Не діє - - - Відкриття встановлювача - - - Будь ласка, відкрийте ScpDriver.exe - - - , файли з іншої локації будуть видалені - - - Будь ласка, завантажте оновлювач, помістіть його в папку програми, потім знову перевірте оновлення - - - Будь ласка, імпортуйте або створіть профіль - - - Новий профіль - - - *Profile name* неможливо відновити - - - Папку профілю переміщено до папки програми - - - Програми - - - ЕКСПЕРЕМЕНТАЛЬНО: Автовимкнення BT коли підключається USB - - - Ви повинні спочаткузакрити програми типу Steam, Uplay до того, як активувати опцію "Приховати DS4 контролер" - - - Запис - - - Клацніть правою кнопкою миші, щоб встановити пресети для набору елементів керування - - - Зберегти записаний макрос - - - Сканувати код - - - Пошук контролерів... - - - Виберіть дію для *action* - - - Встановити звичайний перемикач - - - Встановити перемикач відвантаження - - - Значки - - - Клацніть для розширеного читання Sixaxis - - - Початок... - - - Початок - - - Крок 1: Встановлення DS4 драйверу - - - Зупинити Важкий - - - Зупинити Легкий - - - Зупинено DS4Windows - - - Зупинка DS4 контролерів - - - Зупинка X360 контролерів - - - Зупинка - - - Посунути вниз - - - Посунути вліво - - - Посунути вправо - - - Посунути по тачпаді для зміни профілів - - - Посунути вгору - - - Натисніть і утримуйте, щоб перетягнути, торкайтесь з мінливою затримкою. - - - Сильний Тест - - - Слабкий Тест - - - Тест - - - Текстовий документ (*.txt) - - - Нахил вниз - - - Нахил вліво - - - Нахил вправо - - - Нахил вгору - - - Рухи тачпадом вимкнено - - - Рухи тачпадом увімкнено - - - Увімкнути натиском PS+Тачпад - - - Посуньте двома пальцями по тачпаду вліво чи право - - - нове ім'я - - - новий профіль - - - Не призначено - - - Вгору - - - У вас найновіша версія - - - Ви можете використати контролер для зміни кнопок - - - Використання ексклюзивного режиму - - - Контролер *number* використовує профіль "*Profile name*" - - - Використання звичайного режиму - - - Це вимкне використання тачпаду як миші - - - Будь ласка, вкажіть можливе ім'я - - - Чекати *number*мс - - - Тримати - - - Використовуйте вищі порти, якщо ви маєте конфлікти в інших емуляторах X360, наприклад - SCD's tool - - - XML-файли (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.vi.resx b/DS4Windows/Properties/Resources.vi.resx deleted file mode 100644 index 9d319e47cf..0000000000 --- a/DS4Windows/Properties/Resources.vi.resx +++ /dev/null @@ -1,237 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - Cài đặt TĐK tại đây - - - Cài đặt không được. xin thử lại - - - Dang cài đặt - - - Dùng Siaxis để tính toán di chuyển của Touchpad - - - Giữ kích thước cửa sổ khi đóng - - - Độ trễ tay cầm *number* dưới 10ms - - - Độ trễ tay cầm *number* vượt 10ms - - - Chạy *program* - - - Đang chạy... - - - Chạy *profile* - - - Macro - - - Tạo Profile mới - - - Không khả dụng - - - Mới - - - Chưa ghi macro nào - - - (trống) - - - trống - - - Chưa nhập Profile nào - - - Tay cầm *number* không dùng profile nào - - - Không hợp lệ - - - Đang chạy trình cài đặt - - - Vui lòng chạy ScpDriver.exe - - - Vui lòng tải về Updater, và bỏ vào tập tin của chuơng trình, rồi kiểm tra cập nhật lại - - - Vui lòng nhập hoặc tạo một profile - - - Profile mới - - - *Proflide name* không thể phục hồi - - - Chuơng trình - - - Thử nghiệm: Tắt Bluetooth khi kết nối USB - - - Cập nhật mới nhất - - - Bạn cũng có thể dùng tay cầm để thay đổi điều khiển - - - Sử dụng Exclusive Mode - - - Tay cầm - - - Sử dụng Shared Mode - - - Tắt chức năng chuột của Touchpad - - - Nhập tên hợp lệ - - - Chờ *number* pngiây - - - Giữ lại - - - Dùng giao thức cao hơn khi không tuơng thích với các chuơng trình giả lập X360 khác, ví dụ như SCP's tool - - - Tệp XML (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.zh-Hant.resx b/DS4Windows/Properties/Resources.zh-Hant.resx deleted file mode 100644 index 281fbd58b2..0000000000 --- a/DS4Windows/Properties/Resources.zh-Hant.resx +++ /dev/null @@ -1,555 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 這個動作的名稱已經存在 - - - 新增至列表... - - - 新增程式 - - - 一定要點選一個位置來繼續 - - - 總是開啟彩虹模式 - - - 指定給控制器 *number* - - - 電池:*number*% - - - 與右側最佳用作滑鼠功能 - - - 瀏覽... - - - 無法寫入目前路徑。 複製設定到 appdata 資料夾? - - - 充電完成 - - - 充電中:*number*% - - - 檢查電量 - - - 關閉 DS4Windows 嗎? - - - 通過通知圖示關閉 DS4Windows - - - 顏色 - - - 顏色依電池 % 變化 - - - 連結中... - - - 編輯控制器 *number* 設定檔 - - - 新增控制器 *number* 設定檔 - - - 控制器 *Mac address* 被移除或失去連結 - - - 點擊複製完整的顏色 - - - 警告: 無法獨占啟用 DS4 *Mac address* - - - - - - - - - 刪除設定檔? - - - 依電池 % 變暗 - - - 關閉 X360 按鍵輸入,只使用 DS4 的原生按鍵輸入,"隱藏DS4控制器" 的選項必須先取消(僅限有線連結) - - - 斷開藍牙 - - - 未連接 - - - 下載中 *number* % - - - 立刻下載版本 *number* ? - - - - - - DS4Windows 有可用的更新! - - - DS4Windows 無法編輯設定檔,將立即關閉 - - - 編輯 - - - 退回 - - - 第 5 滑鼠按鍵 按下 - - - 第 5 滑鼠按鍵 放開 - - - 找到控制器: - - - 第 4 滑鼠按鍵 按下 - - - 第 4 滑鼠按鍵 放開 - - - 滿 - - - 小時 - - - 小時 - - - 輸入延遲: *number* 毫秒 - - - 安裝完成 - - - 在此安裝驅動程式 - - - 安裝中... - - - 關閉後保留目前視窗大小 - - - 啟動 *program* - - - 載入中... - - - 載入 *profile* - - - 巨集 - - - 新增使用者設定檔 - - - - - - 新增 - - - 巨集沒有被錄製 - - - (無) - - - - - - 無載入設定檔 - - - 控制器 *number* 未使用一個設定檔 - - - 無效 - - - 開啟安裝程式 - - - 請開啟 ScpDriver.exe - - - 請匯入或新建一個設定檔 - - - 新設定檔 - - - *Profile name* 無法復原 - - - 設定檔資料夾移動至程式資料夾 - - - 程式 - - - 實驗功能: 自動關閉藍牙當連接到USB時 - - - 您必須在退出其他應用程式,如 Steam、Uplay 後,才能啟用 "隱藏 DS4 控制器" 選項。 - - - 錄製 - - - 儲存錄製的巨集? - - - 搜尋控制器... - - - 選擇一個動作來 *action* - - - 捷徑 - - - 啟動中... - - - 開始 - - - 步驟一:安裝 DS4 驅動程式 - - - 停止微震 - - - DS4Windows 已停用 - - - DS4Windows 已停用 - - - 停止 DS4 控制器中 - - - 停止 X360 控制器中 - - - 停止 - - - 向下滑動 - - - 向左滑動 - - - 滑動觸控板以更換設定檔 - - - 兩指向左或向右滑觸控版 - - - 在此輸入新名稱 - - - 在此輸入設定檔名稱 - - - - - - 目前是最新版本 - - - 你也可以使用你的控制器來改變控制 - - - 使用獨占模式 - - - 控制器 *number* 使用設定檔 “*Profile name*” - - - 這將關閉觸控版當作滑鼠 - - - 請輸入有效的名稱 - - - 等待 *number*毫秒 - - - 複製完成,請重新啟動 DS4Windows 並從程式目錄中刪除設定檔 - - - 點擊改變閃爍色彩。黑色 = 默認顏色 - - - 刷新 HID - - - 每次看完後刷新 HID 佇列 - - - 點擊查看六軸陀螺儀的資料解析 - - - 陀螺儀左右傾 - - - 陀螺儀前後傾 - - - 陀螺儀上下傾 - - - 將滑鼠停到項目上來看說明或更多資訊 - - - 當您刪除 DS4Windows 後,可循使用者設定檔資料夾連結刪除設定 - - - 使用六軸來幫助計算觸摸板運作 - - - 控制器 *number* 的延遲現在小於10毫秒 - - - 控制器 *number* 的延遲大於10毫秒 - - - 假如此設定開啟,閒置時間到了也關閉燈光 - - - ,其他位置上的文件將被刪除 - - - 請下載更新程式,放置在程式資料夾中,然後再次檢查更新 - - - 右鍵點擊來設定預設給一組控制 - - - 掃描代碼 - - - 設定固定的觸發鍵 - - - 設定卸載的觸發鍵 - - - 點擊來閱覽進階的六軸 - - - 停止強震 - - - 向右滑動 - - - 向上滑動 - - - 點擊並按住拖動,單點擊有著輕微的延遲 - - - 測試強震 - - - 文本文檔 (*.txt) - - - 下傾 - - - 左傾 - - - 右傾 - - - 上傾 - - - 觸摸板運作現在是關 - - - 觸摸板運作現在是開 - - - 按 PS + 觸控板來重新啟用 - - - 使用共享模式 - - - 將繼續 - - - 無法移動檔案到新的位置,請重命名 DS4Tool 文件夾為 “DS4Windows” - - - 為電池充電 - - - 退回到 *button* - - - 安裝失敗,請重試 - - - 測試微震 - - - 測試 - - - 未指定 - - - 使用更高的連接埠,如果你跟其他模擬X360的程式遇到衝突,如SCP的工具 - - - XML文件 (*.xml) - - \ No newline at end of file diff --git a/DS4Windows/Properties/Resources.zh-hans.resx b/DS4Windows/Properties/Resources.zh-hans.resx index b74cdd354d..dbd81d7642 100644 --- a/DS4Windows/Properties/Resources.zh-hans.resx +++ b/DS4Windows/Properties/Resources.zh-hans.resx @@ -1,534 +1,536 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - 此操作名已经存在 - - - 添加到列表... - - - 添加程序 - - - 请设置路径以继续 - - - 总是彩虹模式 - - - 分配到手柄 *number* - - - 电量:*number*% - - - 作为鼠标右键最好用的方法 - - - Søg… - - - Kan ikke skrives til nuværende placering. Kopier instillinger til appdata? - - - 充电完毕 - - - 正在充电:*number*% - - - 检查电池 - - - 关闭 DS4Windows 吗? - - - 通过消息栏图标关闭DS4Windows - - - 颜色 - - - 依电量颜色为 - - - 正在连接... - - - 编辑手柄*number*配置文件 - - - 新建手柄*number*配置文件 - - - 手柄*Mac address*已删除或失去连接 - - - 复制完成,请重新启动DS4Windows并从程序目录中删除设置文件 - - - 单击以复制完整颜色 - - - 警告: 无法单独打开DS4*Mac address* - - - - - - - - - 是否删除档案? - - - 依电量调暗 - - - 关闭x360输入只使用DS4原生输入,必须关闭隐藏DS4选项(有线情况下) - - - 断开蓝牙 - - - 断开连接 - - - 下载中*number*% - - - 现在下载*number*版本? - - - - - - DS4Windows 有可用更新! - - - DS4Windows 不能修改此处设定,即将关闭 - - - 编辑 - - - 恢复 - - - 鼠标第5按键按下 - - - 鼠标第5按键弹起 - - - 点击设置闪烁颜色。默认:黑 - - - 清空HID - - - 每次读取后刷新HID队列 - - - 找到控制器 - - - 鼠标第4按键按下 - - - 鼠标第4按键弹起 - - - 充满 - - - 点击查看六轴传感器的读数 - - - X轴,左右倾斜 - - - Y轴,前后倾斜 - - - Z轴,上下倾斜 - - - 小时 - - - 小时 - - - 鼠标指针悬停查看说明 - - - 如果删除DS4windows,你可以点配置文件夹链接删除设置文件 - - - 输入延迟:*number*毫秒 - - - 安装完成 - - - 此处安装驱动 - - - 安装中... - - - 使用六轴传感器帮助计算触摸板运动 - - - 退出后保持窗口尺寸 - - - 手柄*number*的延迟在 10ms(毫秒)以内 - - - 手柄*number*的延迟超过 10ms(毫秒) - - - 运行*program* - - - 空闲时灯条变暗 - - - 加载中... - - - 载入*profile* - - - 宏指令 - - - 新建配置文件 - - - 不可用 - - - 新建 - - - 没有宏文件被录制 - - - (无) - - - - - - 未加载配置文件 - - - 手柄*number*尚未配置 - - - 无效 - - - 打开安装程序 - - - 请打开ScpDriver.exe - - - ,其他路径文件将被删除 - - - 请立即下载更新程序,放在程序所在文件夹,然后检查更新 - - - 请导入或新建配置文件 - - - 新配置文件 - - - *Profile name*无法恢复 - - - 配置文件夹移动到程序文件夹 - - - 程序 - - - 【实验功能】接入USB时自动断开蓝牙 - - - 在激活“隐藏DS4”选项前,你必须退出其他程序例如Steam,Uplay - - - 录制 - - - 右键为一系列操作设定预设 - - - 保存已记录的宏指令吗? - - - 扫描 - - - 搜索手柄 - - - 为*action*选择一个操作 - - - 设置正常按键 - - - 设置处理按键 - - - 快捷键 - - - 点击查看高级六轴参数 - - - 启动中... - - - 开始 - - - 第一步:安装DS4驱动 - - - 停止震动 - - - 停止微震 - - - DS4Windows已停止 - - - DS4Windows已停止 - - - DS4手柄停止中 - - - XBOX 360手柄停止中 - - - 停止 - - - 下滑 - - - 左滑 - - - 右滑 - - - 滑动触摸板以更改配置文件 - - - 上滑 - - - 轻触保持以拖动,单次轻触稍微延迟 - - - 测试震动 - - - 下斜 - - - 下斜 - - - 左斜 - - - 右斜 - - - 上斜 - - - 触摸板移动已经关闭 - - - 触摸板移动已经打开 - - - PS键+触摸板 以重新启用 - - - 触摸板双指左或右滑动 - - - 在此输入新命名 - - - 在此输入配置文件名字 - - - 上斜 - - - 程序已经是最新的 - - - 你也可以用手柄来改变操作 - - - 使用排它模式 - - - 手柄*number*正在使用配置文件*profile name* - - - 使用共享模式 - - - 停止触摸板作为鼠标 - - - 请输入一个有效的名字 - - - 等待*number*毫秒 - - - 将保持 - - - 测试微震 - - - 如果你在其他XBOX 360模拟程序中有冲突,使用更高端口.例如SCP's工具 - + + text/microsoft-resx + + + 1.3 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 动作名字已存在 + + + 添加到列表... + + + 添加程序 + + + 必须选择一个位置 + + + 彩虹模式总是开始 + + + 分配到控制器 *number* + + + 进程路径. ^ABC = 匹配字符串头 (^) | ABC$ = 匹配字符串尾 ($) | *ABC =包含字符串 (*) + + + 电池: *number*% + + + 最好用于将右侧用作鼠标功能 + + + 浏览... + + + 决定使用蓝牙连接的DS4硬件的回报率(当配置保存时应用) + + + 无法移动文件到新位置,请把DS4Tool文件夹重命名为"DS4Windows" + + + 无法在当前位置写入,把设置复制到appdata? + + + 给电池充电 + + + 已充电 + + + 充电中:*number*% + + + 检查电池 + + + 这会断开所有控制器的链接。继续? + + + 关闭DS4Windows? + + + 关闭主窗口会最小化应用。需要到通知栏图标关闭应用。 + + + 颜色 + + + 颜色与电量百分比同步 + + + 确认... + + + 连接... + + + 编辑控制器 *number* 的配置 + + + 创建控制器 *number* 的配置 + + + 控制器*Mac address*被移除或断开连接 + + + 复制完成,请重启DS4Windows并从程序目录中删除设置 + + + 点击来复制所有颜色 + + + 警告:无法独占打开DS4 *Mac address* + + + + + + + + + 删除配置? + + + 与电池电量同步调暗 + + + 仅使用Dinput + + + 断开蓝牙连接 + + + 连接已断开 + + + 下载中 *number*% + + + 现在下载版本 *number*? + + + + + + DS4Windows更新已可用! + + + DS4Windows无法编辑这里的设置,将关闭窗口 + + + 编辑 + + + 允许使用PS键 + 触摸板点击来开关触摸板鼠标 + + + 退回 + + + 退回到 *button* + + + 鼠标按键5 上 + + + 鼠标按键5 下 + + + 点击来改编闪烁颜色。黑色 = 默认颜色 + + + 刷新 HID + + + 在每次读取后刷新 HID + + + 找到控制器: + + + 鼠标按钮4 下 + + + 鼠标按钮4 上 + + + 全部 + + + 点击查看六轴陀螺仪的读数 + + + 勾选来在扳机按下时启用陀螺仪。取消选择来在扳机按下时禁用陀螺仪。 + + + 陀螺仪X轴,左右偏转 + + + 陀螺仪Y轴,前后偏转 + + + 陀螺仪Z轴,上下偏转 + + + 小时 + + + 小时 + + + 悬浮于选项上来查看简介或详细信息 + + + 如果要删除DS4Windows,你可以删除这些文件夹中的设置 + + + 输入延迟: {0:0.##} ms + + + 安装完成 + + + 在此处安装驱动 + + + 安装失败,请重试 + + + 安装中... + + + 使用六轴陀螺仪来帮助计算触摸板移动 + + + 在关闭后保持这个窗口尺寸 + + + 语言包仅会在DS4Windows重启后生效 + + + 控制器 *number* 的延迟现在已在10ms以内 + + + 控制器 {0} 的延迟超过了10ms ({1} ms) + + + 启动 *program* + + + 当DS4 完全充电后在挂机时间过后也会调暗灯光 + + + 加载中... + + + 加载 *profile* + + + + + + 在宏执行完成后保持最后一个按键状态(例如,当结束时某个键是按下的状态,不会被重置到默认状态) + + + 宏已录制 + + + 当触发键按下时重复宏 + + + 当触发键松开时执行宏 + + + 在宏中使用键盘的扫描码 + + + 如果同一个触发按键有多个宏,按照同步顺序运行多个宏(抬起按键的宏会在按下按键的宏完成后运行) + + + 创建一个新配置 + + + 多动作按键 + + + N/A + + + 新建 + + + 没有宏被录制 + + + + + + + + + 没有配置被加载 + + + 控制器 {0} 没有分配配置。电池电量是 {1}% + + + 无效 + + + 打开安装包 + + + 请打开 ScpDriver.exe + + + 使用 OSC 服务器。在所有地址上监听端口。 + + + ,其他地方的文件会被删除。 + + + 选择输出虚拟手柄类型(在配置文件保存时应用) + + + 请现在下载 Updater,并放在文件夹中然后重命名为 DS4Updater.exe (x86设备),然后重新检查更新。DS4Windows会在这个窗口关闭后尝试打开DS4Updater下载页面。 + + + 请导入或创建一个配置。 + + + 新配置 + + + *Profile name* 无法保存 + + + 配置文件夹被移动到程序文件夹 + + + 程序 + + + 当通过USB连接时自动禁用蓝牙 + + + 在启用隐藏DS4控制器之前,你必须退出其他 UWP 应用 (Netflix), Steam, Uplay, Edge, NVIDIA IN-GAME。详见:https://github.com/Ryochan7/DS4Windows/wiki/Exclusive-Mode-(Hide-DS4-Controller-config-option)-tips-and-issues + + + 录制 + + + 右键单击以设置一组控制的预设 + + + 让Windows在登录后启动DS4Windows + + + 六轴方向盘模拟的校准 + + + 保存已录制的宏? + + + 扫描码 + + + 寻找控制器中... + + + 为 *action* 选择一个动作 + + + 选择一个宏 + + + 设置普通扳机 + + + 设置 Unload 扳机 + + + 快捷方式 + + + 在启用时,日志页面会显示关于自动切换配置事件的详细信息。 + + + 点击查看进阶六轴读数 + + + 方形摇杆的边角圆率 + + + 启动中 + + + 开始 + + + 步骤1:安装ViGemBus驱动 + + + 停止重震动 + + + 停止轻震动 + + + 停止DS4Windows + + + 停止DS4 控制器输入 + + + 停止 + + + 停止 + + + 下滑 + + + 左滑 + + + 右滑 + + + 滑动触摸板来切换配置文件 + + + 上滑 + + + 单击并保持来拖拽,单击时略有延迟 + + + 测试重振动 + + + 测试轻振动 + + + 测试 + + + 文本文档(*.txt) + + + 下倾 + + + 左倾 + + + 右倾 + + + 上倾 + + + 触摸板移动已关闭 + + + 触摸板移动已开启 + + + 按下PS键 + 触摸板重新启用 + + + 双指在触摸板上左滑或右滑 + + + 在此处输入新名字 + + + 在此处输入新配置名字 + + + 你需要以管理员模式运行DS4Windows来激活这个模式 + + + 启用UDP服务器。服务器会监听端口和地址。地址选项:127.0.0.1 仅本地 | 0.0.0.0 全部地址 | 指定主机名或IP地址 + + + 未分配 + + + + + + DS4Windows已经是最新版本 + + + 你也可以用控制器来改变设置 + + + 控制器 {0} 正在使用临时配置 "{1}" + + + 使用独占模式 + + + 控制器 {0} 正在使用配置 "{1}"。电池电量为 {2}% + + + 使用共享模式 + + + 这会禁止将触摸板用作鼠标 + + + 请输入一个有效名字 + + + 等待 *number* ms + + + 会保持 + + + Actions.xml 文件已损坏。重新开始配置。 + + + XML 文件 (*.xml) + + + 所有校准点都设置好后灯条会变绿。在转动控制器到校准点时,灯条会闪烁。按下OK按钮接受校准 + + + (1)回中控制器,保持稳定并按”X” + + + (2)左转90°(或右转)并按“X” + + + (3)右转90°(或左转)并按“X” + + + 无控制器时无法校准陀螺仪(六轴)方向盘模拟。请通过蓝牙或者USB连接一个控制器 + + + 陀螺仪方向盘模拟选项被设置为NONE(模拟未启用)。请在校准六轴陀螺仪方向盘模拟前选择一个轴选项。 + \ No newline at end of file diff --git a/DS4Windows/Properties/Settings.Designer.cs b/DS4Windows/Properties/Settings.Designer.cs index ac3f6fb1f4..9b02aafc7c 100644 --- a/DS4Windows/Properties/Settings.Designer.cs +++ b/DS4Windows/Properties/Settings.Designer.cs @@ -8,11 +8,11 @@ // //------------------------------------------------------------------------------ -namespace DS4Windows.Properties { +namespace DS4WinWPF.Properties { [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] - [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "14.0.0.0")] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "16.8.1.0")] internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); diff --git a/DS4Windows/Properties/Settings.settings b/DS4Windows/Properties/Settings.settings index 39645652af..033d7a5e9e 100644 --- a/DS4Windows/Properties/Settings.settings +++ b/DS4Windows/Properties/Settings.settings @@ -1,7 +1,7 @@  - + - + \ No newline at end of file diff --git a/DS4Windows/ReaderWriteLockSlimWrappers.cs b/DS4Windows/ReaderWriteLockSlimWrappers.cs new file mode 100644 index 0000000000..14d943d521 --- /dev/null +++ b/DS4Windows/ReaderWriteLockSlimWrappers.cs @@ -0,0 +1,63 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.Threading; + +namespace DS4Windows +{ + public class ReadLocker : IDisposable + { + private ReaderWriterLockSlim _lockerInstance; + + public ReadLocker(ReaderWriterLockSlim lockerInstance) + { + _lockerInstance = lockerInstance; + _lockerInstance.EnterReadLock(); + } + + public void Dispose() + { + _lockerInstance.ExitReadLock(); + _lockerInstance = null; + } + } + + public class WriteLocker : IDisposable + { + private ReaderWriterLockSlim _lockerInstance; + private bool IsDisposed => _lockerInstance == null; + + public WriteLocker(ReaderWriterLockSlim lockerInstance) + { + _lockerInstance = lockerInstance; + _lockerInstance.EnterWriteLock(); + } + + public void Dispose() + { + if (IsDisposed) + { + throw new ObjectDisposedException(this.ToString()); + } + + _lockerInstance.ExitWriteLock(); + _lockerInstance = null; + } + } +} \ No newline at end of file diff --git a/DS4Windows/Resources/360 fades.png b/DS4Windows/Resources/360 fades.png index 032d3f60f3..8c699ead69 100644 Binary files a/DS4Windows/Resources/360 fades.png and b/DS4Windows/Resources/360 fades.png differ diff --git a/DS4Windows/Resources/360 highlight.png b/DS4Windows/Resources/360 highlight.png index 629251102a..1086194735 100644 Binary files a/DS4Windows/Resources/360 highlight.png and b/DS4Windows/Resources/360 highlight.png differ diff --git a/DS4Windows/Resources/360 highlight.psd b/DS4Windows/Resources/360 highlight.psd deleted file mode 100644 index 4057e5d92d..0000000000 Binary files a/DS4Windows/Resources/360 highlight.psd and /dev/null differ diff --git a/DS4Windows/Resources/360 map.png b/DS4Windows/Resources/360 map.png index d3e5541a24..6296f4f02e 100644 Binary files a/DS4Windows/Resources/360 map.png and b/DS4Windows/Resources/360 map.png differ diff --git a/DS4Windows/Resources/A.PNG b/DS4Windows/Resources/A.PNG index 466257aa1d..832ad09789 100644 Binary files a/DS4Windows/Resources/A.PNG and b/DS4Windows/Resources/A.PNG differ diff --git a/DS4Windows/Resources/B.png b/DS4Windows/Resources/B.png index 9399fdf482..32b5131cec 100644 Binary files a/DS4Windows/Resources/B.png and b/DS4Windows/Resources/B.png differ diff --git a/DS4Windows/Resources/BACK.png b/DS4Windows/Resources/BACK.png index 16f6f7b0ce..ef4032ad5a 100644 Binary files a/DS4Windows/Resources/BACK.png and b/DS4Windows/Resources/BACK.png differ diff --git a/DS4Windows/Resources/BT.png b/DS4Windows/Resources/BT.png index f94a35dcf8..b0a77e2ab7 100644 Binary files a/DS4Windows/Resources/BT.png and b/DS4Windows/Resources/BT.png differ diff --git a/DS4Windows/Resources/BT_white.png b/DS4Windows/Resources/BT_white.png new file mode 100644 index 0000000000..1fbaa2fabc Binary files /dev/null and b/DS4Windows/Resources/BT_white.png differ diff --git a/DS4Windows/Resources/Clock.png b/DS4Windows/Resources/Clock.png deleted file mode 100644 index bf09e3323b..0000000000 Binary files a/DS4Windows/Resources/Clock.png and /dev/null differ diff --git a/DS4Windows/Resources/DOWN.png b/DS4Windows/Resources/DOWN.png index 9240c46e6f..070306fe50 100644 Binary files a/DS4Windows/Resources/DOWN.png and b/DS4Windows/Resources/DOWN.png differ diff --git a/DS4Windows/Resources/DS4 Config.png b/DS4Windows/Resources/DS4 Config.png index 807bee6dd0..7a2eaa1898 100644 Binary files a/DS4Windows/Resources/DS4 Config.png and b/DS4Windows/Resources/DS4 Config.png differ diff --git a/DS4Windows/Resources/DS4 Config_white.png b/DS4Windows/Resources/DS4 Config_white.png new file mode 100644 index 0000000000..88ab6dcf70 Binary files /dev/null and b/DS4Windows/Resources/DS4 Config_white.png differ diff --git a/DS4Windows/Resources/DS4 Controller.png b/DS4Windows/Resources/DS4 Controller.png index 43af0acc8f..4bb5789009 100644 Binary files a/DS4Windows/Resources/DS4 Controller.png and b/DS4Windows/Resources/DS4 Controller.png differ diff --git a/DS4Windows/Resources/DS4 lightbar.png b/DS4Windows/Resources/DS4 lightbar.png index eac7853f10..56b96d4fb2 100644 Binary files a/DS4Windows/Resources/DS4 lightbar.png and b/DS4Windows/Resources/DS4 lightbar.png differ diff --git a/DS4Windows/Resources/DS4 old.ico b/DS4Windows/Resources/DS4 old.ico deleted file mode 100644 index 6f5f022cc0..0000000000 Binary files a/DS4Windows/Resources/DS4 old.ico and /dev/null differ diff --git a/DS4Windows/Resources/DS4-Config_Circle.png b/DS4Windows/Resources/DS4-Config_Circle.png index f4913b6cc9..ec90da0108 100644 Binary files a/DS4Windows/Resources/DS4-Config_Circle.png and b/DS4Windows/Resources/DS4-Config_Circle.png differ diff --git a/DS4Windows/Resources/DS4-Config_Cross.png b/DS4Windows/Resources/DS4-Config_Cross.png index 378ca40c41..3c75e2fc11 100644 Binary files a/DS4Windows/Resources/DS4-Config_Cross.png and b/DS4Windows/Resources/DS4-Config_Cross.png differ diff --git a/DS4Windows/Resources/DS4-Config_Down.png b/DS4Windows/Resources/DS4-Config_Down.png index 1ebe5de97f..884760cfde 100644 Binary files a/DS4Windows/Resources/DS4-Config_Down.png and b/DS4Windows/Resources/DS4-Config_Down.png differ diff --git a/DS4Windows/Resources/DS4-Config_L1.png b/DS4Windows/Resources/DS4-Config_L1.png index 58e4f91f36..f1e92b92f1 100644 Binary files a/DS4Windows/Resources/DS4-Config_L1.png and b/DS4Windows/Resources/DS4-Config_L1.png differ diff --git a/DS4Windows/Resources/DS4-Config_L2.png b/DS4Windows/Resources/DS4-Config_L2.png index 0576f1c56e..8120d599af 100644 Binary files a/DS4Windows/Resources/DS4-Config_L2.png and b/DS4Windows/Resources/DS4-Config_L2.png differ diff --git a/DS4Windows/Resources/DS4-Config_LS.png b/DS4Windows/Resources/DS4-Config_LS.png index 7f493a0abb..f9a30cff1b 100644 Binary files a/DS4Windows/Resources/DS4-Config_LS.png and b/DS4Windows/Resources/DS4-Config_LS.png differ diff --git a/DS4Windows/Resources/DS4-Config_Left.png b/DS4Windows/Resources/DS4-Config_Left.png index 1f0b30f2fb..07b172a5be 100644 Binary files a/DS4Windows/Resources/DS4-Config_Left.png and b/DS4Windows/Resources/DS4-Config_Left.png differ diff --git a/DS4Windows/Resources/DS4-Config_PS.png b/DS4Windows/Resources/DS4-Config_PS.png index 39b8529e0d..b2ab33f72f 100644 Binary files a/DS4Windows/Resources/DS4-Config_PS.png and b/DS4Windows/Resources/DS4-Config_PS.png differ diff --git a/DS4Windows/Resources/DS4-Config_R1.png b/DS4Windows/Resources/DS4-Config_R1.png index 9ec47cb280..084b72d135 100644 Binary files a/DS4Windows/Resources/DS4-Config_R1.png and b/DS4Windows/Resources/DS4-Config_R1.png differ diff --git a/DS4Windows/Resources/DS4-Config_R2.png b/DS4Windows/Resources/DS4-Config_R2.png index fafec62d3f..609b1fc89a 100644 Binary files a/DS4Windows/Resources/DS4-Config_R2.png and b/DS4Windows/Resources/DS4-Config_R2.png differ diff --git a/DS4Windows/Resources/DS4-Config_RS.png b/DS4Windows/Resources/DS4-Config_RS.png index 926ccd04ab..840f68ed96 100644 Binary files a/DS4Windows/Resources/DS4-Config_RS.png and b/DS4Windows/Resources/DS4-Config_RS.png differ diff --git a/DS4Windows/Resources/DS4-Config_Right.png b/DS4Windows/Resources/DS4-Config_Right.png index 40d5307a7c..5d33a9ecb9 100644 Binary files a/DS4Windows/Resources/DS4-Config_Right.png and b/DS4Windows/Resources/DS4-Config_Right.png differ diff --git a/DS4Windows/Resources/DS4-Config_Share.png b/DS4Windows/Resources/DS4-Config_Share.png index 58f5d2f0ae..0b2833c55f 100644 Binary files a/DS4Windows/Resources/DS4-Config_Share.png and b/DS4Windows/Resources/DS4-Config_Share.png differ diff --git a/DS4Windows/Resources/DS4-Config_Square.png b/DS4Windows/Resources/DS4-Config_Square.png index 0da65c5dc4..14402c0471 100644 Binary files a/DS4Windows/Resources/DS4-Config_Square.png and b/DS4Windows/Resources/DS4-Config_Square.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchLeft.png b/DS4Windows/Resources/DS4-Config_TouchLeft.png index bb34548c5a..a058cb9c61 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchLeft.png and b/DS4Windows/Resources/DS4-Config_TouchLeft.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchMulti.png b/DS4Windows/Resources/DS4-Config_TouchMulti.png index 60467c9564..d76608f1e1 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchMulti.png and b/DS4Windows/Resources/DS4-Config_TouchMulti.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchRight.png b/DS4Windows/Resources/DS4-Config_TouchRight.png index ea321ceaac..e231006f99 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchRight.png and b/DS4Windows/Resources/DS4-Config_TouchRight.png differ diff --git a/DS4Windows/Resources/DS4-Config_TouchUpper.png b/DS4Windows/Resources/DS4-Config_TouchUpper.png index 7e3dd283e2..73555cf953 100644 Binary files a/DS4Windows/Resources/DS4-Config_TouchUpper.png and b/DS4Windows/Resources/DS4-Config_TouchUpper.png differ diff --git a/DS4Windows/Resources/DS4-Config_Triangle.png b/DS4Windows/Resources/DS4-Config_Triangle.png index c730dcd50f..42d7c219cb 100644 Binary files a/DS4Windows/Resources/DS4-Config_Triangle.png and b/DS4Windows/Resources/DS4-Config_Triangle.png differ diff --git a/DS4Windows/Resources/DS4-Config_Up.png b/DS4Windows/Resources/DS4-Config_Up.png index 7d3dbdee11..d50cfed664 100644 Binary files a/DS4Windows/Resources/DS4-Config_Up.png and b/DS4Windows/Resources/DS4-Config_Up.png differ diff --git a/DS4Windows/Resources/DS4-Config_options.png b/DS4Windows/Resources/DS4-Config_options.png new file mode 100644 index 0000000000..0b2833c55f Binary files /dev/null and b/DS4Windows/Resources/DS4-Config_options.png differ diff --git a/DS4Windows/Resources/DS4-Config_ptionss.png b/DS4Windows/Resources/DS4-Config_ptionss.png deleted file mode 100644 index f8472329bb..0000000000 Binary files a/DS4Windows/Resources/DS4-Config_ptionss.png and /dev/null differ diff --git a/DS4Windows/Resources/DS4.ico b/DS4Windows/Resources/DS4.ico index 3c1b36488d..475dfff6ec 100644 Binary files a/DS4Windows/Resources/DS4.ico and b/DS4Windows/Resources/DS4.ico differ diff --git a/DS4Windows/Resources/DS4W - Black.ico b/DS4Windows/Resources/DS4W - Black.ico new file mode 100644 index 0000000000..6f40a4c653 Binary files /dev/null and b/DS4Windows/Resources/DS4W - Black.ico differ diff --git a/DS4Windows/Resources/DS4W - White.ico b/DS4Windows/Resources/DS4W - White.ico index c7dee8c5dc..ba92958a63 100644 Binary files a/DS4Windows/Resources/DS4W - White.ico and b/DS4Windows/Resources/DS4W - White.ico differ diff --git a/DS4Windows/Resources/DS4W.ico b/DS4Windows/Resources/DS4W.ico index f75e9aa480..d729cb4cc1 100644 Binary files a/DS4Windows/Resources/DS4W.ico and b/DS4Windows/Resources/DS4W.ico differ diff --git a/DS4Windows/Resources/EE.wav b/DS4Windows/Resources/EE.wav deleted file mode 100644 index 8fd4620889..0000000000 Binary files a/DS4Windows/Resources/EE.wav and /dev/null differ diff --git a/DS4Windows/Resources/LB.png b/DS4Windows/Resources/LB.png index 7bb306a71d..f5b89fe057 100644 Binary files a/DS4Windows/Resources/LB.png and b/DS4Windows/Resources/LB.png differ diff --git a/DS4Windows/Resources/LEFT.png b/DS4Windows/Resources/LEFT.png index 6b3af2a4f1..9352692635 100644 Binary files a/DS4Windows/Resources/LEFT.png and b/DS4Windows/Resources/LEFT.png differ diff --git a/DS4Windows/Resources/LS.png b/DS4Windows/Resources/LS.png index 19b2f70e49..c5345164bb 100644 Binary files a/DS4Windows/Resources/LS.png and b/DS4Windows/Resources/LS.png differ diff --git a/DS4Windows/Resources/LSD.png b/DS4Windows/Resources/LSD.png index f0c9c0d7c9..12d4020419 100644 Binary files a/DS4Windows/Resources/LSD.png and b/DS4Windows/Resources/LSD.png differ diff --git a/DS4Windows/Resources/LSL.png b/DS4Windows/Resources/LSL.png index 50b7161503..a42cd5ecb7 100644 Binary files a/DS4Windows/Resources/LSL.png and b/DS4Windows/Resources/LSL.png differ diff --git a/DS4Windows/Resources/LSR.png b/DS4Windows/Resources/LSR.png index 8b6d4bfece..61f1f7755c 100644 Binary files a/DS4Windows/Resources/LSR.png and b/DS4Windows/Resources/LSR.png differ diff --git a/DS4Windows/Resources/LSU.png b/DS4Windows/Resources/LSU.png index c66485280c..6c3ea44bb4 100644 Binary files a/DS4Windows/Resources/LSU.png and b/DS4Windows/Resources/LSU.png differ diff --git a/DS4Windows/Resources/LT.png b/DS4Windows/Resources/LT.png index fa4acc33c2..c272289dbc 100644 Binary files a/DS4Windows/Resources/LT.png and b/DS4Windows/Resources/LT.png differ diff --git a/DS4Windows/Resources/Pairmode.png b/DS4Windows/Resources/Pairmode.png index 8ff4eaae99..aaa61e5ae7 100644 Binary files a/DS4Windows/Resources/Pairmode.png and b/DS4Windows/Resources/Pairmode.png differ diff --git a/DS4Windows/Resources/RB.png b/DS4Windows/Resources/RB.png index 24cc39e5c9..16a31abf70 100644 Binary files a/DS4Windows/Resources/RB.png and b/DS4Windows/Resources/RB.png differ diff --git a/DS4Windows/Resources/RIGHT.png b/DS4Windows/Resources/RIGHT.png index 705f533ad2..a916888571 100644 Binary files a/DS4Windows/Resources/RIGHT.png and b/DS4Windows/Resources/RIGHT.png differ diff --git a/DS4Windows/Resources/RS.png b/DS4Windows/Resources/RS.png index 490b74bbfd..215133a75e 100644 Binary files a/DS4Windows/Resources/RS.png and b/DS4Windows/Resources/RS.png differ diff --git a/DS4Windows/Resources/RSD.png b/DS4Windows/Resources/RSD.png index 3edfe29688..9a477c738d 100644 Binary files a/DS4Windows/Resources/RSD.png and b/DS4Windows/Resources/RSD.png differ diff --git a/DS4Windows/Resources/RSL.png b/DS4Windows/Resources/RSL.png index 5be6c3963e..b0e5d0e910 100644 Binary files a/DS4Windows/Resources/RSL.png and b/DS4Windows/Resources/RSL.png differ diff --git a/DS4Windows/Resources/RSR.png b/DS4Windows/Resources/RSR.png index e178fbacb7..1b9c8deda9 100644 Binary files a/DS4Windows/Resources/RSR.png and b/DS4Windows/Resources/RSR.png differ diff --git a/DS4Windows/Resources/RSU.png b/DS4Windows/Resources/RSU.png index 874c526d74..8a8f19a44b 100644 Binary files a/DS4Windows/Resources/RSU.png and b/DS4Windows/Resources/RSU.png differ diff --git a/DS4Windows/Resources/RT.png b/DS4Windows/Resources/RT.png index 115b05f1f6..fff6cd64cd 100644 Binary files a/DS4Windows/Resources/RT.png and b/DS4Windows/Resources/RT.png differ diff --git a/DS4Windows/Resources/Red Circle.png b/DS4Windows/Resources/Red Circle.png index 84fc5e92f4..5ea845dd4b 100644 Binary files a/DS4Windows/Resources/Red Circle.png and b/DS4Windows/Resources/Red Circle.png differ diff --git a/DS4Windows/Resources/START.png b/DS4Windows/Resources/START.png index c1820b465a..ea5b53ba94 100644 Binary files a/DS4Windows/Resources/START.png and b/DS4Windows/Resources/START.png differ diff --git a/DS4Windows/Resources/Scp_All.ico b/DS4Windows/Resources/Scp_All.ico deleted file mode 100644 index b94efc8ea0..0000000000 Binary files a/DS4Windows/Resources/Scp_All.ico and /dev/null differ diff --git a/DS4Windows/Resources/UP.png b/DS4Windows/Resources/UP.png index c77b541171..32b588b102 100644 Binary files a/DS4Windows/Resources/UP.png and b/DS4Windows/Resources/UP.png differ diff --git a/DS4Windows/Resources/USB.png b/DS4Windows/Resources/USB.png index b0c07bf14c..9c1fbfc073 100644 Binary files a/DS4Windows/Resources/USB.png and b/DS4Windows/Resources/USB.png differ diff --git a/DS4Windows/Resources/USB_white.png b/DS4Windows/Resources/USB_white.png new file mode 100644 index 0000000000..e891ad5acf Binary files /dev/null and b/DS4Windows/Resources/USB_white.png differ diff --git a/DS4Windows/Resources/UpperTouch.png b/DS4Windows/Resources/UpperTouch.png index 94ee8a2afe..dda8b47107 100644 Binary files a/DS4Windows/Resources/UpperTouch.png and b/DS4Windows/Resources/UpperTouch.png differ diff --git a/DS4Windows/Resources/X.png b/DS4Windows/Resources/X.png index dc92bc6770..5455d28d18 100644 Binary files a/DS4Windows/Resources/X.png and b/DS4Windows/Resources/X.png differ diff --git a/DS4Windows/Resources/Y.png b/DS4Windows/Resources/Y.png index 76f1e0a185..26e9515575 100644 Binary files a/DS4Windows/Resources/Y.png and b/DS4Windows/Resources/Y.png differ diff --git a/DS4Windows/Resources/cancel.png b/DS4Windows/Resources/cancel.png new file mode 100644 index 0000000000..df68a3c745 Binary files /dev/null and b/DS4Windows/Resources/cancel.png differ diff --git a/DS4Windows/Resources/cancel_white.png b/DS4Windows/Resources/cancel_white.png new file mode 100644 index 0000000000..600afe8192 Binary files /dev/null and b/DS4Windows/Resources/cancel_white.png differ diff --git a/DS4Windows/Resources/checked.png b/DS4Windows/Resources/checked.png index c059fc26f0..ab731fd154 100644 Binary files a/DS4Windows/Resources/checked.png and b/DS4Windows/Resources/checked.png differ diff --git a/DS4Windows/Resources/checked_white.png b/DS4Windows/Resources/checked_white.png new file mode 100644 index 0000000000..29e4945305 Binary files /dev/null and b/DS4Windows/Resources/checked_white.png differ diff --git a/DS4Windows/Resources/clock.png b/DS4Windows/Resources/clock.png new file mode 100644 index 0000000000..2f60d740c2 Binary files /dev/null and b/DS4Windows/Resources/clock.png differ diff --git a/DS4Windows/Resources/clock_white.png b/DS4Windows/Resources/clock_white.png new file mode 100644 index 0000000000..99f90f5cc7 Binary files /dev/null and b/DS4Windows/Resources/clock_white.png differ diff --git a/DS4Windows/Resources/copy.png b/DS4Windows/Resources/copy.png new file mode 100644 index 0000000000..029049b709 Binary files /dev/null and b/DS4Windows/Resources/copy.png differ diff --git a/DS4Windows/Resources/copy_white.png b/DS4Windows/Resources/copy_white.png new file mode 100644 index 0000000000..67e064fb09 Binary files /dev/null and b/DS4Windows/Resources/copy_white.png differ diff --git a/DS4Windows/Resources/delete.png b/DS4Windows/Resources/delete.png index e2d2379e05..2482989b0c 100644 Binary files a/DS4Windows/Resources/delete.png and b/DS4Windows/Resources/delete.png differ diff --git a/DS4Windows/Resources/delete_white.png b/DS4Windows/Resources/delete_white.png new file mode 100644 index 0000000000..cfb9088364 Binary files /dev/null and b/DS4Windows/Resources/delete_white.png differ diff --git a/DS4Windows/Resources/edit.png b/DS4Windows/Resources/edit.png new file mode 100644 index 0000000000..8e22f35382 Binary files /dev/null and b/DS4Windows/Resources/edit.png differ diff --git a/DS4Windows/Resources/edit_white.png b/DS4Windows/Resources/edit_white.png new file mode 100644 index 0000000000..6bb6af788c Binary files /dev/null and b/DS4Windows/Resources/edit_white.png differ diff --git a/DS4Windows/Resources/export.png b/DS4Windows/Resources/export.png index 6104cfb0f2..e7293a0a90 100644 Binary files a/DS4Windows/Resources/export.png and b/DS4Windows/Resources/export.png differ diff --git a/DS4Windows/Resources/export_white.png b/DS4Windows/Resources/export_white.png new file mode 100644 index 0000000000..cf44880c78 Binary files /dev/null and b/DS4Windows/Resources/export_white.png differ diff --git a/DS4Windows/Resources/imageres_import.png b/DS4Windows/Resources/imageres_import.png deleted file mode 100644 index 4245de1c10..0000000000 Binary files a/DS4Windows/Resources/imageres_import.png and /dev/null differ diff --git a/DS4Windows/Resources/imageres_new.png b/DS4Windows/Resources/imageres_new.png deleted file mode 100644 index 7bc1970b83..0000000000 Binary files a/DS4Windows/Resources/imageres_new.png and /dev/null differ diff --git a/DS4Windows/Resources/import.png b/DS4Windows/Resources/import.png new file mode 100644 index 0000000000..80a70eda1e Binary files /dev/null and b/DS4Windows/Resources/import.png differ diff --git a/DS4Windows/Resources/import_white.png b/DS4Windows/Resources/import_white.png new file mode 100644 index 0000000000..55db84f1b7 Binary files /dev/null and b/DS4Windows/Resources/import_white.png differ diff --git a/DS4Windows/Resources/key-solid.png b/DS4Windows/Resources/key-solid.png new file mode 100644 index 0000000000..a558f342e5 Binary files /dev/null and b/DS4Windows/Resources/key-solid.png differ diff --git a/DS4Windows/Resources/key-solid_white.png b/DS4Windows/Resources/key-solid_white.png new file mode 100644 index 0000000000..cab1bdf9c8 Binary files /dev/null and b/DS4Windows/Resources/key-solid_white.png differ diff --git a/DS4Windows/Resources/keydown.png b/DS4Windows/Resources/keydown.png new file mode 100644 index 0000000000..2a9209563f Binary files /dev/null and b/DS4Windows/Resources/keydown.png differ diff --git a/DS4Windows/Resources/keydown_white.png b/DS4Windows/Resources/keydown_white.png new file mode 100644 index 0000000000..301ec2c6b7 Binary files /dev/null and b/DS4Windows/Resources/keydown_white.png differ diff --git a/DS4Windows/Resources/keyup.png b/DS4Windows/Resources/keyup.png new file mode 100644 index 0000000000..8969f7f08c Binary files /dev/null and b/DS4Windows/Resources/keyup.png differ diff --git a/DS4Windows/Resources/keyup_white.png b/DS4Windows/Resources/keyup_white.png new file mode 100644 index 0000000000..ff54b60209 Binary files /dev/null and b/DS4Windows/Resources/keyup_white.png differ diff --git a/DS4Windows/Resources/left touch.png b/DS4Windows/Resources/left touch.png index 4c94c3667b..bd5fe1b3e3 100644 Binary files a/DS4Windows/Resources/left touch.png and b/DS4Windows/Resources/left touch.png differ diff --git a/DS4Windows/Resources/mouse.png b/DS4Windows/Resources/mouse.png index 9b3a695732..6aaf93d4a1 100644 Binary files a/DS4Windows/Resources/mouse.png and b/DS4Windows/Resources/mouse.png differ diff --git a/DS4Windows/Resources/newprofile.png b/DS4Windows/Resources/newprofile.png new file mode 100644 index 0000000000..19d4be8371 Binary files /dev/null and b/DS4Windows/Resources/newprofile.png differ diff --git a/DS4Windows/Resources/newprofile_white.png b/DS4Windows/Resources/newprofile_white.png new file mode 100644 index 0000000000..e5da55670b Binary files /dev/null and b/DS4Windows/Resources/newprofile_white.png differ diff --git a/DS4Windows/Resources/none.png b/DS4Windows/Resources/none.png index 9e67a44972..6980501e97 100644 Binary files a/DS4Windows/Resources/none.png and b/DS4Windows/Resources/none.png differ diff --git a/DS4Windows/Resources/rainbow.png b/DS4Windows/Resources/rainbow.png index 5ede989a4b..cc717b157e 100644 Binary files a/DS4Windows/Resources/rainbow.png and b/DS4Windows/Resources/rainbow.png differ diff --git a/DS4Windows/Resources/rainbowC.png b/DS4Windows/Resources/rainbowC.png index 0a6f54d7af..94bab13bc1 100644 Binary files a/DS4Windows/Resources/rainbowC.png and b/DS4Windows/Resources/rainbowC.png differ diff --git a/DS4Windows/Resources/rainbowCCrop.png b/DS4Windows/Resources/rainbowCCrop.png new file mode 100644 index 0000000000..38e581e31f Binary files /dev/null and b/DS4Windows/Resources/rainbowCCrop.png differ diff --git a/DS4Windows/Resources/right touch.png b/DS4Windows/Resources/right touch.png index 4e2ac3d54e..3a662f60f0 100644 Binary files a/DS4Windows/Resources/right touch.png and b/DS4Windows/Resources/right touch.png differ diff --git a/DS4Windows/Resources/saveprofile.png b/DS4Windows/Resources/saveprofile.png index 37e3d4bed9..b0b54ae149 100644 Binary files a/DS4Windows/Resources/saveprofile.png and b/DS4Windows/Resources/saveprofile.png differ diff --git a/DS4Windows/Resources/shell32 delete.png b/DS4Windows/Resources/shell32 delete.png deleted file mode 100644 index 009eebc2af..0000000000 Binary files a/DS4Windows/Resources/shell32 delete.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_copy.png b/DS4Windows/Resources/shell32_copy.png deleted file mode 100644 index 5669430bd3..0000000000 Binary files a/DS4Windows/Resources/shell32_copy.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_export.png b/DS4Windows/Resources/shell32_export.png deleted file mode 100644 index 4bb2c2f7bf..0000000000 Binary files a/DS4Windows/Resources/shell32_export.png and /dev/null differ diff --git a/DS4Windows/Resources/shell32_new.png b/DS4Windows/Resources/shell32_new.png deleted file mode 100644 index 38a838daa6..0000000000 Binary files a/DS4Windows/Resources/shell32_new.png and /dev/null differ diff --git a/DS4Windows/Resources/size.png b/DS4Windows/Resources/size.png index 3694b39581..c5e2385d90 100644 Binary files a/DS4Windows/Resources/size.png and b/DS4Windows/Resources/size.png differ diff --git a/DS4Windows/Resources/x360test.png b/DS4Windows/Resources/x360test.png index ac527929b0..5e5d76e6f4 100644 Binary files a/DS4Windows/Resources/x360test.png and b/DS4Windows/Resources/x360test.png differ diff --git a/DS4Windows/Resources/xbox_360_controller.png b/DS4Windows/Resources/xbox_360_controller.png index 86064915e9..fdf974cd55 100644 Binary files a/DS4Windows/Resources/xbox_360_controller.png and b/DS4Windows/Resources/xbox_360_controller.png differ diff --git a/DS4Windows/StartupMethods.cs b/DS4Windows/StartupMethods.cs new file mode 100644 index 0000000000..5d1939ceac --- /dev/null +++ b/DS4Windows/StartupMethods.cs @@ -0,0 +1,208 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; +using System.IO; +using System.Runtime.InteropServices; +using Microsoft.Win32.TaskScheduler; +using Task = Microsoft.Win32.TaskScheduler.Task; + +namespace DS4WinWPF +{ + [System.Security.SuppressUnmanagedCodeSecurity] + public static class StartupMethods + { + public static string lnkpath = Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk"; + private static string taskBatPath = Path.Combine(DS4Windows.Global.exedirpath, "task.bat"); + + public static bool HasStartProgEntry() + { + // Exception handling should not be needed here. Method handles most cases + bool exists = File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.Startup) + "\\DS4Windows.lnk"); + return exists; + } + + public static bool HasTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + return tasker != null; + } + + public static void WriteStartProgEntry() + { + Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object + dynamic shell = Activator.CreateInstance(t); + try + { + var lnk = shell.CreateShortcut(lnkpath); + try + { + string app = DS4Windows.Global.exelocation; + lnk.TargetPath = DS4Windows.Global.exelocation; + lnk.Arguments = "-m"; + // Need to add the DS4Windows directory as cwd or + // language assemblies cannot be discovered + lnk.WorkingDirectory = DS4Windows.Global.exedirpath; + + //lnk.TargetPath = Assembly.GetExecutingAssembly().Location; + //lnk.Arguments = "-m"; + lnk.IconLocation = app.Replace('\\', '/'); + lnk.Save(); + } + finally + { + Marshal.FinalReleaseComObject(lnk); + } + } + finally + { + Marshal.FinalReleaseComObject(shell); + } + } + + public static void DeleteStartProgEntry() + { + if (File.Exists(lnkpath) && !new FileInfo(lnkpath).IsReadOnly) + { + File.Delete(lnkpath); + } + } + + public static void DeleteOldTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + foreach(Microsoft.Win32.TaskScheduler.Action act in tasker.Definition.Actions) + { + if (act.ActionType == TaskActionType.Execute) + { + ExecAction temp = act as ExecAction; + if (temp.Path != taskBatPath) + { + ts.RootFolder.DeleteTask("RunDS4Windows"); + break; + } + } + } + } + } + + public static bool CanWriteStartEntry() + { + bool result = false; + if (!new FileInfo(lnkpath).IsReadOnly) + { + result = true; + } + + return result; + } + + public static void WriteTaskEntry() + { + DeleteTaskEntry(); + + // Create new version of task.bat file using current exe + // filename. Allow dynamic file + RefreshTaskBat(); + + TaskService ts = new TaskService(); + TaskDefinition td = ts.NewTask(); + td.Triggers.Add(new LogonTrigger()); + string dir = DS4Windows.Global.exedirpath; + td.Actions.Add(new ExecAction($@"{dir}\task.bat", + "", + dir)); + + td.Principal.RunLevel = TaskRunLevel.Highest; + td.Settings.StopIfGoingOnBatteries = false; + td.Settings.DisallowStartIfOnBatteries = false; + ts.RootFolder.RegisterTaskDefinition("RunDS4Windows", td); + } + + public static void DeleteTaskEntry() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + ts.RootFolder.DeleteTask("RunDS4Windows"); + } + } + + public static bool CheckStartupExeLocation() + { + string lnkprogpath = ResolveShortcut(lnkpath); + return lnkprogpath != DS4Windows.Global.exelocation; + } + + public static void LaunchOldTask() + { + TaskService ts = new TaskService(); + Task tasker = ts.FindTask("RunDS4Windows"); + if (tasker != null) + { + tasker.Run(""); + } + } + + private static string ResolveShortcut(string filePath) + { + Type t = Type.GetTypeFromCLSID(new Guid("72C24DD5-D70A-438B-8A42-98424B88AFB8")); // Windows Script Host Shell Object + dynamic shell = Activator.CreateInstance(t); + string result; + + try + { + var shortcut = shell.CreateShortcut(filePath); + result = shortcut.TargetPath; + Marshal.FinalReleaseComObject(shortcut); + } + catch (COMException) + { + // A COMException is thrown if the file is not a valid shortcut (.lnk) file + result = null; + } + finally + { + Marshal.FinalReleaseComObject(shell); + } + + return result; + } + + private static void RefreshTaskBat() + { + string dir = DS4Windows.Global.exedirpath; + string path = $@"{dir}\task.bat"; + FileStream fileStream = new FileStream(path, FileMode.Create, FileAccess.Write); + using (StreamWriter w = new StreamWriter(fileStream)) + { + string temp = string.Empty; + w.WriteLine("@echo off"); // Turn off echo + w.WriteLine("SET mypath=\"%~dp0\""); + temp = $"cmd.exe /c start \"RunDS4Windows\" %mypath%\\{DS4Windows.Global.exeFileName} -m"; + w.WriteLine(temp); + w.WriteLine("exit"); + } + } + } +} diff --git a/DS4Windows/StatusLogMsg.cs b/DS4Windows/StatusLogMsg.cs new file mode 100644 index 0000000000..8ae7806d5a --- /dev/null +++ b/DS4Windows/StatusLogMsg.cs @@ -0,0 +1,62 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System; + +namespace DS4WinWPF +{ + public class StatusLogMsg + { + private string message; + private bool warning; + public string Message + { + get => message; + set + { + if (message == value) return; + message = value; + MessageChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler MessageChanged; + + public bool Warning { get => warning; + set + { + if (warning == value) return; + warning = value; + WarningChanged?.Invoke(this, EventArgs.Empty); + ColorChanged?.Invoke(this, EventArgs.Empty); + } + } + + public event EventHandler WarningChanged; + + public string Color + { + get + { + return warning ? "Red" : "#FF696969"; + } + } + + public event EventHandler ColorChanged; + } +} diff --git a/DS4Windows/Translations/Strings.Designer.cs b/DS4Windows/Translations/Strings.Designer.cs new file mode 100644 index 0000000000..1ba8be431d --- /dev/null +++ b/DS4Windows/Translations/Strings.Designer.cs @@ -0,0 +1,3857 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:4.0.30319.42000 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace DS4WinWPF.Translations { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + public class Strings { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Strings() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("DS4WinWPF.Translations.Strings", typeof(Strings).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + public static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + + /// + /// Looks up a localized string similar to Absolute Mouse. + /// + public static string AbsoluteMouse { + get { + return ResourceManager.GetString("AbsoluteMouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Absolute Mouse Options. + /// + public static string AbsoluteMouseOptions { + get { + return ResourceManager.GetString("AbsoluteMouseOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accel. + /// + public static string Accel { + get { + return ResourceManager.GetString("Accel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accept. + /// + public static string Accept { + get { + return ResourceManager.GetString("Accept", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Action. + /// + public static string Action { + get { + return ResourceManager.GetString("Action", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Active. + /// + public static string Active { + get { + return ResourceManager.GetString("Active", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Directory. + /// + public static string AddDirectory { + get { + return ResourceManager.GetString("AddDirectory", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Programs. + /// + public static string AddPrograms { + get { + return ResourceManager.GetString("AddPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Start Menu Programs. + /// + public static string AddStartMenuPrograms { + get { + return ResourceManager.GetString("AddStartMenuPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Steam Games. + /// + public static string AddSteamGames { + get { + return ResourceManager.GetString("AddSteamGames", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to All. + /// + public static string All { + get { + return ResourceManager.GetString("All", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Analog. + /// + public static string Analog { + get { + return ResourceManager.GetString("Analog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Anti-dead Zone. + /// + public static string AntiDeadZone { + get { + return ResourceManager.GetString("AntiDeadZone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to An anti-deadzone acts as an offset for use with an axis to denote the minimum output value generated after an axis has left its assigned deadzone. This is mainly meant to help with mapping an axis to the assigned deadzone value used for an axis in a video game. For example, the typical assigned deadzone for XInput LS in a video game is around 8000 (25%). With no anti-deadzone assigned, an axis would have to move past the assigned deadzone in DS4Windows along with the game's assigned axis deadzone.. + /// + public static string AntiDeadzoneTooltip { + get { + return ResourceManager.GetString("AntiDeadzoneTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Anti Radius. + /// + public static string AntiRadius { + get { + return ResourceManager.GetString("AntiRadius", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Anti Snapback. + /// + public static string AntiSnapback { + get { + return ResourceManager.GetString("AntiSnapback", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Anti Snapback timing. + /// + public static string AntiSnapbackTiming { + get { + return ResourceManager.GetString("AntiSnapbackTiming", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Appdata. + /// + public static string Appdata { + get { + return ResourceManager.GetString("Appdata", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Apply. + /// + public static string Apply { + get { + return ResourceManager.GetString("Apply", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to App Theme. + /// + public static string AppTheme { + get { + return ResourceManager.GetString("AppTheme", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto Profiles. + /// + public static string AutoProfiles { + get { + return ResourceManager.GetString("AutoProfiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Display Profile Switch via. + /// + public static string AutoProfiles_DisplaySwitchVia { + get { + return ResourceManager.GetString("AutoProfiles.DisplaySwitchVia", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log + Notification. + /// + public static string AutoProfiles_LogAndNotification { + get { + return ResourceManager.GetString("AutoProfiles.LogAndNotification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). + /// + public static string AutoProfPathTip { + get { + return ResourceManager.GetString("AutoProfPathTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*). + /// + public static string AutoProfTitleTip { + get { + return ResourceManager.GetString("AutoProfTitleTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Axial. + /// + public static string Axial { + get { + return ResourceManager.GetString("Axial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Axis Config. + /// + public static string AxisConfig { + get { + return ResourceManager.GetString("AxisConfig", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Battery. + /// + public static string Battery { + get { + return ResourceManager.GetString("Battery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Mouse. + /// + public static string BindingWin_AbsMouse { + get { + return ResourceManager.GetString("BindingWin.AbsMouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Mouse Down. + /// + public static string BindingWin_AbsMouseDown { + get { + return ResourceManager.GetString("BindingWin.AbsMouseDown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Mouse Left. + /// + public static string BindingWin_AbsMouseLeft { + get { + return ResourceManager.GetString("BindingWin.AbsMouseLeft", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Mouse Right. + /// + public static string BindingWin_AbsMouseRight { + get { + return ResourceManager.GetString("BindingWin.AbsMouseRight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Mouse Up. + /// + public static string BindingWin_AbsMouseUp { + get { + return ResourceManager.GetString("BindingWin.AbsMouseUp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Light. + /// + public static string BindingWin_ChangeLight { + get { + return ResourceManager.GetString("BindingWin.ChangeLight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Mouse Sensitivity. + /// + public static string BindingWin_ChangeMouseSensitivity { + get { + return ResourceManager.GetString("BindingWin.ChangeMouseSensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KB & Rel Mouse. + /// + public static string BindingWin_KeyAndRelMouse { + get { + return ResourceManager.GetString("BindingWin.KeyAndRelMouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keyboard & Mouse. + /// + public static string BindingWin_KeyboardAndMouse { + get { + return ResourceManager.GetString("BindingWin.KeyboardAndMouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Macro On, Choose a key to disable, else close this window to save. + /// + public static string BindingWin_MacroOn { + get { + return ResourceManager.GetString("BindingWin.MacroOn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record A Macro. + /// + public static string BindingWin_RecordAMacro { + get { + return ResourceManager.GetString("BindingWin.RecordAMacro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select Shift Trigger. + /// + public static string BindingWin_SelectShiftTrigger { + get { + return ResourceManager.GetString("BindingWin.SelectShiftTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Black. + /// + public static string Black { + get { + return ResourceManager.GetString("Black", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browse. + /// + public static string Browse { + get { + return ResourceManager.GetString("Browse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Browse for Other Programs. + /// + public static string BrowseOtherPrograms { + get { + return ResourceManager.GetString("BrowseOtherPrograms", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Buttons. + /// + public static string Buttons { + get { + return ResourceManager.GetString("Buttons", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cancel. + /// + public static string Cancel { + get { + return ResourceManager.GetString("Cancel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changelog. + /// + public static string Changelog { + get { + return ResourceManager.GetString("Changelog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Changes take effect on new device connection. + /// + public static string ChangeOnNewDeviceConn { + get { + return ResourceManager.GetString("ChangeOnNewDeviceConn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check every. + /// + public static string CheckEvery { + get { + return ResourceManager.GetString("CheckEvery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check For Update Now. + /// + public static string CheckUpdateNow { + get { + return ResourceManager.GetString("CheckUpdateNow", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check for updates at DS4Windows startup. + /// + public static string CheckUpdateStartup { + get { + return ResourceManager.GetString("CheckUpdateStartup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Clear. + /// + public static string Clear { + get { + return ResourceManager.GetString("Clear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close. + /// + public static string Close { + get { + return ResourceManager.GetString("Close", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Close Minimizes. + /// + public static string CloseMinimizes { + get { + return ResourceManager.GetString("CloseMinimizes", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Color. + /// + public static string Color { + get { + return ResourceManager.GetString("Color", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Colored. + /// + public static string Colored { + get { + return ResourceManager.GetString("Colored", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Confirm. + /// + public static string Confirm { + get { + return ResourceManager.GetString("Confirm", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 1. + /// + public static string Controller1Text { + get { + return ResourceManager.GetString("Controller1Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 2. + /// + public static string Controller2Text { + get { + return ResourceManager.GetString("Controller2Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 3. + /// + public static string Controller3Text { + get { + return ResourceManager.GetString("Controller3Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 4. + /// + public static string Controller4Text { + get { + return ResourceManager.GetString("Controller4Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 5. + /// + public static string Controller5Text { + get { + return ResourceManager.GetString("Controller5Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 6. + /// + public static string Controller6Text { + get { + return ResourceManager.GetString("Controller6Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 7. + /// + public static string Controller7Text { + get { + return ResourceManager.GetString("Controller7Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller 8. + /// + public static string Controller8Text { + get { + return ResourceManager.GetString("Controller8Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Home LED. + /// + public static string ControllerRegOptWin_EnableHomeLED { + get { + return ResourceManager.GetString("ControllerRegOptWin.EnableHomeLED", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Joined Gyro Provider. + /// + public static string ControllerRegOptWin_JoinedGyroProvider { + get { + return ResourceManager.GetString("ControllerRegOptWin.JoinedGyroProvider", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Link Mode. + /// + public static string ControllerRegOptWin_LinkMode { + get { + return ResourceManager.GetString("ControllerRegOptWin.LinkMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mute LED Mode. + /// + public static string ControllerRegOptWin_MuteLEDMode { + get { + return ResourceManager.GetString("ControllerRegOptWin.MuteLEDMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Player LED Mode. + /// + public static string ControllerRegOptWin_PlayerLEDMode { + get { + return ResourceManager.GetString("ControllerRegOptWin.PlayerLEDMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller Type Options. + /// + public static string ControllerRegOptWin_WinTitle { + get { + return ResourceManager.GetString("ControllerRegOptWin.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controllers. + /// + public static string Controllers { + get { + return ResourceManager.GetString("Controllers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS3 Controller Support. + /// + public static string ControllerSupportDS3 { + get { + return ResourceManager.GetString("ControllerSupportDS3", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS4 Controller Support. + /// + public static string ControllerSupportDS4 { + get { + return ResourceManager.GetString("ControllerSupportDS4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DualSense Controller Support. + /// + public static string ControllerSupportDualSense { + get { + return ResourceManager.GetString("ControllerSupportDualSense", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to JoyCon Controller Support. + /// + public static string ControllerSupportJoyCon { + get { + return ResourceManager.GetString("ControllerSupportJoyCon", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switch Pro Controller Support. + /// + public static string ControllerSupportSwitchPro { + get { + return ResourceManager.GetString("ControllerSupportSwitchPro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Control Panel. + /// + public static string ControlPanel { + get { + return ResourceManager.GetString("ControlPanel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controls. + /// + public static string Controls { + get { + return ResourceManager.GetString("Controls", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Copycat. + /// + public static string Copycat { + get { + return ResourceManager.GetString("Copycat", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change some flags used for a non-Sony DS4 controller. It might fix rumble and lightbar support for some third party DS4 clones. + /// + public static string CopycatTip { + get { + return ResourceManager.GetString("CopycatTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Data integrity checks failed for wireless device. Closing device.. + /// + public static string CRC32Fail { + get { + return ResourceManager.GetString("CRC32Fail", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Cubic. + /// + public static string Cubic { + get { + return ResourceManager.GetString("Cubic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Current. + /// + public static string Current { + get { + return ResourceManager.GetString("Current", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom. + /// + public static string Custom { + get { + return ResourceManager.GetString("Custom", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Custom Exe Name. + /// + public static string CustomExeName { + get { + return ResourceManager.GetString("CustomExeName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + /// + ///Example: whyme_DS4Windows. + /// + public static string CustomExeNameInfo { + get { + return ResourceManager.GetString("CustomExeNameInfo", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dark. + /// + public static string Dark { + get { + return ResourceManager.GetString("Dark", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Days. + /// + public static string Days { + get { + return ResourceManager.GetString("Days", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dead Zone. + /// + public static string DeadZone { + get { + return ResourceManager.GetString("DeadZone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DeadZone X. + /// + public static string DeadZone_X { + get { + return ResourceManager.GetString("DeadZone X", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DeadZone Y. + /// + public static string DeadZone_Y { + get { + return ResourceManager.GetString("DeadZone Y", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dead Zone Type. + /// + public static string DeadZoneType { + get { + return ResourceManager.GetString("DeadZoneType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default. + /// + public static string Default { + get { + return ResourceManager.GetString("Default", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delete. + /// + public static string Delete { + get { + return ResourceManager.GetString("Delete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Delta Acceleration. + /// + public static string DeltaAcceleration { + get { + return ResourceManager.GetString("DeltaAcceleration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Description. + /// + public static string Description { + get { + return ResourceManager.GetString("Description", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Detected Controllers. + /// + public static string DetectedControllers { + get { + return ResourceManager.GetString("DetectedControllers", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device Options. + /// + public static string DeviceOptions { + get { + return ResourceManager.GetString("DeviceOptions", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device type. + /// + public static string DeviceType { + get { + return ResourceManager.GetString("DeviceType", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Directional Swipe. + /// + public static string DirectionalSwipe { + get { + return ResourceManager.GetString("DirectionalSwipe", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disable virtual controller. + /// + public static string DisableVirtualController { + get { + return ResourceManager.GetString("DisableVirtualController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do not spawn/associate virtual controllers for connected controllers using this profile (Applies on profile save). + /// + public static string DisableVirtualControllerTip { + get { + return ResourceManager.GetString("DisableVirtualControllerTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disconnect from BT when Stopping. + /// + public static string DisconnectFromBtWhenStopping { + get { + return ResourceManager.GetString("DisconnectFromBtWhenStopping", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controller/Driver Setup. + /// + public static string DriverSetup { + get { + return ResourceManager.GetString("DriverSetup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS4 BT Poll Rate. + /// + public static string DS4BTPollRate { + get { + return ResourceManager.GetString("DS4BTPollRate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Feature currently disabled in app due to driver issues. Hopefully issues get fixed in a future update.. + /// + public static string DS4LightbarPassthruDisabled { + get { + return ResourceManager.GetString("DS4LightbarPassthruDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Default (Analog + Buttons). + /// + public static string DS4OutputTriggersDefault { + get { + return ResourceManager.GetString("DS4OutputTriggersDefault", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Force usage of both % strength levels (General and DualSense specifc). + /// + public static string DualSRumbleForceGenericRescale { + get { + return ResourceManager.GetString("DualSRumbleForceGenericRescale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Recommended to be left DISABLED. + /// + ///- Disabled: rumble will be rescaled natively by the controller accordingly to the defined power level (better quality) + /// + ///- Enabled: both DS4Windows generic rumble rescale and DualSense's native control will be active. + /// + public static string DualSRumbleForceGenericRescale_Tip { + get { + return ResourceManager.GetString("DualSRumbleForceGenericRescale_Tip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accurate. + /// + public static string DualSRumbleModeAccurate { + get { + return ResourceManager.GetString("DualSRumbleModeAccurate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disabled. + /// + public static string DualSRumbleModeDisabled { + get { + return ResourceManager.GetString("DualSRumbleModeDisabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Legacy. + /// + public static string DualSRumbleModeLegacy { + get { + return ResourceManager.GetString("DualSRumbleModeLegacy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rumble mode and strength level:. + /// + public static string DualSRumbleModeNPowerLevelTxt { + get { + return ResourceManager.GetString("DualSRumbleModeNPowerLevelTxt", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passthru. + /// + public static string DualSRumbleModePassthru { + get { + return ResourceManager.GetString("DualSRumbleModePassthru", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Accurate Mode (recommended): + ///- Better replicates the DualShock 4/Xbox 360 controller rumble feeling + ///- More accurately executes game's intended rumble effects + ///- Rumble has more depth. Within the same power level there is a greater difference between min and max in-game rumble activation, + ///varying from real low up to the max strength of the defined power level + /// + ///Legacy Mode: + ///- Overral stronger, but lacks depth + ///- Has a "sharper" feeling + ///- The min and max activation in-game will be, respectively, only sl [rest of string was truncated]";. + /// + public static string DualSRumbleModes_Tip { + get { + return ResourceManager.GetString("DualSRumbleModes_Tip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DualSense's native rumble Power Level rescaler. + /// + ///- When in Accurate Mode, rumble's [ min // max ] will be [ 1% /// Chosen Power Level ] + /// - Example (62%): [ min = 1% /// max = 62% ] + /// + ///- When in Legacy Mode, rumble's [min /// max ] will be roughly [ Power Level - 12% /// Power Level + 12% ] + /// - Example (62%): [ min = 50% /// max = 74% ]. + /// + public static string DualSRumblePowerLevel_Tip { + get { + return ResourceManager.GetString("DualSRumblePowerLevel_Tip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DualSense specific rumble settings. + /// + public static string DualSRumbleSpecificSettings { + get { + return ResourceManager.GetString("DualSRumbleSpecificSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Duplicate. + /// + public static string Duplicate { + get { + return ResourceManager.GetString("Duplicate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Dynamic. + /// + public static string Dynamic { + get { + return ResourceManager.GetString("Dynamic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Easeout Cubic. + /// + public static string EaseoutCubic { + get { + return ResourceManager.GetString("EaseoutCubic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Easeout Quad. + /// + public static string EaseoutQuad { + get { + return ResourceManager.GetString("EaseoutQuad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Easing Duration. + /// + public static string EasingDuration { + get { + return ResourceManager.GetString("EasingDuration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit. + /// + public static string Edit { + get { + return ResourceManager.GetString("Edit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Action. + /// + public static string EditAction { + get { + return ResourceManager.GetString("EditAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Emulated Controller. + /// + public static string EmulatedController { + get { + return ResourceManager.GetString("EmulatedController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enabled. + /// + public static string Enabled { + get { + return ResourceManager.GetString("Enabled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Interpret Monitoring Messages. + /// + public static string EnableInterpretingOscMonitoring { + get { + return ResourceManager.GetString("EnableInterpretingOscMonitoring", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Monitoring Service. + /// + public static string EnableOscSender { + get { + return ResourceManager.GetString("EnableOscSender", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Control Server. + /// + public static string EnableOscServer { + get { + return ResourceManager.GetString("EnableOscServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Output data to DS4. + /// + public static string EnableOutputDataToDS4 { + get { + return ResourceManager.GetString("EnableOutputDataToDS4", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output lightbar and rumble data periodically to DS4 gamepad. Untick if the gamepad doesn't support data receiving. + ///Changes to this option takes effect at the gamepad connection time.. + /// + public static string EnableOutputDataToDS4Tip { + get { + return ResourceManager.GetString("EnableOutputDataToDS4Tip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Touchpad Toggle. + /// + public static string EnableTouchpadToggle { + get { + return ResourceManager.GetString("EnableTouchpadToggle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable verbose log. + /// + public static string EnableVerboseLog { + get { + return ResourceManager.GetString("EnableVerboseLog", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show additional log messages when a gamepad is connected. + /// + public static string EnableVerboseLogTip { + get { + return ResourceManager.GetString("EnableVerboseLogTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enhanced Precision. + /// + public static string EnhancedPrecision { + get { + return ResourceManager.GetString("EnhancedPrecision", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Exclusive Access. + /// + public static string ExclusiveAccess { + get { + return ResourceManager.GetString("ExclusiveAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Export. + /// + public static string Export { + get { + return ResourceManager.GetString("Export", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Extra. + /// + public static string Extra { + get { + return ResourceManager.GetString("Extra", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Due to other mappers enabling support for multiple device types by default (Steam Input), DS4Windows only enables support for reading from DS4 controllers by default. You can specify mapper support for other supported device types here. Be careful when using DS4Windows with other possible mappers running at the same time.. + /// + public static string FirstLaunch_DeviceIntroText { + get { + return ResourceManager.GetString("FirstLaunch.DeviceIntroText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Device Support. + /// + public static string FirstLaunch_DeviceSupport { + get { + return ResourceManager.GetString("FirstLaunch.DeviceSupport", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS3 Device Support. + /// + public static string FirstLaunch_DS3EnableCkbLabel { + get { + return ResourceManager.GetString("FirstLaunch.DS3EnableCkbLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support for DualShock 3 (PS3) controllers. Requires the use of the DsHidMini driver from the ViGEm project (nefarius).. + /// + public static string FirstLaunch_DS3EnableText { + get { + return ResourceManager.GetString("FirstLaunch.DS3EnableText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS4 Device Support. + /// + public static string FirstLaunch_DS4EnableCkbLabel { + get { + return ResourceManager.GetString("FirstLaunch.DS4EnableCkbLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support for known DualShock 4 controllers. + /// + public static string FirstLaunch_DS4EnableText { + get { + return ResourceManager.GetString("FirstLaunch.DS4EnableText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DualSense Device Support. + /// + public static string FirstLaunch_DSEnableCkbLabel { + get { + return ResourceManager.GetString("FirstLaunch.DSEnableCkbLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support for DualSense (PS5) controllers. Base model and DS Edge. + /// + public static string FirstLaunch_DSEnableText { + get { + return ResourceManager.GetString("FirstLaunch.DSEnableText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enabled Devices Mapper Support. + /// + public static string FirstLaunch_Header { + get { + return ResourceManager.GetString("FirstLaunch.Header", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to JoyCon Device Support. + /// + public static string FirstLaunch_JoyConEnableCkbLabel { + get { + return ResourceManager.GetString("FirstLaunch.JoyConEnableCkbLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support for JoyCon (Nintendo Switch) controllers. + /// + public static string FirstLaunch_JoyConEnableText { + get { + return ResourceManager.GetString("FirstLaunch.JoyConEnableText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Switch Pro Device Support. + /// + public static string FirstLaunch_SwitchProEnableCkbLabel { + get { + return ResourceManager.GetString("FirstLaunch.SwitchProEnableCkbLabel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Support for Switch Pro (Nintendo Switch) controllers. + /// + public static string FirstLaunch_SwitchProEnableText { + get { + return ResourceManager.GetString("FirstLaunch.SwitchProEnableText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to First Launch. + /// + public static string FirstLaunch_WinTitle { + get { + return ResourceManager.GetString("FirstLaunch.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flash Lightbar at High Latency. + /// + public static string FlashLightbarAtHighLatency { + get { + return ResourceManager.GetString("FlashLightbarAtHighLatency", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flash Rate. + /// + public static string FlashRate { + get { + return ResourceManager.GetString("FlashRate", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flick Stick. + /// + public static string FlickStick { + get { + return ResourceManager.GetString("FlickStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flick Threshold. + /// + public static string FlickThreshold { + get { + return ResourceManager.GetString("FlickThreshold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Flick Time. + /// + public static string FlickTime { + get { + return ResourceManager.GetString("FlickTime", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full. + /// + public static string Full { + get { + return ResourceManager.GetString("Full", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Full Btn Pull. + /// + public static string FullBtnPull { + get { + return ResourceManager.GetString("FullBtnPull", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to .NET 5 Runtime was not detected on your system. Please download and install .NET 5 Runtime to ensure compatibility with future DS4Windows builds. You will be redirected to the .NET 5 Runtime download page upon closing this window.. + /// + public static string FutureNetNotInstalled { + get { + return ResourceManager.GetString("FutureNetNotInstalled", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fuzz. + /// + public static string Fuzz { + get { + return ResourceManager.GetString("Fuzz", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick.. + /// + public static string GamepadGyroCameraDescription { + get { + return ResourceManager.GetString("GamepadGyroCameraDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad with Mouse-like Joystick. + /// + public static string GamepadGyroCameraName { + get { + return ResourceManager.GetString("GamepadGyroCameraName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the controller output to a standard gamepad. + /// + public static string GamepadPresetDescription { + get { + return ResourceManager.GetString("GamepadPresetDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad. + /// + public static string GamepadPresetName { + get { + return ResourceManager.GetString("GamepadPresetName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad Test. + /// + public static string GamepadTest { + get { + return ResourceManager.GetString("GamepadTest", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gyro. + /// + public static string Gyro { + get { + return ResourceManager.GetString("Gyro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Controls (Accel). + /// + public static string GyroControlsAccel { + get { + return ResourceManager.GetString("GyroControlsAccel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add additional throttling at low end of curve to account for device shaking. + /// + public static string GyroTriggerJitterCompensationTooltip { + get { + return ResourceManager.GetString("GyroTriggerJitterCompensationTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Heavy. + /// + public static string Heavy { + get { + return ResourceManager.GetString("Heavy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Height. + /// + public static string Height { + get { + return ResourceManager.GetString("Height", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide DS4 Controller. + /// + public static string HideDS4Controller { + get { + return ResourceManager.GetString("HideDS4Controller", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hide Unchecked. + /// + public static string HideUnchecked { + get { + return ResourceManager.GetString("HideUnchecked", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HidGuardian Access. + /// + public static string HidGuardianAccess { + get { + return ResourceManager.GetString("HidGuardianAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HidHide. + /// + public static string HidHide { + get { + return ResourceManager.GetString("HidHide", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HidHide Access. + /// + public static string HidHideAccess { + get { + return ResourceManager.GetString("HidHideAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HidHide Configuration Client. + /// + public static string HidHideConfigClient { + get { + return ResourceManager.GetString("HidHideConfigClient", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to HidNinja. + /// + public static string HidNinja { + get { + return ResourceManager.GetString("HidNinja", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hip Fire Delay. + /// + public static string HipFireDelay { + get { + return ResourceManager.GetString("HipFireDelay", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hotkeys/About. + /// + public static string HotkeysAbout { + get { + return ResourceManager.GetString("HotkeysAbout", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hours. + /// + public static string Hours { + get { + return ResourceManager.GetString("Hours", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Icon Choice. + /// + public static string IconChoice { + get { + return ResourceManager.GetString("IconChoice", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ID. + /// + public static string ID { + get { + return ResourceManager.GetString("ID", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Idle Disconnect. + /// + public static string IdleDisconnect { + get { + return ResourceManager.GetString("IdleDisconnect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Import. + /// + public static string Import { + get { + return ResourceManager.GetString("Import", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Intro. + /// + public static string Intro { + get { + return ResourceManager.GetString("Intro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse.. + /// + public static string KBMGyroMouseDescription { + get { + return ResourceManager.GetString("KBMGyroMouseDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KB+M Controls with Gyro Mouse. + /// + public static string KBMGyroMouseName { + get { + return ResourceManager.GetString("KBMGyroMouseName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support.. + /// + public static string KBMPresetDescription { + get { + return ResourceManager.GetString("KBMPresetDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to KB+M Controls. + /// + public static string KBMPresetName { + get { + return ResourceManager.GetString("KBMPresetName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use language pack. + /// + public static string LangPackControl_UseLangPack { + get { + return ResourceManager.GetString("LangPackControl.UseLangPack", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch program with profile. + /// + public static string LaunchProgramWithProfile { + get { + return ResourceManager.GetString("LaunchProgramWithProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Left Stick. + /// + public static string LeftStick { + get { + return ResourceManager.GetString("LeftStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Light. + /// + public static string Light { + get { + return ResourceManager.GetString("Light", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Lightbar. + /// + public static string Lightbar { + get { + return ResourceManager.GetString("Lightbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Linear. + /// + public static string Linear { + get { + return ResourceManager.GetString("Linear", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Link Profile/ID. + /// + public static string LinkProfileId { + get { + return ResourceManager.GetString("LinkProfileId", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Log. + /// + public static string Log { + get { + return ResourceManager.GetString("Log", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Abs Display Monitor. + /// + public static string MainWin_AbsDisplayMonitor { + get { + return ResourceManager.GetString("MainWin.AbsDisplayMonitor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Enable Server. + /// + public static string MainWin_EnableServer { + get { + return ResourceManager.GetString("MainWin.EnableServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1€ Beta. + /// + public static string MainWin_OneEuroBeta { + get { + return ResourceManager.GetString("MainWin.OneEuroBeta", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 1€ MinCutoff. + /// + public static string MainWin_OneEuroMinCutoff { + get { + return ResourceManager.GetString("MainWin.OneEuroMinCutoff", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max Output. + /// + public static string MaxOutput { + get { + return ResourceManager.GetString("MaxOutput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max Travel. + /// + public static string MaxTravel { + get { + return ResourceManager.GetString("MaxTravel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Max Zone. + /// + public static string MaxZone { + get { + return ResourceManager.GetString("MaxZone", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Min Angle Threshold. + /// + public static string MinAngleThreshold { + get { + return ResourceManager.GetString("MinAngleThreshold", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Min Factor. + /// + public static string MinFactor { + get { + return ResourceManager.GetString("MinFactor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimize to Taskbar. + /// + public static string MinimizeToTaskbar { + get { + return ResourceManager.GetString("MinimizeToTaskbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimize to Taskbar instead of System Tray. + /// + public static string MinimizeToTaskbarTip { + get { + return ResourceManager.GetString("MinimizeToTaskbarTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Min Travel. + /// + public static string MinTravel { + get { + return ResourceManager.GetString("MinTravel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse. + /// + public static string MixedGyroMousePresetDescription { + get { + return ResourceManager.GetString("MixedGyroMousePresetDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad with Gyro Mouse. + /// + public static string MixedGyroMousePresetName { + get { + return ResourceManager.GetString("MixedGyroMousePresetName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Maps the controller output to mixed XInput gamepad + RS mouse.. + /// + public static string MixedPresetDescription { + get { + return ResourceManager.GetString("MixedPresetDescription", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Gamepad with High Precision Camera. + /// + public static string MixedPresetName { + get { + return ResourceManager.GetString("MixedPresetName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mode. + /// + public static string Mode { + get { + return ResourceManager.GetString("Mode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse. + /// + public static string Mouse { + get { + return ResourceManager.GetString("Mouse", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse Acceleration. + /// + public static string MouseAcceleration { + get { + return ResourceManager.GetString("MouseAcceleration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse Joystick. + /// + public static string MouseJoystick { + get { + return ResourceManager.GetString("MouseJoystick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse Offset. + /// + public static string MouseOffset { + get { + return ResourceManager.GetString("MouseOffset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse Sensitivity. + /// + public static string MouseSensitivity { + get { + return ResourceManager.GetString("MouseSensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Mouse Vertical Scale. + /// + public static string MouseVerticalScale { + get { + return ResourceManager.GetString("MouseVerticalScale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Down. + /// + public static string MoveDown { + get { + return ResourceManager.GetString("MoveDown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Move Up. + /// + public static string MoveUp { + get { + return ResourceManager.GetString("MoveUp", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiplier. + /// + public static string Multiplier { + get { + return ResourceManager.GetString("Multiplier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Name. + /// + public static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to .NET 8 Not Found. + /// + public static string Net8NoticeWin_WinTitle { + get { + return ResourceManager.GetString("Net8NoticeWin.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS4Windows version 3.3 will require the installation of the .NET 8 Desktop Runtime on your system + ///[https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer) + /// + ///Please click OK to confirm that you have read the message. Press Cancel to be reminded again on the next application launch.. + /// + public static string Net8NotInstalledWinNotice { + get { + return ResourceManager.GetString("Net8NotInstalledWinNotice", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New. + /// + public static string New { + get { + return ResourceManager.GetString("New", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Action. + /// + public static string NewAction { + get { + return ResourceManager.GetString("NewAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to New Profile. + /// + public static string NewProfile { + get { + return ResourceManager.GetString("NewProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No. + /// + public static string No { + get { + return ResourceManager.GetString("No", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to No Controllers Connected (Max {0}). + /// + public static string NoControllersConnected { + get { + return ResourceManager.GetString("NoControllersConnected", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to None. + /// + public static string None { + get { + return ResourceManager.GetString("None", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Normal. + /// + public static string Normal { + get { + return ResourceManager.GetString("Normal", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Notification. + /// + public static string Notification { + get { + return ResourceManager.GetString("Notification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OK. + /// + public static string OK { + get { + return ResourceManager.GetString("OK", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to External OSC Control & Monitoring. + /// + public static string OscServerHeading { + get { + return ResourceManager.GetString("OscServerHeading", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Other. + /// + public static string Other { + get { + return ResourceManager.GetString("Other", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Choose the type of output virtual controller (Applies on profile save). + /// + public static string OutContNotice { + get { + return ResourceManager.GetString("OutContNotice", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Outer Bind. + /// + public static string OuterBind { + get { + return ResourceManager.GetString("OuterBind", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Outer Btn. + /// + public static string OuterBtn { + get { + return ResourceManager.GetString("OuterBtn", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Outer Btn Dead. + /// + public static string OuterBtnDead { + get { + return ResourceManager.GetString("OuterBtnDead", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output Curve. + /// + public static string OutputCurve { + get { + return ResourceManager.GetString("OutputCurve", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output Mode. + /// + public static string OutputMode { + get { + return ResourceManager.GetString("OutputMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Input #. + /// + public static string OutputSlotMan_InputNum { + get { + return ResourceManager.GetString("OutputSlotMan.InputNum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XInput #. + /// + public static string OutputSlotMan_XInputNum { + get { + return ResourceManager.GetString("OutputSlotMan.XInputNum", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output Slots. + /// + public static string OutputSlots { + get { + return ResourceManager.GetString("OutputSlots", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Passthru. + /// + public static string Passthru { + get { + return ResourceManager.GetString("Passthru", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Path. + /// + public static string Path { + get { + return ResourceManager.GetString("Path", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Permanent. + /// + public static string Permanent { + get { + return ResourceManager.GetString("Permanent", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pitch. + /// + public static string Pitch { + get { + return ResourceManager.GetString("Pitch", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Plug. + /// + public static string Plug { + get { + return ResourceManager.GetString("Plug", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Port. + /// + public static string Port { + get { + return ResourceManager.GetString("Port", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile.. + /// + public static string PresetIntroText { + get { + return ResourceManager.GetString("PresetIntroText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Output Controller. + /// + public static string PresetOptWin_OutputController { + get { + return ResourceManager.GetString("PresetOptWin.OutputController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Preset Menu. + /// + public static string PresetOptWin_PresetMenu { + get { + return ResourceManager.GetString("PresetOptWin.PresetMenu", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Presets. + /// + public static string Presets { + get { + return ResourceManager.GetString("Presets", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile. + /// + public static string Profile { + get { + return ResourceManager.GetString("Profile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to DS4 Trigger Output Mode. + /// + public static string ProfileEditor_VirtualDS4TrigOutput { + get { + return ResourceManager.GetString("ProfileEditor.VirtualDS4TrigOutput", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profile Folder. + /// + public static string ProfileFolder { + get { + return ResourceManager.GetString("ProfileFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Profiles. + /// + public static string Profiles { + get { + return ResourceManager.GetString("Profiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program. + /// + public static string Program { + get { + return ResourceManager.GetString("Program", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Program Folder. + /// + public static string ProgramFolder { + get { + return ResourceManager.GetString("ProgramFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quadratic. + /// + public static string Quadratic { + get { + return ResourceManager.GetString("Quadratic", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Quick Charge. + /// + public static string QuickCharge { + get { + return ResourceManager.GetString("QuickCharge", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Radial. + /// + public static string Radial { + get { + return ResourceManager.GetString("Radial", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Battery: 0%. + /// + public static string ReadingsControl_BatteryZero { + get { + return ResourceManager.GetString("ReadingsControl.BatteryZero", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Input Delay: N/A. + /// + public static string ReadingsControl_InputDelayNA { + get { + return ResourceManager.GetString("ReadingsControl.InputDelayNA", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to SixAxis: X Axis is flipped so it is easier to read. + /// + public static string ReadingsControl_SixAxisXText { + get { + return ResourceManager.GetString("ReadingsControl.SixAxisXText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Real World Calibration. + /// + public static string RealWorldCalibration { + get { + return ResourceManager.GetString("RealWorldCalibration", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add Rumble. + /// + public static string RecordBox_AddRumble { + get { + return ResourceManager.GetString("RecordBox.AddRumble", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Change Lightbar Color. + /// + public static string RecordBox_ChangeLightbarColor { + get { + return ResourceManager.GetString("RecordBox.ChangeLightbarColor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Double click on a wait to edit the time. + /// + public static string RecordBox_DoubleClickWaitEdit { + get { + return ResourceManager.GetString("RecordBox.DoubleClickWaitEdit", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 5th Mouse Button. + /// + public static string RecordBox_FifthMB { + get { + return ResourceManager.GetString("RecordBox.FifthMB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to 4th Mouse Button. + /// + public static string RecordBox_FourthMB { + get { + return ResourceManager.GetString("RecordBox.FourthMB", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Insert Wait. + /// + public static string RecordBox_InsertWait { + get { + return ResourceManager.GetString("RecordBox.InsertWait", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Load Preset. + /// + public static string RecordBox_LoadPreset { + get { + return ResourceManager.GetString("RecordBox.LoadPreset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Macro Order. + /// + public static string RecordBox_MacroOrder { + get { + return ResourceManager.GetString("RecordBox.MacroOrder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Play Once. + /// + public static string RecordBox_PlayOnce { + get { + return ResourceManager.GetString("RecordBox.PlayOnce", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record Delays. + /// + public static string RecordBox_RecordDelays { + get { + return ResourceManager.GetString("RecordBox.RecordDelays", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeat While Held. + /// + public static string RecordBox_RepeatWhileHeld { + get { + return ResourceManager.GetString("RecordBox.RepeatWhileHeld", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save Preset. + /// + public static string RecordBox_SavePreset { + get { + return ResourceManager.GetString("RecordBox.SavePreset", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Keyboard/Mouse + Controller 1 to record. + /// + public static string RecordBox_UseActionToRecord { + get { + return ResourceManager.GetString("RecordBox.UseActionToRecord", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Edit Macro. + /// + public static string RecordBoxWin_WinTitle { + get { + return ResourceManager.GetString("RecordBoxWin.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record. + /// + public static string RecordText { + get { + return ResourceManager.GetString("RecordText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Regular. + /// + public static string Regular { + get { + return ResourceManager.GetString("Regular", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove. + /// + public static string Remove { + get { + return ResourceManager.GetString("Remove", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Remove Action. + /// + public static string RemoveAction { + get { + return ResourceManager.GetString("RemoveAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename. + /// + public static string RenameProfile { + get { + return ResourceManager.GetString("RenameProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please type the new name to use for the selected profile XML file.. + /// + public static string RenameProfileWin_TypeNewProfileName { + get { + return ResourceManager.GetString("RenameProfileWin.TypeNewProfileName", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rename Profile. + /// + public static string RenameProfileWin_WinTitle { + get { + return ResourceManager.GetString("RenameProfileWin.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Requested. + /// + public static string Requested { + get { + return ResourceManager.GetString("Requested", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Revert to default profile on unknown. + /// + public static string RevertToDefaultProfileOnUnknown { + get { + return ResourceManager.GetString("RevertToDefaultProfileOnUnknown", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Right Stick. + /// + public static string RightStick { + get { + return ResourceManager.GetString("RightStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Roll. + /// + public static string Roll { + get { + return ResourceManager.GetString("Roll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rotation. + /// + public static string Rotation { + get { + return ResourceManager.GetString("Rotation", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Rumble. + /// + public static string Rumble { + get { + return ResourceManager.GetString("Rumble", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to sec. + /// + public static string RumbleMaxSecs { + get { + return ResourceManager.GetString("RumbleMaxSecs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Auto stop rumble in secs (0=auto stop disabled). + /// + public static string RumbleMaxSecsTip { + get { + return ResourceManager.GetString("RumbleMaxSecsTip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run As. + /// + public static string RunAs { + get { + return ResourceManager.GetString("RunAs", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run At Startup. + /// + public static string RunAtStartup { + get { + return ResourceManager.GetString("RunAtStartup", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fuzz specifies the minimum number of device units, in active zone, that the Accel has to be rotated before the output is registered as changed in the mapper. The value is expressed in raw Accel units.. + /// + public static string SASteeringWheelFuzzTooltip { + get { + return ResourceManager.GetString("SASteeringWheelFuzzTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save. + /// + public static string SaveProfile { + get { + return ResourceManager.GetString("SaveProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to For those who prefer a regular install. Settings saved at %appdata%\DS4Windows. + /// + public static string SaveWhere_AppDataDescText { + get { + return ResourceManager.GetString("SaveWhere.AppDataDescText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Don't Delete the other settings yet. + /// + public static string SaveWhere_DontDelete { + get { + return ResourceManager.GetString("SaveWhere.DontDelete", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multiple save locations detected. + /// + public static string SaveWhere_MultipleSaves { + get { + return ResourceManager.GetString("SaveWhere.MultipleSaves", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Pick where you want profiles and settings to be saved. + /// + public static string SaveWhere_PickWhere { + get { + return ResourceManager.GetString("SaveWhere.PickWhere", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to For those who prefer a portable program. + ///Note: this option does not work if in an admin folder w/o UAC. + /// + public static string SaveWhere_ProgramFolderDescText { + get { + return ResourceManager.GetString("SaveWhere.ProgramFolderDescText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Save Where. + /// + public static string SaveWhere_WinTitle { + get { + return ResourceManager.GetString("SaveWhere.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scan Code. + /// + public static string ScanCode { + get { + return ResourceManager.GetString("ScanCode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Selected Profile. + /// + public static string SelectedProfile { + get { + return ResourceManager.GetString("SelectedProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensitivity. + /// + public static string Sensitivity { + get { + return ResourceManager.GetString("Sensitivity", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Settings. + /// + public static string Settings { + get { + return ResourceManager.GetString("Settings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shared Access. + /// + public static string SharedAccess { + get { + return ResourceManager.GetString("SharedAccess", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Shift Modifier. + /// + public static string ShiftModifier { + get { + return ResourceManager.GetString("ShiftModifier", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show auto-profile debug messages. + /// + public static string ShowAutoProfileDebugMessages { + get { + return ResourceManager.GetString("ShowAutoProfileDebugMessages", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Show Notifications. + /// + public static string ShowNotifications { + get { + return ResourceManager.GetString("ShowNotifications", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Six Axis (Accel). + /// + public static string SixAxisAccel { + get { + return ResourceManager.GetString("SixAxisAccel", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Skip Version. + /// + public static string SkipVersion { + get { + return ResourceManager.GetString("SkipVersion", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Snap To Center. + /// + public static string SnapToCenter { + get { + return ResourceManager.GetString("SnapToCenter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Check Battery Life. + /// + public static string SpecialActionEdit_CheckBattery { + get { + return ResourceManager.GetString("SpecialActionEdit.CheckBattery", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Disconnect from Bluetooth. + /// + public static string SpecialActionEdit_DisconnectBT { + get { + return ResourceManager.GetString("SpecialActionEdit.DisconnectBT", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Double Tap Trigger. + /// + public static string SpecialActionEdit_DoubleTapTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.DoubleTapTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hold for. + /// + public static string SpecialActionEdit_HoldFor { + get { + return ResourceManager.GetString("SpecialActionEdit.HoldFor", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Hold Trigger. + /// + public static string SpecialActionEdit_HoldTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.HoldTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Keep key state. + /// + public static string SpecialActionEdit_KeepKeyState { + get { + return ResourceManager.GetString("SpecialActionEdit.KeepKeyState", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Launch a program. + /// + public static string SpecialActionEdit_LaunchProgram { + get { + return ResourceManager.GetString("SpecialActionEdit.LaunchProgram", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Load a profile. + /// + public static string SpecialActionEdit_LoadProfile { + get { + return ResourceManager.GetString("SpecialActionEdit.LoadProfile", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Macro Recorded. + /// + public static string SpecialActionEdit_MacroRecorded { + get { + return ResourceManager.GetString("SpecialActionEdit.MacroRecorded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Multi-action Button. + /// + public static string SpecialActionEdit_MultiAction { + get { + return ResourceManager.GetString("SpecialActionEdit.MultiAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to pressing unload trigger. + /// + public static string SpecialActionEdit_PressingUnloadTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.PressingUnloadTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Press/Toggle key. + /// + public static string SpecialActionEdit_PressKey { + get { + return ResourceManager.GetString("SpecialActionEdit.PressKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Record a macro. + /// + public static string SpecialActionEdit_RecordMacro { + get { + return ResourceManager.GetString("SpecialActionEdit.RecordMacro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to releasing unload trigger. + /// + public static string SpecialActionEdit_ReleasingUnloadTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.ReleasingUnloadTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Repeat while held. + /// + public static string SpecialActionEdit_RepeatWhileHeld { + get { + return ResourceManager.GetString("SpecialActionEdit.RepeatWhileHeld", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Run on Trigger Release. + /// + public static string SpecialActionEdit_RunTriggerRelease { + get { + return ResourceManager.GetString("SpecialActionEdit.RunTriggerRelease", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to -Select an Action-. + /// + public static string SpecialActionEdit_SelectAction { + get { + return ResourceManager.GetString("SpecialActionEdit.SelectAction", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a Key. + /// + public static string SpecialActionEdit_SelectKey { + get { + return ResourceManager.GetString("SpecialActionEdit.SelectKey", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Select a macro. + /// + public static string SpecialActionEdit_SelectMacro { + get { + return ResourceManager.GetString("SpecialActionEdit.SelectMacro", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Set Unload Trigger. + /// + public static string SpecialActionEdit_SetUnloadTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.SetUnloadTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Calibration of sixaxis wheel calibration. + /// + public static string SpecialActionEdit_SixAxisWheelCalib { + get { + return ResourceManager.GetString("SpecialActionEdit.SixAxisWheelCalib", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Synchronized Run. + /// + public static string SpecialActionEdit_SyncRun { + get { + return ResourceManager.GetString("SpecialActionEdit.SyncRun", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap Trigger. + /// + public static string SpecialActionEdit_TapTrigger { + get { + return ResourceManager.GetString("SpecialActionEdit.TapTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unload on trigger release. + /// + public static string SpecialActionEdit_UnloadTriggerRelease { + get { + return ResourceManager.GetString("SpecialActionEdit.UnloadTriggerRelease", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Untoggle key by. + /// + public static string SpecialActionEdit_UntoggleKeyBy { + get { + return ResourceManager.GetString("SpecialActionEdit.UntoggleKeyBy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to via lightbar. + /// + public static string SpecialActionEdit_ViaLightbar { + get { + return ResourceManager.GetString("SpecialActionEdit.ViaLightbar", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to via notification. + /// + public static string SpecialActionEdit_ViaNotification { + get { + return ResourceManager.GetString("SpecialActionEdit.ViaNotification", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Square Stick. + /// + public static string SquareStick { + get { + return ResourceManager.GetString("SquareStick", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start Minimized. + /// + public static string StartMinimized { + get { + return ResourceManager.GetString("StartMinimized", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Start. + /// + public static string StartText { + get { + return ResourceManager.GetString("StartText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Status. + /// + public static string Status { + get { + return ResourceManager.GetString("Status", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Fuzz specifies the minimum number of units the analog stick moves, in active zone, before the output is registered as changed in the mapper. This setting can be useful for worn sticks that cannot maintain a constant position. The value is expressed in raw stick units.. + /// + public static string StickFuzzTooltip { + get { + return ResourceManager.GetString("StickFuzzTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to OLD OBSOLETE SETTING. Attempt to apply a curve based on raw input coordinates before any dead zone info is applied. Wonky. + /// + public static string StickInputCurveTooltip { + get { + return ResourceManager.GetString("StickInputCurveTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Always enforce max output setting. Useful for 100% Max Output and confining value to a circular output value. + /// + public static string StickMaxOutputForceTooltip { + get { + return ResourceManager.GetString("StickMaxOutputForceTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to In some situations, it might be useful to limit the maximum value that is output by the output analog stick. Max Output allows throttling the final output value of the analog stick.. + /// + public static string StickMaxOutputTooltip { + get { + return ResourceManager.GetString("StickMaxOutputTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Threshold for when an action will fire. + /// + public static string StickOuterBindDeadTooltip { + get { + return ResourceManager.GetString("StickOuterBindDeadTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Have outer bind fire before reaching a threshold. Action releases once the threshold has been exceeded. + /// + public static string StickOuterBindInvertTooltip { + get { + return ResourceManager.GetString("StickOuterBindInvertTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Action to execute when stick travel reaches past a treshold. Useful for mapping keys for Walk or Sprint actions. Invert casues the action to fire up until the threshold. + /// + public static string StickOuterBindTooltip { + get { + return ResourceManager.GetString("StickOuterBindTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to + = Clockwise. - = Counter-clockwise. + /// + ///The rotation setting is meant to help correct the orientation of an analog stick if your thumb is slightly shifted when moving an analog stick. For example, your thumb might be slightly shifted from center when the analog stick is moved fully north. My thumbs shift slightly to the right when moving an analog stick fully north due to the way my hands grip the DS4. The value used denotes the number of degrees used to adjust the final axis output value. Values allows ra [rest of string was truncated]";. + /// + public static string StickRotationTooltip { + get { + return ResourceManager.GetString("StickRotationTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Stop. + /// + public static string StopText { + get { + return ResourceManager.GetString("StopText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Swipe Touchpad To Switch Profiles. + /// + public static string SwipeTouchpadToSwitchProfiles { + get { + return ResourceManager.GetString("SwipeTouchpadToSwitchProfiles", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Task. + /// + public static string Task { + get { + return ResourceManager.GetString("Task", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test. + /// + public static string Test { + get { + return ResourceManager.GetString("Test", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Heavy. + /// + public static string TestHeavy { + get { + return ResourceManager.GetString("TestHeavy", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Test Light. + /// + public static string TestLight { + get { + return ResourceManager.GetString("TestLight", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Toggle. + /// + public static string Toggle { + get { + return ResourceManager.GetString("Toggle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Touchpad. + /// + public static string Touchpad { + get { + return ResourceManager.GetString("Touchpad", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Throttle low end of Touchpad movement. Reduces accidental mouse cursor movement when holding a mostly fixed position on the Touchpad. + /// + public static string TouchpadJitterCompTooltip { + get { + return ResourceManager.GetString("TouchpadJitterCompTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Minimum calculated output travel before a Mouse event is sent to the system. + /// + public static string TouchpadMinThresholdTooltip { + get { + return ResourceManager.GetString("TouchpadMinThresholdTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adjusts a touchpad swipe by a given rotation angle. Useful when a normal touchpad swipe is not a straight line across. Values allows range from -180 to 180. Default is 0.. + /// + public static string TouchpadRotationTooltip { + get { + return ResourceManager.GetString("TouchpadRotationTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Sensitivity used to engage a multi-touch Mouse Wheel Scroll action. + /// + public static string TouchpadSlideTooltip { + get { + return ResourceManager.GetString("TouchpadSlideTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Activate Mouse Left click with a Touchpad Tap. Max time interval is set at (value * 2) ms.. + /// + public static string TouchpadTapTooltip { + get { + return ResourceManager.GetString("TouchpadTapTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Adds momentum to a Touchpad swipe once a finger is lifted. Adds extra Mouse cursor travel than would be possible with the confined space on the Touchpad. + /// + public static string TouchpadTrackballEnableTooltip { + get { + return ResourceManager.GetString("TouchpadTrackballEnableTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Add friction to virtual Trackball. Decreased friction will increase final mouse cursor travel time. + /// + public static string TouchpadTrackballFrictionTooltip { + get { + return ResourceManager.GetString("TouchpadTrackballFrictionTooltip", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Scroll. + /// + public static string TouchScroll { + get { + return ResourceManager.GetString("TouchScroll", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Slide. + /// + public static string TouchSlide { + get { + return ResourceManager.GetString("TouchSlide", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Tap. + /// + public static string TouchTap { + get { + return ResourceManager.GetString("TouchTap", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger. + /// + public static string Trigger { + get { + return ResourceManager.GetString("Trigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Trigger Effect. + /// + public static string TriggerEffect { + get { + return ResourceManager.GetString("TriggerEffect", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Turn Off DS4Windows Temporarily. + /// + public static string TurnOffDS4WindowsTemporarily { + get { + return ResourceManager.GetString("TurnOffDS4WindowsTemporarily", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Two Stage Mode. + /// + public static string TwoStageMode { + get { + return ResourceManager.GetString("TwoStageMode", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to UDP Server. + /// + public static string UDPServer { + get { + return ResourceManager.GetString("UDPServer", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unbound. + /// + public static string Unbound { + get { + return ResourceManager.GetString("Unbound", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unload Trigger. + /// + public static string UnloadTrigger { + get { + return ResourceManager.GetString("UnloadTrigger", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Unplug. + /// + public static string Unplug { + get { + return ResourceManager.GetString("Unplug", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Update Window. + /// + public static string UpdaterWin_WinTitle { + get { + return ResourceManager.GetString("UpdaterWin.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Please update .NET Runtime. + /// + public static string UpgradeNetCaption { + get { + return ResourceManager.GetString("UpgradeNetCaption", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Controller. + /// + public static string UseController { + get { + return ResourceManager.GetString("UseController", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use custom Steam Folder. + /// + public static string UseCustomSteamFolder { + get { + return ResourceManager.GetString("UseCustomSteamFolder", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use Smoothing. + /// + public static string UseSmoothing { + get { + return ResourceManager.GetString("UseSmoothing", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Utils. + /// + public static string Utils { + get { + return ResourceManager.GetString("Utils", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Vertical Scale. + /// + public static string VerticalScale { + get { + return ResourceManager.GetString("VerticalScale", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Only works with ViGEmBus 1.17.333.0 and newer. + /// + public static string ViGEm117MinNeeded { + get { + return ResourceManager.GetString("ViGEm117MinNeeded", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to ViGEm Device Plugin Failed. Error Code {0}. Likely an internal ViGEmBus problem. Closing connection. If the issue persists, please close DS4Windows and then reboot Windows.. + /// + public static string ViGEmPluginFailure { + get { + return ResourceManager.GetString("ViGEmPluginFailure", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Virtual Controller Settings. + /// + public static string VirtualControllerSettings { + get { + return ResourceManager.GetString("VirtualControllerSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Waking Up From Suspend. + /// + public static string WakeupFromSuspend { + get { + return ResourceManager.GetString("WakeupFromSuspend", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Warnings only. + /// + public static string WarningsOnly { + get { + return ResourceManager.GetString("WarningsOnly", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Bluetooth Settings. + /// + public static string Welcome_BluetoothSettings { + get { + return ResourceManager.GetString("Welcome.BluetoothSettings", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If this window reappears after installing, you may need to reboot your PC.. + /// + public static string Welcome_Step1HelpText { + get { + return ResourceManager.GetString("Welcome.Step1HelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Step 1: Install ViGEmBus Driver. + /// + public static string Welcome_Step1Text { + get { + return ResourceManager.GetString("Welcome.Step1Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to If you've used a 360 controller on this PC, you can skip this step.. + /// + public static string Welcome_Step2HelpText { + get { + return ResourceManager.GetString("Welcome.Step2HelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Step 2: If on Windows 7, Install 360 Driver. + /// + public static string Welcome_Step2Text { + get { + return ResourceManager.GetString("Welcome.Step2Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Once flashing go to your Bluetooth Settings and connect to "Wireless Controller". If asked, enter pair code 0000. Once paired, you're ready. Have fun!. + /// + public static string Welcome_Step3BluetoothHelpText { + get { + return ResourceManager.GetString("Welcome.Step3BluetoothHelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Step 3: Connecting the DualShock 4 controller. + ///To setup wired/USB: + ///Simply plug a micro-USB into your PC and DualShock 4. + /// + ///To setup Bluetooth (optional): Hold the PS Button and Share for 3 seconds. The lightbar will begin to double flash.. + /// + public static string Welcome_Step3HelpText { + get { + return ResourceManager.GetString("Welcome.Step3HelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use HidHide to configure and hide any input controllers from other apps running on your system. Some games require only one controller to be present or double input will cause problems in game.. + /// + public static string Welcome_Step4HelpText { + get { + return ResourceManager.GetString("Welcome.Step4HelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (Optional) Step 4: Install HidHide Driver. + /// + public static string Welcome_Step4Text { + get { + return ResourceManager.GetString("Welcome.Step4Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Use FakerInput driver to expose system-wide virtual keyboard, relative mouse, and absolute mouse. Allows virtual KB+M events to be usable in some situations when SendInput fails. Such situations are elevated process and games, UAC prompts, and anti-cheat systems that block SendInput events. Use of FakerInput is necessary to allow DS4Windows to work with some games with anti-cheat protection like Valorant.. + /// + public static string Welcome_Step5HelpText { + get { + return ResourceManager.GetString("Welcome.Step5HelpText", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to (Optional) Step 5: Install FakerInput Driver. + /// + public static string Welcome_Step5Text { + get { + return ResourceManager.GetString("Welcome.Step5Text", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Welcome to DS4Windows. + /// + public static string Welcome_WinTitle { + get { + return ResourceManager.GetString("Welcome.WinTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to White. + /// + public static string White { + get { + return ResourceManager.GetString("White", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Width. + /// + public static string Width { + get { + return ResourceManager.GetString("Width", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Window Title. + /// + public static string WindowTitle { + get { + return ResourceManager.GetString("WindowTitle", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to X Center. + /// + public static string XCenter { + get { + return ResourceManager.GetString("XCenter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to XInputChecker. + /// + public static string XInputChecker { + get { + return ResourceManager.GetString("XInputChecker", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yaw. + /// + public static string Yaw { + get { + return ResourceManager.GetString("Yaw", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Y Center. + /// + public static string YCenter { + get { + return ResourceManager.GetString("YCenter", resourceCulture); + } + } + + /// + /// Looks up a localized string similar to Yes. + /// + public static string Yes { + get { + return ResourceManager.GetString("Yes", resourceCulture); + } + } + } +} diff --git a/DS4Windows/Translations/Strings.ar.resx b/DS4Windows/Translations/Strings.ar.resx new file mode 100644 index 0000000000..ce312819a7 --- /dev/null +++ b/DS4Windows/Translations/Strings.ar.resx @@ -0,0 +1,445 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + التسارع + + + فعل + + + إضافة مجلد + + + إضافة برامج + + + إضافة لقائمة برامج ابدأ + + + إضافة العاب ستيم + + + الكل + + + ملفات التعريف التلقائية + + + البطارية + + + تصفح + + + تصفح برامج أخرى + + + إلغاء + + + التحقق من وجود تحديث الأن + + + DS4Windows التحقق من وجود تحديث عند تشغيل + + + مسح + + + تصغير البرنامج عند إغلاقه + + + اللون + + + يد تحكم 1 + + + يد تحكم 2 + + + يد تحكم 3 + + + يد تحكم 4 + + + أيادي التحكم + + + لوحة التحكم + + + حذف + + + يد التحكم\إعداد برنامج التشغيل + + + نسخ + + + تعديل + + + تعديل الفعل + + + تصدير + + + كامل + + + Gyro + + + إخفاء العناصر غير المحددة + + + إستيراد + + + العصا اليسرى + + + السجل + + + الاسم + + + جديد + + + فعل جديد + + + ملف تعريف جديد + + + لا شيء + + + مسار + + + ملف تعريف + + + مجلد ملفات التعريف + + + شحن سريع + + + تسجيل + + + إزالة + + + إزالة فعل + + + العصا اليمنى + + + الإهتزاز + + + تشغيل عند البدأ + + + حفظ + + + حفظ ملف اتعريف + + + الإعدادات + + + إظهار الإشعارات + + + البدأ مصغراً + + + تشغيل + + + الحالة + + + إيقاف + + + التمرير + + + إنزلاق + + + النقر + + + الضغط + + + التحذيرات فقط + + + الحد الأقصى للإهتزاز في الثانية + + + إيقاف الإهتزاز بشكل تلقائي خلال ث (0= الإيقاف التلقائي معطل) + + + عنوان النافذة + + + تحرك للأعلى + + + تحرك للأسفل + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + تجربة يد التحكم + + + DS4 تمكين بيانات الإخراج لـ + + + .DS4 إخراج بيانات الشريط الضوئي والإهتزاز بشكل دوري إلى يد تحكم +.إلغي التحديد في حال يد التحكم لا تدعم تلقي بيانات المساعدة +.تسري هذه التغييرات في وقت إتصال يد التحكم + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + تطبيق + + + HidNinja + + + مخصص Exe اسم + + + .قيد التشغيل DS4Windows.exe / InputMapper.exe بعض الألعاب تقوم بمنع التحكم إذا اكتشفت +.الحل البديل إعادة تسميته لشيء أخر ليفشل منع اللعبة +.تحديد اسم جديد هنا يسمح لبرنامج التحديث لمعرفة اسم الملف + + + XInputChecker + + + يد تحكم 5 + + + يد تحكم 6 + + + يد تحكم 7 + + + يد تحكم 8 + + + .القياسي Gryo أو DS4 تعيين إخراج يد التحكم إلى تحكم +Gryo معين كفأرة + + + يد تحكم مع فأرة + + + تعيين وحدة التحكم ليد تحكم قياسية + + + يد التحكم + + + .إفتراضي KB+M قم بتعيين إخراج وحدة التحكم إلى تحكم +.مفيدة للعب العاب المنظور الأول لا تدعم يد التحكم +معين كفأرة إفتراضية Gryo + + + Gryo مع فأرة KB+M تحكم + + + .إفتراضي KB+M قم بتعيين إخراج وحدة التحكم إلى تحكم +مفيدة للعب العاب المنظور الأول لا تدعم يد التحكم + + + KB+M تحكم + + + .قم بتعيين الأزرار ومحاور التحكم لقياسية +إلى ماوس افتراضي Gryo قم بتعيين + + + Gryo يد تحكم مع فأرة + + + XInput + RS تعيين إخراج يد التحكم لخليط فأرة + + + يد تحكم مع كاميرا عالية الدقة + + + الوصف + + + هل تريد إختيار إعداد مسبق؟ سيؤدي إختيار "لا" إلى قيام "محرر الملف الشخصي" بملف .تعريف يد تحكم فارغ + + + إعدادات مسبقة + + + سجل التغييرات + + + إغلاق + + + ملفات التعريف + + + (لا توجد أيادي تحكم متصلة (الأقصى {0} + + + بداية النقرة + + + وقت النقرة + + + الحد الأدنى للزاوية + + + المعايرة في العالم الحقيقي + + diff --git a/DS4Windows/Translations/Strings.cs.resx b/DS4Windows/Translations/Strings.cs.resx new file mode 100644 index 0000000000..ccfbd99169 --- /dev/null +++ b/DS4Windows/Translations/Strings.cs.resx @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Akcelerace + + + Akce + + + Přidat cestu + + + Přidat programy + + + Přidat ze Start Menu + + + Přidat Steam Hry + + + Vše + + + Automatické profily + + + Baterie + + + Prohlížet + + + Hledat programy + + + Zrušit + + + Hledat aktualizace + + + Hledat aktualizace při startu programu + + + Smazat + + + Zavření minimalizuje + + + Barva + + + Ovladač 1 + + + Ovladač 2 + + + Ovladač 3 + + + Ovladač 4 + + + Ovladače + + + Ovládací panel + + + Odstranit + + + Nastavení ovladače + + + Duplikovat + + + Upravit + + + Upravit akci + + + Exportovat + + + Plná + + + Gyroskop + + + Skrýt nezaškrtnuté + + + Importovat + + + Levá páčka + + + Historie + + + Jméno + + + Nový + + + Nová akce + + + Nový profil + + + Žádné + + + Cesta + + + Profil + + + Složka profilu + + + Rychlé nabíjení + + + Nahrát + + + Odstranit + + + Odstranit akci + + + Pravá páčka + + + Vibrace + + + Spustit při spuštění PC + + + Uložit + + + Uložit profil + + + Nastavení + + + Ukázat upozornění + + + Zapnout minimalizovaně + + + Start + + + Status + + + Stop + + + Přetáčet dotykem + + + Jet dotykem + + + Zmáčknout dotykem + + + Spoušť + + + Jen varování + + + sekunda + + + Automaticky vypnout vibrace po sekundách ( 0 = automatické vypnutí vibrací vypnuto) + + + Window Title + + + Posun nahoru + + + Posun dolů + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Test ovladače + + + Enable Output data to DS4 + + + Output lightbar and rumble data periodically to DS4 gamepad. Untick if the gamepad doesn't support data receiving. +Changes to this option takes effect at the gamepad connection time. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Použít + + + HidNinja + + + Custom Exe Name + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad s joystickem podobným myši + + + Mapuje výstup ovladače na standardní gamepad + + + Ovladač + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M Controls with Gyro Mouse + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M Controls + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Gamepad s gyroskopickou myší + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Gamepad s vysoce přesnou kamerou + + + Popis + + + Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile. + + + Předvolby + + + Seznam změn + + + Zavřít + + + Profily + + + Žádné připojené ovladače (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + + ViGEm Device Plugin Failed. Likely an internal ViGEmBus problem. Closing connection. If the issue persists, please reboot Windows. WARNING: You will likely get a BSOD on Windows shutdown. + + + Data integrity checks failed for wireless device. Closing device. + + + .NET 5 Runtime was not detected on your system. Please download and install .NET 5 Runtime to ensure compatibility with future DS4Windows builds. You will be redirected to the .NET 5 Runtime download page upon closing this window. + + + Please update .NET Runtime + + + HidHide + + + HidHide Configuration Client + + + Exclusive Access + + + HidGuardian Access + + + HidHide Access + + + Shared Access + + diff --git a/DS4Windows/Translations/Strings.de.resx b/DS4Windows/Translations/Strings.de.resx new file mode 100644 index 0000000000..5df6682004 --- /dev/null +++ b/DS4Windows/Translations/Strings.de.resx @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Beschleunigung + + + Aktion + + + Verzeichnis hinzufügen + + + Programme hinzufügen + + + Startmenü-Programm hinzufügen + + + Steam-Spiel hinzufügen + + + Alle + + + Automatische Profile + + + Batterie + + + Durchsuchen + + + Nach anderen Programmen suchen + + + Abbrechen + + + Jetzt nach Updates suchen + + + Nach Updates beim Starten von DS4Windows suchen + + + Leeren + + + Schließen minimiert das Fenster + + + Farbe + + + Controller 1 + + + Controller 2 + + + Controller 3 + + + Controller 4 + + + Controller + + + Systemsteuerungs-Panel + + + Löschen + + + Treiber-Setup + + + Duplizieren + + + Bearbeiten + + + Bearbeitungsaktionen + + + Exportieren + + + Voll + + + Gyro + + + Abgewählte ausblenden + + + Importieren + + + Linker Stick + + + Protokoll + + + Name + + + Neu + + + Neue Aktion + + + Neues Profil + + + Keine + + + Pfad + + + Profil + + + Profil-Ordner + + + Schnellladen + + + Aufnehmen + + + Entfernen + + + Aktion entfernen + + + Rechter Stick + + + Vibration + + + Mit Windows starten + + + Speichern + + + Profil speichern + + + Einstellungen + + + Benachrichtigungen anzeigen + + + Minimiert starten + + + Start + + + Status + + + Stopp + + + Scrollen + + + Wischen + + + Tippen + + + Trigger + + + Nur Warnungen + + + s + + + Automatisches stoppen der Vibration in Sekunden (0 = automatisches stoppen deaktiviert) + + + Fenstertitel + + + Nach oben bewegen + + + Nach unten bewegen + + + Prozesspfad. ^ABC = Übereinstimmung am Anfang der Zeichenfolge (^) | ABC$ = Übereinstimmung am Ende der Zeichenfolge ($) | *ABC = Enthält eine Zeichenfolge (*) + + + Fenstertitel. ^ABC = Übereinstimmung am Anfang der Zeichenfolge (^) | ABC$ = Übereinstimmung am Ende der Zeichenfolge ($) | *ABC = Enthält eine Zeichenfolge (*) + + + Gamepad-Test + + + Datenausgabe an DS4 aktivieren + + + Licht- und Vibrationsdaten regelmäßig auf dem DS4-Controller ausgeben. Abwählen wenn der Controller keinen Datenempfang unterstützt. Änderungen dieser Option werden zum Zeitpunkt der Verbindung des Controllers wirksam. + Um einen Zeilenumbruch in einen String-Ressourcenwert im VisualStudio-Ressourceneditor einzugeben, drücken Sie Umschalt+Eingabe Taste. + + + Anwenden + + + HidNinja + + + Externe OSC Steuerung & Überwachung + + + Aktiviere Steuerungsserver + + + Interpretiere Überwachungsnachrichten + + + Aktiviere Überwachungsservice + + + Eigener EXE-Name + + + Einige Spiele ignorieren DS4-Eingaben wenn sie erkennen, dass DS4Windows.exe oder InputMapper.exe läuft. Mit dem Umbenennen von DS4Windows.exe schlägt die Überprüfung im Spiel fehl und die Sperre kann somit umgangen werden. Wird hier ein eigener EXE-Name angegeben, kann DS4Updater eine Kopie von DS4Windows mit dem eigenen Namen automatisch aktualisieren. Stelle sicher, dass die Dateiendung weggelassen wird. + +Beispiel: whyme_DS4Windows + + + XInput-Tester + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Ordnet die Controller-Ausgabe einem standardmäßigen XInput- oder DS4-Gamepad zu. Gyro ist einem Maus-ähnlichen Joystick zugeordnet. + + + Gamepad mit Maus-ähnlichem Joystick + + + Ordnet die Controller-Ausgabe einem Standard-Gamepad zu + + + Gamepad + + + Ordnet die Controller-Ausgabe virtuellen KB+M-Tasten zu. Nützlich für FPS-Spiele ohne Controller-Unterstützung. Gyro ist einer virtuellen Maus zugeordnet. + + + KB+M-Steuerung mit Gyro-Maus + + + Ordnet die Controller-Ausgabe virtuellen KB+M-Tasten zu. Nützlich für FPS-Spiele ohne Controller-Unterstützung. Gyro ist einer virtuellen Maus zugeordnet. + + + KB+M-Steuerung + + + Ordnet die Tasten und Achsen einem Standard-Gamepad zu. Gyro ist einer virtuellen Maus zugeordnet. + + + Gamepad mit Gyro-Maus + + + Ordnet die Controller-Ausgabe einem gemischen XInput-Gamepad + RS-Maus zu. + + + Gamepad mit hochpräziser Kamera + + + Beschreibung + + + Preset-Option verweden? Bei der Auswahl von Nein wird der Profil-Editor ein leeres Gamepad-Profil laden. + + + Voreinstellungen + + + Änderungsprotokoll + + + Schließen + + + Profile + + + Keine Controller verbunden (max. {0}) + + + Blinkschwelle + + + Blinkzeit + + + Min. Winkelschwelle + + + Echtwelt-Kalibrierung + + + ViGEm Geräte-Plugin fehlgeschlagen. Wahrscheinlich ein internes ViGEmBus-Problem. Verbindung getrennt. Wenn das Problem weiterhin besteht, schliessen Sie bitte DS4Windows und starten Sie Windows neu. + + + Datenintegritätsprüfungen für drahtloses Gerät fehlgeschlagen. Gerät getrennt. + + + .NET 5 Runtime wurde auf Ihrem System nicht erkannt. Bitte laden Sie .NET 5 Runtime herunter und installieren Sie es, um die Kompatibilität mit zukünftigen DS4Windows-Builds zu gewährleisten. Sie werden nach dem Schliessen dieses Fensters auf die Download-Seite für .NET 5 Runtime weitergeleitet. + + + Bitte aktualisieren Sie .NET Runtime + + + HidHide + + + HidHide-Konfigurations-Client + + + Exklusiver Zugriff + + + HidGuardian Zugriff + + + HidHide Zugriff + + + Gemeinsamer Zugriff + + + Profil umbenennen + + + Virtuelle Steuerung deaktivieren + + + Virtuelle Steuerung für verbundene Controller, die dieses Profil verwenden, nicht erzeugen/verbinden (gilt nach Speichern des Profils) + + + Emulierter Controller + + + Wählen Sie den Typ der virtuellen Ausgabesteuerung (gilt nach Speichern des Profils) + + + Einstellungen der virtuellen Steuerung + + + Änderungen werden bei neuer Geräteverbindung wirksam + + + Fuzz gibt die minimale Anzahl von Einheiten an, die der Analogknüppel in der aktiven Zone bewegt, bevor der Ausgang im Mapper als verändert registriert wird. Diese Einstellung kann für abgenutzte Knüppel nützlich sein, die keine konstante Position halten können. Der Wert wird in rohen Knüppeleinheiten angegeben. + + + Erzwingt immer die Einstellung der maximalen Leistung. Nützlich für 100% Max Output und Begrenzung des Wertes auf einen kreisförmigen Ausgangswert + + + In manchen Situationen kann es sinnvoll sein, den maximalen Wert zu begrenzen, der vom Analogknüppel ausgegeben wird. Max Output ermöglicht die Drosselung des endgültigen Ausgabewertes des Analogknüppels. + + + Eine Anti-Deadzone dient als Offset für die Verwendung mit einer Achse, um den minimalen Ausgangswert zu bezeichnen, der erzeugt wird, nachdem eine Achse ihre zugewiesene Deadzone verlassen hat. Dies soll hauptsächlich bei der Zuordnung einer Achse zum zugewiesenen Totzonenwert helfen, der für eine Achse in einem Videospiel verwendet wird. Zum Beispiel liegt die typische zugewiesene Totzone für XInput LS in einem Videospiel bei 8000 (25%). Wenn keine Antideadzone zugewiesen ist, müsste eine Achse die zugewiesene Deadzone in DS4Windows zusammen mit der zugewiesenen Achsen-Totzone des Spiels überschreiten. + + + ALTE, VERALTETE EINSTELLUNG. Es wird versucht, eine Kurve auf der Grundlage der rohen Eingabekoordinaten anzuwenden, bevor eine Totzoneninformation angewendet wird. Verrückt + + + Minimaler berechneter Ausgangsweg, bevor ein Mausereignis an das System gesendet wird + + + Passt eine Touchpad-Wischbewegung um einen bestimmten Drehwinkel an. Nützlich, wenn eine normale Touchpad-Bewegung nicht eine gerade Linie ist. Erlaubte Werte reichen von -180 bis 180. Standardwert ist 0. + + + Empfindlichkeit zum Aktivieren einer Multi-Touch-Mausrad-Bildlaufaktion + + + Aktivieren Sie den Linksklick der Maus mit einem Touchpad-Tipp. Das maximale Zeitintervall ist auf (Wert * 2) ms festgelegt. + + + Erhöht den Schwung einer Touchpad-Bewegung, sobald der Finger angehoben wird. Ermöglicht eine größere Bewegung des Mauszeigers, als es bei dem begrenzten Platz auf dem Touchpad möglich wäre. + + + Fügen Sie dem virtuellen Trackball Reibung hinzu. Eine verringerte Reibung erhöht die endgültige Verfahrzeit des Mauszeigers. + + + Schwellenwert, ab dem eine Aktion ausgelöst wird + + + Die äußere Bindung muss vor Erreichen eines Schwellenwerts ausgelöst werden. Die Aktion wird ausgelöst, sobald der Schwellenwert überschritten wurde + + + Aktion, die ausgeführt werden soll, wenn der Steuerknüppel einen bestimmten Schwellenwert überschreitet. Nützlich für die Zuweisung von Tasten für die Aktionen Gehen oder Sprinten. Invertieren bewirkt, dass die Aktion bis zum Schwellenwert ausgelöst wird. + + + Fuzz gibt die Mindestanzahl von Geräteeinheiten in der aktiven Zone an, um die der Achse gedreht werden muss, bevor der Ausgang im Mapper als geändert registriert wird. Der Wert wird in rohen Achse-Einheiten angegeben. + + + Die Rotationseinstellung soll helfen, die Ausrichtung eines Analogsticks zu korrigieren, wenn Ihr Daumen beim Bewegen eines Analogsticks leicht verschoben ist. Zum Beispiel könnte Ihr Daumen leicht aus der Mitte verschoben sein, wenn der Analogstick ganz nach Norden bewegt wird. Meine Daumen verschieben sich leicht nach rechts, wenn ich den Analog-Stick ganz nach Norden bewege, was an der Art liegt, wie meine Hände den DS4 halten. Der verwendete Wert gibt die Anzahl der Grad an, die zur Anpassung des endgültigen Achsenausgangswertes verwendet wird. Zulässige Werte reichen von -180 bis 180. Die Voreinstellung ist 0. + + + Drosselt das untere Ende der Touchpad-Bewegung. Verringert die versehentliche Bewegung des Mauszeigers, wenn eine weitgehend feste Position auf dem Touchpad gehalten wird. + + + DS4 BT-Abrufrate + + + Die Funktion ist derzeit aufgrund von Treiberproblemen in der App deaktiviert. Hoffentlich werden die Probleme in einem zukünftigen Update behoben. + + + Akzeptieren + + + Farbschema + + + Schwarz + + + Standard + + + Gefärbt + + + Dunkel + + + Tage + + + Erkannte Controller + + + Geräteoptionen + + + Gerätetyp + + + Dynamisch + + + Stunden + + + Programm + + + Aufgabe + + + Trennen + + + Weiß + + + Zeige Debug-Nachrichten + + + Kehre zu Standardprofil zurück bei unbekannt + + + Schalte DS4Windows temporär ab + + + Verbinden + + + Verstecke DS4 Controller + + + Benutze das Touchpad um Profile zu wechseln + + + Trenne Bluetoothverbindung beim Beenden + + + Blinke mit hoher Latenz + + + In Taskbar minimieren + + + In Taskbar minimieren, statt in System-Tray + + + Symbolwahl + + + Checke aller + + + Verwende individuellen Steam-Ordner + + + Tastenkürzel/Über + + diff --git a/DS4Windows/Translations/Strings.el.resx b/DS4Windows/Translations/Strings.el.resx new file mode 100644 index 0000000000..39cc9003f0 --- /dev/null +++ b/DS4Windows/Translations/Strings.el.resx @@ -0,0 +1,801 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Επιταχ + + + Ενέργεια + + + Προσθήκη Φακέλου + + + Προσθήκη Προγραμμάτων + + + Προσθήκη Προγραμμάτων Μενού Έναρξης + + + Προσθήκη Παιχνιδιών Steam + + + Όλα + + + Αυτόματα Προφίλ + + + Μπαταρία + + + Περιήγηση + + + Περιήγηση για Άλλα Προγράμματα + + + Ακύρωση + + + Έλεγχός για Ενημερώσεις Τώρα + + + Έλεγχος για ενημερώσεις κατά την εκκίνηση του DS4Windows + + + Εκκαθάριση + + + Το Κλείσιμο Ελαχιστοποιεί + + + Χρώμα + + + Χειριστήριο 1 + + + Χειριστήριο 2 + + + Χειριστήριο 3 + + + Χειριστήριο 4 + + + Χειριστήρια + + + Πίνακας Ελέγχου + + + Διαγραφή + + + Ρύθμιση Χειριστηρίου/Οδηγού + + + Διπλότυπο + + + Επεξεργασία + + + Επεξεργασία Ενέργειας + + + Εξαγωγή + + + Πλήρες + + + Γυροσκόπιο + + + Απόκρυψη μη Επιλεγμένων + + + Εισαγωγή + + + Αριστερός Μοχλός + + + Καταγραφή + + + Όνομα + + + Νέο + + + Νέα Ενέργεια + + + Νέο Προφίλ + + + Κανένα + + + Διαδρομή + + + Προφίλ + + + Φάκελος Προφίλ + + + Γρήγορη Φόρτιση + + + Εγγραφή + + + Αφαίρεση + + + Αφαίρεση Ενέργειας + + + Δεξιός Μοχλός + + + Δόνηση + + + Εκκίνηση κατά την Έναρξη + + + Αποθήκευση + + + Αποθήκευση + + + Ρυθμίσεις + + + Εμφάνιση Ειδοποιήσεων + + + Εκκίνηση Ελαχιστοποιημένο + + + Έναρξη + + + Κατάσταση + + + Διακοπή + + + Κύλιση + + + Ολίσθηση + + + Άγγιγμα + + + Έναυσμα + + + Μόνο Προειδοποιήσεις + + + δεύτ + + + Αυτόματη διακοπή δόνησης σε δεύτερα (0= αυτόματη διακοπή ανενεργή) + + + Τίτλος Παραθύρου + + + Κίνηση Πάνω + + + Κίνηση Κάτω + + + Διαδρομή Διεργασίας. ^ABC = Ταύτιση με την αρχή της συμβολοσειράς (^) | ABC$ = Ταύτιση με το τέλος της συμβολοσειράς ($) | *ABC = Περιέχει τη συμβολοσειρά (*) + + + Τίτλος Παραθύρου. ^ABC = Ταύτιση με την αρχή της συμβολοσειράς (^) | ABC$ = Ταύτιση με το τέλος της συμβολοσειράς ($) | *ABC = Περιέχει τη συμβολοσειρά (*) + + + Έλεγχος Χειριστηρίου + + + Ενεργοποίηση Δεδομένων Εξόδου του DS4 + + + ΈΞοδος δεδομένων Μπάρας Φωτός και Δόνησης περιοδικά στο χειριστήριο DS4. Αποεπιλογή αν το χειριστήριο δεν υποστηρίζει λήψη δεδομένων. +Αλλαγές στη ρύθμιση επηρεάζουν τον χρόνο σύνδεσης του χειριστηρίου. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Εφαρμογή + + + HidNinja + + + Προσαρμοσμένο όνομα Exe + + + Κάποια παιχνίδια εφαρμόζουν κώδικα που αγνοούν την είσοδο του DS4 αν το παιχνίδι ανιχνεύσει το DS4Windows.exe ή το InputMapper.exe να τρέχει. Μια παράκμψη για τον κώδικα είναι η μετονομασία του DS4Windows.exe ώστε ο έλεγχος να αποτυγχάνει. Πιο συγκεκριμένα ένα προσαρμοσμένο exe επιτρέπει στον DS4Updater να ενημερώνει αυτόματα ένα προσαρμοσμένο αντίγραφο του DS4Windows με το επιθυμητό όνομα αρχείου. Σιγουρευτείτε να παραλείψετε την επέκταση. + +Example: whyme_DS4Windows + + + XInputChecker + + + Χειριστήριο 5 + + + Χειριστήριο 6 + + + Χειριστήριο 7 + + + Χειριστήριο 8 + + + Αντιστοιχεί την έξοδο του χειριστηρίου σε ένα στάνταρ χειριστήριο XInput ή ένα DS4. Το Γυροσκόπιο αντιστοιχείται ως ένα Joystick-Ποντίκι. + + + Χειριστήριο με Joystick σαν Ποντίκι + + + Αντιστοιχεί την έξοδο του χειριστηρίου ως στάνταρ χειριστήριο + + + Χειριστήριο + + + Αντιστοιχεί την έξοδο του χειριστηρίου ως εικονικοί χειρισμοί KB+M. Χρήσιμο για παιχνίδια FPS χωρίς υποστήριξη χειριστηρίου. Το Γυροσκόπιο αντιστοιχείται ως εικονικό Ποντίκι. + + + Χειρισμοί KB+M με Γυροσκοπικό Ποντίκι + + + Αντιστοιχεί την έξοδο του χειριστηρίου ως εικονικοί χειρισμοί KB+M. Χρήσιμο για παιχνίδια FPS χωρίς υποστήριξη χειριστηρίου. + + + Χειρισμοί KB+M + + + Αντιστοιχεί τα κουμπία και τους άξονες σε ένα στάνταρ χειριστήριο Maps. Αντιστοιχεί το Γυροσκόπιο ως εικονικό Ποντίκι + + + Χειριστήριο με Γυροσκοπικό Ποντίκι + + + Αντιστοιχεί την έξοδο του χειριστηρίου ως μίξη χειριστηρίου XInput + ποντίκι RS. + + + Χειριστήριο με Κάμερα Υψηλής Ακρίβειας + + + Περιγραφή + + + Θέλετε να χρησιμοποιήσετε μια προεπιλεγμένη ρύθμιση; Επιλέγοντας Όχι θα οδηγήσει τον Επεξεργαστή Προφίλ να χρησιμοποιήσει ένα κενό προφίλ Χειριστηρίου. + + + Προ-ρυθμίσεις + + + Λίστα αλλαγών + + + Κλείσιμο + + + Προφίλ + + + Κανένα Συνδεδεμένο Χειριστήριο (Μέγιστο {0}) + + + Όριο Τινάγματος + + + Χρόνος Τινάγματος + + + Όριο Ελάχιστης Γωνίας + + + Βαθμονόμηση Πραγματικού Κόσμου + + + Το Πρόσθετο Συσκευής ViGEm Απέτυχε. Μάλλον εσωτερικό πρόβλημα του ViGEmBus. Τερματισμός σύνδεσης. Αν το πρόβλημα παραμένει, παρακαλώ κλείστε το DS4Windows και επανεκκινήστε τα Windows. + + + Ο έλεγχος Ακεραιότητας Δεδομένων απέτυχε για ασύρματη συσκευή. Τερματισμός συσκευής. + + + Το .NET 5 Runtime δε βρέθηκε στο σύστημά σας. Παρακαλώ κατεβάστε και εγκαταστήστε το .NET 5 Runtime για να διασφαλίσετε την συμβατότητα με μελλοντικές εκδόσεις DS4Windows. Θα γίνει ανακατεύθυνση στη σελίδα λήψης του .NET 5 Runtime μόλις κλέισετε το παράθυρο. + + + Παρακαλώ ενημερώστε το .NET Runtime + + + HidHide + + + Πελάτης Διαμόρφωσης του HidHide + + + Αποκλειστική Πρόσβαση + + + Πρόσβαση HidGuardian + + + Πρόσβαση HidHide + + + Κοινόχρηστη Πρόσβαση + + + Μετονομασία + + + Απενεργοποίηση εικονικού χειριστηρίου + + + Μην συσχετίζετε εικονικά χειριστήρια με συνδεδεμένα χειριστήρια χρησιμοποιώντας αυτό το προφίλ (Εφαρμόζεται κατά την αποθήκευση προφίλ) + + + Προσομοιωμένο Χειριστήριο + + + Επιλέξτε τον τύπο εξόδου του εικονικού χειριστηρίου (Εφαρμόζεται κατά την αποθήκευση προφίλ) + + + Ρυθμίσεις Εικονικού Χειριστηρίου + + + Οι αλλαγές εφαρμόζονται σε νέα σύνδεση συσκευής + + + Το Fuzz καθορίζει τον ελάχιστο αριθμό μονάδων κίνησης του αναλογικού μοχλού, σε ενεργή ζώνη, πριν η έξοδος κατωχυρωθεί ως αλλαγμένη στον χάρτη. Αυτή η ρύθμιση είναι χρήσιμη σε φθαρμένους μοχλούς που δε μπορούν να διατηρήσουν σταθερή θέση. Η τιμή εκφράζεται σε μονάδες κίνησης μοχλού. + + + Ρύθμιση συνεχούς εξαναγκασμού μέγιστης εξόδου. Χρήσιμο για 100% Πλήρης Έξοδο και περιορισμός τιμής σε έξοδο κυκλικής τιμής + + + Σε κάποιες περιπτώσεις, μπορεί να φανεί χρήσιμο να περιορίσετε την μέγιστη τιμή που εξάγεται από την έξοδο του αναλογικού μοχλού. Η Μέγιστη έξοδος επιτρέπει τον περιορισμό της τελικής τιμής εξόδου του αναλογικού μοχλού. + + + Μια anti-deadzone δρα ως αντίβαρο για χρήση με έναν άξονα για να δηλώνει την ελάχιστη τιμή εισόδου μόλις ο άξονας φύγει από την καθορισμένη deadzone. Αυτό έχει ώς στόχο να βοηθήσει κυρίως με την αντιστοίχιση ενός άξονα στην καθορισμένη τιμή deadzone που χρησιμοποιείται για έναν άξονα σ΄ ένα βιντεοπαιχνίδι. Για παράδειγμα, η τυπική αναθετημένη τιμή deadzone για XInput LS σε ένα βιντεοπαιχνίδι είναι γύρω στα 8000 (25%). Χωρίς anti-deadzone, ο άξονας θα έπρεπε να μετακινηθεί πέρα της αναθετημένης deadzone στο DS4Windows μαζί με την αναθετημένη deadzone άξονα του παιχνιδιού. + + + ΠΑΛΙΑ ΕΓΚΑΤΑΛΕΛΕΙΜΜΕΝΗ ΡΥΘΜΙΣΗ. Προσπαθεί να εφαρμόσει μια καμπύλη βασισμένη σε ακατέργαστες συντεταγμένες εισόδου προτού οποιαδήποτε πληροφορία dead zone info εφαρμοστεί. Περίεργο + + + Ελάχιστη υπολογισμένη διαδρομή εξόδου πριν ένα Mouse event σταλεί στο σύστημα + + + Προσαρμόζει την κύλιση στην επιφάνεια αφής με μία δοσμένη γωνία περιστροφής. Χρήσιμο όταν μια συνηθισμένη κύλιση στην επιφάνεια αφής δεν είναι μια ευθεία γραμμή. Οι τιμές ποικίλλουν από -180 έως 180. Προεπιλογή είναι 0. + + + Η ευαισθησία που χρησιμοποιείται για να εκκινηθεί η ενέργεια multi-touch Mouse Wheel Scroll + + + Ενεργοποιήστε το αριστερό κλικ με απλό άγγιγμα στην Επιφάνεια Αφής. Ο μέγιστος χρόνος διαστήματος ορίζεται σε (τιμή * 2) ms. + + + Προσθέτει ορμή σε κύλιση στην Επιφάνεια αφής μόλις σηκωθεί το δάχτυλο. Προσθέτει επιπλέον travel στον δείκτη του ποντικιού από ό,τι θα ήταν δυνατό με τον περιορισμένο χώρο στην Επιφάνεια + + + Προσθέτει τριβή στο εικονικό Trackball. Μειωμένη τριβή θα αυξήσει το τελικό χρόνο travel του δείκτη ποντικιού + + + Όριο για το πότε μια ενέργεια θα εκκινηθεί + + + Να εκκινήσει τον εξωτερικό δεσμό πριν την άφιξη στο όριο. Η ενέργεια απελευθερώνεται μόλις το όριο ξεπεραστεί + + + Ενέργεια που θα εκτελεστεί όταν το travel του μοχλού ξεπεράσει ένα όριο. Χρήσιμο για την αντιστοίχιση κουμπιών για ενέργειες Περπάτημα ή Τρέξιμο. Η αντιστροφή κάνει την ενέργεια να εκκινείται μέχρι το όριο + + + Το Fuzz προσδιορίζει τον ελάχιστο αριθμό συσκευών, σε ενεργή ζώνη, όπου το Επιταχυνσιόμετρο πρέπει να περιστραφεί πριν η έξοδος καταγραφεί ως αλλαγμένη στην αντιστοίχιση. Η τιμή προσδιορίζεται ως μονάδες Επιταχυνσιόμετρου. + + + + = Δεξιόστροφα. - = Αριστερόστροφα. + +Η ρύθμιση περιστροφής έχει ως σκοπό την διόρθωση της κατεύθυνσης του αναλογικού μοχλού αν ο αντίχειράς σας μετακινείται ελάχιστα όταν κινείτε τον αναλογικό μοχλό. Πχ, ο αντίχειράς σας μπορεί να παρεκκλίνει ελάχιστα από το κέντρο όταν ο μοχλός έχει μετακινηθεί απολύτως βόρεια. Οι αντίχειρες μου παρεκκλίνουν ελάχιστα προς τα δεξιά όταν σπρώχνω το μοχλό βόρεια λόγω του τρόπου που κρατάω το DS4. Η τιμή που χρησιμοποιείται δείχνει τον αριθμό μοιρών που χρησιμοποιήθηκαν για να προσαρμόσουν την τελική τιμή εξόδου του άξονα. Οι τιμές που επιτρέπονται είναι από -180 έως 180. Προεπιλογή είναι το 0. + + + Περιορίζει τη κίνηση στο κάτω μέρος της Επιφάνειας Αφής. Περιορίζει την τυχαία κίνηση του δείκτη ποντικιού κατά το κράτημα μιας κατά κύριο λόγο σταθερή θέση στην Επιφάνεια + + + DS4 BT Poll Rate + + + Δυνατότητα προς το παρόν ανενεργή λόγω προβλημάτων με τον οδηγητή. Ελπίζουμε να διορθωθεί σε μελλοντική ενημέρωση. + + + Επιβολή χρήσης και των δύο επιπέδων ισχύος % (Γενικό και ειδικό για DualSense) + + + Ανενεργό + + + Ακριβές + + + Απαρχαιωμένο + + + Λειτουργία Δόνησης και επίπεδο ισχύος: + + + Passthru + + + Ρυθμίσεις δόνησης ειδικά για DualSense + + + Προτείνεται ΑΝΕΝΕΡΓΟ. + +- Ανενεργό: η δόνηση θα ρυθμίζεται εγγενώς από το χειριστήριο ανάλογα με το καθορισμένο επίπεδο ισχύος (καλύτερη ποιότητα) + +- Ενεργό: Και η γενική ρύθμιση δόνησης του DS4Windows και ο εγγενής χειρισμός του DualSense θα είναι ενεργοί + + + Λειτουργία Ακριβές (προτείνεται): +- Αναπαριστά καλύτερα την αίσθηση δόνησης του DualShock 4/Xbox 360 +- Εκτελεί με μεγαλύτερη ακρίβεια τα επιθυμητά επίπεδα δόνησης του παιχνιδιού +- Η δόνηση έχει περισσότερο βάθος. Εντός του ίδιου επιπέδου ισχύος μεγαλύτερη διαφορά μεταξύ μεγίστου και ελαχίστου ενεργοποίησης δόνησης στο παιχνίδι, από πολύ χαμηλό μέχρι τη μέγιστη ισχύς του καθορισμένου επιπέδου ισχύος + +Απαρχαιωμένη Λειτουργία: +- Γενικότερα ισχυρότερη, λείπει βάθος +- Έχει πιο "αιχμηρή" αίσθηση +- Η ελάχιστη και μέγιστη ενεργοποίηση στο παιχνίδι θα είναι, αντιστοίχως, ελάχιστα κάτω και πάνω του επιλεγμένου επιπέδου ισχύος + +Ανενεργό: +- Απενεργοποιεί πλήρως τη δόνηση + + + Ο κλιμακωτής εγγενού επιπέδου ισχύος δόνησης του DualSense. + +- Στη Λειτουργία Ακριβές, το [ ελαχ // μεγ ] της δόνησης θα είναι [ 1% /// Επιλεγμένο Επίπεδο Ισχύος] + - Παράδειγμα (62%): [ ελαχ = 1% /// μεγ = 62% ] + +- Στην Απαρχαιωμένη Λειτουργία, το [ελαχ /// μεγ ] της δόνησης θα είναι περίπου [ Επίπεδο Ισχύος - 12% /// Επίπεδο Ισχύος + 12% ] + - Παράδειγμα (62%): [ ελαχ = 50% /// μεγ = 74% ] + + + Αποδοχή + + + Μαύρο + + + Χρωματιστό + + + Προεπιλογή + + + Τύπος συσκευής + + + Αποσύνδεση από το ΒΤ κατά το Σταμάτημα + + + Δυναμικό + + + Αναβόσβησε τη Lightbar σε Υψηλή Καθυστέρηση + + + Απόκρυψη χειριστηρίου DS4 + + + Hotkeys/Σχετικά + + + Επιλογή Εικονιδίου + + + Ελαχιστοποίηση στη Γραμμή Εργασιών + + + Ελαχιστοποίηση στην Γραμμή εργασιών αντί στο Συρτάρι Συστήματος (System Tray) + + + Θύρες Εξόδου + + + Μόνιμο + + + Σύνδεση + + + Επαναφορά στο προεπιλεγμένο προφίλ αν είναι άγνωστο + + + Εμφάνιση μηνυμάτων αποσφαλμάτωσης αυτόματου προφίλ + + + Κύλιση στην Επιφάνεια αφής για εναλλαγή προφίλ + + + Προσωρινή Απενεργοποίηση DS4Windows + + + Αποσύνδεση + + + Λευκό + + + Θέμα Εφαρμογής + + + Έλεγχος κάθε + + + Εξωτερικός Έλεγχος OSC & Παρακολούθηση + + + Ενεργοποίηση Διακομιστή Ελέγχου + + + Διερμήνευση Μηνυμάτων Παρακολούθησης + + + Ενεργοποίηση Υπηρεσίας Παρακολούθησης + + + Υποστήριξη Χειριστηρίου DS4 + + + Υποστήριξη Χειριστηρίου DualSense + + + Υποστήριξη Χειριστηρίου JoyCon + + + Υποστήριξη Χειριστηρίου Switch Pro + + + Αντίγραφα + + + Αλλάξτε μερικές επισημάνσεις που χρησιμοποιούνται για χειριστήρια DS4 που δεν είναι της Sony. Μπορεί να επιδιορθώσει την υποστήριξη δόνησης και lightbar για μερικούς κλώνους DS4 τρίτων + + + Σκοτεινό + + + Μέρες + + + Χειριστήρια που ανιχνέυτηκαν + + + Ρυθμίσεις Συσκευής + + + Ενεργοποίηση καταγραφής verbose + + + Εμφάνιση επιπλέον μηνυμάτων καταγραφής όταν συνδέεται το χειριστήριο + + + Ώρες + + + Χρήση προσαρμοσμένου φακέλου Steam + + + Εργαλεία + + + Πρόγραμμα + + + Εκκίνηση Ως + + + Διεργασία + + + Προσθήκη επιπρόσθετης εξουδετέρωσης στο κάτω μέρος της καμπύλης για την αντιμετώπιση του τραντάγματος της συσκευής + + + Αφύπνιση από την Αναστολή + + + Υποστήριξη Χειριστηρίου DS3 + + + Λόγω άλλων εφαρμογών αντιστοίχισης που παρέχουν υποστήριξη για πολλαπλούς τύπους συσκευών από προεπιλογή (Steam Input), το DS4Windows παρέχει υποστήριξη από προεπιλογή μόνο από χειριστήρια DS4. Μπορείτε να προσδιορίσετε υποστήριξη αντιστοίχισης επιπλεόν τύπων συσκευών εδώ. Να είστε προσεκτικοί όταν χρησιμοποιείτε το DS4Windows με άλλες εφαρμογές αντιστίχισης να τρέχουν ταυτόχρονα. + + + Υποστήριξη Συσκευής DS3 + + + Υποστήριξη για χειριστήρια DualShock 3 (PS3). Απαιτεί τη χρήση οδηγητή DsHidMini από το έργο ViGEm (nefarius). + + + Υποστήριξη Συσκευής DS4 + + + Υποστήριξη για γνωστά χειριστήρια DualShock 4 + + + Υποστήριξη Συσκευής DualSense + + + Υποστήριξη για χειριστήρια DualSense (PS5). Βασικό μοντέλο και το DS Edge + + + Ενεργοποιήθηκε Υποστήριξη Αντιστοίχισης Συσκευών + + + Υποστήριξη Συσκευής JoyCon + + + Υποστήριξη για χειριστήρια JoyCon (Nintendo Switch) + + + Υποστήριξη Συσκευής Switch Pro + + + Υποστήριξη για χειριστήρια Switch Pro (Nintendo Switch). + + + Πρώτη Εκκίνηση + + + Εμφάνιση Εναλλαγής Προφίλ μέσω + + + Καταγραφής + Ειδοποίησης + + + Ειδοποίηση + + + Φως + + + Ενεργοποίηση Κουμπιών Εικονικής Σκανδάλης (DS4) + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.es.resx b/DS4Windows/Translations/Strings.es.resx new file mode 100644 index 0000000000..b449814c3c --- /dev/null +++ b/DS4Windows/Translations/Strings.es.resx @@ -0,0 +1,438 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Acelerar + + + Acción + + + Añadir directorio + + + Añadir programas + + + Añadir al Menú de Inicio de programas + + + Añadir juegos de Steam + + + Todo + + + Perfiles automáticos + + + Batería + + + Navegar + + + Navegar en otros programas + + + Cancelar + + + Buscar actualizaciones + + + Buscar actualizaciones de DS4Windows al iniciar + + + Vaciar + + + Cerrar minimizado + + + Color + + + Mando 1 + + + Mando 2 + + + Mando 3 + + + Mando 4 + + + Mandos + + + Panel de Control + + + Eliminar + + + Configuración del mando/driver + + + Duplicar + + + Editar + + + Editar acción + + + Exportar + + + Todo + + + Giroscopio + + + Ocultar desmarcado + + + Importar + + + Stick izquierdo + + + Registro + + + Nombre + + + Nuevo + + + Nueva acción + + + Nuevo perfil + + + Ninguno + + + Ruta + + + Perfil + + + Carpeta de perfil + + + Carga rápida + + + Guardar + + + Quitar + + + Quitar acción + + + Stick derecho + + + Vibración + + + Ejecutar en el arranque + + + Guardar + + + Guardar + + + Opciones + + + Mostrar notificaciones + + + Iniciar minimizado + + + Iniciar + + + Estado + + + Detener + + + Desplazar + + + Deslizar + + + Pulsar + + + Disparador + + + Solo advertencias + + + segundos + + + Parada automática de la vibración en segundos (0 = parada automática desactivada) + + + Título de la ventana + + + Subir + + + Bajar + + + Ruta de proceso. ^ABC = Coincidencia al principio de la cadena (^) | ABC$ = Coincidencia al final de la cadena ($) | *ABC = Contiene una cadena (*) + + + Título de la ventana. ^ABC = Coincidencia al principio de la cadena (^) | ABC$ = Coincidencia al final de la cadena ($) | *ABC = Contiene una cadena (*) + + + Prueba de gamepad + + + Habilitar la salida de datos a DS4 + + + Envía periódicamente datos de la barra de luces y de las vibraciones al gamepad de DS4. Desmarca si el gamepad no soporta la recepción de datos. + Los cambios en esta opción tienen efecto a partir de la conexión del gamepad. + Para introducir un salto de línea en un valor de recurso de cadena en el editor de recursos de VisualStudio, pulse Shift+Enter. + + + Aplicar + + + HidNinja + + + Nombre del exe personalizado + + + Algunos juegos implementan un bloqueo que hace que la entrada de DS4 sea ignorada si un juego detecta que DS4Windows.exe o InputMapper.exe se está ejecutando en ese momento. Una solución alternativa al bloqueo es cambiar el nombre de DS4Windows.exe para que la comprobación del juego falle. Si especifica un nombre de exe personalizado aquí, DS4Updater podrá actualizar automáticamente una copia personalizada de DS4Windows con el nombre de archivo deseado. Asegúrese de omitir la extensión. + + Ejemplo: oculto_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad with Mouse-like Joystick + + + Maps the controller output to a standard gamepad + + + Gamepad + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M Controls with Gyro Mouse + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M Controls + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Gamepad with Gyro Mouse + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Gamepad with High Precision Camera + + + Description + + + Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile. + + + Presets + + + Changelog + + + Close + + + Profiles + + + No Controllers Connected (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + diff --git a/DS4Windows/Translations/Strings.fi.resx b/DS4Windows/Translations/Strings.fi.resx new file mode 100644 index 0000000000..a3f6315512 --- /dev/null +++ b/DS4Windows/Translations/Strings.fi.resx @@ -0,0 +1,745 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Kiihdyttää + + + Toiminta + + + Lisää Sanakirja + + + Lisää Ohjelmia + + + Lisää Käynnistä-valikko Ohjelmat + + + Lisää Steam-pelejä + + + Kaikki + + + Autoprofiilit + + + Akku + + + Selaa + + + Selaa muita ohjelmia + + + Peruuttaa + + + Tarkista Päivitys Nyt + + + Tarkista päivitykset DS4Windowsin käynnistyksen yhteydessä + + + Asia selvä + + + Sulje Minimoi + + + Väri + + + Ohjain 1 + + + Ohjain 2 + + + Ohjain 3 + + + Ohjain 4 + + + Ohjaimet + + + Ohjauspaneeli + + + Poistaa + + + Ohjaimen/ohjaimen Asetukset + + + Kopioi + + + Muokata + + + Muokkaa Toimintoa + + + Viedä + + + Koko + + + Gyro + + + Piilota Valitsematon + + + Tuonti + + + Vasen Tikku + + + Lokikirja + + + Nimi + + + Uusi + + + Uusi Toiminta + + + Uusi Profiili + + + Ei mitään + + + Polku + + + Profiili + + + Profiilikansio + + + Pikalataus + + + Ennätys + + + Poista + + + Poista Toiminto + + + Oikea tikku + + + Rumble + + + Suorita käynnistyksen yhteydessä + + + Tallentaa + + + Tallentaa + + + Asetukset + + + Näytä Ilmoitukset + + + Aloita Minimoitu + + + Alkaa + + + Tila + + + Lopettaa + + + Selaa + + + Liuku + + + Napauta + + + Laukaista + + + Vain varoitukset + + + sek + + + Automaattinen pysäytys jyrinä sekunneissa (0 = automaattinen pysäytys poissa käytöstä) + + + Ikkunan Otsikko + + + Liiku ylös + + + Siirrä alas + + + Prosessin polku. ^ABC = Vastaa merkkijonon alussa (^) | ABC$ = Vastaa merkkijonon lopussa ($) | *ABC =Sisältää merkkijonon (*) + + + Ikkunan otsikko. ^ABC = Vastaa merkkijonon alussa (^) | ABC$ = Vastaa merkkijonon lopussa ($) | *ABC =Sisältää merkkijonon (*) + + + Peliohjaimen testi + + + Ota käyttöön Output data to DS4 + + + Lähetä valopalkki- ja rumble-tiedot ajoittain DS4-peliohjaimeen. Poista valinta, jos peliohjain ei tue tiedon vastaanottamista. +Muutokset tähän asetukseen tulevat voimaan peliohjaimen yhteyden aikana. + Jos haluat kirjoittaa rivinvaihdon merkkijonoresurssiarvoon VisualStudio-resurssieditorissa, paina Vaihto+Enter. + + + Käytä + + + HidNinja + + + Mukautettu Exe-nimi + + + Jotkut pelit toteuttavat lohkon, joka ohittaa DS4-syötteen, jos peli havaitsee joko DS4Windows.exe- tai InputMapper.exe-tiedoston sillä hetkellä käynnissä. Kiertokeino estoon on nimetä DS4Windows.exe uudelleen, jotta pelin tarkistus epäonnistuu. Kun määrität mukautetun exe-nimen tässä, DS4Updater voi päivittää mukautetun DS4Windows-kopion automaattisesti haluttuun tiedostonimeen. Muista jättää laajennus pois. + +Esimerkki: Whyme_DS4Windows + + + XInputChecker + + + Ohjain 5 + + + Ohjain 6 + + + Ohjain 7 + + + Ohjain 8 + + + Yhdistää ohjaimen ulostulon tavalliseen XInput-peliohjaimeen tai DS4-padiin. Gyro on kartoitettu hiiren kaltaiseen joystickiin. + + + Peliohjain hiiren kaltaisella joystickillä + + + Yhdistää ohjaimen ulostulon tavalliseen peliohjaimeen + + + Peliohjain + + + Yhdistää ohjaimen lähdön virtuaalisiin KB+M-säätimiin. Hyödyllinen FPS-pelien pelaamiseen ilman peliohjaintukea. Gyro on kartoitettu virtuaaliseen hiireen. + + + KB+M-ohjaimet Gyro Mouse -hiirellä + + + Yhdistää ohjaimen lähdön virtuaalisiin KB+M-säätimiin. Hyödyllinen FPS-pelien pelaamiseen ilman peliohjaintukea. + + + KB+M-säätimet + + + Yhdistää painikkeet ja akselit tavalliseen peliohjaimeen. Karttaa Gyron virtuaalihiireen + + + Peliohjain Gyro Mouse -hiirellä + + + Yhdistää ohjaimen ulostulon sekoitettuun XInput-peliohjaimeen + RS-hiireen. + + + Peliohjain korkean tarkkuuden kameralla + + + Kuvaus + + + Haluatko käyttää esiasetettua vaihtoehtoa? Jos valitset Ei, profiilieditori käyttää tyhjää Gamepad-profiilia. + + + Esiasetukset + + + Muutosloki + + + Kiinni + + + Profiilit + + + Ei ohjaimia kytkettynä (enintään {0}) + + + Pyyhkäisykynnys + + + Flip-aika + + + Minimikulman kynnys + + + Tosimaailman kalibrointi + + + ViGEm Device Plugin epäonnistui. Todennäköisesti sisäinen ViGEmBus-ongelma. Yhteyden sulkeminen. Jos ongelma jatkuu, sulje DS4Windows ja käynnistä Windows uudelleen. + + + Langattoman laitteen tietojen eheystarkistukset epäonnistuivat. Sulkeva laite. + + + .NET 5 Runtimea ei havaittu järjestelmästäsi. Lataa ja asenna .NET 5 Runtime varmistaaksesi yhteensopivuuden tulevien DS4Windows-versioiden kanssa. Sinut ohjataan .NET 5 Runtime -lataussivulle, kun suljet tämän ikkunan. + + + Päivitä .NET Runtime + + + HidPiilota + + + HidHide Configuration Client + + + Ainutlaatuinen pääsy + + + HidGuardian Access + + + HidHide Access + + + Jaettu käyttöoikeus + + + Nimeä uudelleen + + + Poista virtuaaliohjain käytöstä + + + Älä luo/liitä virtuaalisia ohjaimia tätä profiilia käyttäville liitetyille ohjaimille (koskee profiilin tallennusta) + + + Emuloitu ohjain + + + Valitse virtuaalisen lähtöohjaimen tyyppi (koskee profiilin tallennusta) + + + Virtuaaliohjaimen asetukset + + + Muutokset astuvat voimaan uuden laitteen yhteydessä + + + Fuzz määrittää minimimäärän yksiköitä, joita analoginen sauva liikkuu aktiivisella alueella, ennen kuin tulos rekisteröidään muuttuneeksi kartoittimessa. Tämä asetus voi olla hyödyllinen kuluneille sauvoille, jotka eivät pysty säilyttämään vakioasentoa. Arvo ilmaistaan ​​raakatikkuyksiköinä. + + + Käytä aina maksimitehoasetusta. Hyödyllinen 100 % maksimiteholle ja arvon rajoittamiseksi pyöreään lähtöarvoon + + + Joissakin tilanteissa saattaa olla hyödyllistä rajoittaa analogisen lähtötikun antamaa maksimiarvoa. Max Output mahdollistaa analogisen tikun lopullisen lähtöarvon kuristamisen. + + + Anti-kuollut alue toimii siirtymänä käytettäväksi akselin kanssa osoittamaan minimilähtöarvoa, joka syntyy sen jälkeen, kun akseli on poistunut sille määrätystä kuollut alueesta. Tämä on tarkoitettu lähinnä auttamaan akselin kartoittamisessa määritettyyn kuollut aluearvoon, jota käytetään akselille videopelissä. Esimerkiksi tyypillinen määritetty kuollut alue XInput LS:lle videopelissä on noin 8000 (25 %). Jos anti-deadzone-aluetta ei ole määritetty, akselin on siirrettävä määrätyn kuollut alueen ohi DS4Windowsissa yhdessä pelille määritetyn akselin kuollutalueen kanssa. + + + VANHA VANNETTU ASETUS. Yritä käyttää käyrää, joka perustuu raakatulokoordinaatteihin, ennen kuin kuolleiden vyöhykkeiden tietoja käytetään. Hutera + + + Pienin laskettu lähtömatka ennen Mouse-tapahtuman lähettämistä järjestelmään + + + Säätää kosketuslevyn pyyhkäisyä tietyllä kiertokulmalla. Hyödyllinen, kun normaali kosketuslevyn pyyhkäisy ei ole suora viiva. Sallitut arvot vaihtelevat välillä -180 - 180. Oletus on 0. + + + Herkkyys, jota käytetään usean kosketuksen hiiren rullan vieritystoimintoon + + + Aktivoi hiiren vasen painike kosketuslevyn napauttamalla. Suurin aikaväli on asetettu (arvo * 2) ms. + + + Lisää vauhtia kosketuslevyn pyyhkäisyyn, kun sormi nostetaan. Lisää hiiren osoittimen liikkumista enemmän kuin olisi mahdollista kosketuslevyn ahtaissa tiloissa + + + Lisää kitkaa virtuaaliseen ohjauspalloon. Pienentynyt kitka lisää lopullista hiiren kursorin kulkuaikaa + + + Kynnys, jolloin toiminto käynnistyy + + + Säilytä ulkoinen tulipalo ennen kynnyksen saavuttamista. Toiminto vapautuu, kun kynnys on ylitetty + + + Suoritettava toiminto, kun sauvan liike ylittää kynnyksen. Hyödyllinen Walk- tai Sprint-toimintojen näppäinten kartoittamiseen. Käänteinen saa toiminnon käynnistymään kynnykseen asti + + + Fuzz määrittää laitteen yksiköiden vähimmäismäärän aktiivisella vyöhykkeellä, jota Accel on käännettävä ennen kuin tulos rekisteröidään muuttuneeksi kartoittimessa. Arvo ilmaistaan ​​raakana Accel-yksiköinä. + + + + = myötäpäivään. - = Vastapäivään. + +Kiertoasetuksen tarkoituksena on auttaa korjaamaan analogisen sauvan suuntaa, jos peukaloasi on hieman siirtynyt analogista sauvaa liikuttaessa. Esimerkiksi peukaloasi saattaa siirtyä hieman keskustasta, kun analoginen sauva siirretään kokonaan pohjoiseen. Peukaloni siirtyvät hieman oikealle siirtäessäni analogista sauvaa kokonaan pohjoiseen, koska käteni pitävät DS4:stä kiinni. Käytetty arvo ilmaisee akselin lopullisen lähtöarvon säätämiseen käytettyjen asteiden lukumäärän. Sallitut arvot vaihtelevat välillä -180 - 180. Oletus on 0. + + + Kosketuslevyn liikkeen kaasutus. Vähentää vahingossa tapahtuvaa hiiren kohdistimen liikettä, kun kosketuslevyä pidetään enimmäkseen kiinteässä asennossa + + + DS4 BT Poll Rate + + + Ominaisuus on tällä hetkellä poistettu käytöstä sovelluksessa ajuriongelmien vuoksi. Toivottavasti ongelmat korjataan tulevassa päivityksessä. + + + Molempien prosenttiosuuksien voimankäyttö (yleinen ja DualSense-kohtainen) + + + Liikuntarajoitteinen + + + Tarkka + + + Perintö + + + Rumble-tila ja voimataso: + + + Passthru + + + DualSense-kohtaiset rumble-asetukset + + + Suositellaan jätettäväksi POIS KÄYTÖSTÄ. + +- Pois käytöstä: ohjain skaalaa rumblen alkuperäisesti määritetyn tehotason mukaisesti (parempi laatu) + +- Käytössä: sekä DS4Windowsin yleinen rumble-uudelleenskaalaus että DualSensen alkuperäinen ohjaus ovat aktiivisia + + + Tarkka tila (suositus): +- Toistaa paremmin DualShock 4/Xbox 360 -ohjaimen jyrinän tunteen +- Suorittaa tarkemmin pelin aiotut rumble-efektit +- Rumblessa on enemmän syvyyttä. Samalla tehotasolla on suurempi ero pelin sisäisen rumble-aktivoinnin välillä, +vaihtelee todella matalasta määritellyn tehotason maksimivoimakkuuteen + +Vanha tila: +- Yleinen voimakkaampi, mutta syvyydestä puuttuu +- On "terävämpi" tunne +- Pelin sisäinen aktivointi minimi- ja maksimiarvo on vain hieman alle ja hieman yli valitun tehotason. + +Liikuntarajoitteinen: +- Poistaa rumblen kokonaan käytöstä + + + DualSensen alkuperäinen rumble Power Level -rescaler. + +- Tarkkatilassa jyrinän [ min // max ] on [ 1 % /// Valittu tehotaso ] + - Esimerkki (62 %): [ min = 1 % /// max = 62 % ] + +- Legacy-tilassa rumblen [min /// max ] on suunnilleen [ Tehotaso - 12 % /// Tehotaso + 12 % ] + - Esimerkki (62 %): [ min = 50 % /// max = 74 % ] + + + Hyväksyä + + + Musta + + + Värillinen + + + Oletus + + + Laitetyyppi + + + Katkaise yhteys BT:hen pysähtyessäsi + + + Dynaaminen + + + Flash Lightbar korkealla viiveellä + + + Piilota DS4-ohjain + + + Pikanäppäimet/Tietoja + + + Kuvakkeen valinta + + + Pienennä Tehtäväpalkkiin + + + Pienennä Tehtäväpalkkiin Ilmaisinalueen Sijaan + + + Lähtöpaikat + + + Pysyvä + + + Pistoke + + + Palauta Oletusprofiili Tuntemattomaan + + + Näytä Automaattisen Profiilin Virheenkorjausviestit + + + Vaihda Profiileja Pyyhkäisemällä Kosketuslevyä + + + Sammuta DS4Windows Väliaikaisesti + + + Irrota Pistoke + + + Valkoinen + + + Sovelluksen Teema + + + Tarkista Jokainen + + + Ulkoinen OSC-ohjaus & Valvonta + + + Ota Ohjauspalvelin Käyttöön + + + Tulkitse Valvontaviestit + + + Ota Valvontapalvelu Käyttöön + + + DS4-Ohjaintuki + + + DualSense-Ohjaimen Tuki + + + JoyCon-Ohjaintuki + + + Switch Pro-Ohjaimen Tuki + + + Copycat + + + Muuta joitain muussa kuin Sony DS4 -ohjaimessa käytettyjä lippuja. Se saattaa korjata rumble- ja lightbar-tuen joillekin kolmannen osapuolen DS4-klooneille + + + Tumma + + + Päivää + + + Havaitut Ohjaimet + + + Laitteen Asetukset + + + Ota monisanainen loki käyttöön + + + Näytä lisää lokiviestejä, kun peliohjain on kytketty + + + Tuntia + + + Käytä mukautettua Steam-kansiota + + + Utils + + + Ohjelmoida + + + Suorita Nimellä + + + Tehtävä + + + Lisää ylimääräinen kuristus käyrän alapäässä laitteen tärinän huomioimiseksi + + + Herääminen Keskeytyksestä + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.fr.resx b/DS4Windows/Translations/Strings.fr.resx new file mode 100644 index 0000000000..970d8b07e6 --- /dev/null +++ b/DS4Windows/Translations/Strings.fr.resx @@ -0,0 +1,747 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Amélioration + + + Action + + + Ajouter un répertoire + + + Ajouter des programmes + + + Ajouter des programmes de menu démarrer + + + Ajouter des jeux Steam + + + Tout + + + Profils automatiques + + + Batterie + + + Parcourir + + + Parcourir des autres programmes + + + Annuler + + + Rechercher des mises à jour + + + Rechercher des mises à jour au démarrage + + + Effacer + + + Minimiser à la fermeture + + + Couleur + + + Manette 1 + + + Manette 2 + + + Manette 3 + + + Manette 4 + + + Manettes + + + Panneau de configuration + + + Effacer + + + Installer les pilotes + + + Dupliquer + + + Modifier + + + Modifier l'action + + + Exporter + + + Plein + + + Gyro + + + Masquer les non coché + + + Importer + + + Stick gauche + + + Journaux + + + Nom + + + Nouveau + + + Nouvelle action + + + Nouveau profil + + + Aucun + + + Chemin de l'ordinateur + + + Profil + + + Dossier des profils + + + Chargement rapide + + + Enregistrer + + + Effacer + + + Effacer l'action + + + Stick droit + + + Vibration + + + Lancer au démarrage + + + Sauvegarder + + + Sauvegarder le profil + + + Paramètres + + + Afficher les notifications + + + Lancer minimisé + + + Commencer + + + Statuts + + + Arrêter + + + Défilement de la souris + + + Faire glisser + + + Appuyer + + + Déclencheur + + + Avertissements seulement + + + sec + + + Arrêt automatique des vibrations après (0 pour vibration infinie, en secondes) + + + Titre de la fenêtre + + + Vers le haut + + + Vers le bas + + + Chemin du processus. ^ABC = Correspondance au début de la chaîne (^) | ABC$ = Correspondance à la fin de la chaîne ($) | *ABC = Contient une chaîne (*) + + + Le titre de fenêtre. ^ABC = Correspondance au début de la chaîne (^) | ABC$ = Correspondance à la fin de la chaîne ($) | *ABC = Contient une chaîne (*) + + + Tester la manette de jeu + + + Activer la sortie de données vers DS4 + + + Active la barre lumineuse et la vibration périodiquement sur la manette DS4. Décochez si la manette de jeu ne prend pas en charge la réception de données. +Les modifications apportées à cette option prennent effet au moment de la connexion de la manette. + Pour entrer un saut de ligne dans une chaîne de caractères dans l'éditeur de ressources VisualStudio, appuyez sur Maj + Entrée. + + + Appliquer + + + HidNinja + + + Nom de l'exe personnalisé + + + Certains jeux implémentent un script qui ignore les entrée de la manette DS4 si les processus DS4Windows.exe ou InputMapper.exe sont en cours d'exécution. Il est possible de contourner ce blocage en modifiant le nom DS4Windows.exe afin que la détection échoue. Spécifier le nom personnalisé ici permet à DS4Updater de mettre à jour automatiquement une copie personnalisée de DS4Windows avec le nom de fichier souhaité. Assurez-vous d'omettre l'extension. + +Exemple : tu_es_tilte_boubou_DS4Windows + + + Détection XInput + + + Manette 5 + + + Manette 6 + + + Manette 7 + + + Manette 8 + + + Mappe la sortie de la manette sur une manette de jeu XInput standard ou une manette DS4. Le gyroscope est mappé sur un joystick en tant que souris. + + + Manette avec joysticks en tant que souris + + + Mappe la sortie du contrôleur sur une manette de jeu standard + + + Manette de jeu + + + Mappe la sortie de la manette à un clavier/souris virtuel. Utile pour jouer à des jeux de tir sans prise en charge de la manette de jeu. Le gyroscope est mappé à une souris virtuelle. + + + Commandes clavier/souris avec une souris gyroscope + + + Mappe la sortie de la manette à un clavier/souris virtuel. Utile pour jouer à des jeux de tir sans prise en charge de la manette de jeu. + + + Commandes clavier/souris + + + Mappe les boutons et les joysticks à une manette de jeu standard. Associe le gyroscope à une souris virtuelle. + + + Manette de jeu avec souris gyroscope + + + Mappe la sortie du contrôleur à une manette de jeu XInput et une souris. + + + Manette de jeu avec caméra haute précision + + + Description + + + Voulez-vous utiliser une configuration prédéfinie ? Si vous choisissez non, un profil vide sera défini dans l'éditeur. + + + Préconfigurations + + + Changelog + + + Quitter + + + Profils + + + Aucune manette connecté (Max {0}) + + + Seuil d'accoup + + + Temps d'accoup + + + Seuil minimal d'angle + + + Calibration dans le monde réel + + + Le plug-in de périphérique ViGEm à rencontré un problème. Probablement un problème interne à ViGEmBus. Fermeture de la connexion. Si le problème persiste, veuillez fermer DS4Windows et redémarrer windows. + + + Vérfications d'intégrité des données du périphérique échouées. Fermeture du périphérique. + + + .NET 5 Runtime n'a pas été détecté sur votre système. Veuillez télécharger et installer .NET 5 Runtime pour assurer la compatibilité avec les futures versions de DS4Windows. Vous serez redirigé vers la page de téléchargement de .NET 5 Runtime à la fermeture de cette fenêtre. + + + Veuillez mettre à jour .NET Runtime + + + HidHide + + + Configuration Client HidHide + + + Accès exclusif + + + Accès HidGuardian + + + Accès HidHide + + + Accès partagé + + + Renommer + + + Désactiver la manette virtuelle + + + Ne pas créer/associer de manettes virtuelles pour les manettes connectées à l'aide de ce profil (s'applique à l'enregistrement du profil) + + + Manette émulée + + + Choisissez le type de manette virtuelle de sortie (s'applique à la sauvegarde du profil) + + + Paramètres de la manette virtuelle + + + Changements effectifs à la connection d'un nouveau périphérique + + + La valeur 'Fuzz' spécifie le nombre minimum d'unités que le stick analogique déplace, dans la zone active, avant que le changement soit enregistré dans le mappeur. Ce réglage peut être utile pour les joysticks usés qui ne peuvent pas maintenir une position constante. Cette valeur est exprimée en unités brutes du stick. + + + Applique toujours le paramètre de sortie maximale. Utile pour obtenir une sortie maximale et associer une direction précise à une valeur de sortie circulaire + + + Dans certaines situations, il peut être utile de limiter la valeur de sortie maximale émise par le stick analogique. Cette fonction permet ainsi de limiter la valeur de sortie du stick analogique. + + + L'anti-zone morte agit comme un décalage à associer à un axe pour indiquer la valeur de sortie minimale générée après qu'un axe ait quitté sa zone morte assignée. Ceci vise principalement à faciliter le mappage d'une valeur de zone morte attribuée à un axe dans un jeu vidéo. Par exemple, la zone morte typique attribuée pour XInput LS dans un jeu vidéo est d'environ 8000 (25%). Sans anti-zone morte assignée, un axe devrait dépasser la zone morte assignée dans DS4Windows avec la zone morte de l'axe assignée dans le jeu. + + + ANCIEN PARAMÈTRE OBSOLÈTE. Avant d'appliquer toute information de zone morte, essayez d'utiliser une courbe basée sur les coordonnées d'entrée brutes. + + + Course minimale sur le pavé tactile avant qu'un déplacement de souris soit pris en compte + + + Ajustement du balayage du pavé tactile selon un angle de rotation. Utile lorsqu'un balayage normal du pavé tactile n'est pas effectué en ligne droite. L'angle est compris entre -180 et 180 degrés et sa valeur par défaut est 0. + + + Sensibilité nécessaire avant le défilement de la molette de la souris + + + Active le clic gauche de la souris avec un appuie sur le pavé tactile. L'intervalle de temps maximum est défini sur la valeur multiplié par 2 millisecondes. + + + Ajoute de l'élan à un balayage du pavé tactile une fois que le doigt est levé. Ajoute un déplacement supplémentaire du curseur de la souris par rapport à ce qui serait possible avec l'espace restreint du pavé tactile + + + Ajoute de la friction au Trackball virtuel. La diminution de la friction augmentera le temps de déplacement final du curseur de la souris + + + Seuil de déclenchement d'une action + + + Permet à une liaison externe de s'activer avant d'atteindre un seuil. L'action se déclenche une fois que le seuil a été dépassé. + + + Action à exécuter lorsque le déplacement du joystick dépasse un seuil. Utile pour attribuer des touches aux actions de marche ou de sprint. L'inversion provoque l'activation de l'action jusqu'au seuil. + + + La valeur 'Fuzz' spécifie le nombre minimum d'unités de l'appareil, dans la zone active, que l'accéléromètre doit être tourné avant que le changement soit enregistré dans le mappeur. Cette valeur est exprimée en unités brutes de l'accéléromètre. + + + [+] Sens horaire | [-] Sens anti-horaire + +Le réglage de rotation est destiné à aider à corriger l'orientation d'un stick analogique si votre pouce est légèrement décalé lors du déplacement d'un stick analogique. Par exemple, votre pouce peut être légèrement décalé du centre lorsque le stick analogique est déplacé complètement vers le haut. Mes pouces se déplacent légèrement vers la droite lorsque je déplace un stick analogique complètement vers le haut en raison de la façon dont mes mains saisissent le DS4. La valeur utilisée indique le nombre de degrés utilisés pour ajuster la valeur finale de sortie de l'axe. Cet angle est compris entre -180 et 180 degrés et sa valeur par défaut est 0. + + + Accélère le bas du mouvement du pavé tactile. Réduit les mouvements accidentels du curseur de la souris lorsque vous maintenez une position essentiellement fixe sur le pavé tactile + + + Fréquence d'actualisation BlueTooth avec la DS4 + + + Fonctionnalité actuellement désactivée dans l'application en raison de problèmes de pilote. Espérons que les problèmes seront résolus dans une future mise à jour. + + + Forcer l'utilisation des deux niveaux de force en % (général et spécifique à DualSense) + + + Désactivé + + + Précision + + + Héritage + + + Mode de vibration et niveau de force : + + + Passerelle + + + Paramètres de vibration spécifiques à la DualSense + + + Réglage recommandé : DÉSACTIVÉ. + +- Désactivé : la vibration sera redimensionnée nativement par le contrôleur en fonction du niveau de puissance défini (meilleure qualité) + +- Activé : la mise à l'échelle des vibrations natives DS4Windows et le contrôle natif de DualSense seront actifs + + + Mode Précision (recommandé) : +- Reproduit mieux la sensation de vibration des manettes DualShock 4/Xbox 360 +- Exécute plus précisément les effets de vibration prévus par le jeu +- Les vibrations ont plus de profondeur. Dans un même niveau de puissance, il existe une plus grande variation entre l'activation minimale et maximale des vibrations dans le jeu, +allant d'une intensité très faible jusqu'à la force maximale définie pour ce niveau de puissance. + +Mode Héritage : +- Globalement plus puissant, mais manque de profondeur +- Procure une sensation plus "nette" +- Dans le jeu, l'activation minimale sera légèrement inférieure et l'activation maximale sera légèrement supérieure au niveau de puissance choisi. + +Désactivé: +- Désactive complètement les vibrations + + + Réétalonnage du niveau de puissance des vibrations natif du DualSense. + +- En mode Précision, les vibrations seront comprises entre [1% et Niveau de puissance choisi]. + - Exemple à 62% : [min = 1% /// max = 62%] + +- En mode Héritage, les vibrations seront environ comprises entre [Niveau de puissance - 12% et Niveau de puissance + 12%]. + - Exemple à 62% : [min = 50% /// max = 74%] + + + Accepter + + + Noir + + + Coloré + + + Défaut + + + Type d'appareil + + + Se déconnecter du BlueTooth lors de l'arrêt + + + Dynamique + + + Faire clignoter la barre lumineuse à latence élevée. + + + Masquer la manette DS4 + + + Raccourcis clavier/À propos + + + Choix de l'icône + + + Réduire à la barre des tâches + + + Réduit dans la barre des tâches au lieu de la barre d'état système + + + Emplacements de sortie + + + Permanent + + + Brancher + + + Revenir au profil par défaut pour les nouveaux appareils + + + Afficher les messages de débogage du profil automatique + + + Faites glisser sur le pavé tactile pour changer de profil + + + Désactiver temporairement DS4Windows + + + Débrancher + + + Blanc + + + Thème de l'application + + + Vérifiez tous les + + + Contrôle et surveillance OSC externe + + + Activer le serveur de contrôle + + + Interpréter les messages de surveillance + + + Activer le service de surveillance + + + Support manette DS4 + + + Support manette DualSense + + + Support manette JoyCon + + + Support manette Switch Pro + + + Copycat + + + Modifie certains flags utilisés par les manettes DS4 non officielles. Cela pourrait corriger la prise en charge des vibrations et de la barre lumineuse pour certaines "fausses" DS4. + + + Sombre + + + Jours + + + Manettes détectées + + + Options de périphérique + + + Activer le journal détaillé + + + Afficher des messages supplémentaires au journal lorsqu'une manette de jeu est connectée + + + Heures + + + Utiliser le dossier Steam personnalisé + + + Utilitaires + + + Programme + + + Exécuter en tant que + + + Tâche + + + Ajouter un bridage supplémentaire à l'extrémité basse de la courbe pour prendre en compte les secousses de l'appareil. + + + Sortie de veille + + + Support manette DS3 + + diff --git a/DS4Windows/Translations/Strings.he.resx b/DS4Windows/Translations/Strings.he.resx new file mode 100644 index 0000000000..405168841f --- /dev/null +++ b/DS4Windows/Translations/Strings.he.resx @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + תאוצה + + + פעולה + + + הוסף תיקיה + + + הוסף תוכניות + + + הוסף תוכניות מתפריט ההתחלה + + + הוסף משחקי Steam + + + הכל + + + פרופילים אוטומטיים + + + סוללה + + + עיון + + + פתח תוכניות אחרות + + + ביטול + + + בדוק עדכונים כעת + + + בדוק עדכונים עם פתיחת DS4WINDOWS + + + נקה + + + מזער בסגירה + + + צבע + + + בקר 1 + + + בקר 2 + + + בקר 3 + + + בקר 4 + + + בקרים + + + לוח הבקרה + + + מחק + + + התקנת Driver לבקר + + + שכפול + + + עריכה + + + ערוך פעולה + + + יצוא + + + מלא + + + חיישן התנועה + + + הסתר אפשרויות שלא נבחרו + + + יבוא + + + סטיק שמאלי + + + יומן + + + שם + + + חדש + + + פעולה חדשה + + + פרופיל חדש + + + ללא + + + נתיב + + + פרופיל + + + תיקיית הפרופילים + + + טעינה מהירה + + + הקלטה + + + הסר + + + הסר פעולה + + + סטיק ימני + + + רטט + + + פתח בהפעלת ה-Windows + + + שמור + + + שמור + + + הגדרות + + + הצג התראות + + + התחל ממוזער + + + התחל + + + סטטוס + + + עצור + + + גלילה + + + החלקה + + + לחיצה + + + טריגר + + + אזהרות בלבד + + + שניות + + + שניות לעצירה אוטומטית של רטט (0=אל תעצור אוטומטית) + + + כותרת חלון + + + למעלה + + + למטה + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + בדיקת בקר + + + אפשר פלט אל בקר ה-DS4 + + + שלח מידע על תאורה ורטט לסירוגין אל הבקר. בטל בחירה אם הבקר אינו תומך בקבלת מידע. +שינוי הגדרה זו יחל בחיבור הבקר + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + החל + + + HidNinja + + + שם מותאם אישית לקובץ EXE + + + חלק מהמשחקים מבצעים התעלמות מבקר DS4 אם התהליכים DS4WINDOWS.exe או InputMapper.exe פועלים. ניתן לעקוף בעיה זו בעזרת שינוי שם הקובץ DS4Windows.exe כך שהבדיקה של המשחק תיכשל. שינוי שם קובץ ה-EXE בהגדרה זו מאפשר לעדכונים בעתיד ליצור עותק של התוכנה לתוך קובץ ה-EXE עם השם החדש. שים לב - יש להזין שם ללא הסיומת. + +לדוגמא: whyme_DS4Windows + + + XInputChecker + + + בקר 5 + + + בקר 6 + + + בקר 7 + + + בקר 8 + + + ממפה את המידע הנשלח לבקר Xinput סטנדרטי או DS4. חיישן התנועה ידמה תנועת ג'ויסטיק עכבר. + + + בקר עם ג'ויסטיק עכבר + + + ממפה את המידע הנשלח בתור בקר משחק סטנדרטי + + + בקר + + + ממפה את המידע הנשלח מהבקר לכפתורי KB+M וירטואליים. שימושי במשחקי יריות מגוף ראשון שלא תומכים בבקרי משחק. חיישן התנועה ממופה בתור עכבר. + + + מקשי KM+M עם חיישן התנועה בתור עכבר. + + + ממפה את המידע הנשלח מהבקר לכפתורי KB+M וירטואליים. שימושי במשחקי יריות מגוף ראשון שלא תומכים בבקרי משחק. + + + מקשי KB+M. + + + ממפה את הכפתורים והצירים (סטיק) לבקר משחק סטנדרטי. ממפה את חיישן התנועה בתור עכבר. + + + בקר עם חיישן תנועה + + + ממפה את הבקר לבקר XInput משולב + עכבר בסטיק הימני. + + + בקר עם מצלמה עם דיוק גבוה + + + תיאור + + + האם תרצה להשתמש בהגדרות מוכנות מראש? אם תבחר לא, עורך הפרופילים יפתח פרופיל ריק ללא הגדרות. + + + הגדרות מוכנות מראש + + + יומן שינויים + + + סגור + + + פרופילים + + + אין בקרים מחוברים (מקסימום {0}) + + + זמן להתחלת לחיצה + + + זמן לחיצה + + + זווית מינימלית ללחיצה + + + כיול לפי העולם האמיתי + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.hu-HU.resx b/DS4Windows/Translations/Strings.hu-HU.resx new file mode 100644 index 0000000000..6d6e53a9e3 --- /dev/null +++ b/DS4Windows/Translations/Strings.hu-HU.resx @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Tengely + + + Művelet + + + Könyvtár hozzáadása + + + Programok hozzáadása + + + Start menü programok hozzáadása + + + Steam játékok hozzáadása + + + Összes + + + Automatikus profilok + + + Akkumulátor + + + Tallózás + + + Más program tallózása + + + Mégse + + + Frissítés keresése most + + + DS4Windows frissítések keresése induláskor + + + Törlés + + + Bezáráskor minimalizálás + + + Szín + + + Kontroller 1 + + + Kontroller 2 + + + Kontroller 3 + + + Kontroller 4 + + + Kontrollerek + + + Vezérlőpult + + + Törlés + + + Kontroller/Illesztőprogram beállítása + + + Másolás + + + Szerkesztés + + + Művelet szerkesztése + + + Exportálás + + + Teljes + + + Giroszkóp + + + Kijelöletlenek elrejtése + + + Importálás + + + Bal kar + + + Napló + + + Név + + + Új + + + Új művelet + + + Új profil + + + Semmi + + + Hely + + + Profil + + + Profil mappa + + + Gyorstöltés + + + Felvétel + + + Eltávolítás + + + Művelet eltávolítása + + + Jobb kar + + + Rezgés + + + Futattás rendszerinduláskor + + + Mentés + + + Mentés + + + Beállítások + + + Értesítések mutatása + + + Induláskor minimalizálás + + + Indítás + + + Állapot + + + Megállítás + + + Görgetés + + + Csúztatás + + + Koppintás + + + Ravasz + + + Csak figyelmeztetések + + + mp + + + Rezgés automatikus megállítása másodpercben (0 = automatikus megállítás kikapcsolva) + + + Ablak címe + + + Mozgás fel + + + Mozgás le + + + Folyamat elérési útja. ^ABC = Egyezés a string elején (^) | ABC$ = Egyezés a string végén ($) | *ABC = Tartalmazza a stringet (*) + + + Ablak címe. ^ABC = Egyezés a string elején (^) | ABC$ = Egyezés a string végén ($) | *ABC = Tartalmazza a stringet (*) + + + Játékvezerlő teszt + + + Kimenő adat engedélyezése a DS4-nek + + + Állapotjelző és rézgés adat időközönkénti küldése a DS4-nek. Töröld ki a kijelölést ha a kontrollered nem támogatja az adatok fogadását. +A változások a kontroller csatlakoztatásakor lépnek életbe. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Alkalmazás + + + HidNinja + + + Egyedi exe név + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Kontroller 5 + + + Kontroller 6 + + + Kontroller 7 + + + Kontroller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad with Mouse-like Joystick + + + Maps the controller output to a standard gamepad + + + Játékvezerlő + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M irányítás giroszkópos egérrel + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M irányítás + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Játékvezerlő giroszkóp egérrel + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Játékvezerlő nagy pontosságú kamerával + + + Leírás + + + Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile. + + + Presetek + + + Változási napló + + + Bezárás + + + Profilok + + + Nincs kontroller csatlakoztatva (maximum {0}) + + + Flick határérték + + + Flick idő + + + Minimum szög határérték + + + Real World Calibration + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.idn.resx b/DS4Windows/Translations/Strings.idn.resx new file mode 100644 index 0000000000..7b8591c40d --- /dev/null +++ b/DS4Windows/Translations/Strings.idn.resx @@ -0,0 +1,797 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Akselerasi + + + Aksi + + + Tambahkan Direktori + + + Tambahkan Program + + + Tambhkan Program Start Menu + + + Tambahkan Permainan dari Steam + + + Semua + + + Profil Otomatis + + + Baterai + + + Pilih File + + + Pilih Program Lain + + + Batal + + + Periksa Pembaruan Sekarang + + + Periksa pembaruan saat DS4Windows mulai + + + Bersihkan + + + Tutup untuk Meminimalkan + + + Warna + + + Kontroler 1 + + + Kontroler 2 + + + Kontroler 3 + + + Kontroler 4 + + + Kontroler + + + Panel Kontrol + + + Hapus + + + Konfigurasi Kontroler/Driver + + + Duplikat + + + Edit + + + Edit Aksi + + + Ekspor + + + Penuh + + + Gyro + + + Sembunyikan yang Belum Dicentang + + + Impor + + + Stik Kiri + + + Catatan + + + Nama + + + Baru + + + Aksi Baru + + + Profil Baru + + + Tidak ada + + + Jalur + + + Profil + + + Folder Profil + + + Pengisian Cepat + + + Rekam + + + Hapus + + + Hapus Aksi + + + Stik Kanan + + + Getar + + + Jalankan Saat Komputer di Mulai + + + Simpan + + + Simpan + + + Pengaturan + + + Tampilkan Notifikasi + + + Mulai dengan Minimal + + + Start + + + Status + + + Stop + + + Gulir + + + Geser + + + Tap + + + Pelatuk + + + Hanya Peringatan + + + sec + + + Memberhentikan otomatisasi getar dalam detik (0 = fitur berhenti otomatis dinonaktifkan) + + + Judul Window + + + Geser ke Atas + + + Geser ke bawah + + + Memproses Jalur. ^ABC = Cocok di awal string (^) | ABC$ = Cocok di akhir string ($) | ABC = Mengandung string () + + + Judul Window. ^ABC = Cocok di awal string (^) | ABC$ = Cocok di akhir string ($) | ABC = Mengandung string () + + + Kontroler Test + + + Aktifkan Pengiriman data ke DS4 + + + Kirim data lampu indikator dan getar secara berkala ke gamepad DS4. Hapus centang jika kontroler tidak mendukung penerimaan data. +Perubahan pada opsi ini berlaku saat kontroler terhubung + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Terapkan + + + HidNinja + + + Nama Exe Kustom + + + Beberapa permainan menerapkan pemblokiran yang menyebabkan input dari DS4 diabaikan jika permainan tersebut mendeteksi DS4Windows.exe atau InputMapper.exe berjalan pada saat yang sama. Solusi alternatif untuk mengatasi pemblokiran ini adalah dengan mengganti nama DS4Windows.exe sehingga pemeriksaan pada game tersebut gagal. Menentukan nama exe kustom di sini memungkinkan DS4Updater untuk secara otomatis memperbarui salinan kustom DS4Windows ke nama file yang diinginkan. Pastikan untuk menghilangkan ekstensinya. Contoh: whyme_DS4Windows + + + Pemeriksa XInput + + + Kontroler 5 + + + Kontroler 6 + + + Kontroler 7 + + + Kontroler 8 + + + Mengatur tombol kontroler ke standard XInput kontroler dan DS4 kontroler, Gyro akan di atur ulang dengan Joystick yang mirip dengan mouse + + + Kontroler dengan Joystick yang mirip dengan Mouse + + + Mengatur tombol controller ke kontroller standar + + + Kontroler + + + Mengatur tombol kontroler ke kontrol virtual KB+M. Berguna untuk bermain game FPS tanpa dukungan kontroler. Gyro dihubungkan ke virtual Mouse. + + + Kontrol KB+M dengan Gyro Mouse + + + Mengatur tombol kontroler ke kontrol virtual KB+M. Berguna untuk bermain game FPS tanpa dukungan kontroler. Gyro dihubungkan ke virtual Mouse. + + + Kontrol KB+M + + + Mengatur ulang tombol dan axis ke kontroler standar. Memetakan Gyro ke virtual mouse + + + Kontroler dengan Gyro Mouse + + + Mengatur ulang tombol kontroler menjadi gabungan antara XInput kontroler + RS Mouse + + + Kontroler dengan High Precision Camera + + + Deskripsi + + + Apakah Anda ingin menggunakan opsi pra atur ? Dengan memilih Tidak, akan membuat Editor Profil menggunakan profil kontroler kosong. + + + Prasetel + + + Changelog + + + Tutup + + + Profil + + + Tidak ada Kontroler yang Terhubung (Max {0}) + + + Batas Flick + + + Waktu Flick + + + Batas Sudut Minimum + + + Pengkalibrasi Langsung + + + Plugin Perangkat ViGEm Gagal. Kemungkinan masalah internal ViGEmBus. Menutup koneksi. Jika masalah berlanjut, harap tutup DS4Windows dan kemudian restart Windows. + + + Pengecekan informasi pada intergritas data gagal untuk perangkat nirkabel, Menutup perangkat. + + + .NET 5 Runtime tidak terdeteksi pada sistem/komputer Anda. Silakan unduh dan instal .NET 5 Runtime untuk memastikan kompatibilitas dengan versi DS4Windows yang akan datang. Anda akan diarahkan ke halaman unduhan .NET 5 Runtime setelah menutup jendela ini. + + + Mohon perbarui .NET Runtime. + + + HidHide + + + Klien Konfigurasi HidHide + + + Akses Eksklusif + + + Akses HidGuardian + + + Akses HidHide + + + Akses Bersama + + + Ubah Nama + + + Matikan Kontroler Virtual + + + Jangan buat/assosiasikan kontroler virtual untuk kontroler yang terhubung menggunakan profil ini (Berlaku saat menyimpan profil) + + + Emulasi Kontroler + + + Pilih jenis output kontroler virtual (Berlaku saat menyimpan profil) + + + Pengaturan Kontroler Virtual + + + Perubahan berlaku saat perangkat baru terhubung + + + Fuzz menentukan jumlah minimum unit yang harus bergerak pada stick analog, di dalam zona aktif, sebelum keluaran diregistrasi sebagai perubahan dalam pemetaan. Pengaturan ini dapat berguna untuk stick yang aus yang tidak dapat mempertahankan posisi yang konstan. Nilainya diungkapkan dalam unit stick mentah. + + + Selalu mengharuskan pengaturan output maksimal. Berguna untuk 100% Output Maksimum dan membatasi nilai ke nilai output lingkaran. + + + Dalam beberapa situasi, mungkin berguna untuk membatasi nilai maksimum yang dihasilkan oleh output analog stick. Output Maksimum memungkinkan pengendalian nilai output akhir dari analog stick. + + + Anti-deadzone bertindak sebagai offset untuk digunakan dengan aksis dalam menunjukkan nilai output minimum yang dihasilkan setelah aksis meninggalkan deadzone yang ditetapkan. Hal ini terutama dimaksudkan untuk membantu pemetaan sumbu ke nilai deadzone yang ditetapkan yang digunakan untuk aksis dalam permainan. Sebagai contoh, deadzone yang ditetapkan untuk XInput LS dalam permainan video adalah sekitar 8000 (25%). Tanpa anti-deadzone yang ditetapkan, sebuah aksis harus bergerak melewati deadzone yang ditetapkan di DS4Windows bersama dengan deadzone aksis yang ditetapkan dalam permainan. + + + + + PENGATURAN LAMA DAN USANG. Upaya untuk menerapkan kurva berdasarkan input koordinat langsung sebelum ada informasi zona mati yang diterapkan. Tidak stabil. + + + Perhitungan output minimum sebelum sebuah data Mouse dikirim ke sistem + + + Mengatur geseran touchpad dengan sudut rotasi tertentu. Berguna ketika geseran touchpad biasa tidak dalam garis lurus. Nilai dapat berada dalam rentang -180 hingga 180. Bawaan adalah 0. + + + Sensitivitas yang digunakan untuk mengaktifkan aksi multi-touch Mouse Wheel Scroll + + + Aktifkan klik kiri Mouse dengan Ketukan Touchpad. Interval waktu maksimum diatur pada (nilai * 2) ms. + + + Menambahkan momentum ke geseran Touchpad setelah jari diangkat. Menambahkan pergerakan kursor Mouse lebih banyak daripada yang mungkin dilakukan di ruang terbatas pada Touchpad. + + + Menambahkan gesekan pada virtual Trackball. Gesekan yang lebih rendah akan meningkatkan waktu pergerakan kursor Mouse akhir. + + + Batas untuk kapan suatu tindakan akan aktif + + + Mengaktifkan ikatan luar sebelum mencapai ambang batas. Tindakan dilepaskan setelah ambang batas terlampaui + + + Tindakan yang dieksekusi ketika pergerakan stick melewati ambang batas. Berguna untuk mengatur tombol untuk Berjalan atau Berlari. Inversi menyebabkan tindakan akan aktif hingga mencapai ambang batas. + + + Fuzz menentukan jumlah minimum unit perangkat, dalam zona aktif, yang harus dirotasi oleh Akselerometer sebelum keluaran didaftarkan sebagai berubah dalam pemeta. Nilai ini diukur dalam unit Akselerometer mentah. + + + + = Putaran searah jarum jam. - = Putaran berlawanan arah jarum jam. +Pengaturan rotasi dimaksudkan untuk membantu memperbaiki orientasi stik analog jika jempol Anda sedikit tergeser saat memindahkan stik analog. Misalnya, jempol Anda mungkin sedikit tergeser dari pusat saat stik analog digerakkan sepenuhnya ke utara. Jempol saya sedikit bergeser ke kanan saat memindahkan stik analog sepenuhnya ke utara karena cara saya memegang kontroler DS4. Nilai yang digunakan menunjukkan jumlah derajat yang digunakan untuk menyesuaikan nilai output sumbu akhir. Nilai yang diperbolehkan berkisar dari -180 hingga 180. Default adalah 0. + + + Mengurangi kecepatan gerakan di bagian bawah Touchpad. Mengurangi pergerakan kursor mouse yang tidak disengaja saat memegang posisi yang hampir tetap di Touchpad. + + + DS4 BT Poll Rate + + + Fitur saat ini dinonaktifkan dalam aplikasi karena masalah dengan driver. Semoga masalahnya dapat diperbaiki dalam pembaruan mendatang. + + + Paksa penggunaan dari kedua % tingkat kekuatan (umum dan khusus DualSense) + + + Matikan + + + Akurat + + + Legacy + + + Mode Getar dan Tingkat Kekuatan: + + + Passthru + + + Pengaturan getar khusus DualSense + + + Dianjurkan untuk TIDAK AKTIFKAN.-Dinonaktifkan: getar akan disesuaikan ulang secara native oleh kontroler sesuai dengan tingkat daya yang ditentukan (kualitas lebih baik)-Diaktifkan: kedua reskalasi getar generik DS4Windows dan kontroler asli DualSense akan aktif + + + Mode Akurat (Disarankan): + +- Meniru rasa getaran kontroler DualShock 4/Xbox 360 lebih baik +- Lebih akurat mengeksekusi efek getar yang dimaksudkan oleh permainan +- Getar memiliki rasa kedalaman lebih. Dalam tingkat kekuatan yang sama, terdapat perbedaan yang lebih besar antara aktivasi getar terendah dan tertinggi dalam permainan, mulai dari sangat lemah hingga kekuatan maksimum dari tingkat daya yang ditentukan. + +Mode Legacy: + +- Secara keseluruhan lebih kuat, tetapi kurang dalam +- Memiliki perasaan yang "lebih tajam" +- Aktivasi getar terendah dan tertinggi dalam permainan, masing-masing hanya sedikit di bawah dan sedikit di atas kekuatan tingkat daya yang dipilih + +Dinonaktifkan: + +- Menonaktifkan getar secara keseluruhan + + + Pengubah Tingkat Daya getar native DualSense. + +Saat dalam Mode Akurat, getar [terendah // tertinggi] akan menjadi [1% /// Tingkat Daya yang Dipilih] + +Contoh (62%): [terendah = 1% /// tertinggi = 62%] +Saat dalam Mode Warisan, getar [terendah /// tertinggi] akan sekitar [Tingkat Daya - 12% /// Tingkat Daya + 12%] + +Contoh (62%): [terendah = 50% /// tertinggi = 74%] + + + Setuju + + + Hitam + + + Berwarna + + + Bawaan + + + Tipe Perangkat + + + Putuskan koneksi Bluetooth saat berhenti + + + Dinamis + + + Kedipkan lampu Lightbar pada saat Latensi Tinggi + + + Sembunyikan Kontroler DS 4 + + + Tombol/Tentang + + + Pilihan Ikon + + + Minimalkan ke Taskbar + + + Minimalkan ke Taskbar daripada ke System Tray + + + Slot Output + + + Permanen + + + Plug + + + Kembalikan ke profil bawaan saat tidak dikenali + + + Tampilkan pesan debug profil otomatis + + + Geser Touchpad Untuk Mengganti Profil + + + Matikan DS4Windows untuk sementara + + + Unplug + + + Putih + + + Tema Aplikasi + + + Periksa Semua + + + Kontrol dan Pemantauan OSC Eksternal + + + Aktifkan Server Kontrol + + + Mengartikan Pesan Pemantauan + + + Aktifkan Layanan Pemantauan + + + Dukungan Kontroler DS4 + + + Dukungan Kontroler DualSense + + + Dukungan Kontroler JoyCon + + + Dukungan Kontroler Switch Pro + + + Copycat + + + Mengubah beberapa flag yang digunakan untuk kontroler DS4 non-Sony. Ini mungkin memperbaiki getar dan lampu indikator untuk beberapa klon DS4 buatan pihak ketiga + + + Gelap + + + Hari + + + Kontroler Terdeteksi + + + Opsi Perangkat + + + Aktifkan log verbose + + + Tampilkan pesan log tambahan saat kontroler terhubung + + + Jam + + + Gunakan folder Steam Kustom + + + Utilitas + + + Program + + + Jalankan Sebagai + + + Tugas + + + Tambahkan pengendalian tambahan pada ujung rendah kurva untuk mengatasi guncangan perangkat + + + Mengaktifkan Dari Mode Tidur + + + Dukungan Kontroler DS3 + + + Dikarenakan mapper lain secara bawaan mengaktifkan dukungan untuk beberapa jenis perangkat (Steam Input), DS4Windows hanya mengaktifkan dukungan untuk membaca dari kontroler DS4 secara bawaan. Anda dapat menentukan dukungan mapper untuk jenis perangkat lain yang didukung di sini. Hati-hati saat menggunakan DS4Windows bersama mapper lain yang mungkin berjalan pada saat yang sama + + + Dukungan Perangkat DS3 (PS3) + + + Dukungan untuk kontroler DualShock 3 (PS3). Membutuhkan penggunaan driver DsHidMini dari proyek ViGEm (nefarius). + + + Dukungan untuk kontroler DualShock 4 (PS4). + + + Dukungan untuk kontroler DualShock 4 (PS4) yang telah dikenali. + + + Dukungan untuk kontroler DualSense (PS5) + + + Dukungan untuk kontroler DualSense (PS5). Model biasa dan DS Edge. + + + Dukungan Mapper untuk Perangkat yang Diaktifkan + + + Dukungan untuk kontroler JoyCon + + + Dukungan untuk kontroler Joy-Con (Nintendo Switch) + + + Dukungan untuk kontroler Switch Pro + + + Dukungan untuk kontroler Switch Pro (Nintendo Switch). + + + Pertama Kali Dijalankan + + + Tampilkan Pergantian Profil melalui + + + Catatan + Pemberitahuan + + + Notifikasi + + + Terang + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.it.resx b/DS4Windows/Translations/Strings.it.resx new file mode 100644 index 0000000000..61e026cf59 --- /dev/null +++ b/DS4Windows/Translations/Strings.it.resx @@ -0,0 +1,730 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Accel + + + Azione + + + Aggiungi Cartella + + + Aggiungi Programmi + + + Aggiungi Programmi Del Menu Start + + + Aggiungi Giochi Steam + + + Tutto + + + Profili Automatici + + + Batteria + + + Sfoglia + + + Sfoglia per Altri Programmi + + + Annulla + + + Controlla Aggiornamenti Ora + + + Controlla Aggiornamenti di DS4Windows all'Avvio + + + Svuota + + + Chiudi Minimizza + + + Colore + + + Controller 1 + + + Controller 2 + + + Controller 3 + + + Controller 4 + + + Controllers + + + Pannello di Controllo + + + Elimina + + + Configurazione Controller/Driver + + + Duplica + + + Modifica + + + Modifica Azione + + + Esporta + + + Pieno + + + Gyro + + + Nascondi I Profili on Attivi + + + Importa + + + Analogico Sinistro + + + Registro + + + Nome + + + Nuovo + + + Nuova Azione + + + Nuovo Profilo + + + Nessuno + + + Percorso + + + Profilo + + + Cartella del Profilo + + + Ricarica Rapida + + + Registra Macro + + + Rimuovi + + + Rimuovi Azione + + + Analogico Destro + + + Vibrazione + + + Lancia l'app all'Avvio di Windows + + + Salva + + + Salva + + + Opzioni + + + Mostra Notifiche + + + Avvia Minimizzato + + + Avvia + + + Stato + + + Arresta + + + Scorri + + + Striscia + + + Tocco + + + Grilletto + + + Solo Warnings + + + sec + + + Ferma il test della vibrazione in secondi (0=auto stop disabled) + + + Barra del titolo + + + Sposta Su + + + Sposta Giù + + + Percorso del processo. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Barra del titolo. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Gamepad Test + + + Abilita L'output dei dati sul DS4 + + + Trasmetti periodicamente i dati della barra luminosa e della vibrazione al gamepad DS4. Deseleziona se il gamepad non supporta la ricezione dei dati. +Le modifiche a questa opzione hanno effetto al momento della connessione del gamepad. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Applica + + + HidNinja + + + Custom Exe Name + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad with Mouse-like Joystick + + + Maps the controller output to a standard gamepad + + + Gamepad + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M Controls with Gyro Mouse + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M Controls + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Gamepad with Gyro Mouse + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Gamepad with High Precision Camera + + + Descrizione + + + Vuoi utilizzare un preset? Scegliendo "No", verrà utilizzato un profilo standard. + + + Preset + + + Changelog + + + Chiudi + + + Profili + + + Nessun Controller Connesso (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + + ViGEm Device Plugin Failed. Likely an internal ViGEmBus problem. Closing connection. If the issue persists, please close DS4Windows and then reboot Windows. + + + Data integrity checks failed for wireless device. Closing device. + + + .NET 5 Runtime was not detected on your system. Please download and install .NET 5 Runtime to ensure compatibility with future DS4Windows builds. You will be redirected to the .NET 5 Runtime download page upon closing this window. + + + Please update .NET Runtime + + + HidHide + + + HidHide Configuration Client + + + Exclusive Access + + + HidGuardian Access + + + HidHide Access + + + Shared Access + + + Rinomina + + + Disabilita Controller Virtuale + + + Non generare/associare i controller virtuali per i controller connessi utilizzando questo profilo (La modifica verrà applicata al salvataggio del profilo) + + + Controller Emulato + + + Scegli il tipo di controller da emulare (La modifica verrà applicata al salvataggio del profilo) + + + Opzioni Controller Virtuali + + + Le modifiche avranno effetto sulla nuova connessione del dispositivo + + + Fuzz specifica il valore minimo, in unità, per la registrazione del movimento della levetta analogica nel mapper. Questa opzione può essere utile per gli analogici usurati che non riescono a mantenere una posizione fissa. Questo valore viene espresso in unità grezze. + + + Always enforce max output setting. Useful for 100% Max Output and confining value to a circular output value + + + In some situations, it might be useful to limit the maximum value that is output by the output analog stick. Max Output allows throttling the final output value of the analog stick. + + + An anti-deadzone acts as an offset for use with an axis to denote the minimum output value generated after an axis has left its assigned deadzone. This is mainly meant to help with mapping an axis to the assigned deadzone value used for an axis in a video game. For example, the typical assigned deadzone for XInput LS in a video game is around 8000 (25%). With no anti-deadzone assigned, an axis would have to move past the assigned deadzone in DS4Windows along with the game's assigned axis deadzone. + + + OLD OBSOLETE SETTING. Attempt to apply a curve based on raw input coordinates before any dead zone info is applied. Wonky + + + Minimum calculated output travel before a Mouse event is sent to the system + + + Adjusts a touchpad swipe by a given rotation angle. Useful when a normal touchpad swipe is not a straight line across. Values allows range from -180 to 180. Default is 0. + + + Sensitivity used to engage a multi-touch Mouse Wheel Scroll action + + + Activate Mouse Left click with a Touchpad Tap. Max time interval is set at (value * 2) ms. + + + Adds momentum to a Touchpad swipe once a finger is lifted. Adds extra Mouse cursor travel than would be possible with the confined space on the Touchpad + + + Add friction to virtual Trackball. Decreased friction will increase final mouse cursor travel time + + + Threshold for when an action will fire + + + Have outer bind fire before reaching a threshold. Action releases once the threshold has been exceeded + + + Action to execute when stick travel reaches past a treshold. Useful for mapping keys for Walk or Sprint actions. Invert casues the action to fire up until the threshold + + + Fuzz specifies the minimum number of device units, in active zone, that the Accel has to be rotated before the output is registered as changed in the mapper. The value is expressed in raw Accel units. + + + + = Clockwise. - = Counter-clockwise. + +The rotation setting is meant to help correct the orientation of an analog stick if your thumb is slightly shifted when moving an analog stick. For example, your thumb might be slightly shifted from center when the analog stick is moved fully north. My thumbs shift slightly to the right when moving an analog stick fully north due to the way my hands grip the DS4. The value used denotes the number of degrees used to adjust the final axis output value. Values allows range from -180 to 180. Default is 0. + + + Throttle low end of Touchpad movement. Reduces accidental mouse cursor movement when holding a mostly fixed position on the Touchpad + + + DS4 BT Poll Rate + + + Funzionalità disabilitata al momento a causa di problemi con il driver. Si spera che i problemi vengano risolti in un aggiornamento futuro. + + + Forza l'uso di entrambi i valori di vibrazione % (Opzione specifica per controller Generici e DualSense) + + + Disabled + + + Accurate + + + Legacy + + + Modalità vibrazione e livello: + + + Passthru + + + Impostazioni di vibrazione specifiche per DualSense + + + Recommended to be left DISABLED. + +- Disabled: rumble will be rescaled natively by the controller accordingly to the defined power level (better quality) + +- Enabled: both DS4Windows generic rumble rescale and DualSense's native control will be active + + + Accurate Mode (recommended): +- Better replicates the DualShock 4/Xbox 360 controller rumble feeling +- More accurately executes game's intended rumble effects +- Rumble has more depth. Within the same power level there is a greater difference between min and max in-game rumble activation, +varying from real low up to the max strength of the defined power level + +Legacy Mode: +- Overral stronger, but lacks depth +- Has a "sharper" feeling +- The min and max activation in-game will be, respectively, only slightly below and slight above the chosen power level strength + +Disabled: +- Fully disables rumble + + + DualSense's native rumble Power Level rescaler. + +- When in Accurate Mode, rumble's [ min // max ] will be [ 1% /// Chosen Power Level ] + - Example (62%): [ min = 1% /// max = 62% ] + +- When in Legacy Mode, rumble's [min /// max ] will be roughly [ Power Level - 12% /// Power Level + 12% ] + - Example (62%): [ min = 50% /// max = 74% ] + + + Accetta + + + Nero + + + Colorato + + + Default + + + Device type + + + Disconnetti dal BT dopo aver premuto "Arresta" + + + Dinamico + + + Lampeggia se la Latenza è Alta + + + Nascondi il controller DS4 + + + Tasti di Scelta Rapida/Informazioni + + + Scegli l'Icona + + + Riduci a icona sulla barra delle applicazioni + + + Riduci a icona sulla barra delle applicazioni invece dell'area di notifica + + + Output Slots + + + Permanente + + + Plug + + + Ripristina il profilo predefinito se nessun processo è riconosciuto + + + Mostra i messaggi di debug del profilo automatico + + + Scorri sul Touchpad per Cambiare Profilo + + + Disattiva temporanaemente DS4Windows + + + Unplug + + + Bianco + + + Tema App + + + Controlla ogni + + + DS4 Controller Support + + + DualSense Controller Support + + + JoyCon Controller Support + + + Switch Pro Controller Support + + + Copycat + + + Change some flags used for a non-Sony DS4 controller. It might fix rumble and lightbar support for some third party DS4 clones + + + Scuro + + + Giorni + + + Controller Rilevati + + + Opzioni Dispositivo + + + Abilita Registro Dettagliato + + + Mostra messaggi più dettagliati nel registro quando un gamepad è connesso + + + Ore + + + Seleziona la Cartella di Steam Personalizzata + + + Utils + + + Program + + + Run As + + + Task + + diff --git a/DS4Windows/Translations/Strings.ja.resx b/DS4Windows/Translations/Strings.ja.resx new file mode 100644 index 0000000000..1541ce1963 --- /dev/null +++ b/DS4Windows/Translations/Strings.ja.resx @@ -0,0 +1,469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 加速度 + + + アクション + + + ディレクトリを追加 + + + プログラムを追加 + + + スタートメニューのプログラムを追加 + + + Steamゲームを追加 + + + すべて + + + 自動プロファイル + + + バッテリー + + + 参照 + + + その他のプログラムを参照 + + + キャンセル + + + 今すぐ更新を確認 + + + 起動時に更新を確認 + + + クリア + + + 閉じるボタンで最小化 + + + + + + コントローラー1 + + + コントローラー2 + + + コントローラー3 + + + コントローラー4 + + + コントローラー + + + コントロールパネル + + + 削除 + + + コントローラー/ドライバーのセットアップ + + + 複製 + + + 編集 + + + アクションを編集 + + + エクスポート + + + 満タン + + + ジャイロ + + + 未選択を隠す + + + インポート + + + 左スティック + + + ログ + + + 名前 + + + 新規 + + + 新規アクション + + + 新規プロファイル + + + なし + + + パス + + + プロファイル + + + プロファイルフォルダ + + + 急速充電 + + + 記録 + + + 削除 + + + アクションを除去 + + + 右スティック + + + 振動 + + + システム起動時に開始 + + + 保存 + + + 保存 + + + 設定 + + + 通知を表示 + + + 最小化の状態で起動 + + + 開始 + + + 状態 + + + 停止 + + + スクロール + + + スライド + + + タップ + + + トリガー + + + 警告のみ + + + + + + 振動を自動停止するまでの秒数 (0で自動停止しません) + + + ウインドウ名 + + + 上に移動 + + + 下に移動 + + + プロセスのパス。^ABC = ABCで始まる文字列に一致 (^) | ABC$ = ABCで終わる文字列に一致 ($) | *ABC = ABCを含む文字列に一致 (*) + + + ウィンドウ名。^ABC = ABCで始まる文字列に一致 (^) | ABC$ = ABCで終わる文字列に一致 ($) | *ABC = ABCを含む文字列に一致 (*) + + + ゲームパッド入力テスト + + + DS4にデータを出力する + + + ライトバーと振動のデータを定期的にDS4に送ります。データ受信をサポートしないゲームパッドではチェックを外してください。 +設定変更はゲームパッドの次回接続時に反映されます。 + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + 適用 + + + HidNinja + + + カスタム実行ファイル名 + + + いくつかのゲームは、実行時に DS4Windows.exe や InputMapper.exe を検出すると、そこからの入力を無視するように実装されています。その回避策として、DS4Windows.exe をリネームします。ここにカスタム実行ファイル名を指定すると、DS4Updater が自動的に DS4Windows を指定された名前にコピーして使用します。 拡張子は必ず取り除いてください。 + +例: whyme_DS4Windows + + + XInputChecker + + + コントローラー5 + + + コントローラー6 + + + コントローラー7 + + + コントローラー8 + + + コントローラーの出力を、XinputゲームパッドまたはDS4パッドに変換します。ジャイロの出力はマウス形態のジョイスティックに変換します。 + + + ゲームパッド (マウス形態のジョイスティック付き) + + + コントローラーの出力を標準ゲームパッドに変換します。 + + + ゲームパッド + + + コントローラーの出力を、仮想 KB+M コントロールに変換します。ゲームパッドをサポートしていないFPSゲームなどで有用です。ジャイロの出力は仮想マウスに変換します。 + + + KB+M コントロール (ジャイロマウス付き) + + + コントローラーの出力を、仮想 KB+M コントロールに変換します。ゲームパッドをサポートしていないFPSゲームなどで有用です。 + + + KB+M コントロール + + + ボタンと方向キーの出力を標準ゲームパッドに変換します。ジャイロの出力は仮想マウスに変換します。 + + + ゲームパッド (ジャイロマウス付き) + + + コントローラーの出力を、XinputゲームパッドとRSマウスに変換します。 + + + ゲームパッド (高精度カメラ付き) + + + 説明 + + + プリセットオプションを使用しますか? No を選択すると、空のゲームパッドプロファイルを使用してプロファイルエディタを開きます。 + + + プリセット + + + 更新履歴 + + + 閉じる + + + プロファイル + + + コントローラーが接続されていません (最大 {0}) + + + フリックのしきい値 + + + フリックの時間 + + + 最小角度のしきい値 + + + Real World Calibration + + + ViGEm デバイスプラグインが失敗しました。おそらくViGEmBus内部の問題です。接続を終了します。問題が解決しない場合は、Windowsを再起動してください。警告: Windowsのシャットダウン時にブルースクリーンが発生する可能性があります。 + + + ワイヤレスデバイスのデータ整合性チェックに失敗しました。デバイスを閉じます。 + + + .NET 5 ランタイムが見つかりません。DS4Windowsの将来のビルドとの互換性を確保するために、.NET 5 ランタイムをダウンロードしてインストールしてください。このウィンドウを閉じると、.NET 5 ランタイムのダウンロードページに移動します。 + + + .NET ランタイムを更新してください + + + HidHide + + + HidHide 設定クライアント + + + 排他アクセス + + + HidGuardian アクセス + + + HidHide アクセス + + + 共有アクセス + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.ms.resx b/DS4Windows/Translations/Strings.ms.resx new file mode 100644 index 0000000000..cc7d9d0770 --- /dev/null +++ b/DS4Windows/Translations/Strings.ms.resx @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=5.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Pecutan + + + Tindakan + + + Tambah Direktori + + + Tambah Program + + + Tambah Program Menu Mula + + + Tambah Permainan Steam + + + Semua + + + Profil Automatik + + + Bateri + + + Semak Imbas + + + Semak Imbas Program Lain + + + Batal + + + Periksa Kemaskini Sekarang + + + Semak Kemas Kini Pada Permulaan DS4Windows + + + Bersihkan + + + Tutup Meminimumkan + + + Warna + + + Alat Kawalan 1 + + + Alat Kawalan 2 + + + Alat Kawalan 3 + + + Alat Kawalan 4 + + + Alat Kawalan + + + Panel Kawalan + + + Padam + + + Pasang Alat Kawalan/Pemacu + + + Pendua + + + Sunting + + + Sunting Tindakan + + + Eksport + + + Penuh + + + Giro + + + Sembunyikan Yang Tidak ditanda + + + Import + + + Kayu(stick) kiri + + + Log + + + Nama + + + Baharu + + + Tindakan Baharu + + + Profil Baharu + + + Tiada + + + Laluan + + + Profil + + + Folder Profil + + + Cas Pantas + + + Rekod Teks + + + Buang + + + Buang Tindakan + + + Kayu(stick) Kanan + + + Getaran + + + Dijalankan Pada Permulaan Sistem + + + Simpan + + + Simpan Profil + + + Tetapan + + + Tunjuk Pemberitahuan + + + Mula Diminimumkan + + + Mula + + + Status + + + Berhenti + + + Tatal + + + Slaid + + + Ketik + + + Picu + + + Amaran Sahaja + + + Saat + + + Auto berhenti derum dalam beberapa saat(0=auto berhenti dilumpuhkan) + + + Tajuk Tetingkap + + + Bergerak keatas + + + Bergerak kebawah + + + Laluan proses. ^ABC = Padankan pada permulaan rentetan (^) | ABC$ = Padankan di hujung rentetan ($) | *ABC = Mengandungi rentetan (*) + + + Tajuk tetingkap. ^ABC = Padankan pada permulaan rentetan (^) | ABC$ = Padankan di hujung rentetan ($) | *ABC = Mengandungi rentetan (*) + + + Ujian Pad Permainan + + + Dayakan data Output kepada DS4 + + + Keluarkan bar cahaya dan data derum secara berkala ke pad permainan DS4. Nyahtanda jika pad permainan tidak menyokong penerimaan data. +Perubahan pada pilihan ini berkuat kuasa pada masa sambungan pad permainan. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Terap + + + HidNinja + + + Nama boleh laku tersuai + + + Sesetengah permainan melaksanakan sekatan yang menyebabkan input DS4 diabaikan jika permainan mengesan sama ada 'DS4Windows.exe' atau 'InputMapper.exe' berjalan pada masa itu. Penyelesaian kepada sekatan itu ialah menamakan semula 'DS4Windows.exe' supaya semakan dalam permainan gagal. Menentukan nama exe tersuai di sini membolehkan DS4Updater mengemas kini salinan tersuai DS4Windows secara automatik kepada nama fail yang dikehendaki. Pastikan anda meninggalkan sambungan. + +Contoh: whyme_DS4Windows + + + XInputChecker + + + Alat Kawalan 5 + + + Alat Kawalan 6 + + + Alat Kawalan 7 + + + Alat Kawalan 8 + + + Petakan output alat kawalan ke pad permainan XInput standard atau pad DS4. Gyro dipetakan kepada kayu bedik seperti tetikus. + + + Pad permainan (dengan kayu bedik berbentuk tetikus) + + + Menukar output alat kawalan kepada pad permainan standard. + + + Pad permainan + + + Petakan output alat kawalan ke kawalan KB+M maya. Berguna untuk bermain permainan FPS tanpa sokongan pad permainan. Gyro dipetakan ke Tetikus maya. + + + KB+M Kawalan dengan tetikus giro + + + Petakan output alat kawalan ke kawalan KB+M maya. Berguna untuk bermain permainan FPS tanpa sokongan pad permainan. + + + Kawalan KB+M + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse. + + + Pad permainan dengan tetikus giro + + + Petakan output alat kawalan ke pad permainan XInput + tetikus RS bercampur. + + + Pad permainan dengan Kamera Ketepatan Tinggi + + + Penerangan + + + Adakah anda mahu menggunakan pilihan pratetap? Memilih 'Tidak' akan menyebabkan editor profil menggunakan profil pad permainan kosong. + + + Pratetap + + + Log Perubahan + + + Tutup + + + Profil + + + Tiada Alat Kawalan Disambungkan (Maks {0}) + + + Ambang Kuis + + + Masa Kuis + + + Ambang Sudut Min + + + Penentukuran Dunia Sebenar + + + Pemalam Peranti ViGEm Gagal. Kod Ralat {0}. Mungkin masalah dalaman ViGEmBus. Menutup sambungan. Jika isu berterusan, sila tutup DS4Windows dan kemudian but semula Windows. + + + Pemeriksaan integriti data gagal untuk peranti nirwayar. Menutup peranti. + + + .NET 5 Runtime tidak dikesan pada sistem anda. Sila muat turun dan pasang .NET 5 Runtime untuk memastikan keserasian dengan binaan DS4Windows akan datang. Anda akan dialihkan ke halaman muat turun .NET 5 Runtime selepas menutup tetingkap ini. + + + Sila kemas kini .NET Runtime + + + HidHide + + + Klien Konfigurasi HidHide + + + Akses Eksklusif + + + Akses HidGuardian + + + Akses HidHide + + + Akses Dikongsi + + + Namakan Semula + + + Lumpuhkan Alat Kawalan Maya + + + Jangan wujudkan/kaitkan alat kawalan maya untuk alat kawalan yang disambungkan menggunakan profil ini (Digunakan pada simpanan profil) + + + Alat Kawalan Ditiru + + + Pilih jenis alat kawalan maya output (Digunakan pada simpanan profil) + + + Tetapan Alat Kawalan Maya + + + Perubahan berkuat kuasa pada sambungan peranti baharu + + + Fuzz menentukan bilangan minimum unit yang digerakkan oleh kayu analog, dalam zon aktif, sebelum output didaftarkan seperti yang diubah dalam pemeta. Tetapan ini boleh berguna untuk kayu haus yang tidak dapat mengekalkan kedudukan tetap. Nilai dinyatakan dalam unit kayu mentah. + + + Sentiasa kuatkan tetapan output maks. Berguna untuk 100% Output Maks dan mengehadkan nilai kepada nilai keluaran bulat + + + Dalam sesetengah situasi, ia mungkin berguna untuk mengehadkan nilai maksimum yang dikeluarkan oleh output kayu analog. Output Maks membolehkan pendikitan nilai output akhir kayu analog. + + + Anti-deadzone bertindak sebagai offset untuk digunakan dengan paksi untuk menandakan nilai output minimum yang dijana selepas paksi meninggalkan zon mati yang ditetapkan. Ini terutamanya bertujuan untuk membantu memetakan paksi kepada nilai zon mati yang ditetapkan yang digunakan untuk paksi dalam permainan video. Sebagai contoh, zon mati biasa yang ditetapkan untuk XInput LS dalam permainan video ialah sekitar 8000 (25%). Dengan tiada anti-deadzone ditetapkan, paksi perlu bergerak melepasi zon mati yang ditetapkan dalam DS4Windows bersama-sama dengan zon mati paksi yang ditetapkan permainan. + + + TETAPAN USANG/LAMA. Cuba gunakan lengkung berdasarkan koordinat input mentah sebelum sebarang maklumat zon mati digunakan. Wonky + + + Perjalanan keluaran terkira minimum sebelum acara Tetikus dihantar ke sistem + + + Melaraskan leret pad sentuh mengikut sudut putaran tertentu. Berguna apabila leret pad sentuh biasa bukan garis lurus. Nilai membenarkan julat dari -180 hingga 180. Lalai ialah 0. + + + Sensitiviti yang digunakan untuk melibatkan tindakan Tatal Roda Tetikus berbilang sentuhan + + + Aktifkan Klik Kiri Tetikus dengan Ketik Pad Sentuh. Selang masa maksimum ditetapkan pada (nilai * 2) ms. + + + Menambah momentum pada leret Pad Sentuh sebaik sahaja jari diangkat. Menambahkan perjalanan kursor Tetikus tambahan daripada yang mungkin dengan ruang terkurung pada Pad Sentuh + + + Tambahkan geseran pada Trackball maya. Geseran yang berkurangan akan meningkatkan masa perjalanan kursor tetikus akhir + + + Ambang bila tindakan akan dicetuskan + + + Jalankan ikatan luar sebelum mencapai ambang. Tindakan dikeluarkan apabila ambang telah melebihi + + + Tindakan untuk dilaksanakan apabila perjalanan kayu(stick) melepasi ambang. Berguna untuk kekunci pemetaan untuk tindakan Berjalan atau Pecut. Songsang menyebabkan tindakan menyala sehingga ambang + + + Fuzz menentukan bilangan minimum unit peranti, dalam zon aktif, yang Accel perlu diputar sebelum output didaftarkan seperti diubah dalam pemeta. Nilai dinyatakan dalam unit Accel mentah. + + + + = Mengikut arah jam. - = lawan arah jam. + +Tetapan putaran bertujuan untuk membantu membetulkan orientasi kayu(stick) analog jika ibu jari anda dianjak sedikit apabila menggerakkan kayu(stick) analog. Contohnya, ibu jari anda mungkin dianjak sedikit dari tengah apabila kayu(stick) analog digerakkan sepenuhnya ke utara. Ibu jari saya beralih sedikit ke kanan apabila menggerakkan kayu(stick) analog sepenuhnya ke utara kerana cara tangan saya menggenggam DS4. Nilai yang digunakan menunjukkan bilangan darjah yang digunakan untuk melaraskan nilai keluaran paksi akhir. Nilai membenarkan julat dari -180 hingga 180. Lalai ialah 0. + + + Pendikit bahagian bawah pergerakan Pad Sentuh. Mengurangkan pergerakan kursor tetikus yang tidak disengajakan apabila memegang kedudukan tetap pada Pad Sentuh + + + Kadar Poll DS4 BT + + + Ciri dilumpuhkan pada masa ini dalam apl disebabkan isu pemacu. Mudah-mudahan masalah dapat diselesaikan dalam kemas kini masa hadapan. + + + Paksa pengunaan kedua-dua % tahap kekuatan (General dan DualSense specifc) + + + Dilumpuhkan + + + Tepat + + + Legasi + + + Mod derum dan tahap kekuatan: + + + Passthru + + + Tetapan derum khusus DualSense + + + Disyorkan untuk dibiarkan LUMPUH. + +- Dilumpuhkan: derum akan diskala semula secara asli oleh pengawal mengikut tahap kuasa yang ditentukan (kualiti lebih baik) + +- Didayakan: kedua-dua skala semula derum generik DS4Windows dan kawalan asli DualSense akan aktif + + + Mod Tepat (disyorkan): +- Lebih baik mereplikasi perasaan derum alat kawalan DualShock 4/Xbox 360 +- Lebih tepat melaksanakan kesan derum yang dimaksudkan permainan +- Derum mempunyai lebih kedalaman. Dalam tahap kuasa yang sama terdapat perbezaan yang lebih besar antara pengaktifan derum dalam permainan min dan maksimum, +berbeza-beza dari sangat rendah hingga kekuatan maksimum tahap kuasa yang ditentukan + +Mod Legasi: +- Secara keseluruhan lebih kuat, tetapi tidak mempunyai kedalaman +- Mempunyai rasa yang "lebih tajam". +- Pengaktifan min dan maksimum dalam permainan masing-masing, hanya sedikit di bawah dan sedikit di atas kekuatan aras kuasa yang dipilih + +Dilumpuhkan: +- Lumpuhkan sepenuhnya derum + + + Penskala semula Tahap Kuasa asli DualSense. + +- Apabila dalam Mod Tepat, derum [ min // maks ] akan menjadi [ 1% /// Tahap Kuasa Terpilih ] + - Contoh (62%): [ min = 1% /// maks = 62% ] + +- Apabila dalam Mod Legasi, [min /// maks ] derum akan menjadi kira-kira [ Tahap Kuasa - 12% /// Tahap Kuasa + 12% ] + - Contoh (62%): [ min = 50% /// maks = 74% ] + + + Terima + + + Hitam + + + Berwarna + + + Lalai + + + Jenis peranti + + + Putuskan sambungan daripada BT apabila Berhenti + + + Dinamik + + + Kelipkan lampu bar pada kependaman tinggi + + + Sembunyikan Alat Kawalan DS4 + + + Kekunci pintas/Perihal + + + Pilihan Ikon + + + Minimumkan kepada Bar Tugas + + + Minimumkan kepada Bar Tugas dan bukannya Dulang Sistem + + + Slot Keluaran + + + kekal + + + Palam + + + Kembali ke profil lalai pada tidak diketahui + + + Tunjukkan mesej nyahpepijat profil automatik + + + Leret Pad Sentuh Untuk Menukar Profil + + + Matikan DS4Windows Buat Sementara + + + Cabut Plag + + + Putih + + + Tema Apl + + + Semak setiap + + + Kawalan OSC Luaran & Pemantauan + + + Dayakan Pelayan Kawalan + + + Mentafsir Mesej Pemantauan + + + Dayakan Perkhidmatan Pemantauan + + + Sokongan Alat Kawalan DS4 + + + Sokongan Alat Kawalan DualSense + + + Sokongan Alat Kawalan JoyCon + + + Sokongan Alat Kawalan SwitchPro + + + Peniru + + + Tukar beberapa 'flags' yang digunakan untuk alat kawalan DS4 bukan Sony. Ia mungkin membetulkan derum dan sokongan bar ringan untuk beberapa klon DS4 pihak ketiga + + + Gelap + + + Hari + + + Alat Kawalan Dikesan + + + Pilihan Peranti + + + Dayakan log verbose + + + Tunjukkan mesej log tambahan apabila pad permainan disambungkan + + + Jam + + + Gunakan Folder Steam tersuai + + + Util + + + Program + + + Jalankan Sebagai + + + Tugasan + + + Tambahkan pendikit tambahan pada hujung bawah lengkung untuk mengambil kira gegaran peranti + + + Bangun Dari Penggantungan + + + Sokongan Alat Kawalan DS3 + + + Disebabkan oleh pemeta lain yang mendayakan sokongan untuk berbilang jenis peranti secara lalai (Input Steam), DS4Windows hanya mendayakan sokongan untuk membaca daripada alat kawalan DS4 secara lalai. Anda boleh menentukan sokongan pemeta untuk jenis peranti lain yang disokong di sini. Berhati-hati apabila menggunakan DS4Windows dengan pemeta lain yang mungkin berjalan pada masa yang sama. + + + Sokongan Peranti DS3 + + + Sokongan untuk alat kawalan DualShock 3 (PS3). Memerlukan penggunaan pemacu DsHidMini daripada projek ViGEm (nefarius). + + + Sokongan Peranti DS4 + + + Sokongan untuk alat kawalan DualShock 4 yang terkenal + + + Sokongan Peranti DualSense + + + Sokongan untuk alat kawalan DualSense (PS5). Model asas dan DS Edge + + + Sokongan Pemeta Peranti Didayakan + + + Sokongan Peranti JoyCon + + + Sokongan untuk alat kawalan JoyCon (Nintendo Switch). + + + Sokongan peranti Switch Pro + + + Sokongan untuk alat kawalan Switch Pro (Nintendo Switch). + + + Pelancaran Pertama + + + Paparkan Profil Tukar melalui + + + Log + Pemberitahuan + + + Pemberitahuan + + + Terang + + + Mod Output Pencetus DS4 + + + Analog + + + Butang + + + Lalai (Analog + Butang) + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.nl.resx b/DS4Windows/Translations/Strings.nl.resx new file mode 100644 index 0000000000..5071a74647 --- /dev/null +++ b/DS4Windows/Translations/Strings.nl.resx @@ -0,0 +1,1395 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Versnellingsmeter + + + Actie + + + Map toevoegen + + + Programma's toevoegen + + + Startmenu-programmma's toevoegen + + + Steam-spellen toevoegen + + + Alles + + + Automatische profielen + + + Batterij + + + Bladeren + + + Bladeren naar andere programma's + + + Annuleren + + + Updates ophalen + + + Updates ophalen bij opstarten DS4Windows + + + Leegmaken + + + Sluiten zorgt voor minimaliseren + + + Kleur + + + Controller 1 + + + Controller 2 + + + Controller 3 + + + Controller 4 + + + Controllers + + + Configuratiescherm + + + Verwijderen + + + Controller/driver installeren + + + Dupliceren + + + Bewerken + + + Actie aanpassen + + + Exporteren + + + Volledig + + + Gyro + + + Verberg niet-aangevinkt + + + Importeren + + + Linkse stick + + + Logboek + + + Naam + + + Nieuw + + + Nieuwe actie + + + Nieuw profiel + + + Geen + + + Pad + + + Profiel + + + Profielmap + + + Snelladen + + + Opnemen + + + Verwijderen + + + Verwijder actie + + + Rechtse stick + + + Vibratie/trillen + + + Uitvoeren bij opstarten PC + + + Opslaan + + + Opslaan + + + Instellingen + + + Meldingen tonen + + + Geminimaliseerd starten + + + Start + + + Status + + + Stop + + + Scrollen + + + Schuiven + + + Tikken + + + Trigger + + + Enkel waarschuwingen + + + sec + + + Automatisch stoppen van vibratie in seconden (0 = niet automatisch stoppen) + + + Titel venster + + + Naar boven + + + Naar beneden + + + Proces pad. ^ABC = komt overeen met begin van de tekst (^) | ABC$ = komt overeen met einde van de tekst ($) | *ABC = bevat tekst (*) + + + Titel venster. ^ABC = komt overeen met begin van de tekst (^) | ABC$ = komt overeen met einde van de tekst ($) | *ABC = bevat tekst (*) + + + Controller testen + + + Sta data uitvoer naar DS4 toe + + + Stuur regelmatig licht- en trildata naar de DS4-controller. Vink uit als je controller geen data kan ontvangen. +Wijzigen op deze instellingen hebben effect op de verbindingssnelheid van de controller. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Toepassen + + + HidNinja + + + Aangepaste exe naam + + + Sommige spellen blokkeren de invoer van DS4 als ze DS4Windows.exe of InputMapper.exe zien. Een oplossing is om DS4Windows.exe te hernoemen zodat de check faalt en de game normaal werkt. Hier een aangepaste exe naam invullen staat DS4Updater toe om automatisch een aangepaste kopie van DS4Windows te maken met de gewenste naam. Zorg ervoor dat je geen bestandextensie toevoegt. + +Voorbeeld: waaromik_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Wijst de controller uitvoer toe aan een standaard XInput- of DS4-gamepad. Gyro wordt toegewezen als een muisachtige joystick. + + + Gamepad met muisachtige joystick + + + Wijst de controller-uitvoer toe aan een standaard gamepad. + + + Gamepad + + + Wijst de uitvoer van de controller toe aan een virtuele muis en toetsenbord. Handig voor schietspellen zonder controller-ondersteuning. Gyro is toegewezen als een virtuele muis. + + + Toetsenbord en muis-bewegingen met gyro muis. + + + Wijst de uitvoer van de controller toe aan een virtuele muis en toetsenbord. Handig voor schietspellen zonder controller-ondersteuning. + + + Toetsenbord en muis + + + Wijst de knoppen en assen toe aan een standaard gamepad. Wijst gyro toe aan een virtuele Muis. + + + Gamepad met gyro muis + + + Wijst de uitvoer van de controller toe aan een gemixte XInput gamepad + muis. + + + Gamepad met hoogaccurate camera + + + Beschrijving + + + Wilt u één van de vooraf ingestelde opties gebruiken? Kies Nee als je een leeg Gamepad profiel wenst. + + + Voorinstellingen + + + Wijzigenlogboek + + + Sluiten + + + Profielen + + + Geen controllers verbonden (Max {0}) + + + Flick drempelwaarde + + + Flick tijd + + + Minimum hoek drempelwaarde + + + Fysieke calibratie + + + Stap 3: DualShock 4 controller verbinden. +Om bedraad/USB in te stellen: +Verbind gewoon je DualShock 4 en PC met een micro-USB kabel. + +(Optioneel) Om Bluetooth in te stellen: Hou de PS- en deelknop 3 seconden lang ingedrukt. De lightbar zal dubbel beginnen knipperen. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + HidHide + + + HidHide configuratie + + + Exclusieve toegang + + + HidHide toegang + + + Gedeelde toegang + + + ViGEm apparaatplugin gefaald. Error Code {0}. Waarschijnlijk een intern ViGEmBus probleem. Connectie afsluiten. Als het probleem zich blijft voordoen, sluit dan DS4Windows en herstart Windows. + + + Data-integriteit checks gefaald voor draadloos apparaat. Apparaat afsluiten. + + + .NET 5 Runtime niet gevonden op je systeem. Download en installeer .NET 5 Runtime om compatibiliteit te verzekeren met toekomstige versies van DS4Windows. Je zal doorgestuurd worden naar de .NET 5 Runtime download pagina bij het sluiten van dit venster. + + + Update .NET Runtime a.u.b. + + + HidGuardian toegang + + + Hernoemen + + + Virtuele controller uitschakelen + + + Geëmuleerde controller + + + Kies het type uitvoer van de virtuele controller (Wordt toegepast bij opslaan profiel) + + + Virtuele controller Instellingen + + + Aanpassingen treden in werking wanneer een nieuw apparaat verbindt + + + Maak/associeer geen virtuele controllers met verbonden controllers voor dit profiel (Wordt toegepast bij opslaan profiel) + + + via notificatie + + + via lichtbar + + + Trigger tikken + + + Voer gesynchroniseerd uit + + + Sixaxis stuur calibreren + + + Selecteer een macro + + + -Selecteer een actie- + + + Herhaal tijdens indrukken + + + Neem een macro op + + + Druk/schakel toets + + + Selecteer een toets + + + Multi-actieknop + + + Macro opgenomen + + + Laad een profiel + + + Start een programma + + + Bewaar status van toets + + + Hou trigger ingedrukt + + + Hou vast voor + + + Dubbeltik trigger + + + Bluetooth loskoppelen + + + Check batterij + + + Welkom bij DS4Windows + + + (Optioneel) Stap 5: Installeer FakerInput Stuurprogramma + + + (Optioneel) Stap 4: Installeer HidHide Stuurprogramma + + + Fuzz specifieert hoeveel de analoge stick moet bewegen, in de actieve zone, voor de uitvoer geregistreerd wordt. Deze instelling kan handig zijn voor versleten sticks die geen constante positie kunnen houden. De uitgedrukte waarde is ruwe invoer. + + + Gebruik altijd maximum Uitvoer. Handig voor 100% max uitvoer en om de uitvoer te beperken tot een cirkel. + + + Beperkt de maximale uitvoerwaarde van de analoge stick door alle hogere invoerwaarden te verlagen tot de maximum waarde. + + + Een anti-deadzone geeft de minimum uitvoerwaarde die wordt gegenereerd als een as de toegewezen deadzone heeft verlaten. Als er geen anti-deadzone is toegewezen, zou een as voorbij de toegewezen deadzone in DS4Windows moeten bewegen en dan nog eens voorbij de toegewezen deadzone van het spel. De typische toegewezen deadzone voor XInput LS in een videogame is ongeveer 8000 (25%). + + + + VEROUDERDE INSTELLING. Probeert een curve toe te passen gebaseerd op ruwe invoercoördinaten vóór de deadzone toegepast is. Onstabiel + + + Minimum berekende uitvoer beweging voor een muisbeweging naar het systeem word gestuurd + + + Past een touchpad swipe aan volgens een gegeven draaiingshoek. Handig wanneer een normale touchpad swipe geen rechte lijn is. Waarden mogen tussen -180 en 180 liggen. De standaardwaarde is 0°. + + + Gevoeligheid voor het starten van multi-touch scrollen. + + + Activeer linker muisklik door te tikken op de touchpad. Maximum tijdsinterval is (waarde * 2) ms. + + + Geeft momentum aan een touchpad swipe wanneer je de touchpad loslaat. Voegt extra beweging toe aan de cursorbeweging die normaal niet mogelijk zou zijn met de beperkte plaats op de touchpad. + + + Voeg wrijving toe aan virtuele trackball. Lagere wrijving zorgt voor meer beweging van de cursor. + + + Drempelwaarde waarna de actie begint + + + Start buitenste actie voor je de drempelwaarde bereikt. Actie stopt wanneer de drempelwaarde bereikt is. + + + Actie om uit te voeren wanneer de stick voorbij de drempelwaarde beweegt. Handig om bv. de toets voor lopen toe te wijzen. Omkeren zorgt ervoor dat de actie uitvoert tot de drempelwaarde bereikt is. + + + Breedte + + + X center + + + Y center + + + Ja + + + Actief + + + Huidig + + + Intro + + + Invoer # + + + XInput # + + + Pitch + + + Uitvoer controller + + + Preset menu + + + Batterij: 0% + + + Invoervertraging: N.V.T. + + + Sixaxis: X-as is omgekeerd zodat het makkelijker te lezen is + + + Verzocht + + + Roll + + + Yaw + + + Appdata + + + Program Folder + + + Voor wie een normale installatie wil. Instellingen worden opgeslagen in %appdata%\DS4Windows + + + Verwijder de andere instellingen nog niet + + + Meerdere opslaglocaties gedetecteerd + + + Kies waar je profielen en instellingen wil opslaan + + + Voor wie een draagbare installatie wil. +Let op: deze optie werkt niet in een admin map zonder gebruikersaccountbeheer + + + Waar opslaan + + + Bluetooth instellingen + + + Als dit venster opnieuw verschijnt na installatie, moet je misschien je PC opnieuw opstarten. + + + Stap 1: Installeer ViGEmBus stuurprogramma + + + Als je al eens een Xbox 360 controller hebt gebruikt op deze PC, mag je deze stap overslaan. + + + Stap 2: Enkel voor Windows 7, installeer 360 stuurprogramma + + + Als de lichtjes pinken, ga naar Bluetooth instellingen en verbind met "Wireless Controller" ("Draadloze Controller"). Indien gevraagd, gebruik koppelcode 0000. Na het koppelen ben je klaar. Veel plezier! + + + Gebruik HidHide om controllers in te stellen en te verbergen van andere apps op je systeem. Sommige games vertonen afwijkend gedrag wanneer meerdere controllers tegelijk verbonden zijn. + + + Gebruik FakerInput om voor het hele systeem het virtuele toetsenbord, relatieve muis en absolute muis beschikbaar te maken. Staat toe om virtuele toetsenbord en muis acties uit te voeren wanneer SendInput niet werkt. Bijvoorbeeld bij processen en games die hogere bevoegdheid nodig hebben, gebruikersaccountbeheer en anti-cheat systemen die SendInput blokkeren. Gebruik van FakerInput is nodig om DS4Windows te laten werken met bepaalde games , zoals Valorant. + + + Voer uit bij loslaten trigger + + + Toets uitzetten door + + + Verander licht + + + Verander gevoeligheid muis + + + Toetsenbord en relatieve muis + + + Toetsenbord en muis + + + Macro aan, kies eventueel een toets om uit te schakelen, sluit dit venster om op te slaan + + + Neem een macro op + + + Selecteer shift trigger + + + Bevestig + + + Schakel home LED in + + + Samengevoegde gyro provider + + + Link modus + + + Demp LED modus + + + Speler LED modus + + + Controller type opties + + + Delta versnelling + + + Swipe in een richting + + + Overgangsduratie + + + Ingeschakeld + + + Touchpad schakelen gebruiken + + + Extra + + + Apparaat ondersteuning + + + Fuzz + + + Besturing (versnellingsmeter) + + + Zwaar + + + Hoogte + + + Hip fire vertraging + + + ID + + + Inactieve verbinding verbreken + + + Flitssnelheid + + + Volledige knop trekken + + + Gebruik taalpakket + + + Voer programma uit met profiel + + + Lightbar + + + Link profiel/ID + + + Absolute beeldscherm weergave + + + Server inschakelen + + + 1€ Bèta + + + 1€ Minimum cutoff + + + Maximum beweging + + + Minimum factor + + + Minimum beweging + + + Modus + + + Muis + + + Muis versnelling + + + Muis joystick + + + Muis gevoeligheid + + + Vermenigvuldiger + + + Nee + + + Normaal + + + Andere + + + Buitenste waarde + + + Buitenste knop + + + Buitenste knop dead + + + Passthrough + + + Poort + + + Trilling toevoegen + + + Kleur lightbar veranderen + + + Dubbelklik op een wacht op de tijd te veranderen + + + 5e muisknop + + + 4e muisknop + + + Wacht invoegen + + + Voorinstelling laden + + + Macro volgorde + + + Eén keer afspelen + + + Vertraging opnemen + + + Herhalen tijdens indrukken + + + Voorinstelling opslaan + + + Gebruik toetsenbord/muis + controller 1 om op te nemen + + + Macro bewerken + + + Gewoon + + + Typ de nieuwe naam om te gebruiken voor het XML-bestand van het geselecteerde profiel. + + + Profiel hernoemen + + + Rotatie + + + Scan code + + + Geselecteerd profiel + + + Shift modifier + + + Versie overslaan + + + Test + + + Test zwaar + + + Test licht + + + Shakel + + + Trigger effect + + + Tweetrapsmodus + + + UDP server + + + Ongebonden + + + Update venster + + + Gebruik controller + + + Gebruik smoothing + + + Snap naar het midden + + + Accepteer + + + Zwart + + + Gekleurd + + + Standaard + + + Apparaattype + + + Loskoppelen van Bluetooth bij stoppen + + + Dynamisch + + + Flikker lightbar met hoge vertraging + + + Verberg DS4-controller + + + Sneltoetsen/Over + + + Icoonkeuze + + + Uitgeschakeld + + + Accuraat + + + Verouderd + + + Vibratiemodus en -sterkte + + + Passthrough + + + DualSense-specifieke vibratie-instellingen + + + Forceer gebruik van beide % sterkteniveaus (algemeen en DualSense-specifiek) + + + Fuzz specifieert hoeveel de versnellingsmeter gedraaid moet worden, in de actieve zone, voor de uitvoer geregistreerd wordt. De uitgedrukte waarde is ruwe invoer. + + + + = Met de klok mee. - = Tegen de klok in. + +De rotatie-instelling is bedoeld om de oriëntatie van een analoge stick te helpen corrigeren als uw duim een beetje verschoven is bij het bewegen van een stick. Uw duim kan bijvoorbeeld enigszins vanuit het midden verschoven zijn wanneer de analoge stick volledig naar boven is bewogen. Mijn duimen verschuiven iets naar rechts als ik een analoge stick helemaal naar het boven beweeg, vanwege de manier waarop ik de DS4 vasthoud. De gebruikte waarde geeft het aantal graden aan dat wordt gebruikt om de uiteindelijke uitvoerwaarde van de as aan te passen. Waarden mogen tussen -180 tot 180 liggen. De standaardwaarde is 0°. + + + Limiteer kleine bewegingen op touchpad. Vermindert onopzettelijke cursorbewegingen wanneer je een bijna-constante positie houdt. + + + DS4 Bluetooth poll rate + + + Functie momenteel uitgeschakeld in app door problemen met stuurprogramma. Hopelijk worden de problemen opgelost in een toekomstige update. + + + Aangeraden om UITGESCHAKELD te laten. + +- Uitgeschakeld: vibratie wordt geschaald door de controller volgens het gedefinieerde krachtniveau (betere kwaliteit) + +- Ingeschakeld: zowel DS4Windows algemene vibratie schaling en DualSense ingebouwde controle zijn actief + + + Accurate modus (aangeraden): +- Lijkt meer op DualShock 4/Xbox 360 controller vibratiegevoel +- Meer accurate vibratie hoe de game het bedoelt +- Vibratie heeft meer diepgang. Binnen hetzelfde krachtniveau is er een groter verschil tussen minimum en maximum in-game vibratie. + +Verouderde Modus: +- Hardere vibratie, maar minder diepgang +- Voelt "scherper" +- De minimum en maximum vibratie zijn respectievelijk, maar een beetje onder en boven het gekozen krachtniveau. + +Uitgeschakeld: +- Vibratie volledig uitgeschakeld + + + DualSense ingebouwde krachtniveau schaling. + +- In accurate modus zal vibratie [ min // max ] gelijk zijn aan [ 1% /// gekozen krachtniveau ] + - Voorbeeld (62%): [ min = 1% /// max = 62% ] + +- In verouderde modus zal vibratie [min /// max ] gelijk zijn aan [ Power Level - 12% /// Power Level + 12% ] + - Voorbeeld (62%): [ min = 50% /// max = 74% ] + + + Minimaliseer naar taakbalk + + + Minimaliseer naar taakbalk i.p.v. systeemvak + + + Uitvoer slots + + + Permanent + + + Gebruik standaard profiel wanneer onbekend + + + toon automatisch profiel debug berichten + + + Swipe touchpad om tussen profielen te wisselen + + + Schakel DS4Windows tijdelijk uit + + + Aansluiten + + + Afsluiten + + + Wit + + + Appthema + + + Check elke + + + Externe OSC controle en monitoring + + + Schakel controle server in + + + Interpreteer monitoring berichten + + + Schakel monitoring service in + + + DS4-controller ondersteuning + + + DualSense controller ondersteuning + + + JoyCon controller ondersteuning + + + Switch Pro controller ondersteuning + + + Copycat + + + Verander enkele waarden die gebruikt worden voor een non-Sony DS4-controller. Dit kan vibratie en lightbar ondersteuning herstellen voor bepaalde onofficiële DS4-controllers. + + + Donker + + + Dagen + + + Gedetecteerde controllers + + + Apparaatopties + + + Schakel uitgebreid logboek in + + + Toon aanvullende logberichten wanneer een gamepad verbonden is + + + Uur + + + Gebruik aangepaste Steam map + + + Voorzieningen + + + Programma + + + Voer uit als + + + Taak + + + Limiteer het onderste deel van de curve om rekening te houden met beweging van het apparaat + + + DS3 controller ondersteuning + + + Wakker worden van sluimeren + + + Omdat andere mappers standaard ondersteuning bieden voor meerdere apparaattypen (Steam Input), schakelt DS4Windows standaard alleen ondersteuning in voor het lezen van DS4-controllers. U kunt hier ondersteuning voor andere ondersteunde apparaattypen kiezen. Let op als u DS4Windows gebruikt terwijl andere mappers tegelijkertijd actief zijn. + + + DS3 apparaat ondersteuning + + + Ondersteuning voor DualShock 3 controllers (PS3). Gebruikt het DsHidMini stuurprogramma uit het ViGEm project (Nefarius). + + + DS4 apparaat ondersteuning + + + Ondersteuning voor DualShock 4 controller (PS4). + + + DualSense apparaat ondersteuning + + + Ondersteuning voor DualSense controller (PS5). + + + Apparaatmapper ondersteuning ingeschakeld + + + JoyCon apparaat ondersteuning + + + Ondersteuning voor JoyCon controllers (Nintendo Switch). + + + Switch Pro apparaat ondersteuning + + + Ondersteuning voor Switch Pro controller (Nintendo Switch). + + + Eerste keer opstarten + + + Wissel van weergaveprofiel via + + + Logboek + notificatie + + + Notificatie + + + Licht + + + DS4 trigger uitvoer modus + + + Analoog + + + Knoppen + + + Standaard (analoog + knoppen) + + + Deadzone + + + Maximum zone + + + Anti-deadzone + + + Axiaal + + + As configuratie + + + Besturing + + + Kubisch + + + Deadzone X + + + Deadzone Y + + + Deadzone type + + + Overgang-in kubisch + + + Overgang-uit quad + + + Verbeterde precisie + + + Flick stick + + + Lineair + + + Maximum uitvoer + + + Muis offset + + + Muis verticale schaal + + + Uitvoercurve + + + Uitvoermodus + + + Kwadratisch + + + Radiaal + + + Gevoeligheid + + + Sixaxis (versnellingsmeter) + + + Vierkante stick + + + Verticale schaal + + + Anti-snapback + + + Anti-snapback timing + + + Touchpad + + + Werkt enkel met ViGEmBus 1.17.333.0 en nieuwer + + + Absolute muis + + + Absolute muis opties + + + Anti-straal + + + Absolute muis + + + Absolute muis naar beneden + + + Absolute muis naar links + + + Absolute muis naar rechts + + + Absolute muis naar boven + + + Ontlaad trigger loslaten + + + Ontlaad trigger indrukken + + + Ontlaadtrigger instellen + + + Ontlaad bij loslaten trigger + + + Ontlaad trigger + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.pl.resx b/DS4Windows/Translations/Strings.pl.resx new file mode 100644 index 0000000000..7317a1392d --- /dev/null +++ b/DS4Windows/Translations/Strings.pl.resx @@ -0,0 +1,442 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Przysp. + + + Akcja + + + Dodaj folder + + + Dodaj programy + + + Dodaj programy Menu Start + + + Dodaj gry ze Steama + + + Wszystko + + + Autom. profil + + + Bateria + + + Przeglądaj + + + Inne programy + + + Anuluj + + + Sprawdź aktualizacje + + + Sprawdzaj aktualizacje przy uruchamianiu programu + + + Wyczyść + + + Minimalizuj program po zamknięciu + + + Kolor + + + Kontroler 1 + + + Kontroler 2 + + + Kontroler 3 + + + Kontroler 4 + + + Kontrolery + + + Panel sterowania + + + Usuń + + + Konfiguracja kontrolera / sterownika + + + Kopiuj + + + Edytuj + + + Edytuj akcję + + + Eksportuj + + + Pełny + + + Żyroskop + + + Ukryj niezaznaczone + + + Importuj + + + Lewy drążek + + + Dziennik + + + Nazwa + + + Nowy + + + Nowa akcja + + + Nowy profil + + + Brak + + + Ścieżka + + + Profil + + + Folder z profilami + + + Szybkie ładowanie + + + Nagraj + + + Usuń + + + Usuń akcję + + + Prawy drążek + + + Wibracje + + + Uruchom przy starcie systemu + + + Zapisz + + + Zapisz + + + Ustawienia + + + Pokazuj powiadomienia + + + Uruchom zminimalizowany + + + Start + + + Status + + + Stop + + + Przewijanie + + + Przesuwanie + + + Dotknięcie + + + Spust + + + Tylko ostrzeżenia + + + sek + + + Zatrzymaj wibracje po upływie x sekund (0=wył.) + + + Nazwa okna + + + Do góry + + + Na dół + + + Ścieżka do procesu. ^ABC = Dopasuj na początku ciągu (^) | ABC$ = Dopasuj na końcu ciągu ($) | *ABC = Zawiera ciąg (*) + + + Nazwa okna. ^ABC = Dopasuj na początku ciągu (^) | ABC$ = Dopasuj na końcu ciągu ($) | *ABC = Zawiera ciąg (*) + + + Test kontrolera + + + Włącz dane wyjściowe do DS4 + + + Wysyłaj okresowo dane paska świetlnego i wibracji do kontrolera. +Odznacz, jeśli nie wspiera on funkcji otrzymywania danych. +Zmiany zostaną zastosowane przy łączeniu się z kontrolerem. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Zastosuj + + + HidNinja + + + Własna nazwa EXE + + + Niektóre gry blokują użycie kontrolera, gdy wykryją one działający program DS4Windows.exe lub InputMapper.exe. Obejść to można zmieniając nazwę programu DS4Windows.exe. Podanie tutaj własnej nazwy tego programu pozwala programowi aktualizującemu na automatyczną aktualizację DS4Windows pod zmienioną nazwą. Pamiętaj, aby nie dodawać rozszerzenia. + +Przykład: 1_DS4Windows + + + XInputChecker + + + Kontroler 5 + + + Kontroler 6 + + + Kontroler 7 + + + Kontroler 8 + + + Mapuje kontroler jako standardowy kontroler XInput lub DS4. Żyroskop jest mapowny jako myszkopodobny joystick. + + + Kontroler z myszkopodobnym joystickiem + + + Mapuje kontroler jako standardowy + + + Kontroler + + + Mapuje kontroler jako klawiaturę i myszkę. Użyteczne w przypadku gier FPS bez wsparcia dla kontrolerów. Żyroskop mapowany jest jako mysz. + + + Klawiatura i mysz + + + Mapuje kontroler jako klawiaturę i myszkę. Użyteczne w przypadku gier FPS bez wsparcia dla kontrolerów. + + + Klawiatura i mysz - przyciski + + + Mapuje przyciski i osie jako standardowy kontroler. Żyroskop mapowany jest jako mysz. + + + Kontroler z myszką + + + Mapuje kontroler jako mieszankę kontrolera XInput i myszy. + + + Kontroler z kamerą wysokiej precyzji + + + Opis + + + Czy chcesz uzyć presetu? Wybranie opcji 'Nie' spowoduje utworzenie pustego profilu kontrolera. + + + Presety + + + Lista zmian + + + Zamknij + + + Profile + + + Brak podłączonych kontrolerów (Maks. {0}) + + + Próg szybkiego ruchu + + + Czas szybkiego ruchu + + + Próg kąta minimalnego + + + Kalibracja w świecie rzeczywistym + + + Wystąpił problem z wtyczką ViGEm. Zamykanie połączenia. + + diff --git a/DS4Windows/Translations/Strings.pt-BR.resx b/DS4Windows/Translations/Strings.pt-BR.resx new file mode 100644 index 0000000000..adaf0e643e --- /dev/null +++ b/DS4Windows/Translations/Strings.pt-BR.resx @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aceleração + + + Ação + + + Adicionar Diretório + + + Adicionar Programas + + + Adicionar Programas do Menu de Inicialização + + + Adicionar Jogos da Steam + + + Todos + + + Perfis Automáticos + + + Bateria + + + Procurar + + + Procurar por Outros Programas + + + Cancelar + + + Verificar Atualizações Agora + + + Verificar Atualizações para DS4Windows na inicialização + + + Limpar + + + Fechar Minimiza + + + Cor + + + Controle 1 + + + Controle 2 + + + Controle 3 + + + Controle 4 + + + Controles + + + Painel de Controle + + + Deletar + + + Configuração Controle/Driver + + + Duplicar + + + Editar + + + Editar Ação + + + Exportar + + + Cheio + + + Giroscópio + + + Ocultar Desmarcados + + + Importar + + + Controle Esquerdo + + + Registro + + + Nome + + + Novo + + + Nova Ação + + + Novo Perfil + + + Nenhum + + + Caminho + + + Perfil + + + Pasta de Perfil + + + Carregamento Rápido + + + Gravar + + + Remover + + + Remover Ação + + + Controle Direito + + + Vibração + + + Executar na Inicialização + + + Salvar + + + Salvar + + + Configurações + + + Mostrar Notificações + + + Iniciar Minimizado + + + Começar + + + Status + + + Parar + + + Rolagem + + + Deslizar + + + Pressionar + + + Gatilho + + + Apenas Avisos + + + seg + + + Parar vibração automaticamente em segundos (0=auto parar desabilitado) + + + Titulo da janela + + + Mover acima + + + Mover abaixo + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Testar controle + + + Habilitar saida de dados para o DS4 + + + Enviar dados da lightbar e de vibração periodicamente para o DS4. Desmarcar se o controle não suportar a recepção de dados. + Mudanças nessa opção são ativadas ao conectar ao controle. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Aplicar + + + HidNinja + + + Nome Exe customizado. + + + Alguns jogos implementam um bloco que faz com que a entrada DS4 seja ignorada se um jogo detectar DS4Windows.exe ou InputMapper.exe rodando no momento. Uma alternativa para o bloco é renomear DS4Windows.exe para que a verificação no jogo falhe. Especificar um nome de exe personalizado aqui permite que DS4Updater atualize automaticamente uma cópia personalizada de DS4Windows para o nome de arquivo desejado. Certifique-se de omitir a extensão. + + Exemplo: whyme_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Mapeia a saída do controlador para um gamepad padrão XInput ou DS4. O Gyro é mapeado para um Joystick parecido com um mouse. + + + Gamepad com Joystick parecido com o mouse + + + Mapeia a saída do controlador para um padrão gamepad + + + Gamepad + + + Mapeia a saída do controlador para controles Teclado+Mouse virtuais. Útil para jogar jogos FPS sem suporte de gamepad. O Gyro é mapeado para um mouse virtual. + + + Controles Teclado+Mouse com mouse Gyro + + + Mapeia a saída do controlador para controles KB+M virtuais. Útil para jogar jogos FPS sem suporte de gamepad. + + + Controles Teclado e Mouse + + + Mapeia os botões e os eixos para um padrão de jogo. Mapeia o Giro para um mouse virtual + + + Gamepad com mouse Gyro + + + Mapeia a saída do controlador para o gamepad misto XInput + mouse RS. + + + Gamepad com Câmera de Alta Precisão + + + Descrição + + + Você quer usar uma opção pré-definida? A escolha de Não fará com que o Editor de Perfil utilize um perfil Gamepad vazio. + + + Predefinições + + + Log de mudanças + + + Fechar + + + Perfis + + + Nenhum controle conectado (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + diff --git a/DS4Windows/Translations/Strings.pt.resx b/DS4Windows/Translations/Strings.pt.resx new file mode 100644 index 0000000000..183f60b425 --- /dev/null +++ b/DS4Windows/Translations/Strings.pt.resx @@ -0,0 +1,452 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Aceleração + + + Ação + + + Adicionar Diretório + + + Adicionar Programas + + + Adicionar Programas do Menu de Inicialização + + + Adicionar Jogos da Steam + + + Todos + + + Perfis Automáticos + + + Bateria + + + Procurar + + + Procurar por Outros Programas + + + Cancelar + + + Verificar Atualizações Agora + + + Verificar Atualizações para DS4Windows na inicialização + + + Limpar + + + Fechar Minimiza + + + Cor + + + Comando 1 + + + Comando 2 + + + Comando 3 + + + Comando 4 + + + Comandos + + + Painel de Controlo + + + Apagar + + + Configuração Comando/Driver + + + Duplicar + + + Editar + + + Editar Ação + + + Exportar + + + Cheio + + + Giroscópio + + + Ocultar Desmarcados + + + Importar + + + Analógico Esquerdo + + + Registo + + + Nome + + + Novo + + + Nova Ação + + + Novo Perfil + + + Nenhum + + + Caminho + + + Perfil + + + Pasta do Perfil + + + Carregamento Rápido + + + Gravar + + + Remover + + + Remover Ação + + + Analógico Direito + + + Vibração + + + Executar na Inicialização + + + Guardar + + + Guardar + + + Configurações + + + Mostrar Notificações + + + Iniciar Minimizado + + + Começar + + + Estado + + + Parar + + + Rolamento (Scroll) + + + Deslizar + + + Pressionar + + + Gatilho + + + Apenas Avisos + + + seg + + + Segundos para a paragem automática de vibração (0 = paragem automática desativada) + + + Título da Janela + + + Cima + + + Baixo + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Teste de comando + + + Ativar a saída de data para DS4 + + + Envio periódico de dados da lightbar e rumble para o DS4.Desmarque se o comando não suportar a receção de dados. +Mudanças só serão aplicadas ao conectar o comando. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Aplicar + + + HidNinja + + + Nome Exe Customizado + + + Alguns jogos implementam um bloqueio que faz com que a entrada DS4 seja ignorada se um jogo detectar DS4Windows.exe ou InputMapper.exe em execução no momento. Uma solução alternativa para o bloqueio é renomear DS4Windows.exe para que a verificação do jogo falhe. Especificar um nome exe personalizado aqui permite que o DS4Updater atualize automaticamente uma cópia personalizada do DS4Windows para o nome de arquivo desejado. Certifi~ca-te que omites a extensão. + +Exemplo: whyme_DS4Windows + + + XInputChecker + + + Comando 5 + + + Comando 6 + + + Comando 7 + + + Comando 8 + + + Mapeia o output do comando para um comando padrão XInput ou comando DS4.Gyro será mapeado para um rato virtual. + + + Comando com analógicos semelhantes a um rato + + + Mapeia a saída do controlador para um gamepad padrão + + + Gamepad + + + Mapeia o output do comando para controlos virtuais KB+M. Útil para jogos FPS sem suporte para comando nativo. Gyro será mapeado para um rato virtual. + + + Controlos KB+M com rato Gyro + + + Mapeia o output do comando para controlos virtuais KB+M. Útil para jogos FPS sem suporte para comando nativo. + + + Controlos KB+M + + + Mapeia os butões e os axis para um comando padrão.Gyro será mapeado para um rato virtual + + + Comando com rato Gyro + + + Mapeia o output para uma junção de um comando XInput com rato RS. + + + Comando com câmera de alta precisão + + + Descrição + + + Queres usar uma opção predefinida? Escolher -Não- fará com que o Editor de Perfil use um perfil de comando vazio. + + + Predefinições + + + Registo de alterações + + + Fechar + + + Perfis + + + Nenhum comando conectado (Max {0}) + + + Limite de Flick + + + Tempo de Flick + + + Ângulo minimo limite + + + Calibração Real World + + + ViGEm Device Plugin Falhou. Provável que seja um problema do ViGemBus. A fechar a conexão. Se o problema persistir, por favor reinicie o Windows. ATENÇÃO: Será provavel que terás uma Blue Screen of Death ao encerrar o Windows. + + + A validação de integridade de dados falhou para o dispositivo wireless. A fechar dispositivo. + + + Não detectámos o .NET 5 Runtime no teu sistem. Faz o download e instala o .NET 5 Runtime para garantires a compatibilidade com versões futuras do DS4Windows. Irás ser redirecionado para a página de download do .NET 5 Runtime ao fechar esta janela. + + + + Por favor atualiza o .NET Runtime + + diff --git a/DS4Windows/Translations/Strings.resx b/DS4Windows/Translations/Strings.resx new file mode 100644 index 0000000000..7bea594653 --- /dev/null +++ b/DS4Windows/Translations/Strings.resx @@ -0,0 +1,1412 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Accel + + + Action + + + Add Directory + + + Add Programs + + + Add Start Menu Programs + + + Add Steam Games + + + All + + + Auto Profiles + + + Battery + + + Browse + + + Browse for Other Programs + + + Cancel + + + Check For Update Now + + + Check for updates at DS4Windows startup + + + Clear + + + Close Minimizes + + + Color + + + Controller 1 + + + Controller 2 + + + Controller 3 + + + Controller 4 + + + Controllers + + + Control Panel + + + Delete + + + Controller/Driver Setup + + + Duplicate + + + Edit + + + Edit Action + + + Export + + + Full + + + Gyro + + + Hide Unchecked + + + Import + + + Left Stick + + + Log + + + Name + + + New + + + New Action + + + New Profile + + + None + + + Path + + + Profile + + + Profile Folder + + + Quick Charge + + + Record + + + Remove + + + Remove Action + + + Right Stick + + + Rumble + + + Run At Startup + + + Save + + + Save + + + Settings + + + Show Notifications + + + Start Minimized + + + Start + + + Status + + + Stop + + + Scroll + + + Slide + + + Tap + + + Trigger + + + Warnings only + + + sec + + + Auto stop rumble in secs (0=auto stop disabled) + + + Window Title + + + Move Up + + + Move Down + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Gamepad Test + + + Enable Output data to DS4 + + + Output lightbar and rumble data periodically to DS4 gamepad. Untick if the gamepad doesn't support data receiving. +Changes to this option takes effect at the gamepad connection time. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Apply + + + HidNinja + + + Custom Exe Name + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad with Mouse-like Joystick + + + Maps the controller output to a standard gamepad + + + Gamepad + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M Controls with Gyro Mouse + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M Controls + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Gamepad with Gyro Mouse + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Gamepad with High Precision Camera + + + Description + + + Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile. + + + Presets + + + Changelog + + + Close + + + Profiles + + + No Controllers Connected (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + + ViGEm Device Plugin Failed. Error Code {0}. Likely an internal ViGEmBus problem. Closing connection. If the issue persists, please close DS4Windows and then reboot Windows. + + + Data integrity checks failed for wireless device. Closing device. + + + .NET 5 Runtime was not detected on your system. Please download and install .NET 5 Runtime to ensure compatibility with future DS4Windows builds. You will be redirected to the .NET 5 Runtime download page upon closing this window. + + + Please update .NET Runtime + + + HidHide + + + HidHide Configuration Client + + + Exclusive Access + + + HidGuardian Access + + + HidHide Access + + + Shared Access + + + Rename + + + Disable virtual controller + + + Do not spawn/associate virtual controllers for connected controllers using this profile (Applies on profile save) + + + Emulated Controller + + + Choose the type of output virtual controller (Applies on profile save) + + + Virtual Controller Settings + + + Changes take effect on new device connection + + + Fuzz specifies the minimum number of units the analog stick moves, in active zone, before the output is registered as changed in the mapper. This setting can be useful for worn sticks that cannot maintain a constant position. The value is expressed in raw stick units. + + + Always enforce max output setting. Useful for 100% Max Output and confining value to a circular output value + + + In some situations, it might be useful to limit the maximum value that is output by the output analog stick. Max Output allows throttling the final output value of the analog stick. + + + An anti-deadzone acts as an offset for use with an axis to denote the minimum output value generated after an axis has left its assigned deadzone. This is mainly meant to help with mapping an axis to the assigned deadzone value used for an axis in a video game. For example, the typical assigned deadzone for XInput LS in a video game is around 8000 (25%). With no anti-deadzone assigned, an axis would have to move past the assigned deadzone in DS4Windows along with the game's assigned axis deadzone. + + + OLD OBSOLETE SETTING. Attempt to apply a curve based on raw input coordinates before any dead zone info is applied. Wonky + + + Minimum calculated output travel before a Mouse event is sent to the system + + + Adjusts a touchpad swipe by a given rotation angle. Useful when a normal touchpad swipe is not a straight line across. Values allows range from -180 to 180. Default is 0. + + + Sensitivity used to engage a multi-touch Mouse Wheel Scroll action + + + Activate Mouse Left click with a Touchpad Tap. Max time interval is set at (value * 2) ms. + + + Adds momentum to a Touchpad swipe once a finger is lifted. Adds extra Mouse cursor travel than would be possible with the confined space on the Touchpad + + + Add friction to virtual Trackball. Decreased friction will increase final mouse cursor travel time + + + Threshold for when an action will fire + + + Have outer bind fire before reaching a threshold. Action releases once the threshold has been exceeded + + + Action to execute when stick travel reaches past a treshold. Useful for mapping keys for Walk or Sprint actions. Invert casues the action to fire up until the threshold + + + Fuzz specifies the minimum number of device units, in active zone, that the Accel has to be rotated before the output is registered as changed in the mapper. The value is expressed in raw Accel units. + + + + = Clockwise. - = Counter-clockwise. + +The rotation setting is meant to help correct the orientation of an analog stick if your thumb is slightly shifted when moving an analog stick. For example, your thumb might be slightly shifted from center when the analog stick is moved fully north. My thumbs shift slightly to the right when moving an analog stick fully north due to the way my hands grip the DS4. The value used denotes the number of degrees used to adjust the final axis output value. Values allows range from -180 to 180. Default is 0. + + + Throttle low end of Touchpad movement. Reduces accidental mouse cursor movement when holding a mostly fixed position on the Touchpad + + + DS4 BT Poll Rate + + + Feature currently disabled in app due to driver issues. Hopefully issues get fixed in a future update. + + + Force usage of both % strength levels (General and DualSense specifc) + + + Disabled + + + Accurate + + + Legacy + + + Rumble mode and strength level: + + + Passthru + + + DualSense specific rumble settings + + + Recommended to be left DISABLED. + +- Disabled: rumble will be rescaled natively by the controller accordingly to the defined power level (better quality) + +- Enabled: both DS4Windows generic rumble rescale and DualSense's native control will be active + + + Accurate Mode (recommended): +- Better replicates the DualShock 4/Xbox 360 controller rumble feeling +- More accurately executes game's intended rumble effects +- Rumble has more depth. Within the same power level there is a greater difference between min and max in-game rumble activation, +varying from real low up to the max strength of the defined power level + +Legacy Mode: +- Overral stronger, but lacks depth +- Has a "sharper" feeling +- The min and max activation in-game will be, respectively, only slightly below and slight above the chosen power level strength + +Disabled: +- Fully disables rumble + + + DualSense's native rumble Power Level rescaler. + +- When in Accurate Mode, rumble's [ min // max ] will be [ 1% /// Chosen Power Level ] + - Example (62%): [ min = 1% /// max = 62% ] + +- When in Legacy Mode, rumble's [min /// max ] will be roughly [ Power Level - 12% /// Power Level + 12% ] + - Example (62%): [ min = 50% /// max = 74% ] + + + Accept + + + Black + + + Colored + + + Default + + + Device type + + + Disconnect from BT when Stopping + + + Dynamic + + + Flash Lightbar at High Latency + + + Hide DS4 Controller + + + Hotkeys/About + + + Icon Choice + + + Minimize to Taskbar + + + Minimize to Taskbar instead of System Tray + + + Output Slots + + + Permanent + + + Plug + + + Revert to default profile on unknown + + + Show auto-profile debug messages + + + Swipe Touchpad To Switch Profiles + + + Turn Off DS4Windows Temporarily + + + Unplug + + + White + + + App Theme + + + Check every + + + External OSC Control & Monitoring + + + Enable Control Server + + + Interpret Monitoring Messages + + + Enable Monitoring Service + + + DS4 Controller Support + + + DualSense Controller Support + + + JoyCon Controller Support + + + Switch Pro Controller Support + + + Copycat + + + Change some flags used for a non-Sony DS4 controller. It might fix rumble and lightbar support for some third party DS4 clones + + + Dark + + + Days + + + Detected Controllers + + + Device Options + + + Enable verbose log + + + Show additional log messages when a gamepad is connected + + + Hours + + + Use custom Steam Folder + + + Utils + + + Program + + + Run As + + + Task + + + Add additional throttling at low end of curve to account for device shaking + + + Waking Up From Suspend + + + DS3 Controller Support + + + Due to other mappers enabling support for multiple device types by default (Steam Input), DS4Windows only enables support for reading from DS4 controllers by default. You can specify mapper support for other supported device types here. Be careful when using DS4Windows with other possible mappers running at the same time. + + + DS3 Device Support + + + Support for DualShock 3 (PS3) controllers. Requires the use of the DsHidMini driver from the ViGEm project (nefarius). + + + DS4 Device Support + + + Support for known DualShock 4 controllers + + + DualSense Device Support + + + Support for DualSense (PS5) controllers. Base model and DS Edge + + + Enabled Devices Mapper Support + + + JoyCon Device Support + + + Support for JoyCon (Nintendo Switch) controllers + + + Switch Pro Device Support + + + Support for Switch Pro (Nintendo Switch) controllers + + + First Launch + + + Display Profile Switch via + + + Log + Notification + + + Notification + + + Light + + + DS4 Trigger Output Mode + + + Analog + + + Buttons + + + Default (Analog + Buttons) + + + Dead Zone + + + Max Zone + + + Anti-dead Zone + + + Axial + + + Axis Config + + + Controls + + + Cubic + + + DeadZone X + + + DeadZone Y + + + Dead Zone Type + + + Easeout Cubic + + + Easeout Quad + + + Enhanced Precision + + + Flick Stick + + + Linear + + + Max Output + + + Mouse Offset + + + Mouse Vertical Scale + + + Output Curve + + + Output Mode + + + Quadratic + + + Radial + + + Sensitivity + + + Six Axis (Accel) + + + Square Stick + + + Vertical Scale + + + Anti Snapback + + + Anti Snapback timing + + + Touchpad + + + Only works with ViGEmBus 1.17.333.0 and newer + + + Absolute Mouse + + + Absolute Mouse Options + + + Anti Radius + + + Abs Mouse + + + Abs Mouse Down + + + Abs Mouse Left + + + Abs Mouse Right + + + Abs Mouse Up + + + Change Light + + + Change Mouse Sensitivity + + + KB & Rel Mouse + + + Keyboard & Mouse + + + Macro On, Choose a key to disable, else close this window to save + + + Record A Macro + + + Select Shift Trigger + + + Confirm + + + Enable Home LED + + + Joined Gyro Provider + + + Link Mode + + + Mute LED Mode + + + Player LED Mode + + + Controller Type Options + + + Delta Acceleration + + + Directional Swipe + + + Easing Duration + + + Enabled + + + Enable Touchpad Toggle + + + Extra + + + Device Support + + + Flash Rate + + + Full Btn Pull + + + Fuzz + + + Controls (Accel) + + + Heavy + + + Height + + + Hip Fire Delay + + + ID + + + Idle Disconnect + + + Use language pack + + + Launch program with profile + + + Lightbar + + + Link Profile/ID + + + Abs Display Monitor + + + Enable Server + + + 1€ Beta + + + 1€ MinCutoff + + + Max Travel + + + Min Factor + + + Min Travel + + + Mode + + + Mouse + + + Mouse Acceleration + + + Mouse Joystick + + + Mouse Sensitivity + + + Multiplier + + + No + + + Normal + + + Other + + + Outer Bind + + + Outer Btn + + + Outer Btn Dead + + + Passthru + + + Port + + + Add Rumble + + + Change Lightbar Color + + + Double click on a wait to edit the time + + + 5th Mouse Button + + + 4th Mouse Button + + + Insert Wait + + + Load Preset + + + Macro Order + + + Play Once + + + Record Delays + + + Repeat While Held + + + Save Preset + + + Use Keyboard/Mouse + Controller 1 to record + + + Edit Macro + + + Regular + + + Please type the new name to use for the selected profile XML file. + + + Rename Profile + + + Rotation + + + Scan Code + + + Selected Profile + + + Shift Modifier + + + Skip Version + + + Snap To Center + + + Test + + + Test Heavy + + + Test Light + + + Toggle + + + Trigger Effect + + + Two Stage Mode + + + UDP Server + + + Unbound + + + Update Window + + + Use Controller + + + Use Smoothing + + + Width + + + X Center + + + Y Center + + + Yes + + + Active + + + Current + + + Intro + + + Input # + + + XInput # + + + Pitch + + + Output Controller + + + Preset Menu + + + Battery: 0% + + + Input Delay: N/A + + + SixAxis: X Axis is flipped so it is easier to read + + + Requested + + + Roll + + + Yaw + + + Appdata + + + Program Folder + + + For those who prefer a regular install. Settings saved at %appdata%\DS4Windows + + + Don't Delete the other settings yet + + + Multiple save locations detected + + + Pick where you want profiles and settings to be saved + + + For those who prefer a portable program. +Note: this option does not work if in an admin folder w/o UAC + + + Save Where + + + Bluetooth Settings + + + If this window reappears after installing, you may need to reboot your PC. + + + Step 1: Install ViGEmBus Driver + + + If you've used a 360 controller on this PC, you can skip this step. + + + Step 2: If on Windows 7, Install 360 Driver + + + Once flashing go to your Bluetooth Settings and connect to "Wireless Controller". If asked, enter pair code 0000. Once paired, you're ready. Have fun! + + + Step 3: Connecting the DualShock 4 controller. +To setup wired/USB: +Simply plug a micro-USB into your PC and DualShock 4. + +To setup Bluetooth (optional): Hold the PS Button and Share for 3 seconds. The lightbar will begin to double flash. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Use HidHide to configure and hide any input controllers from other apps running on your system. Some games require only one controller to be present or double input will cause problems in game. + + + (Optional) Step 4: Install HidHide Driver + + + Use FakerInput driver to expose system-wide virtual keyboard, relative mouse, and absolute mouse. Allows virtual KB+M events to be usable in some situations when SendInput fails. Such situations are elevated process and games, UAC prompts, and anti-cheat systems that block SendInput events. Use of FakerInput is necessary to allow DS4Windows to work with some games with anti-cheat protection like Valorant. + + + (Optional) Step 5: Install FakerInput Driver + + + Welcome to DS4Windows + + + Check Battery Life + + + Disconnect from Bluetooth + + + Double Tap Trigger + + + Hold for + + + Hold Trigger + + + Keep key state + + + Launch a program + + + Load a profile + + + Macro Recorded + + + Multi-action Button + + + pressing unload trigger + + + Press/Toggle key + + + Record a macro + + + releasing unload trigger + + + Repeat while held + + + Run on Trigger Release + + + -Select an Action- + + + Select a Key + + + Select a macro + + + Set Unload Trigger + + + Calibration of sixaxis wheel calibration + + + Synchronized Run + + + Tap Trigger + + + Unload on trigger release + + + Untoggle key by + + + via lightbar + + + via notification + + + Unload Trigger + + + .NET 8 Not Found + + + DS4Windows version 3.3 will require the installation of the .NET 8 Desktop Runtime on your system +[https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-{0}-installer) + +Please click OK to confirm that you have read the message. Press Cancel to be reminded again on the next application launch. + Can use Markdown syntax + + + OK + + + Custom + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.ru.resx b/DS4Windows/Translations/Strings.ru.resx new file mode 100644 index 0000000000..4734d5dcae --- /dev/null +++ b/DS4Windows/Translations/Strings.ru.resx @@ -0,0 +1,1296 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Ускорение + + + Действие + + + Добавить каталог + + + Добавить программы + + + Добавить программы меню Пуск + + + Добавить игры Steam + + + Все + + + Авто-Профили + + + Аккумулятор + + + Выбрать + + + Выбрать другие программы + + + Отмена + + + Проверка обновлений + + + Проверка обновлений DS4Windows при запуске + + + Очистить + + + Сворачивать при закрытии + + + Цвет + + + Контроллер 1 + + + Контроллер 2 + + + Контроллер 3 + + + Контроллер 4 + + + Контроллеры + + + Панель управления + + + Удалить + + + Настройка драйвера контроллера + + + Дублировать + + + Редактировать + + + Изменить действие + + + Экспорт + + + Полностью + + + Гироскоп + + + Скрыть невыбранные + + + Импорт + + + Левый стик + + + Журнал + + + Название + + + Новый + + + Новое действие + + + Новый профиль + + + Нет + + + Путь + + + Профиль + + + Папка профиля + + + Быстрая зарядка + + + Запись + + + Удалить + + + Удалить действие + + + Правый стик + + + Вибрация + + + Запускать при запуске системы + + + Сохранить + + + Сохранить + + + Настройки + + + Показать уведомления + + + Запускать свернутым + + + Старт + + + Статус + + + Стоп + + + Прокрутка + + + Скольжение + + + Касание + + + Триггер + + + Только предупреждения + + + сек + + + Авто-остановка в секундах (0=отключена) + + + Заголовок окна + + + Move Up + + + Move Down + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Тест геймпада + settings tab>utils + + + Применить + Profiles>Edit>Apply +(button) + + + Настраиваемое имя Exe + Settings tab +(string) + + + Некоторые игры встроили блок, который приводит к игнорированию ввода DS4, если игра обнаруживает, что в это время запущен DS4Windows.exe или InputMapper.exe. Обходной путь к блокировке - переименовать DS4Windows.exe, чтобы проверка в игре не прошла. Указание настраиваемого имени exe-файла позволяет DS4Updater автоматически обновлять настраиваемую копию DS4Windows до желаемого имени файла. Обязательно уберите расширение. + +Пример: whyme_DS4Windows + Settings tab +(help button) + + + Контроллер 5 + + + Контроллер 6 + + + Контроллер 7 + + + Контроллер 8 + + + Геймпад + preset name + + + Описание + Profiles tab>Select Preset + + + Вы хотите использовать предустановленный вариант? При выборе «Нет» редактор профиля будет использовать пустой профиль геймпада. + Profiles tab>Select Preset + + + Пресеты + Profiles tab>Select Preset + + + Журнал изменений + settings tab>utils + + + Закрыть + Changelog window +(button) + + + Профили + Main tab + + + Контроллеры не подключены (Максимум {0}) + Controllers tab +(if controllers are disabled) + + + Включить вывод данных в DS4 + Profiles tab>edit>Other + + + Периодически выводить данные световой панели и вибрации на геймпад DS4. Снимите флажок, если геймпад не поддерживает прием данных. +Изменения этого параметра вступают в силу во время подключения геймпада. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Проверка XInput + settings tab>utils + + + HidNinja + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + Description + + + Gamepad with Mouse-like Joystick + preset name + + + Maps the controller output to a standard gamepad + Description + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + Description + + + KB+M Controls with Gyro Mouse + preset name + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + Description + + + KB+M Controls + preset name + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + Description + + + Gamepad with Gyro Mouse + preset name + + + Maps the controller output to mixed XInput gamepad + RS mouse. + Description + + + Gamepad with High Precision Camera + preset name + + + Flick Threshold + Profiles tab>Edit>Axis Config>Flick Stick + + + Flick Time + Profiles tab>Edit>Axis Config>Flick Stick + + + Min Angle Threshold + Profiles tab>Edit>Axis Config>Flick Stick + + + Real World Calibration + Profiles tab>Edit>Axis Config>Flick Stick + + + Подключение устройства ViGEm не удалось. Вероятно, внутренняя проблема ViGEmBus. Закрытие соединения. Если проблема не устранена, закройте DS4Windows, а затем запустите приложение PurgeOldXInput из папки Tools. Также может потребоваться перезагрузка Windows. + + + Сбой проверки целостности данных для беспроводного устройства. Закрытие устройства. + + + Среда выполнения .NET 5 не была обнаружена в вашей системе. Пожалуйста, загрузите и установите среду выполнения .NET 5, чтобы обеспечить совместимость с будущими сборками DS4Windows. После закрытия этого окна вы будете перенаправлены на страницу загрузки среды выполнения .NET 5. + + + Пожалуйста, обновите среду выполнения .NET + + + HidHide + + + Клиент конфигурации HidHide + + + Эксклюзивный доступ + + + HidGuardian доступ + + + HidHide доступ + + + Общий доступ + + + Принять + + + Черная + + + Цветная + + + По умолчанию + + + Тип устройства + + + Отключать устройства от BT при остановке + + + Динамический + + + Мигать индикатором при высокой задержке + + + Скрыть DS4 Контроллер + + + Горячие клавиши/О программе + + + Выбор иконки + + + Сворачивать в панель задач + + + Сворачивать в панель задач вместо системного трея + + + Виртуальные Слоты + + + Постоянный + + + Подключить + + + Переименовать + + + Вернуть профиль по умолчанию на неизвестном + + + Показывать отладочные сообщения авто-профиля + + + Проведите по тачпаду, чтобы переключить профиль + + + Временно выключить DS4Windows + + + Отключить + + + Белая + + + Тема приложения + + + Проверять каждые + + + Поддержка контроллера DS4 + + + Поддержка контроллера DualSense + + + Поддержка контроллера JoyCon + + + Поддержка контроллера Switch Pro + + + Имитатор + + + Измените некоторые флаги, используемые для контроллера DS4, отличного от Sony. Это может исправить поддержку вибрации и световой панели для некоторых сторонних клонов DS4. + + + Темная + + + Дней + + + Обнаруженные контроллеры + + + Параметры устройства + + + Включить подробный журнал + + + Показывать дополнительные сообщения журнала при подключении геймпада + + + Часов + + + Программу + + + Запускать как + + + Задачу + + + Использовать кастомную папку Steam + + + Утилиты + + + Программа + + + Запустить как + + + Задача + + + Добавьте дополнительное регулирование на нижнем конце кривой, чтобы учесть тряску устройства. + + + Пробуждение от режима ожидания + + + Поддержка контроллера DS3 + + + Из-за того, что другие мапперы по умолчанию поддерживают использование нескольких типов устройств (Steam Input), DS4Windows по умолчанию активирует поддержку только для чтения с контроллеров DS4. Вы можете указать поддержку маппера для других поддерживаемых типов устройств здесь. Будьте осторожны при использовании DS4Windows с возможным одновременным запуском других мапперов. + + + Поддержка контроллера DS3 + + + Поддержка контроллеров DualShock 3 (PS3). Для этого необходимо использовать драйвер DsHidMini от проекта ViGEm (nefarius) + + + Поддержка контроллера DS4 + + + Поддержка известных контроллеров DualShock 4 + + + Поддержка контроллера DualSense + + + Поддержка контроллеров DualSense (PS5). Включает базовую модель и DS Edge + + + Включена поддержка маппера устройств + + + Поддержка контроллера JoyCon + + + Поддержка контроллеров JoyCon (Nintendo Switch) + + + Поддержка Switch Pro + + + Поддержка Switch Pro (Nintendo Switch) Контроллеров + + + Первый запуск + + + Показывать смену профиля через + + + Запись в журнал + Уведомление + + + Уведомление + + + Светлая + + + Режим вывода триггеров DS4 + + + Аналоговый + + + Кнопки + + + Стандартный (Аналоговый + Кнопки) + + + Мертвая зона + + + Максимальная зона + + + Анти-мертвая зона + + + Осевая + + + Настройка оси + + + Элементы управления + + + Cubic + + + Мертвая зона X + + + Мертвая зона Y + + + Тип мертвой зоны + + + Easeout Cubic + + + Easeout Quad + + + Повышенная точность + + + Флик стик + + + Линейный + + + Максимальный выход + + + Смещение мыши + + + Вертикальное увеличение мыши + + + Кривая + + + Режим + + + Quadratic + + + Radial + + + Чувствительность + + + Шесть осей (акселерометр) + + + Square Stick + + + Вертикальное увеличение + + + Анти-снэпбекSnapback + + + Временный анти-снэпбек + + + Тачпад + + + Работает только с ViGEmBus 1.17.333.0 и выше + + + Мышь с абсолютным указанием положения + + + Настройка мыши с абсолютным указанием положения + + + Анти-радиус + + + Мышь с абсолютным указанием положения + + + Мышь с абсолютным указанием положения вниз + + + Мышь с абсолютным указанием положения влево + + + Мышь с абсолютным указанием положения вправо + + + Мышь с абсолютным указанием положения вверх + + + Изменить цвет + + + Изменить чувствительность мыши + + + KB & Rel Mouse + + + Keyboard & Mouse + + + Макрос включен. Выберите клавишу для выключения, или закройте это окно для сохранения + + + Записать макрос + + + Выбрать Shift Trigger + + + Подтвердить + + + Включить Home светодиод + + + Присоединено устройство с гироскопом + + + Режим связи + + + Режим светодиода Mute + + + Режим светодиода игрока + + + Варианты типа контроллера + + + Дельта-ускорение + + + Направленный свайп + + + Уменьшение продолжительности + + + Выключено + + + Включить переключение тачпада + + + Дополнительно + + + Поддержка устройств + + + Скорость мигания + + + Полное нажатие + + + Fuzz + + + Управление (Ускорение) + + + Тяжесть + + + Высота + + + Задержка выстрела от бедра + + + ID + + + Отключение при бездействии + + + Язык программы + + + Запуск программы с профилем + + + Световая панель + + + Связать Профиль/ID + + + Монитор + + + Включить сервер + + + 1€ Beta + + + 1€ MinCutoff + + + Максимальная дистанция + + + Минимальный коэффициент + + + Минимальная дистанция + + + Режим + + + Мышь + + + Ускорение мыши + + + Джойстик-мышь + + + Чувствительность мыши + + + Множитель + + + Нет + + + Нормальный + + + Другой + + + Внешнее привязывание + + + Внешний Btn + + + Внешний Btn Dead + + + Передача + + + Порт + + + Добавить вибрацию + + + Изменить цвет подсветки + + + Дважды щелкните по ожиданию, чтобы отредактировать время + + + Пятая кнопка мыши + + + Четвертая кнопка мыши + + + Вставить задержку + + + Загрузить настройку + + + Макрос + + + Воспроизвести один раз + + + Записывать задержку + + + Повторять, пока удерживается + + + Сохранить настройку + + + Использовать клавиатуру/Мышь + Контроллер 1 для записи + + + Редактировать макрос + + + Обычный + + + Пожалуйста, введите новое имя для использования выбранного файла профиля XML. + + + Переименовать профиль + + + Поворот + + + Сканировать код + + + Выбранные профили + + + Модификатор Shift + + + Пропустить версию + + + Привязать к центру + + + Тест + + + Тест сильной + + + Тест легкой + + + Переключить + + + Эффект триггера + + + Двухступенчатый режим + + + UDP Сервер + + + Не назначенный + + + Обновить окно + + + Использовать Контроллер + + + Использовать сглаживание + + + Ширина + + + Центр X + + + Центр Y + + + Да + + + Активно + + + Текущий + + + Вступление + + + Input # + + + XInput # + + + Тон + + + Контроллер вывода + + + Меню настроек + + + Батарея: 0% + + + Задержка вывода: N/A + + + SixAxis: ось X перевернута, поэтому ее легче читать. + + + Запрошено + + + Крен + + + Рыскание + + + Appdata + + + Program Folder + + + Для тех, кто предпочитает обычную установку. Настройки сохраняются по пути %appdata%\DS4Windows + + + Не удаляйте другие настройки пока + + + Обнаружено несколько мест сохранения + + + Выберите, где вы хотите сохранять профили и настройки + + + Для тех, кто предпочитает портативную программу. Примечание: эта опция не работает, если программа находится в административной папке без нужных прав + + + Сохранить + + + Настройка Bluetooth + + + Если это окно появляется снова после установки, возможно, вам нужно перезагрузить свой компьютер. + + + Шаг 1: Установка ViGEmBus Driver + + + Если вы уже использовали контроллер Xbox 360 на этом компьютере, вы можете пропустить этот шаг. + + + Шаг 3: Если вы используете Windows 7, Установите 360 Driver + + + После мигания перейдите в настройки Bluetooth и подключитесь к "Wireless Controller". Если вас попросят, введите код для сопряжения 0000. После подключения вы готовы. Удачи! + + + Шаг 3: Подключите контроллер DualShock 4. +Для настройки по проводу/USB: +Просто подключите micro-USB в ваш компьютер и в DualShock 4. + +Для настройки по Bluetooth (дополнительно): Зажмите Кнопку PS и Share на 3 секунды. Световая полоса начнет мигать дважды. + + + Используйте HidHide для конфигурации и скрытия любых контроллеров ввода от других приложений, работающих на вашей системе. Некоторые игры требуют наличие только одного контроллера, и двойной ввод может вызвать проблемы в игре. + + + (Дополнительно) Шаг 4: Установите HidHide Driver + + + Используйте драйвер FakerInput для создания системной виртуальной клавиатуры, относительной мыши и абсолютной мыши. Позволяет использовать виртуальные события клавиатуры и мыши в некоторых ситуациях, когда SendInput не работает. Такие ситуации включают в себя повышенный процесс и игры, запросы контроля учетных записей пользователей, и системы античита, блокирующие события SendInput. Использование FakerInput необходимо для работы DS4Windows с некоторыми играми, защищенными системами античита, такими как Valorant. + + + (Дополнительно) Шаг 5: Установите FakerInput Driver + + + Добро пожаловать в DS4Windows + + + Проверить заряд батаери + + + Отсоединиться от Bluetooth + + + Двойное нажатие триггера + + + Удерживайте для + + + Удерживайте триггер + + + Сохранять состояние клавиши + + + Запуск программы + + + Загрузить профиль + + + Макрос записан + + + Мультизадачная кнопка + + + Нажатие триггера выгрузки + + + Нажать/Переключить клавишу + + + Записать макрос + + + отпускание триггера выгрузки + + + Повторять удерживая + + + Запустить при отпускании триггера + + + -Выбрать действие- + + + Выбрать клавишу + + + Выбрать макрос + + + Установить триггер выгрузки + + + Калибровка шестиосного колеса + + + Синхронный запуск + + + Нажмите на Триггер + + + Разгрузка при отпускании спускового крючка + + + Отключить клавишу с помощью + + + через световую панель + + + через уведомление + + + Выгрузить триггер + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.se.resx b/DS4Windows/Translations/Strings.se.resx new file mode 100644 index 0000000000..d204f17963 --- /dev/null +++ b/DS4Windows/Translations/Strings.se.resx @@ -0,0 +1,547 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Accelerera + + + Verka + + + Lägg till direktiv + + + Lägg till program + + + Lägg till start-meny program + + + Lägg till Steam spel + + + Alla + + + Auto Profiler + + + Batteri + + + Bläddra + + + Browse efter andra program + + + Avbryt + + + Sök efter uppdateringar nu + + + Sök efter uppdateringar när DS4Windows startar + + + Rensa + + + Stäng minimerar + + + Färg + + + Kontroll 1 + + + Kontroll 2 + + + Kontroll 3 + + + Kontroll 4 + + + Kontrollrar + + + Kontrollpanelen + + + Radera + + + Kontroll/Drivrutin Setup + + + Dupplicera + + + Redigera + + + Redigera åtgärd + + + Exportera + + + Hela + + + Gyro + + + Göm omarkerade + + + Importera + + + Vänster spak + + + Logga + + + Namn + + + Ny + + + Ny åtgärd + + + Ny profil + + + Ingen + + + Sökväg + + + Profil + + + Profile Mapp + + + Snabbladdning + + + Spela in + + + Radera + + + Radera åtgärd + + + Höger spak + + + Buller + + + Kör vid start + + + Spara + + + Spara + + + Inställningar + + + Visa Notiser + + + Starta minimerad + + + Start + + + Status + + + Stop + + + Skrolla + + + Dra + + + Tryck + + + Avtryckare + + + Endast varningar + + + sek + + + Stoppa automatiskt i sekunder (0=ingen autostop) + + + Fönsternamn + + + Gå upp + + + Gå ner + + + Processväg. ^ABC = Matcha i början av strängen (^) | ABC$ = Matcha i slutet av strängen ($) | *ABC =Innehåller en sträng (*) + + + Fönsternamn. ^ABC = Matcha i början av strängen (^) | ABC$ = Matcha i slutet av strängen ($) | *ABC =Innehåller en sträng (*) + + + Gamepad Test + + + Aktivera utdata till DS4 + + + Mata ut lightbar och rumble data med jämna mellanrum till DS4 gamepad. Avmarkera om spelplattan inte stöder datamottagning. +Ändringar av det här alternativet träder i kraft vid anslutningstiden för gamepaden. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Applicera + + + GömdNinja + + + Anpassat Exe-namn + + + Vissa spel implementerar ett block som gör att DS4-ingång ignoreras om ett spel upptäcker att antingen DS4Windows.exe eller InputMapper.exe körs vid tillfället. En lösning på blocket är att byta namn på DS4Windows.exe så att kontrollen i spelet misslyckas. Genom att ange ett anpassat exe-namn här kan DS4Updater automatiskt uppdatera en anpassad kopia av DS4Windows till önskat filnamn. Se till att utelämna tillägget. + +Exempel: whyme_DS4Windows + + + XInputKontrollerare + + + Kontroll 5 + + + Kontroll 6 + + + Kontroll 7 + + + Kontroll 8 + + + Mappar kontrollutgången till en standard XInput-gamepad eller DS4-pad. Gyro är mappad till en musliknande joystick. + + + Gamepad med musliknande joystick + + + Mappar handkontrollens utdata till en vanlig gamepad + + + Gamepad + + + Mappar styrenhetens utdata till virtuella TB+M-kontroller. Användbar för att spela FPS-spel utan stöd för gamepad. Gyro är mappad till en virtuell mus. + + + TB+M-kontroller med gyromus + + + Mappar styrenhetens utdata till virtuella TB+M-kontroller. Användbar för att spela FPS-spel utan stöd för gamepad. + + + TB+M-kontroller + + + Mappar knapparna och axlarna till en vanlig gamepad. Mappar Gyro till en virtuell mus + + + Gamepad med Gyro Mouse + + + Mappar styrenhetens utdata till blandad XInput gamepad + RS-mus. + + + Gamepad med högprecisionskamera + + + Beskrivning + + + Vill du använda ett förinställt alternativ? Om du väljer Nej kommer profilredigeraren att använda en tom Gamepad-profil. + + + Förinställningar + + + Ändringslogg + + + Stäng + + + Profiler + + + Inga anslutna kontroller (Max {0}) + + + Snärtströskel + + + Snärttid + + + Min vinkeltröskel + + + Riktiga världen Kalibrering + + + ViGEm Device Plugin misslyckades. Troligtvis ett internt ViGEmBus-problem. Stängande anslutning. Om problemet kvarstår, stäng DS4Windows och starta sedan om Windows. + + + Dataintegritetskontroller misslyckades för trådlös enhet. Stängningsanordning. + + + .NET 5 Runtime upptäcktes inte på ditt system. Ladda ner och installera .NET 5 Runtime för att säkerställa kompatibilitet med framtida DS4Windows-versioner. Du kommer att omdirigeras till nedladdningssidan för .NET 5 Runtime när du stänger det här fönstret. + + + Vänligen uppdatera .NET Runtime + + + HidHide + + + HidHide konfigurationsklient + + + Exklusiv tillgång + + + HidGuardian Access + + + HidHide Access + + + Delad åtkomst + + + Döp om + + + Inaktivera virtuell kontroller + + + Skapa/associera inte virtuella kontroller för anslutna kontroller som använder den här profilen (Gäller vid profilsparning) + + + Emulerad Kontroll + + + Välj typ av virtuell utdatakontroller (Gäller vid profilsparning) + + + Inställningar för virtuell kontroll + + + Ändringar träder i kraft vid ny enhetsanslutning + + + Fuzz specificerar det minsta antalet enheter som den analoga spaken flyttar, i aktiv zon, innan utgången registreras som ändrad i mapparen. Denna inställning kan vara användbar för slitna spakar som inte kan bibehålla en konstant position. Värdet uttrycks i råspakenheter. + + + Genomför alltid inställningen för maxeffekt. Användbar för 100 % Max Output och begränsar värdet till ett cirkulärt outputvärde + + + I vissa situationer kan det vara användbart att begränsa det maximala värdet som matas ut av den analoga utgångsspaken. Max Output tillåter strypning av det slutliga utgångsvärdet för den analoga spaken. + + + En anti-dödzon fungerar som en offset för användning med en axel för att beteckna det lägsta utgångsvärdet som genereras efter att en axel har lämnat sin tilldelade dödzon. Detta är främst tänkt att hjälpa till med att kartlägga en axel till det tilldelade dödzonsvärdet som används för en axel i ett videospel. Till exempel är den typiska tilldelade dödzonen för XInput LS i ett videospel runt 8000 (25%). Utan någon anti-dödzon tilldelad skulle en axel behöva flytta förbi den tilldelade dödzonen i DS4Windows tillsammans med spelets tilldelade dödzon. + + + GAMMAL FÖRALDAD INSTÄLLNING. Försök att tillämpa en kurva baserad på råa indatakoordinater innan någon dödzonsinformation tillämpas. Ostadig + + + Minsta beräknade uteffekt innan en mushändelse skickas till systemet + + + Justerar en pekplattas svepning med en given rotationsvinkel. Användbart när en vanlig pekplatta inte är en rak linje över. Värden tillåter intervall från -180 till 180. Standard är 0. + + + Känslighet används för att aktivera en multi-touch mushjulsrullning + + + Aktivera musen Vänsterklicka med en pekplatta. Max tidsintervall är satt till (värde * 2) ms. + + + Lägger fart på ett pekplattasvep när ett finger lyfts. Lägger till extra muspekarrörelse än vad som skulle vara möjligt med det begränsade utrymmet på pekplattan + + + Lägg till friktion till virtuell styrkula. Minskad friktion ökar den slutliga muspekarens restid + + + Tröskel för när en åtgärd kommer att utlösas + + + Ha yttre bindeld innan du når en tröskel. Åtgärden släpps när tröskeln har överskridits + + + Åtgärd som ska utföras när pinnrörelse når förbi en tröskel. Användbar för att kartlägga nycklar för Walk- eller Sprint-åtgärder. Invert får handlingen att skjuta upp till tröskeln + + + Fuzz specificerar det minsta antalet enhetsenheter, i aktiv zon, som Accel måste roteras innan utgången registreras som ändrad i mapparen. Värdet uttrycks i råa Accel-enheter. + + + Rotationsinställningen är avsedd att hjälpa till att korrigera orienteringen av en analog sticka om din tumme förskjuts något när du flyttar en analog sticka. Till exempel kan din tumme vara något förskjuten från mitten när den analoga spaken förs helt norrut. Mina tummar förskjuts något åt ​​höger när jag flyttar en analog sticka helt norrut på grund av hur mina händer greppar DS4. Värdet som används anger antalet grader som används för att justera det slutliga axelutgångsvärdet. Värden tillåter intervall från -180 till 180. Standard är 0. + + + Gasreglaget på den nedre delen av pekplattans rörelse. Minskar oavsiktlig muspekarrörelse när du håller en mestadels fast position på pekplattan + + + DS4 BT undersökningsfrekvens + + + Feature currently disabled in app due to driver issues. Hopefully issues get fixed in a future update. + + diff --git a/DS4Windows/Translations/Strings.tr.resx b/DS4Windows/Translations/Strings.tr.resx new file mode 100644 index 0000000000..6519154fc9 --- /dev/null +++ b/DS4Windows/Translations/Strings.tr.resx @@ -0,0 +1,811 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Hızlanma + + + Aksiyon + + + Dizin Ekle + + + Program Ekle + + + Başlat Menüsü Programı Ekle + + + Steam Oyunu Ekle + + + Tümü + + + Otomatik Profiller + + + Pil + + + Gözat + + + Diğer Programlara Gözat + + + Vazgeç + + + Güncellemeleri Kontrol Et + + + DS4Windows Açıldığında Güncellemeleri Kontrol Et + + + Temizle + + + Kapatırken Küçült + + + Renk + + + Denetleyici 1 + + + Denetleyici 2 + + + Denetleyici 3 + + + Denetleyici 4 + + + Denetleyiciler + + + Kontrol Paneli + + + Sil + + + Denetleyici/Sürücü Kurulumu + + + Çoğalt + + + Düzenle + + + Aksiyon Düzenle + + + Dışarı Aktar + + + Dolu + + + Jiroskop + + + İşaretlenmemişleri Gizle + + + İçeri Aktar + + + Sol Çubuk + + + Günlük + + + İsim + + + Yeni + + + Yeni Aksiyon + + + Yeni Profil + + + Yok + + + Yol + + + Profil + + + Profil Klasörü + + + Hızlı Şarj + + + Kayıt + + + Kaldır + + + Aksiyonu Kaldır + + + Sağ Çubuk + + + Titreşim + + + Başlangıçta Çalıştır + + + Kaydet + + + Kaydet + + + Ayarlar + + + Bildirimleri Göster + + + Küçültülmüş Olarak Başlat + + + Başlangıç + + + Durum + + + Dur + + + Kaydırma + + + Kaydırma + + + Dokunma + + + Tetik + + + Sadece uyarılar + + + saniye + + + Titreşimi saniyeler içinde otomatik durdur (0=otomatik durdurma devre dışı) + + + Pencere Başlığı + + + Yukarı Oynat + + + Aşağı Oynat + + + İşlem yolu. ^ABC = Dizinin başında eşleşme (^) | ABC$ = Dizinin sonunda eşleşme ($) | *ABC =Dizi içeriyor (*) + + + Pencere başlığı. ^ABC = Dizinin başında eşleşme (^) | ABC$ = Dizinin sonunda eşleşme ($) | *ABC =Dizi içeriyor (*) + + + Oyun Kumandası Testi + + + DS4 İçin Veri Çıkışını Etkinleştir + + + Işık barı ve titreşim verisini periyodik olarak DS4 oyun kumandasına ilet. Oyun kumandası veri almayı desteklemiyorsa tiki kaldırın. +Bu seçenekteki değişiklikler denetleyici bağlandığında geçerli olur. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Uygula + + + HidNinja + + + Özel Exe Adı + + + Bazı oyunlar, DS4Windows.exe veya InputMapper.exe'nin çalıştığını algıladıklarında DS4 girdisini yok sayar. DS4Windows.exe'yi yeniden adlandırarak oyunun yaptığı engelleme aşılabilir. Özel bir exe adı belirlemek DS4Updater'ın DS4Windows'un istenen isimli özel bir kopyasını güncellemesini sağlar. Uzantıyı atladığınızdan emin olun. + +Örnek: whyme_DS4Windows + + + XInput Testi + + + Denetleyici 5 + + + Denetleyici 6 + + + Denetleyici 7 + + + Denetleyici 8 + + + Denetleyici çıktısını standart XInput oyun kumandası veya DS4 kumandasına eşler. Jiroskop, Mouse Şeklinde Oyun Çubuğu ile eşlenmiştir. + + + Mouse Şeklinde Oyun Çubuk'lu Oyun Kumandası + + + Denetleyici çıktısını standart oyun kumandasına eşler + + + Oyun kumandası + + + Denetleyici çıktısını sanal Klavye+Mouse kontrollerine eşler. Oyun kumandası desteği olmayan FPS oyunlarını oynarken kullanışlıdır. Jiroskop sanal Mouse ile eşlenmiştir. + + + Jiroskop Mouse'lı Klavye+Mouse Kontrolleri + + + Denetleyici çıktısını sanal Klavye+Mouse kontrollerine eşler. Oyun kumandası desteği olmayan FPS oyunlarını oynarken kullanışlıdır. + + + Klavye+Mouse Kontrolleri + + + Buton ve eksenleri standart oyun kumandasına eşler. Jiroskop'u sanal mouse'a eşler. + + + Jiroskop Mouse'lı Oyun Kumandası + + + Denetleyici çıktısını birleştirilmiş XInput oyun kumandası + Sağ Çubuk mouse ile eşler. + + + Yüksek Hassasiyet Kamera'lı Oyun Kumandası + + + Açıklama + + + Ön ayar kullanmak istiyor musunuz? Hayırı seçmek Profil Düzenleyicisinin boş bir Oyun Kumandası profili kullanmasını sağlar. + + + Ön Ayarlar + + + Değişim Günlüğü + + + Kapat + + + Profiller + + + Bağlı Denetleyici Yok (En fazla {0}) + + + Titreme Eşiği + + + Titreme Zamanı + + + Minimum Açı Eşiği + + + Gerçek Dünya Kalibrasyonu + + + ViGEm Cihaz Eklentisi Başarısız Oldu. Hata Kodu {0}. Muhtemelen dahili ViGEmBus sorunu. Bağlantı kapatılıyor. Eğer sorun devam ediyorsa, lütfen DS4Windows'u kapatın ve Windows'u yeninden başlatın. + + + Kablosuz cihaz için Veri bütünlüğü kontrolleri başarısız oldu. Cihaz Kapatılıyor. + + + Sisteminizde .NET 5 Runtime tespit edilemedi. Gelecek DS4Windows derlemeleri ile uyum sağlamak için lütfen .NET 5 Runtime indirin ve yükleyin. Bu pencereyi kapattıktan sonra .NET 5 Runtime indirme sayfasına yönlendireleceksiniz. + + + Lütfen .NET Runtime'ı güncelleyin + + + HidHide + + + HidHide Yapılandırma İstemcisi + + + Özel Erişim + + + HidGuardian Erişimi + + + HidHide Erişimi + + + Paylaşılmış Erişim + + + Yeniden Adlandır + + + Sanal denetleyiciyi devre dışı bırak + + + Bu profili kullanarak bağlı denetleyiciler için sanal denetleyici oluşturma/ilişkilendirme (Profil kaydedildiğince uygulanır) + + + Emule Edilmiş Denetleyici + + + Sanal denetleyici çıktısının tipini belirleyin (Profil kaydedildiğince uygulanır) + + + Sanal Denetleyici Ayarları + + + Değişiklikler yeni cihaz bağlandığında geçerli olur + + + Fuzz, analog çubuk hareketinin en düşük birimi sayısını belirler, aktif bölgede, çıktı eşleyicide değiştirildiği şekilde kaydedilmeden önce. Bu ayar sabit bir posizyon koruyamayan eskimiş çubuklar için kullanışlı olabilir. Değer, ham çubuk biriminde ifade edilmiştir. + + + Her zaman maksimum çıktı ayarını tercih etmeye zorla. Dairesel çıktı değeri için 100% Maksimum Çıktı ve kısıtlama değerinde kullanışlıdır. + + + Bazı durumlarda, analog çubuk çıktısının maksimum çıktı değerini limitlemek kullanışlı olabilir. Maksimum Çıktı analog çubuğun final çıktı değerini kısıtlayabilmeyi sağlar. + + + Anti-ölü bölge, bir ekseni kullanırken, o eksinin atanmış ölü bölgesini aştıktan sonra üretilen minimum çıkış değerini ayarlamak için kullanılır. Bu özellik, bir ekseni bir video oyunundaki atanmış ölü bölge değeri ile daha iyi eşleştirmeye yardımcı olmak amacıyla tasarlanmıştır. Örneğin, bir video oyununda XInput LS (Sol Joystick) için tipik atanmış ölü bölge değeri yaklaşık 8000 (yüzde 25) olabilir. Bir anti-ölü bölge atanmamışsa, bir eksinin DS4Windows ile atanmış ölü bölgenin yanı sıra oyunun atanmış eksil ölü bölgesini geçmesi gerekir. + + + ESKİ VE KULLANILMAYAN AYAR. Ölü bölge bilgisi uygulanmadan önce ham giriş koordinatlarına dayalı bir eğri uygulama girişimidir. Karmaşıktır. + + + Sisteme bir Mouse olayı gönderilmeden önce hesaplanan minimum çıktı hareketi. + + + Belirtilen dönüş açısına göre bir dokunmatik ped kaydırmasını ayarlar. Normal bir dokunmatik ped kaydırması düz bir çizgi olmadığında kullanışlıdır. Değerler -180 ila 180 arasında olabilir. Varsayılan değer 0'dır. + + + Çoklu dokunma Mouse Tekerleği Kaydırma eylemini etkinleştirmek için kullanılan hassasiyet. + + + Dokunmatik pede dokunarak Mouse Sol Tıklamasını etkinleştir. Maksimum zaman aralığı (değer * 2) ms şeklinde ayarlanır. + + + Dokunmatik ped kaydırması sırasında bir parmak kaldırıldığında kaydırmaya hız kazandırır. Dokunmatik pedde sınırlı alanda mümkün olmayan ek mouse imleci hareketini mümkün kılar. + + + Trackball'a sürtünme ekler. Azalan sürtünme son mouse imleci hareket süresini artırır. + + + Bir eylemin gerçekleşeceği eşik değeri + + + Eşik değerine ulaşmadan önce dış bağlantının tetiklenmesini sağlar. Eylem, eşik değeri aşıldığında serbest bırakılır + + + Oyun Çubuğu hareketi belirli bir eşiği aştığında gerçekleştirilecek eylem. Yürüme veya Koşma gibi tuşları atamak için kullanışlıdır. Tersine çevirme, eylemin eşik değerine kadar tetiklenmesine neden olur. + + + Fuzz, en düşük cihaz birimi sayısını belirler, aktif bölgede, Hızlanma, çıktı değiştirilmiş olarak kaydedilmeden önce çevirilmelidir. Değer, ham Hızlanma biriminde ifade edilmiştir. + + + + = Saat yönünde. - = Saat yönünün tersinde. + +Döndürme ayarı, analog bir çubuğu hareket ettirirken parmağınız hafifçe kaymışsa çubuğun yönlendirmesini düzeltmeye yardımcı olmak amacıyla kullanılır. Örneğin, analog çubuk tamamen kuzeye hareket ettiğinde parmağınız merkezden hafifçe kaymış olabilir. DS4'ü tutma şeklim nedeniyle, analog çubuğu tamamen kuzeye hareket ettirirken parmaklarım hafifçe sağa kayar. Kullanılan değer, son eksen çıkış değerini ayarlamak için kullanılan derece sayısını belirtir. Değerler -180 ila 180 arasında olabilir. Varsayılan değer 0'dır. + + + Dokunmatik ped hareketinin düşük ucunu limitler. Dokunmatik pedi çoğunlukla sabit bir posizyonda tutarken yanlışlıkla oluşan mouse imleci hareketlerini azaltır + + + DS4 BT Aktarım Oranı + + + Driver problemleri yüzünden özellik devre dışı bırakılmıştır. Umarız gelecek bir güncellemede problem çözülür. + + + Her iki % güç seviyelerinin kullanımını zorla (Genel ve DualSense özelinde) + + + Devre Dışı + + + Doğruluk + + + Geleneksel Mod + + + Titreşim modu ve güç seviyesi: + + + Doğrudan Aktarım + + + DualSense özelinde titreşim ayarları + + + DEVRE DIŞI bırakılması tavsiye edilir. + +- Devre Dışı: Titreşim, denetleyici tarafından tanımlanan güç seviyesine göre yerel olarak yeniden ölçeklendirilecektir (daha iyi kalite) + +- Etkin: Hem DS4Windows genel titreşim yeniden ölçekleme hem de DualSense'in yerel kontrolü etkin olacaktır + + + Doğru Mod (tavsiye edilir): +- DualShock 4 / Xbox 360 denetleyici titreşim hissini daha iyi taklit eder +- Oyunun amaçladığı titreşim efektlerini daha kesin olarak gerçekleştirir +- Titreşim daha fazla derinliğe sahiptir. Aynı güç seviyesi içinde, gerçek düşükten başlayarak tanımlanan güç seviyesinin maksimum gücüne kadar değişen, +oyun içi titreşim etkinleştirmesinde minimum ve maksimum arasında daha büyük bir fark bulunur + +Geleneksel Mod: +- Genel olarak daha güçlüdür, ancak derinlik eksikliği vardır +- Daha "keskin" bir hissiyatı vardır +- Oyun içinde minimum ve maksimum etkinleştirme sırasıyla sadece seçilen güç seviyesi gücünün hafif altında ve hafif üstünde olacaktır + +Devre Dışı: +- Titreşimi tamamen devre dışı bırakır + + + DualSense'in yerel titreşim Güç Seviyesi ölçekleyicisi. + +- Doğru Mod'da, titreşimin [ min // max ] değeri [ 1% /// Seçilen Güç Seviyesi ] olacaktır + - Örnek (62%): [ min = 1% /// max = 62% ] + +- Geleneksel Mod'da, titreşimin [ min /// max ] değeri yaklaşık olarak [ Güç Seviyesi - 12% /// Güç Seviyesi + 12% ] olacaktır + - Örnek (62%): [ min = 50% /// max = 74% ] + + + Kabul Et + + + Siyah + + + Renkli + + + Varsayılan + + + Cihaz türü + + + Durdururken BT bağlantısını kes + + + Dinamik + + + Yüksek Gecikmede Işık Barını Aç Kapat + + + DS4 Denetleyicisini Gizle + + + Kısayollar/Hakkında + + + Simge Seçimi + + + Görev Çubuğuna Küçült + + + Sistem Tepsisi yerine Görev Çubuğuna Küçült + + + Çıktı Yuvaları + + + Kalıcı + + + Tak + + + Bilinmeyende varsayılan profile geri dön + + + Otomatik-profil hata ayıklama mesajlarını göster + + + Profil Değiştirmek için Dokunmatik Pedi Kaydır + + + DS4Windows'u Geçici Olarak Kapat + + + Sök + + + Beyaz + + + Uygulama Teması + + + Her birini kontrol et + + + Harici OSC Kontrolü & Monitoring + + + Kontrol Sunucusunu Etkinleştir + + + İzleme Mesajlarını Yürüt + + + İzleme Servisini Etkinleştir + + + DS4 Denetleyici Desteği + + + DualSense Denetleyici Desteği + + + JoyCon Denetleyici Desteği + + + Switch Pro Denetleyici Desteği + + + Taklitçi + + + Sony olmayan bir DS4 denetleyicisi için kullanılan bazı bayrakları değiştirin. Bu, bazı üçüncü taraf DS4 kopyaları için titreşim ve ışık çubuğu desteğini düzeltebilir. + + + Karanlık + + + Gün + + + Tanımlanan Denetleyiciler + + + Cihaz Ayarları + + + Ayrıntılı günlüğü etkinleştir + + + Bir oyun kumandası bağlandığında ek günlük mesajlarını göster + + + Saat + + + Özel Steam Klasörü Kullan + + + Araçlar + + + Program + + + Olarak Çalıştır + + + Görev + + + Cihazın sarsılmasını hesaba katmak için eğrinin düşük ucunda ek bir kontrol ekleyin. + + + Uykudan Uyanma + + + DS3 Denetleyici Desteği + + + Diğer eşleyicilerin (örneğin Steam Input gibi) varsayılan olarak birden fazla cihaz türünü desteklemesinden dolayı, DS4Windows yalnızca varsayılan olarak DS4 denetleyicilerinden okuma desteği sağlar. Diğer desteklenen cihaz türleri için burada eşleyici desteğini belirtebilirsiniz. DS4Windows'ı aynı anda çalıştıran diğer olası eşleyicileri kullanırken dikkatli olun. + + + DS3 Cihaz Desteği + + + DualShock 3 (PS3) denetleyicileri için destek. ViGEm projesinin (nefarius) DsHidMini sürücüsünün kullanılmasını gerektirir. + + + DS4 Cihaz Desteği + + + Bilinen DualShock 4 denetleyicileri için destek. + + + DualSense Cihaz Desteği + + + DualSense (PS5) denetleyicileri için destek. Temel model ve DS Edge + + + Etkinleştirilen Cihazlar Eşleyici Desteği + + + JoyCon Cihaz Desteği + + + JoyCon (Nintendo Switch) denetleyicileri için destek. + + + Switch Pro Cihaz Desteği + + + Switch Pro (Nintendo Switch) denetleyicileri için destek. + + + İlk Çalıştırma + + + Profil Değişimini Şununla Göster: + + + Günlük + Bildirim + + + Bildirim + + + Aydınlık + + + DS4 Tetik Çıktı Modu + + + Analog + + + Butonlar + + + Varsayılan (Analog + Butonlar) + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.uk-UA.resx b/DS4Windows/Translations/Strings.uk-UA.resx new file mode 100644 index 0000000000..123f9242c4 --- /dev/null +++ b/DS4Windows/Translations/Strings.uk-UA.resx @@ -0,0 +1,439 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Прискорення + + + Дія + + + Додати каталог + + + Додати програму + + + Додати програми через меню Пуск + + + Додати ігри Steam + + + Всі + + + Авто-профілі + + + Акумулятор + + + Вибрати + + + Вибрати інші програми + + + Скасувати + + + Перевірка оновлень + + + Перевірка оновлень DS4Windows при запуску + + + Очистити + + + Згортати при закриванні + + + Колір + + + Контроллер 1 + + + Контроллер 2 + + + Контроллер 3 + + + Контроллер 4 + + + Контроллери + + + Панель управління + + + Видалити + + + Налаштування драйвера контроллера + + + Дублювати + + + Редагувати + + + Змінити дію + + + Експорт + + + Повністю + + + Гіроскоп + + + Приховати не обрані + + + Імпорт + + + Лівий стік + + + Журнал + + + Назва + + + Новий + + + Нова дія + + + Новий профіль + + + Ні + + + Шлях + + + Профіль + + + Папка профілю + + + Швидка зарядка + + + Запис + + + Видалити + + + Видалити дію + + + Правий стік + + + Вібрація + + + Запускати при старті системи + + + Зберегти + + + Зберегти + + + Налаштування + + + Показати сповіщення + + + Запускати згорнутим + + + Старт + + + Статус + + + Стоп + + + Прокрутка + + + Ковзання + + + Дотик + + + Тріггер + + + Тільки попередження + + + сек + + + Автозупинка в секундах (0=відключена) + + + Window Title + + + Move Up + + + Move Down + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Gamepad Test + + + Enable Output data to DS4 + + + Output lightbar and rumble data periodically to DS4 gamepad. Untick if the gamepad doesn't support data receiving. +Changes to this option takes effect at the gamepad connection time. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Apply + + + HidNinja + + + Custom Exe Name + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Controller 5 + + + Controller 6 + + + Controller 7 + + + Controller 8 + + + Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + Gamepad with Mouse-like Joystick + + + Maps the controller output to a standard gamepad + + + Gamepad + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + KB+M Controls with Gyro Mouse + + + Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + KB+M Controls + + + Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + Gamepad with Gyro Mouse + + + Maps the controller output to mixed XInput gamepad + RS mouse. + + + Gamepad with High Precision Camera + + + Description + + + Do you want to use a preset option? Choosing No will cause the Profile Editor to use an empty Gamepad profile. + + + Presets + + + Changelog + + + Close + + + Profiles + + + No Controllers Connected (Max {0}) + + + Flick Threshold + + + Flick Time + + + Min Angle Threshold + + + Real World Calibration + + diff --git a/DS4Windows/Translations/Strings.vi.resx b/DS4Windows/Translations/Strings.vi.resx new file mode 100644 index 0000000000..ae09b89e3e --- /dev/null +++ b/DS4Windows/Translations/Strings.vi.resx @@ -0,0 +1,748 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + Tăng tốc + + + Hành động + + + Thêm thư mục + + + Thêm chương trình + + + Thêm chương trình menu bắt đầu + + + Thêm Game Steam + + + Tất cả + + + Tự chọn thiết lập + + + Dung lượng + + + Truy cập + + + Tìm ứng dụng khác + + + Hủy + + + Kiểm tra phiên bản mới ngay + + + Kiểm tra cập nhật mỗi khi khởi động + + + Dọn + + + Ẩn + + + Màu + + + Tay cầm 1 + + + Tay cầm 2 + + + Tay cầm 3 + + + Tay cầm 4 + + + Tay cầm + + + Bảng điều khiển + + + Xóa + + + Controller/Driver Setup + + + Tạo bản sao + + + Sửa + + + Sửa hành động + + + Xuất tệp + + + Đầy + + + Gyro + + + Ẩn tích + + + Nhập tệp + + + Cần Trái + + + Nhật ký + + + Tên + + + Tạo mới + + + Hành động mới + + + Thiết lập mới + + + None + + + Path + + + Thiếp Lập + + + Thư mục thiếp lập + + + Sạc nhanh + + + Record + + + Bỏ + + + Bỏ hành động + + + Cần Phải + + + Rung + + + Mở khi khởi động + + + Lưu + + + Lưu + + + Cài đặt + + + Hiện thông báo + + + Khởi động ngầm + + + Bật + + + Trạng thái + + + Tắt + + + Cuộn + + + Vuốt + + + Chạm + + + + + + Chỉ cảnh báo + + + sec + + + Tự tắt rung trong (0=auto stop disabled) + + + Tiêu đề + + + Di chuyển lên + + + Di chuyển xuống + + + Process path. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Window title. ^ABC = Match at the beginning of string (^) | ABC$ = Match at the end of string ($) | *ABC =Contains a string (*) + + + Test Tay Cầm + + + Bật truyền dữ liệu tới DS4 + + + Chỉnh màu và bật tắt rung . Bỏ chọn nếu tay cầm không hỗ trợ. +Changes to this option takes effect at the gamepad connection time. + To enter a line break into a string resource value in VisualStudio resource editor press Shift+Enter. + + + Áp dụng + + + HidNinja + + + Custom Exe Name + + + Some games implement a block that causes DS4 input to be ignored if a game detects either DS4Windows.exe or InputMapper.exe running at the time. A workaround to the block is to rename DS4Windows.exe so the check in the game fails. Specifying a custom exe name here allows DS4Updater to automatically update a custom copy of DS4Windows to the desired file name. Make sure to omit the extension. + +Example: whyme_DS4Windows + + + XInputChecker + + + Tay cầm 5 + + + Tay cầm 6 + + + Tay cầm 7 + + + Tay cầm 8 + + + Giả lập tay cầm như một tay xbox hoặc Tay DS4. Gyro được gán như một con chuột. + + + Tay cầm với cần điều khiển như chuột + + + Giả lập tay cầm như một tay cầm mặc định + + + Tay cầm + + + Giả lập tay cầm như chuột + bàn phím ảo. Sử dụng với những game không hỗ trợ tay cầm. Gyro được giả lập thành chuột ảo. + + + Giả lập bàn phím + chuột với Gyro Mouse + + + Giả lập tay cầm như chuột + bàn phím ảo. Sử dụng với những game không hỗ trợ tay cầm. + + + Bàn phím + chuột Controls + + + Giả lập phím và trục như tay cầm. Giả Gyro thành chuột ảo + + + Tay cầm với Gyro Mouse + + + Giả lập thành một tay cầm với cần analog phải là chuột. + + + Tay cầm có cảm biến camera + + + Miêu Tả + + + Bạn có muốn sử dụng thiết lập có sẳn? Chọn không sẽ sử dụng thiếp lập mặc định. + + + Thiết lập + + + Nhật ký + + + Đóng + + + Thiết lập + + + Không có biết bị được kết nối (Max {0}) + + + Flick Vùng + + + Flick Thời gian + + + Góc tối thiểu vùng + + + Real World Calibration + + + Trình cắm thiết bị ViGEm thất bại. Có khả năng là sự cố ViGEmBus nội bộ. Đóng kết nối. Nếu sự cố vẫn tiếp diễn, hãy tắt DS4Windows và khởi động lại. + + + Kiểm tra dữ liệu không thành công cho thiết bị không dây. thiết bị đóng + + + Phát hiện hệ thống chưa cài NET 5 Runtime. Hãy tải và cài đặt .NET 5 Runtime để tương thích với phiên bản mới. bạn sẽ được đưa đến trang tải .NET 5 Runtime sau khi đóng cửa sổ này. + + + Vui lòng cập nhật .NET Runtime + + + HidHide + + + HidHide Configuration Client + + + Exclusive Access + + + HidGuardian Access + + + HidHide Access + + + Shared Access + + + Đổi tên + + + Tắt giả lập tay cầm + + + Do not spawn/associate virtual controllers for connected controllers using this profile (Applies on profile save) + + + Giả lập tay cầm + + + Chọn giả lập tay cầm nào (Áp dụng khi lưu thiết lập) + + + Thiết lập tay cầm ảo + + + Thay đổi trên thiết bị mới + + + Fuzz chỉ định số lượng đơn vị tối thiểu mà thanh analog di chuyển, trong vùng hoạt động, trước khi đầu ra được đăng ký là đã thay đổi trong trình ánh xạ. Cài đặt này có thể hữu ích đối với gậy bị mòn không thể duy trì vị trí cố định. Giá trị được thể hiện bằng đơn vị thanh thô. + + + Luôn thực thi cài đặt đầu ra tối đa. Hữu ích cho Đầu ra tối đa 100% và giá trị giới hạn ở giá trị đầu ra tròn + + + Trong một số trường hợp, có thể hữu ích khi giới hạn giá trị tối đa được xuất ra bởi thanh analog đầu ra. Đầu ra tối đa cho phép điều chỉnh giá trị đầu ra cuối cùng của thanh analog. + + + Một anti-deadzone hoạt động như một phần bù để sử dụng với một trục để biểu thị giá trị đầu ra tối thiểu được tạo sau khi một trục rời khỏi vùng chết được chỉ định của nó. Điều này chủ yếu nhằm giúp ánh xạ một trục tới giá trị vùng chết được chỉ định được sử dụng cho một trục trong trò chơi điện tử. Ví dụ: vùng chết điển hình được chỉ định cho XInput LS trong trò chơi điện tử là khoảng 8000 (25%). Không có vùng chết được chỉ định, một trục sẽ phải di chuyển qua vùng chết được chỉ định trong DS4Windows cùng với vùng chết trục được chỉ định của trò chơi. + + + CÀI ĐẶT CŨ LỖI THỜI. Cố gắng áp dụng một đường cong dựa trên tọa độ đầu vào thô trước khi áp dụng bất kỳ thông tin vùng chết nào. Rung rinh + + + Hành trình đầu ra được tính toán tối thiểu trước khi sự kiện Chuột được gửi đến hệ thống + + + Điều chỉnh thao tác vuốt trên bàn di chuột theo một góc xoay nhất định. Hữu ích khi thao tác vuốt bàn di chuột thông thường không phải là một đường thẳng. Giá trị cho phép nằm trong khoảng từ -180 đến 180. Mặc định là 0. + + + Độ nhạy được sử dụng để thực hiện thao tác Cuộn bánh xe chuột đa điểm + + + Kích hoạt chuột Nhấp chuột trái bằng Touchpad Tap. Khoảng thời gian tối đa được đặt ở (giá trị * 2) ms. + + + Thêm động lượng cho thao tác vuốt trên Bàn di chuột sau khi nhấc ngón tay lên. Thêm hành trình của con trỏ Chuột nhiều hơn mức có thể với không gian hạn chế trên Bàn di chuột + + + Thêm ma sát vào Trackball ảo. Giảm ma sát sẽ tăng thời gian di chuyển cuối cùng của con trỏ chuột + + + Ngưỡng khi một hành động sẽ kích hoạt + + + Có lửa liên kết bên ngoài trước khi đạt đến ngưỡng. Hành động phát hành khi ngưỡng đã được vượt quá + + + Hành động thực hiện khi hành trình của gậy vượt qua ngưỡng. Hữu ích để lập bản đồ các phím cho các hành động Đi bộ hoặc Chạy nước rút. Đảo ngược khiến hành động kích hoạt cho đến khi đạt ngưỡng + + + Fuzz chỉ định số lượng đơn vị thiết bị tối thiểu, trong vùng hoạt động, mà Gia tốc phải được xoay trước khi đầu ra được đăng ký là đã thay đổi trong trình ánh xạ. Giá trị được biểu thị bằng đơn vị Gia tốc thô. + + + + = Clockwise. - = Counter-clockwise. + +The rotation setting is meant to help correct the orientation of an analog stick if your thumb is slightly shifted when moving an analog stick. For example, your thumb might be slightly shifted from center when the analog stick is moved fully north. My thumbs shift slightly to the right when moving an analog stick fully north due to the way my hands grip the DS4. The value used denotes the number of degrees used to adjust the final axis output value. Values allows range from -180 to 180. Default is 0. + + + Điều tiết mức thấp của chuyển động Touchpad. Giảm tình cờ di chuyển con trỏ chuột khi giữ một vị trí gần như cố định trên Touchpad + + + Độ trễ của tay cầm + + + Tính năng này hiện tại bị hạn chế vì xung đột. Hi vọng sẽ được khắc phục trong tương lai. + + + Buộc sử dụng cả hai mức cường độ % (Cụ thể chung và DualSense) + + + Tắt + + + Độ chính xác + + + Legacy + + + Chế độ rung và cường độ rung: + + + Passthru + + + Cài đặt âm thanh cụ thể của DualSense + + + Khuyến cáo nên để tắt. + +- Disabled: rumble will be rescaled natively by the controller accordingly to the defined power level (better quality) + +- Enabled: both DS4Windows generic rumble rescale and DualSense's native control will be active + + + Accurate Mode (recommended): +- Better replicates the DualShock 4/Xbox 360 controller rumble feeling +- More accurately executes game's intended rumble effects +- Rumble has more depth. Within the same power level there is a greater difference between min and max in-game rumble activation, +varying from real low up to the max strength of the defined power level + +Legacy Mode: +- Overral stronger, but lacks depth +- Has a "sharper" feeling +- The min and max activation in-game will be, respectively, only slightly below and slight above the chosen power level strength + +Disabled: +- Fully disables rumble + + + DualSense's native rumble Power Level rescaler. + +- When in Accurate Mode, rumble's [ min // max ] will be [ 1% /// Chosen Power Level ] + - Example (62%): [ min = 1% /// max = 62% ] + +- When in Legacy Mode, rumble's [min /// max ] will be roughly [ Power Level - 12% /// Power Level + 12% ] + - Example (62%): [ min = 50% /// max = 74% ] + + + Đồng ý + + + Đen + + + Màu sắc rực rỡ + + + Mặc định + + + Loại thiết bị + + + Ngắt kết nối không dây khi không hoạt động + + + Dynamic + + + Nháy đèn khi độ trễ cao + + + Ẩn tay cầm PS4 + + + Phím tắt/Về chúng tôi + + + Chọn biểu tượng + + + Ẩn xuống thanh taskbar + + + Minimize to Taskbar instead of System Tray + + + Output Slots + + + Vĩnh viễn + + + Cắm + + + Hoàn nguyên về hồ sơ mặc định trên không xác định + + + Hiển thị thông báo gỡ lỗi cấu hình tự động + + + Vuốt Touchpad để đổi thiếp lập + + + Tắt tạm thời DS4Windows + + + Rút cắm + + + Trắng + + + Chủ đề + + + Kiểm tra mỗi + + + External OSC Control & Monitoring + + + Bật server điều khiển + + + Giải thích thông báo giám sát + + + Kích hoạt dịch vụ giám sát + + + Hỗ trợ tay cầm PS4 + + + Hỗ trợ tay cầm Dualsense + + + Hỗ trợ tay cầm JoyCon + + + Hỗ trợ tay cầm Switch Pro + + + Copycat + + + Thay đổi một số cờ được sử dụng cho bộ điều khiển DS4 không phải của Sony. Nó có thể khắc phục hỗ trợ rumble và lightbar cho một số bản sao DS4 của bên thứ ba + + + Tối + + + Ngày + + + Phát hiện thiết bị + + + Cài đặt thiết bị + + + Bật nhật ký chi tiết + + + Hiển thị thông báo nhật ký bổ sung khi gamepad được kết nối + + + Giờ + + + Sử dụng thư mục Steam tùy chỉnh + + + công dụng + + + Chương trình + + + Chạy với + + + Tác vụ + + + Thêm điều chỉnh bổ sung ở cuối đường cong để giải thích cho thiết bị bị rung + + + Thức dậy từ đình chỉ + + + Hỗ trợ tay cầm PS3 + + diff --git a/DS4Windows/Translations/Strings.zh-Hans.resx b/DS4Windows/Translations/Strings.zh-Hans.resx new file mode 100644 index 0000000000..59db88dc38 --- /dev/null +++ b/DS4Windows/Translations/Strings.zh-Hans.resx @@ -0,0 +1,1488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 加速度 + + + + 动作 + + + + 添加目录 + + + + 添加程序 + + + + 添加Steam游戏 + + + + 全部 + + + + 自动配置 + + + + 电量 + + + + 浏览 + + + + 浏览其他程序 + + + + 取消 + + + + 立即检查更新 + + + + 程序启动时检查更新 + + + + 清除 + + + + 关闭时最小化 + + + + 颜色 + + + + 手柄 1 + + + + 手柄 2 + + + + 手柄 3 + + + + 手柄 4 + + + + 控制器 + + + 手柄 + + + + 删除 + + + + 手柄/驱动安装 + + + + 复制 + + + + 编辑 + + + + 编辑动作 + + + + 导出 + + + + 全部 + + + + 体感 + + + + 隐藏未选中 + + + + 导入 + + + + 左摇杆 + + + + 日志 + + + + 名称 + + + + 新建 + + + + 新建动作 + + + + 新建配置 + + + + + + + + 路径 + + + + 配置文件 + + + + 配置文件夹 + + + + 快速充电 + + + + 录制 + + + + 移除 + + + + 删除动作 + + + + 右摇杆 + + + + 震动 + + + 开机自动启动 + + + + 保存 + + + + 保存配置 + + + + 设置 + + + + 显示通知 + + + + 启动时最小化 + + + + 开始 + + + + 状态 + + + + 停止 + + + + 滚动 + + + + 滑动 + + + + 滑动 + + + + 触发 + + + 仅警告 + + + + + + + + 震动自动停止时间,单位为秒 (0则不自动停止) + + + 窗口标题 + + + + 上移 + + + + 下移 + + + + 进程路径. ^ABC = 匹配字符串头 (^) | ABC$ = 匹配字符串尾 ($) | *ABC =包含字符串 (*) + + + + >窗口标题. ^ABC = 匹配字符串头 (^) | ABC$ = 匹配字符串尾 ($) | *ABC =包含字符串 (*) + + + + 手柄测试(GamepadTest) + + + + 启用向DS4发送数据 + + + + 定期向DS4发送灯条和震动数据。若手柄不支持接收该数据则取消选中。设定变更在手柄连接时生效 + 若要在 Visual Studio 资源编辑器中换行,请按下 Shift+Enter + + + 应用 + + + + HidNinja + + + + 自定义可执行文件名称 + + + + 一些游戏如果测到DS4Windows.exe 或 InputMapper.exe 正在运行,则会忽略 DS4 的输入。对于这些游戏,解决方法是将 DS4Windows.exe 重命名,以规避检测。在这样自定义可执行文件的名称,以允许 DS4Updater 自动更新已被重命名的DS4Windows。请不要输入扩展名(即 .exe)。名称示例: whyme_DS4Windows + + + + XInput 检查器 + + + + 手柄 5 + + + + 手柄 6 + + + + 手柄 7 + + + + 手柄 8 + + + + 将手柄映射为标准的 Xinput 手柄或 DS4 手柄。体感将被映射为类似鼠标的摇杆(相对值输入摇杆)(Mouse-like Joystick)。 + + + + 含有类鼠标的摇杆(相对值输入摇杆)(Mouse-like Joystick)的手柄 + + + + 将手柄映射为标准手柄 + + + + 手柄 + + + + 将手柄映射为虚拟键盘和鼠标。在游玩无手柄支持的 FPS 游戏时很有用。体感将被映射为虚拟鼠标。 + + + + 带有体感控制鼠标虚拟键盘和鼠标 + + + + 将手柄映射为虚拟键盘和鼠标。在游玩无手柄支持的 FPS 游戏时很有用。 + + + + 虚拟键盘和鼠标 + + + + 将按钮和手柄轴映射为标准手柄。将体感映射为虚拟鼠标 + + + + 带有体感控制鼠标的手柄 + + + + 将手柄映射为Xinput手柄和 RS 鼠标 + + + + 带有高精度相机的摇杆 + + + + 描述 + + + + 是否使用预设选项?如不使用,配置编辑器将会使用空配置文件 + + + + 预设 + + + + 更新日志 + + + + 关闭 + + + + 配置文件 + + + + 未连接手柄 (最多 {0} 个) + + + + 触发横移阈值 + + + 横移时长 + + + 最小角度阈值 + + + + 实际移动距离 + + + ViGEm 插件发生错误。可能由于 ViGEm 发生了内部错误。正在断开连接。如果问题仍然存在,请关闭 DS4Windows并重启 Windows。 + + + 无线手柄数据完整性检查失败。正在关闭手柄。 + + + + 未检测到 .NET 5 运行时。请下载并安装 .NET 5 运行时,以确保与未来的 DS4Windows 版本兼容。关闭此窗口后,您将被重定向到 .NET 5 运行时下载页。 + + + + 请更新 .NET 运行时 + + + + HidHide + + + + HidHide 配置客户端 + + + + 独占访问 + + + + 隐藏守护者(HidGuardian)访问 + + + + HidHide 访问 + + + + 共享访问 + + + + 重命名 + + + + 禁用虚拟手柄 + + + + 不要为已连接并使用此配置文件的手柄 生成/绑定 虚拟手柄(在配置文件保存时应用) + + + + 仿真控制器 + + + + 选择输出虚拟手柄类型(在配置文件保存时应用) + + + + 虚拟手柄设置 + + + + 更改将在新设备连接时生效 + + + + 模糊指定了摇杆被注册为输出前的最小移动单位。这个设置对无法保持恒定位置的战损摇杆很有帮助。此数值为原始摇杆单位。 + + + 总是强制圆形外死区。当最大输出为100%时可以将摇杆外圈限制成圆形输出。 + + + 在某些情况下,限制摇杆的最大输出可能会有用。最大输出可以限制模拟摇杆的最终输出。 + + + 旧的过时的设置。会在死区之前尝试对原生输入坐标应用一个曲线。不太灵光。 + + + 在鼠标事件发送到系统之前的最小计算输出行程 + + + 通过设置的旋转角度调整触摸板滑动。当正常的触摸板滑动不是一条直线时很有用。设置的值允许从-180到 180。默认值为0。 + + + 用于多点触摸启用鼠标滚轮动作的灵敏度 + + + 在手指抬起后给触摸板滑动加个动量。可以增加鼠标指针的额外移动距离,不仅局限于触摸板大小的限制。 + + + 给虚拟轨迹球增加摩擦力。减少摩擦力会最终增加鼠标指针的移动时间 + + + 操作触发阈值 + + + + 让额外按键绑定在达到阈值前触发。动作会在超过阈值后结束。 + + + Fuzz specifies the minimum number of device units, in active zone, that the Accel has to be rotated before the output is registered as changed in the mapper. The value is expressed in raw Accel units. + + + + 正数为顺时针, 负数为逆时针。旋转设置旨在帮助校正模拟摇杆的方向,如果在移动模拟摇杆时你的拇指略微偏移。例如,当模拟摇杆完全向北移动时,你的拇指可能会从中心略微偏移。由于我的手握持DS4的方式,当我完全将模拟摇杆移动到北方时,我的拇指会略微向右偏移。所使用的值表示用于调整最终轴输出值的角度数。值的范围允许从-180到180。默认值为0 + + + 限制触摸板下部分的移动。在触摸板上基本保持一个位置时可以减少意外的鼠标指针移动。 + + + DS4 蓝牙轮询速率 + + + + 由于驱动程序问题,本功能当前被禁用。希望问题会在将来更新中解决。 + + + + 强制使用两种震动力度(普通和 DualSense 控制器特定力度) + + + + 已禁用 + + + + 精度 + + + + 传统 + + + + 震动模式和震动强度: + + + + 直通 + + + + DualSense 控制器特定震动设置 + + + + 建议保持禁用。 + +- 禁用: 震动会根据设定的等级重新调整原生震动(更好的质量) + +- 启用:DS4Windows的通用震动调整和DualSense的原生控制都会生效 + + + Accurate Mode (recommended):- Better replicates the DualShock 4/Xbox 360 controller rumble feeling- More accurately executes game's intended rumble effects- Rumble has more depth. Within the same power level there is a greater difference between min and max in-game rumble activation,varying from real low up to the max strength of the defined power levelLegacy Mode:- Overral stronger, but lacks depth- Has a "sharper" feeling- The min and max activation in-game will be, respectively, only slightly below and slight above the chosen power level strengthDisabled:- Fully disables rumble + + + + DualSense's native rumble Power Level rescaler.- When in Accurate Mode, rumble's [ min // max ] will be [ 1% /// Chosen Power Level ] - Example (62%): [ min = 1% /// max = 62% ]- When in Legacy Mode, rumble's [min /// max ] will be roughly [ Power Level - 12% /// Power Level + 12% ] - Example (62%): [ min = 50% /// max = 74% ] + + + + 接受 + + + + 黑色 + + + + 彩色 + + + + 默认 + + + + 设备类型 + + + + 停止时断开蓝牙连接 + + + + 动态 + + + + 高延迟时使灯条闪烁 + + + 隐藏 DS4 控制器 + + + + 热键(快捷键)和关于 + + + + 图标选择 + + + + 最小化到任务栏 + + + + 最小化到任务栏而非系统托盘 + + + + 输出插槽 + + + + 永久 + + + + 插入 + + + + 遇到未知的应用时回滚到默认配置文件 + + + + 显示自动配置文件切换的调试消息 + + + + 滑动触摸板来切换配置文件 + + + + 临时关闭 DS4Windows + + + + 拔出 + + + + 亮色 + + + + 应用主题 + + + + 每日检查 + + + + DS4 手柄支持 + + + + DualSense 手柄支持 + + + + JoyCon 手柄支持 + + + + Switch Pro 手柄支持 + + + + 模仿(Copycat) + + + + 更改一些标志以适配第三方 DS4 手柄。可能修复对第三方 DS4 手柄的震动和灯光支持 + + + + 暗色 + + + + + + + + 检测到的手柄 + + + + 设备选项 + + + + 启用详细(Verbose)日志 + + + + 连接手柄时显示更多日志信息 + + + + 小时 + + + + 使用自定义Steam库文件夹 + + + + 实用工具 + + + + 程序 + + + + 以一下身份运行: + + + + 任务 + + + + 添加开始菜单程序 + + + 模拟 + + + 默认 (模拟+按钮) + + + DS3 手柄支持 + + + 反死区作为一个与轴关联的偏移量,用于表示摇杆在某轴在离开其指定的死区后生成的最小输出值。这主要是为了应对游戏中某轴的死区。例如在游戏中,一般的XInput LS死区约为8000(25%)。如果没有分配反死区,摇杆就必须移动超过DS4Windows和游戏设定的死区才有输出。 + + + 通过以下选项显示配置切换 + + + 日志 + 通知 + + + 按钮 + + + 解释监控消息 + + + 启用监控消息 + + + 启用控制服务器 + + + 在曲线低处增加额外的限制来防止设备晃动。 + + + 通知 + + + 启用 OSC 控制和监控 + + + DS4 扳机输出模式 + + + 从挂起中唤醒 + + + 由于其他映射软件默认支持多种设备(Steam输入),DS4Windows默认只启用DS4控制器的输入。你可以在这里启用其他支持的设备的输入。当DS4Windows与其他映射同时运行的时候请小心冲突。 + + + DS3 设备支持 + + + 支持DualShock 3 (PS3) 控制器。需要来自ViGEm project (nefarius)的DsHidMini 驱动。 + + + DS4 设备支持 + + + 支持已知的 DualShock 4控制器 + + + DualSense设备支持 + + + 支持 DualSense (PS5) 控制器。同时支持原版和DS Edge。 + + + 启用设备映射支持 + + + JoyCon 设备支持 + + + 支持 JoyCon (Nintendo Switch) 控制器 + + + 支持 Switch Pro 控制器 + + + 支持 Switch Pro (Nintendo Switch) 控制器 + + + 第一次启动 + + + + + + 用触摸板单击触发鼠标左键点击。最大时间间隔为(值 * 2)ms + + + 当摇杆行程超过阈值时,执行一个动作。当映射的按键是静步或疾跑时很有用。反转可以放动作在到达阈值前一直执行。 + + + 绝对鼠标 + + + 绝对鼠标选项 + + + 激活 + + + 反死区 + + + 反回弹 + + + 反回弹时间 + + + 应用数据 + + + 轴向 + + + 轴向相关配置 + + + 绝对鼠标 + + + 绝对鼠标 下 + + + 绝对鼠标 左 + + + 绝对鼠标 右 + + + 绝对鼠标 上 + + + 改变灯光 + + + 改变鼠标灵敏度 + + + 键盘和相对鼠标 + + + 键盘和鼠标 + + + 已启用宏,选择一个按键来禁用宏,或关闭此窗口来保存 + + + 录制宏 + + + 选择Shift触发按键 + + + 确认 + + + 控制 + + + 当前 + + + 死区 + + + X轴死区 + + + Y轴死区 + + + 死区类型 + + + 加速度变化值 + + + 定向滑动 + + + 启用 + + + 启用开关触摸板 + + + 额外设置 + + + 设备支持 + + + 闪烁频率 + + + 快速横移鼠标 + + + 控制器类型选项 + + + 玩家LED模式 + + + 链接模式 + + + 禁音LED模式 + + + 按钮完全按下 + + + 模糊 + + + 控制(加速度) + + + + + + 高度 + + + Hip Fire延迟 + + + ID + + + 空闲断开 + + + 介绍 + + + 使用语言包 + + + 启用程序时应用配置 + + + 灯条 + + + 线性 + + + 链接配置/ID + + + 绝对显示器设置 + + + 启用服务器 + + + 最大输出 + + + 最大行程 + + + 外圈死区 + + + 最小因数 + + + 最小行程 + + + 模式 + + + 鼠标 + + + 鼠标加速度 + + + 鼠标摇杆 + + + 鼠标偏移 + + + 鼠标灵明度 + + + 鼠标垂直倍率 + + + 倍率 + + + + + + 普通 + + + 其他 + + + 外圈绑定 + + + 外圈按钮 + + + 外圈按钮死区 + + + 输出曲线 + + + 输出模式 + + + 输入 # + + + XInput # + + + 直通 + + + 俯仰 + + + 端口 + + + 输出控制器 + + + 预设菜单 + + + 程序文件夹 + + + 圆形 + + + 电池电量:0% + + + 输入延迟:N/A + + + 六轴:为了可读性X轴已翻转 + + + 添加震动 + + + 改变灯条颜色 + + + 在延迟上双击来编辑 + + + 鼠标按键 5 + + + 鼠标按键 4 + + + 插入延迟 + + + 加载预设 + + + 宏顺序 + + + 运行一次 + + + 录制延迟 + + + 按下时重复 + + + 保存预设 + + + 使用键盘/鼠标和控制器1来录制 + + + 编辑宏 + + + 请为选中的XML文件输入新名字 + + + 重命名配置 + + + 已请求 + + + 旋转 + + + 横滚 + + + 常规 + + + 对于那些偏好常规安装的人,设置保存路径在 %appdata%\DS4Windows + + + 先不要删除其他设置 + + + 检测到多个保存路径 + + + 选择你想要保存配置和设置文件的位置 + + + 适合那些想要免安装版的人。注:这个选项在没有UAC权限时无法在需要管理员权限的文件夹使用。 + + + 保存位置 + + + 扫描码 + + + 选中的配置 + + + 灵敏度 + + + Shift修饰键 + + + 六轴(加速度) + + + 跳过版本 + + + 吸附到中心 + + + 方形摇杆 + + + 测试 + + + 测试重震动 + + + 测试轻震动 + + + 开关 + + + 触摸板 + + + 扳机效果 + + + 两段模式 + + + UDP服务器 + + + 未绑定 + + + 更新窗口 + + + 使用控制器 + + + 使用平滑 + + + 垂直倍率 + + + 只能与ViGEmBus 1.17.333.0以及更新版本使用 + + + 蓝牙设置 + + + 宽度 + + + X 中心 + + + 偏航 + + + Y 中心 + + + + + + 欢迎来到 DS4Windows + + + 如果这个窗口在安装完成后再次出现,你可能需要重新启动你的电脑。 + + + 步骤1:安装ViGemBud驱动 + + + 如果你曾在这台电脑上使用过Xbox 360控制器,可以跳过这一步。 + + + 步骤2:如果你的系统是Windows 7,安装360驱动 + + + 当灯闪烁时请到蓝牙设置并连接 "Wireless Controller"。如有提示输入配对码,请输入0000。当配对完成后,就可以了。玩得开心! + + + 步骤3:连接DualShock 4 控制器。 \n若要通过有线USB连接:只需使用micro-USB线连接DualShock 4和电脑。 \n\n若要通过蓝牙连接(可选):长按PS和Share键3秒,灯条会开始双闪。 + + + 使用HidHide来配置并对其他应用隐藏你的原生控制器输入。某些游戏只允许一个控制器,或双重输入可能会导致一些游戏内问题。 + + + (可选)步骤4:安装HidHide驱动 + + + (可选)步骤5:安装FakerInput驱动 + + + 使用FakerInput驱动来设置全局的虚拟键盘,相对鼠标,和绝对鼠标。在某些情况下,SendInput失效时可以发送虚拟的键盘与鼠标事件。这些情况包括提升优先级的进程与游戏,UAC提示框,以及一些反作弊系统会屏蔽SendInput事件。为了能让DS4Windows在一些带有反作弊保护的游戏,比如 Valorant,中正常运行,FakerInput是必要的。 + + + 检查电池电量 + + + 断开蓝牙连接 + + + 双击触发 + + + 按下 + + + 按住触发 + + + 保持键当前状态 + + + 启动程序 + + + 加载配置 + + + 宏已录制 + + + 多动作按钮 + + + 按下/切换按键 + + + 录制宏 + + + 按下时充浮 + + + 当松开触发键时运行 + + + - 选择一个动作 - + + + 选择一个按键 + + + 选择一个宏 + + + 六轴方向盘的校准 + + + 同步运行 + + + 点击触发 + + + 触发键松开时取消加载 + + + 设置取消加载触发键 + + + 通过灯条显示 + + + 通过通知显示 + + \ No newline at end of file diff --git a/DS4Windows/Translations/Strings.zh-Hant.resx b/DS4Windows/Translations/Strings.zh-Hant.resx new file mode 100644 index 0000000000..2b05512406 --- /dev/null +++ b/DS4Windows/Translations/Strings.zh-Hant.resx @@ -0,0 +1,553 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 加速儀 + + + 操作 + + + 新增資料夾 + + + 新增應用程式 + + + 新增 [開始]功能表上 的應用程式 + + + 新增 Steam 上的遊戲 + + + 全部 + + + 自動設定檔 + + + 電量 + + + 瀏覽 + + + 瀏覽其它應用程式 + + + 取消 + + + 立即檢查更新 + + + 啟動時檢查更新 + + + 清除 + + + 關閉時最小化 + + + 顏色 + + + 控制器1 + + + 控制器2 + + + 控制器3 + + + 控制器4 + + + 控制器 + + + 控制面板 + + + 刪除 + + + 控制器/驅動程序設置 + + + 複製 + + + 編輯 + + + 編輯操作 + + + 匯出 + + + 充滿 + + + 陀螺儀 + + + 隱藏未勾選 + + + 匯入 + + + 左類比 + + + 日誌 + + + 名稱 + + + 新增 + + + 新增操作 + + + 新增設定檔 + + + + + + 路徑 + + + 設定檔 + + + 設定檔資料夾 + + + 快速充電 + + + 錄製 + + + 移除 + + + 移除操作 + + + 右類比 + + + 震動 + + + 開機時自動啟動 + + + 保存 + + + 保存設定檔 + + + 設置 + + + 顯示通知 + + + 開始時最小化 + + + 開始 + + + 狀態 + + + 停止 + + + 捲動 + + + 滑動 + + + 觸碰 + + + 觸發 + + + 只有警告 + + + + + + 自動停止震動的時間,單位為秒 (0則不自動停止) + + + 視窗標題 + + + 上移 + + + 下移 + + + 執行檔路徑. ^ABC = 在字符串開頭匹配 (^) | ABC$ = 在字符串末尾匹配 ($) | *ABC = 包含一個字符串 (*) + + + 視窗標題. ^ABC = 在字符串開頭匹配 (^) | ABC$ = 在字符串末尾匹配 ($) | *ABC = 包含一個字符串 (*) + + + 遊戲控制器輸入測試 + + + 啟用輸出資料到DS4 + + + 定期將光條和震動的資料輸出到DS4遊戲控制器。 如果遊戲控制器不支援接收資料時,請取消勾選。 +對此選項所做的更動,會在遊戲控制器連接時生效。 + 要在Visual Studio資源編輯器中在字符串資源值中輸入換行符,請按Shift + Enter。 + + + 套用 + + + HidNinja + + + 自定義 Exe 名稱 + + + 如果遊戲檢測到當時正在運行的 DS4Windows.exe 或 InputMapper.exe ,則某些遊戲執行的攔阻會導致忽略DS4的輸入。 解決該問題的方法是重命名 DS4Windows.exe ,以便讓遊戲中的檢查失效。 在此處指定自定義的 exe 執行檔名稱可以使 DS4Updater 自動將 DS4Windows 的自定義副本更新為想要的檔名。 確保省略副檔名。 + +例如: whyme_DS4Windows + + + XInputChecker + + + 控制器5 + + + 控制器6 + + + 控制器7 + + + 控制器8 + + + 將控制器的輸出映射到標準 XInput 遊戲控制器或DS4控制器。 陀螺映射到類滑鼠的操縱桿。 +Maps the controller output to a standard XInput gamepad or DS4 pad. Gyro is mapped to a Mouse-like Joystick. + + + 帶有類滑鼠的操縱桿的遊戲控制器(Gamepad with Mouse-like Joystick) + + + 將控制器的輸出映射到標準遊戲控制器 +Maps the controller output to a standard gamepad + + + 遊戲控制器 + + + 將控制器的輸出映射到虛擬鍵盤+滑鼠的控制。 對於不支持遊戲控制器的FPS第一人稱射擊遊戲很有用。 陀螺儀已映射到虛擬滑鼠。 +Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. Gyro is mapped to a virtual Mouse. + + + 帶有利用陀螺儀來控制滑鼠的鍵盤+滑鼠的控制器(KB+M Controls with Gyro Mouse) + + + 將控制器的輸出映射到虛擬鍵盤+滑鼠的控制。 對於不支持遊戲控制器的FPS第一人稱射擊遊戲很有用。 +Maps the controller output to virtual KB+M controls. Useful for playing FPS games with no gamepad support. + + + 鍵盤+滑鼠的控制器(KB+M Controls) + + + 將按鈕和六軸映射到標準遊戲控制器。 將陀螺儀映射到虛擬滑鼠 +Maps the buttons and axes to a standard gamepad. Maps the Gyro to a virtual mouse + + + 帶有利用陀螺儀來控制滑鼠的遊戲控制器(Gamepad with Gyro Mouse) + + + 將控制器的輸出映射到混合的 XInput 遊戲控制器+右類比滑鼠。 +Maps the controller output to mixed XInput gamepad + RS mouse. + + + 帶有高精度設相機控制的遊戲控制器(Gamepad with High Precision Camera) + + + 說明 + + + 您要使用預設選項嗎? 選擇“否”將會使得設定檔編輯器使用空的控制器設定檔。 + + + 預設集 + + + 更新日誌 + + + 關閉 + + + 設定檔 + + + 未連接控制器 (最大 {0}) + + + 輕彈閾值 + + + 輕彈時間 + + + 最小角度閾值 + + + 現實世界的校準 + + + ViGEm 裝置插件失敗。可能是 ViGEmBus 的內部問題。關閉連接。如果問題仍然存在,請關閉 DS4Windows,然後重新啟動 Windows。 + + + 無線設備的數據完整性檢查失敗。 關閉設備。 + + + .NET 5 Runtime 未在您的系統上檢測到。 請下載並安裝 .NET 5 Runtime,以確保與未來 DS4Windows 構建的兼容性。 關閉此窗口後,您將重定向到 .NET 5 Runtime 下載頁面。 + + + 請更新 .NET Runtime + + + HidHide + + + HidHide 配置客戶端 + + + 獨佔訪問 + + + HidGuardian 訪問 + + + HidHide 訪問 + + + 共享訪問 + + + 重新命名 + + + 停用虛擬控制器 + + + 請勿使用此配置文件為連接控制器產生相關的虛擬控制器(適用於配置文件保存) + + + 模擬控制器 + + + 選擇輸出虛擬控制器的類型(適用於配置文件保存) + + + 虛擬控制器設置 + + + 更改在新的裝置連接時生效 + + + Fuzz(模糊)指定在映射器中將輸出註冊為更改的輸出之前,類比搖桿移動的最小單位數量。 此設置對於無法保持恆定位置的磨損的搖桿可能很有用。 該值以原始搖桿單位表示。 + + + 始終強制執行最大輸出設置。 對於100%最大輸出和將值限制在圓形輸出值中有用 + + + 在某些情況下,限制輸出類比搖桿輸出的最大值可能很有用。 最大輸出允許限制類比搖桿的最終輸出值。 + + + 反死區作為一個偏移量用於一個軸,表示一個軸離開其指定死區後產生的最小輸出值。這主要是為了幫助將一個軸對應到視訊遊戲中的軸的指定死區值。例如,視訊遊戲中XInput LS的典型指定死區是8000左右(25%)。在沒有指定反死區的情況下,一個軸將不得不隨著遊戲中指定的軸死區移動到DS4Windows中的指定死區。 + + + 舊的過時設置。 在應用任何死區信息之前,嘗試根據原始輸入坐標應用曲線。 + + + 滑鼠事件被傳送到系統之前的最小計算輸出行程 + + + 通過給定的旋轉角度調整觸摸板滑動。 當正常的觸摸板滑動不是直線時很有用。 值允許範圍為-180到180。默認值為0。 + + + 用於從事多點觸控的滑鼠滾輪滾動動作的靈敏度 + + + 用觸摸板點擊觸發滑鼠左鍵單擊。 最大時間間隔設置為(值 * 2)毫秒。 + + + 一旦手指抬起,就為觸摸板上的滑動增加動力。增加滑鼠游標的移動,而不是在觸摸板上的有限空間裡。 + + + 給虛擬軌跡球增加摩擦力。減少摩擦力將增加滑鼠指針的最終移動時間。 + + + 一個動作何時啟動的閾值 + + + 在達到閾值之前,讓外部的束縛開火。一旦超過閾值,就釋放行動 + + + 當搖桿行程超過一個臨界點時執行的動作。對於對應行走或衝刺動作的按鍵很有用。顛倒的情況下,動作會一直持續到閾值。 + + + Fuzz(模糊)指定了裝置單位的最小數量,在活動區,在輸出被註冊為映射器中的變化之前,Accel必須被旋轉。該值以原始Accel單位表示。 + + + 旋轉設定是為了幫助糾正類比搖桿的方向,如果你的拇指在移動類比搖桿時略有偏移。例如,當類比搖桿完全向北移動時,你的拇指可能會從中心稍微偏移。由於我的手握住DS4的方式,當類比搖桿完全向北移動時,我的拇指會稍微向右移動。使用的數值表示用於調整最終軸輸出值的度數。允許的數值範圍是-180到180。預設值為0。 + + + 節制觸控板的低端移動。當在觸摸板上保持一個基本固定的位置時,減少意外的滑鼠指針移動。 + + + DS4 藍牙輪詢頻率 + + + 由於驅動問題,該功能目前在應用程式中停用。希望這些問題在未來的更新中得到解決。 + + \ No newline at end of file diff --git a/DS4Windows/VJoyFeeder/vJoyFeeder.cs b/DS4Windows/VJoyFeeder/vJoyFeeder.cs new file mode 100644 index 0000000000..80b1dbfc81 --- /dev/null +++ b/DS4Windows/VJoyFeeder/vJoyFeeder.cs @@ -0,0 +1,719 @@ +// VJoy C# interface file taken from an excellent Shaul's virtual joystick driver project. +// Licensed to public domain as is (http://vjoystick.sourceforge.net/site/index.php/forum/5-Discussion/104-what-is-the-usage-license-for-this-software). +// http://vjoystick.sourceforge.net/site/ +// https://github.com/shauleiz/vJoy/tree/master/apps/common/vJoyInterfaceCS +// +// This module is a feeder for VJoy virtual joystick driver. DS4Windows can optionally re-map and feed buttons and analog axis values from DS4 Controller to VJoy device. +// At first this may seem silly because DS4Windows can already do re-mapping by using a virtual X360 Controller driver, so why feed VJoy virtual driver also? +// Sometimes X360 driver may run out of analog axis options, so for example "SA motion sensor steering wheel emulation" in DS4Windows would reserve a thumbstick X or Y +// axis for SA steering wheel emulation usage. That thumbstick axis would be unavailable for "normal" thumbstick usage after this re-mapping. +// The problem can be solved by configuring DS4Windows to re-map SA steering wheel emulation axis to VJoy axis, so all analog axies in DS4 controller are still available for normal usage. +// + +using System; +using System.Runtime.InteropServices; +using System.Security; // SuppressUnmanagedCodeSecurity support to optimize for performance instead of code security + +namespace DS4Windows.VJoyFeeder +{ + [Flags] + public enum HID_USAGES + { + HID_USAGE_X = 0x30, + HID_USAGE_Y = 0x31, + HID_USAGE_Z = 0x32, + HID_USAGE_RX = 0x33, + HID_USAGE_RY = 0x34, + HID_USAGE_RZ = 0x35, + HID_USAGE_SL0 = 0x36, + HID_USAGE_SL1 = 0x37, + HID_USAGE_WHL = 0x38, + HID_USAGE_POV = 0x39, + } + + public enum VjdStat /* Declares an enumeration data type called BOOLEAN */ + { + VJD_STAT_OWN, // The vJoy Device is owned by this application. + VJD_STAT_FREE, // The vJoy Device is NOT owned by any application (including this one). + VJD_STAT_BUSY, // The vJoy Device is owned by another application. It cannot be acquired by this application. + VJD_STAT_MISS, // The vJoy Device is missing. It either does not exist or the driver is down. + VJD_STAT_UNKN // Unknown + }; + + + // FFB Declarations + + // HID Descriptor definitions - FFB Report IDs + + public enum FFBPType // FFB Packet Type + { + // Write + PT_EFFREP = 0x01, // Usage Set Effect Report + PT_ENVREP = 0x02, // Usage Set Envelope Report + PT_CONDREP = 0x03, // Usage Set Condition Report + PT_PRIDREP = 0x04, // Usage Set Periodic Report + PT_CONSTREP = 0x05, // Usage Set Constant Force Report + PT_RAMPREP = 0x06, // Usage Set Ramp Force Report + PT_CSTMREP = 0x07, // Usage Custom Force Data Report + PT_SMPLREP = 0x08, // Usage Download Force Sample + PT_EFOPREP = 0x0A, // Usage Effect Operation Report + PT_BLKFRREP = 0x0B, // Usage PID Block Free Report + PT_CTRLREP = 0x0C, // Usage PID Device Control + PT_GAINREP = 0x0D, // Usage Device Gain Report + PT_SETCREP = 0x0E, // Usage Set Custom Force Report + + // Feature + PT_NEWEFREP = 0x01 + 0x10, // Usage Create New Effect Report + PT_BLKLDREP = 0x02 + 0x10, // Usage Block Load Report + PT_POOLREP = 0x03 + 0x10, // Usage PID Pool Report + }; + + public enum FFBEType // FFB Effect Type + { + + // Effect Type + ET_NONE = 0, // No Force + ET_CONST = 1, // Constant Force + ET_RAMP = 2, // Ramp + ET_SQR = 3, // Square + ET_SINE = 4, // Sine + ET_TRNGL = 5, // Triangle + ET_STUP = 6, // Sawtooth Up + ET_STDN = 7, // Sawtooth Down + ET_SPRNG = 8, // Spring + ET_DMPR = 9, // Damper + ET_INRT = 10, // Inertia + ET_FRCTN = 11, // Friction + ET_CSTM = 12, // Custom Force Data + }; + + public enum FFB_CTRL + { + CTRL_ENACT = 1, // Enable all device actuators. + CTRL_DISACT = 2, // Disable all the device actuators. + CTRL_STOPALL = 3, // Stop All Effects­ Issues a stop on every running effect. + CTRL_DEVRST = 4, // Device Reset– Clears any device paused condition, enables all actuators and clears all effects from memory. + CTRL_DEVPAUSE = 5, // Device Pause– The all effects on the device are paused at the current time step. + CTRL_DEVCONT = 6, // Device Continue– The all effects that running when the device was paused are restarted from their last time step. + }; + + public enum FFBOP + { + EFF_START = 1, // EFFECT START + EFF_SOLO = 2, // EFFECT SOLO START + EFF_STOP = 3, // EFFECT STOP + }; + + //namespace vJoyInterfaceWrap + //{ + [SuppressUnmanagedCodeSecurity] + public class VJoy + { + + /***************************************************/ + /*********** Various declarations ******************/ + /***************************************************/ + private static RemovalCbFunc UserRemCB; + private static WrapRemovalCbFunc wrf; + private static GCHandle hRemUserData; + + + private static FfbCbFunc UserFfbCB; + private static WrapFfbCbFunc wf; + private static GCHandle hFfbUserData; + + [StructLayout(LayoutKind.Sequential)] + public struct JoystickState + { + public byte bDevice; + public Int32 Throttle; + public Int32 Rudder; + public Int32 Aileron; + public Int32 AxisX; + public Int32 AxisY; + public Int32 AxisZ; + public Int32 AxisXRot; + public Int32 AxisYRot; + public Int32 AxisZRot; + public Int32 Slider; + public Int32 Dial; + public Int32 Wheel; + public Int32 AxisVX; + public Int32 AxisVY; + public Int32 AxisVZ; + public Int32 AxisVBRX; + public Int32 AxisVBRY; + public Int32 AxisVBRZ; + public UInt32 Buttons; + public UInt32 bHats; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx1; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx2; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 bHatsEx3; // Lower 4 bits: HAT switch or 16-bit of continuous HAT switch + public UInt32 ButtonsEx1; + public UInt32 ButtonsEx2; + public UInt32 ButtonsEx3; + }; + + [StructLayout(LayoutKind.Sequential)] + private struct FFB_DATA + { + private UInt32 size; + private UInt32 cmd; + private IntPtr data; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_CONSTANT + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public Int16 Magnitude; + } + + [System.Obsolete("use FFB_EFF_REPORT")] + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_CONST + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBEType EffectType; + [FieldOffset(8)] + public UInt16 Duration;// Value in milliseconds. 0xFFFF means infinite + [FieldOffset(10)] + public UInt16 TrigerRpt; + [FieldOffset(12)] + public UInt16 SamplePrd; + [FieldOffset(14)] + public Byte Gain; + [FieldOffset(15)] + public Byte TrigerBtn; + [FieldOffset(16)] + public bool Polar; // How to interpret force direction Polar (0-360°) or Cartesian (X,Y) + [FieldOffset(20)] + public Byte Direction; // Polar direction: (0x00-0xFF correspond to 0-360°) + [FieldOffset(20)] + public Byte DirX; // X direction: Positive values are To the right of the center (X); Negative are Two's complement + [FieldOffset(21)] + public Byte DirY; // Y direction: Positive values are below the center (Y); Negative are Two's complement + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_REPORT + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBEType EffectType; + [FieldOffset(8)] + public UInt16 Duration;// Value in milliseconds. 0xFFFF means infinite + [FieldOffset(10)] + public UInt16 TrigerRpt; + [FieldOffset(12)] + public UInt16 SamplePrd; + [FieldOffset(14)] + public Byte Gain; + [FieldOffset(15)] + public Byte TrigerBtn; + [FieldOffset(16)] + public bool Polar; // How to interpret force direction Polar (0-360°) or Cartesian (X,Y) + [FieldOffset(20)] + public Byte Direction; // Polar direction: (0x00-0xFF correspond to 0-360°) + [FieldOffset(20)] + public Byte DirX; // X direction: Positive values are To the right of the center (X); Negative are Two's complement + [FieldOffset(21)] + public Byte DirY; // Y direction: Positive values are below the center (Y); Negative are Two's complement + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_OP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public FFBOP EffectOp; + [FieldOffset(8)] + public Byte LoopCount; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_COND + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public bool isY; + [FieldOffset(8)] + public Int16 CenterPointOffset; // CP Offset: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(12)] + public Int16 PosCoeff; // Positive Coefficient: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(16)] + public Int16 NegCoeff; // Negative Coefficient: Range 0x80­0x7F (­10000 ­ 10000) + [FieldOffset(20)] + public UInt32 PosSatur; // Positive Saturation: Range 0x00­0xFF (0 – 10000) + [FieldOffset(24)] + public UInt32 NegSatur; // Negative Saturation: Range 0x00­0xFF (0 – 10000) + [FieldOffset(28)] + public Int32 DeadBand; // Dead Band: : Range 0x00­0xFF (0 – 10000) + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_ENVLP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public UInt16 AttackLevel; + [FieldOffset(8)] + public UInt16 FadeLevel; + [FieldOffset(12)] + public UInt32 AttackTime; + [FieldOffset(16)] + public UInt32 FadeTime; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_PERIOD + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public UInt32 Magnitude; + [FieldOffset(8)] + public Int16 Offset; + [FieldOffset(12)] + public UInt32 Phase; + [FieldOffset(16)] + public UInt32 Period; + } + + [StructLayout(LayoutKind.Explicit)] + public struct FFB_EFF_RAMP + { + [FieldOffset(0)] + public Byte EffectBlockIndex; + [FieldOffset(4)] + public Int16 Start; // The Normalized magnitude at the start of the effect + [FieldOffset(8)] + public Int16 End; // The Normalized magnitude at the end of the effect + } + + + /***************************************************/ + /***** Import from file vJoyInterface.dll (C) ******/ + /***************************************************/ + + ///// General driver data + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyVersion")] + private static extern short _GetvJoyVersion(); + + [DllImport("vJoyInterface.dll", EntryPoint = "vJoyEnabled")] + private static extern bool _vJoyEnabled(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyProductString")] + private static extern IntPtr _GetvJoyProductString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoyManufacturerString")] + private static extern IntPtr _GetvJoyManufacturerString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetvJoySerialNumberString")] + private static extern IntPtr _GetvJoySerialNumberString(); + + [DllImport("vJoyInterface.dll", EntryPoint = "DriverMatch")] + private static extern bool _DriverMatch(ref UInt32 DllVer, ref UInt32 DrvVer); + + ///// vJoy Device properties + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDButtonNumber")] + private static extern int _GetVJDButtonNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDDiscPovNumber")] + private static extern int _GetVJDDiscPovNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDContPovNumber")] + private static extern int _GetVJDContPovNumber(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisExist")] + private static extern UInt32 _GetVJDAxisExist(UInt32 rID, UInt32 Axis); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisMax")] + private static extern bool _GetVJDAxisMax(UInt32 rID, UInt32 Axis, ref long Max); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDAxisMin")] + private static extern bool _GetVJDAxisMin(UInt32 rID, UInt32 Axis, ref long Min); + + [DllImport("vJoyInterface.dll", EntryPoint = "isVJDExists")] + private static extern bool _isVJDExists(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetOwnerPid")] + private static extern int _GetOwnerPid(UInt32 rID); + + ///// Write access to vJoy Device - Basic + [DllImport("vJoyInterface.dll", EntryPoint = "AcquireVJD")] + private static extern bool _AcquireVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "RelinquishVJD")] + private static extern void _RelinquishVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "UpdateVJD")] + private static extern bool _UpdateVJD(UInt32 rID, ref JoystickState pData); + + [DllImport("vJoyInterface.dll", EntryPoint = "GetVJDStatus")] + private static extern int _GetVJDStatus(UInt32 rID); + + + //// Reset functions + [DllImport("vJoyInterface.dll", EntryPoint = "ResetVJD")] + private static extern bool _ResetVJD(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetAll")] + private static extern bool _ResetAll(); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetButtons")] + private static extern bool _ResetButtons(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "ResetPovs")] + private static extern bool _ResetPovs(UInt32 rID); + + ////// Write data + [DllImport("vJoyInterface.dll", EntryPoint = "SetAxis")] + private static extern bool _SetAxis(Int32 Value, UInt32 rID, HID_USAGES Axis); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetBtn")] + private static extern bool _SetBtn(bool Value, UInt32 rID, Byte nBtn); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetDiscPov")] + private static extern bool _SetDiscPov(Int32 Value, UInt32 rID, uint nPov); + + [DllImport("vJoyInterface.dll", EntryPoint = "SetContPov")] + private static extern bool _SetContPov(Int32 Value, UInt32 rID, uint nPov); + + [DllImport("vJoyInterface.dll", EntryPoint = "RegisterRemovalCB", CallingConvention = CallingConvention.Cdecl)] + private extern static void _RegisterRemovalCB(WrapRemovalCbFunc cb, IntPtr data); + + public delegate void RemovalCbFunc(bool complete, bool First, object userData); + public delegate void WrapRemovalCbFunc(bool complete, bool First, IntPtr userData); + + public static void WrapperRemCB(bool complete, bool First, IntPtr userData) + { + + object obj = null; + + if (userData != IntPtr.Zero) + { + // Convert userData from pointer to object + GCHandle handle2 = (GCHandle)userData; + obj = handle2.Target as object; + } + + // Call user-defined CB function + UserRemCB(complete, First, obj); + } + + // Force Feedback (FFB) + [DllImport("vJoyInterface.dll", EntryPoint = "FfbRegisterGenCB", CallingConvention = CallingConvention.Cdecl)] + private extern static void _FfbRegisterGenCB(WrapFfbCbFunc cb, IntPtr data); + + public delegate void FfbCbFunc(IntPtr data, object userData); + public delegate void WrapFfbCbFunc(IntPtr data, IntPtr userData); + + public static void WrapperFfbCB(IntPtr data, IntPtr userData) + { + + object obj = null; + + if (userData != IntPtr.Zero) + { + // Convert userData from pointer to object + GCHandle handle2 = (GCHandle)userData; + obj = handle2.Target as object; + } + + // Call user-defined CB function + UserFfbCB(data, obj); + } + + [DllImport("vJoyInterface.dll", EntryPoint = "FfbStart")] + private static extern bool _FfbStart(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "FfbStop")] + private static extern bool _FfbStop(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "IsDeviceFfb")] + private static extern bool _IsDeviceFfb(UInt32 rID); + + [DllImport("vJoyInterface.dll", EntryPoint = "IsDeviceFfbEffect")] + private static extern bool _IsDeviceFfbEffect(UInt32 rID, UInt32 Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DeviceID")] + private static extern UInt32 _Ffb_h_DeviceID(IntPtr Packet, ref int DeviceID); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Type")] + private static extern UInt32 _Ffb_h_Type(IntPtr Packet, ref FFBPType Type); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Packet")] + private static extern UInt32 _Ffb_h_Packet(IntPtr Packet, ref UInt32 Type, ref Int32 DataSize, ref IntPtr Data); + + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EBI")] + private static extern UInt32 _Ffb_h_EBI(IntPtr Packet, ref Int32 Index); + +#pragma warning disable 618 + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Const")] + private static extern UInt32 _Ffb_h_Eff_Const(IntPtr Packet, ref FFB_EFF_CONST Effect); +#pragma warning restore 618 + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Report")] + private static extern UInt32 _Ffb_h_Eff_Report(IntPtr Packet, ref FFB_EFF_REPORT Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DevCtrl")] + private static extern UInt32 _Ffb_h_DevCtrl(IntPtr Packet, ref FFB_CTRL Control); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EffOp")] + private static extern UInt32 _Ffb_h_EffOp(IntPtr Packet, ref FFB_EFF_OP Operation); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_DevGain")] + private static extern UInt32 _Ffb_h_DevGain(IntPtr Packet, ref Byte Gain); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Cond")] + private static extern UInt32 _Ffb_h_Eff_Cond(IntPtr Packet, ref FFB_EFF_COND Condition); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Envlp")] + private static extern UInt32 _Ffb_h_Eff_Envlp(IntPtr Packet, ref FFB_EFF_ENVLP Envelope); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Period")] + private static extern UInt32 _Ffb_h_Eff_Period(IntPtr Packet, ref FFB_EFF_PERIOD Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_EffNew")] + private static extern UInt32 _Ffb_h_EffNew(IntPtr Packet, ref FFBEType Effect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Ramp")] + private static extern UInt32 _Ffb_h_Eff_Ramp(IntPtr Packet, ref FFB_EFF_RAMP RampEffect); + + [DllImport("vJoyInterface.dll", EntryPoint = "Ffb_h_Eff_Constant")] + private static extern UInt32 _Ffb_h_Eff_Constant(IntPtr Packet, ref FFB_EFF_CONSTANT ConstantEffect); + + /***************************************************/ + /********** Export functions (C#) ******************/ + /***************************************************/ + + ///// General driver data + public short GetvJoyVersion() { return _GetvJoyVersion(); } + public bool vJoyEnabled() { return _vJoyEnabled(); } + public string GetvJoyProductString() { return Marshal.PtrToStringAuto(_GetvJoyProductString()); } + public string GetvJoyManufacturerString() { return Marshal.PtrToStringAuto(_GetvJoyManufacturerString()); } + public string GetvJoySerialNumberString() { return Marshal.PtrToStringAuto(_GetvJoySerialNumberString()); } + public bool DriverMatch(ref UInt32 DllVer, ref UInt32 DrvVer) { return _DriverMatch(ref DllVer, ref DrvVer); } + + ///// vJoy Device properties + public int GetVJDButtonNumber(uint rID) { return _GetVJDButtonNumber(rID); } + public int GetVJDDiscPovNumber(uint rID) { return _GetVJDDiscPovNumber(rID); } + public int GetVJDContPovNumber(uint rID) { return _GetVJDContPovNumber(rID); } + public bool GetVJDAxisExist(UInt32 rID, HID_USAGES Axis) + { + UInt32 res = _GetVJDAxisExist(rID, (uint)Axis); + if (res == 1) + return true; + else + return false; + } + public bool GetVJDAxisMax(UInt32 rID, HID_USAGES Axis, ref long Max) { return _GetVJDAxisMax(rID, (uint)Axis, ref Max); } + public bool GetVJDAxisMin(UInt32 rID, HID_USAGES Axis, ref long Min) { return _GetVJDAxisMin(rID, (uint)Axis, ref Min); } + public bool isVJDExists(UInt32 rID) { return _isVJDExists(rID); } + public int GetOwnerPid(UInt32 rID) { return _GetOwnerPid(rID); } + + ///// Write access to vJoy Device - Basic + public bool AcquireVJD(UInt32 rID) { return _AcquireVJD(rID); } + public void RelinquishVJD(uint rID) { _RelinquishVJD(rID); } + public bool UpdateVJD(UInt32 rID, ref JoystickState pData) { return _UpdateVJD(rID, ref pData); } + public VjdStat GetVJDStatus(UInt32 rID) { return (VjdStat)_GetVJDStatus(rID); } + + //// Reset functions + public bool ResetVJD(UInt32 rID) { return _ResetVJD(rID); } + public bool ResetAll() { return _ResetAll(); } + public bool ResetButtons(UInt32 rID) { return _ResetButtons(rID); } + public bool ResetPovs(UInt32 rID) { return _ResetPovs(rID); } + + ////// Write data + public bool SetAxis(Int32 Value, UInt32 rID, HID_USAGES Axis) { return _SetAxis(Value, rID, Axis); } + public bool SetBtn(bool Value, UInt32 rID, uint nBtn) { return _SetBtn(Value, rID, (Byte)nBtn); } + public bool SetDiscPov(Int32 Value, UInt32 rID, uint nPov) { return _SetDiscPov(Value, rID, nPov); } + public bool SetContPov(Int32 Value, UInt32 rID, uint nPov) { return _SetContPov(Value, rID, nPov); } + + // Register CB function that takes a C# object as userdata + public void RegisterRemovalCB(RemovalCbFunc cb, object data) + { + // Free existing GCHandle (if exists) + if (hRemUserData.IsAllocated && hRemUserData.Target != null) + hRemUserData.Free(); + + // Convert object to pointer + hRemUserData = GCHandle.Alloc(data); + + // Apply the user-defined CB function + UserRemCB = new RemovalCbFunc(cb); + wrf = new WrapRemovalCbFunc(WrapperRemCB); + + _RegisterRemovalCB(wrf, (IntPtr)hRemUserData); + } + + // Register CB function that takes a pointer as userdata + public void RegisterRemovalCB(WrapRemovalCbFunc cb, IntPtr data) + { + wrf = new WrapRemovalCbFunc(cb); + _RegisterRemovalCB(wrf, data); + } + + + ///////////////////////////////////////////////////////////////////////////////////////////// + //// Force Feedback (FFB) + + // Register CB function that takes a C# object as userdata + public void FfbRegisterGenCB(FfbCbFunc cb, object data) + { + // Free existing GCHandle (if exists) + if (hFfbUserData.IsAllocated && hFfbUserData.Target != null) + hFfbUserData.Free(); + + // Convert object to pointer + hFfbUserData = GCHandle.Alloc(data); + + // Apply the user-defined CB function + UserFfbCB = new FfbCbFunc(cb); + wf = new WrapFfbCbFunc(WrapperFfbCB); + + _FfbRegisterGenCB(wf, (IntPtr)hFfbUserData); + } + + // Register CB function that takes a pointer as userdata + public void FfbRegisterGenCB(WrapFfbCbFunc cb, IntPtr data) + { + wf = new WrapFfbCbFunc(cb); + _FfbRegisterGenCB(wf, data); + } + + [Obsolete("you can remove the function from your code")] + public bool FfbStart(UInt32 rID) { return _FfbStart(rID); } + [Obsolete("you can remove the function from your code")] + public bool FfbStop(UInt32 rID) { return _FfbStop(rID); } + public bool IsDeviceFfb(UInt32 rID) { return _IsDeviceFfb(rID); } + public bool IsDeviceFfbEffect(UInt32 rID, UInt32 Effect) { return _IsDeviceFfbEffect(rID, Effect); } + public UInt32 Ffb_h_DeviceID(IntPtr Packet, ref int DeviceID) { return _Ffb_h_DeviceID(Packet, ref DeviceID); } + public UInt32 Ffb_h_Type(IntPtr Packet, ref FFBPType Type) { return _Ffb_h_Type(Packet, ref Type); } + public UInt32 Ffb_h_Packet(IntPtr Packet, ref UInt32 Type, ref Int32 DataSize, ref Byte[] Data) + { + IntPtr buf = IntPtr.Zero; + UInt32 res = _Ffb_h_Packet(Packet, ref Type, ref DataSize, ref buf); + if (res != 0) + return res; + + DataSize -= 8; + Data = new byte[DataSize]; + Marshal.Copy(buf, Data, 0, DataSize); + return res; + } + public UInt32 Ffb_h_EBI(IntPtr Packet, ref Int32 Index) { return _Ffb_h_EBI(Packet, ref Index); } + [Obsolete("use Ffb_h_Eff_Report instead")] + public UInt32 Ffb_h_Eff_Const(IntPtr Packet, ref FFB_EFF_CONST Effect) { return _Ffb_h_Eff_Const(Packet, ref Effect); } + public UInt32 Ffb_h_Eff_Report(IntPtr Packet, ref FFB_EFF_REPORT Effect) { return _Ffb_h_Eff_Report(Packet, ref Effect); } + public UInt32 Ffb_h_DevCtrl(IntPtr Packet, ref FFB_CTRL Control) { return _Ffb_h_DevCtrl(Packet, ref Control); } + public UInt32 Ffb_h_EffOp(IntPtr Packet, ref FFB_EFF_OP Operation) { return _Ffb_h_EffOp(Packet, ref Operation); } + public UInt32 Ffb_h_DevGain(IntPtr Packet, ref Byte Gain) { return _Ffb_h_DevGain(Packet, ref Gain); } + public UInt32 Ffb_h_Eff_Cond(IntPtr Packet, ref FFB_EFF_COND Condition) { return _Ffb_h_Eff_Cond(Packet, ref Condition); } + public UInt32 Ffb_h_Eff_Envlp(IntPtr Packet, ref FFB_EFF_ENVLP Envelope) { return _Ffb_h_Eff_Envlp(Packet, ref Envelope); } + public UInt32 Ffb_h_Eff_Period(IntPtr Packet, ref FFB_EFF_PERIOD Effect) { return _Ffb_h_Eff_Period(Packet, ref Effect); } + public UInt32 Ffb_h_EffNew(IntPtr Packet, ref FFBEType Effect) { return _Ffb_h_EffNew(Packet, ref Effect); } + public UInt32 Ffb_h_Eff_Ramp(IntPtr Packet, ref FFB_EFF_RAMP RampEffect) { return _Ffb_h_Eff_Ramp(Packet, ref RampEffect); } + public UInt32 Ffb_h_Eff_Constant(IntPtr Packet, ref FFB_EFF_CONSTANT ConstantEffect) { return _Ffb_h_Eff_Constant(Packet, ref ConstantEffect); } + } + //} + + public class vJoyFeeder + { + private static readonly object vJoyLocker = new object(); + + static bool[] vJoyInitialized = new bool[2] { false, false }; + static bool[] vJoyAvailable = new bool[2] { false, false }; + static VJoy[] vJoyObj = new VJoy[2] { null, null }; + + vJoyFeeder() + { + // Do nothing + } + + ~vJoyFeeder() + { + // Do nothing + } + + public static void InitializeVJoyDevice(uint vJoyID, HID_USAGES axis) + { + lock (vJoyLocker) + { + if (vJoyInitialized[vJoyID - 1]) return; + + vJoyInitialized[vJoyID - 1] = true; + AppLogger.LogToGui("Initializing VJoy virtual joystick driver via vJoyInterface.dll interface", false); + + try + { + VJoy currVJoy; + + if (vJoyObj[vJoyID - 1] == null) vJoyObj[vJoyID - 1] = new VJoy(); + currVJoy = vJoyObj[vJoyID - 1]; + + if (currVJoy.vJoyEnabled() && currVJoy.GetVJDAxisExist(vJoyID, axis)) + { + AppLogger.LogToGui("Connection to VJoy virtual joystick established", false); + AppLogger.LogToGui($"VJoy driver. Vendor={currVJoy.GetvJoyManufacturerString()} Product={currVJoy.GetvJoyProductString()} Version={currVJoy.GetvJoySerialNumberString()} Device#={vJoyID} Axis={axis}", false); + + // Test if DLL matches the driver + UInt32 DllVer = 0, DrvVer = 0; + if (!currVJoy.DriverMatch(ref DllVer, ref DrvVer)) + AppLogger.LogToGui("WARNING. VJoy version of Driver {DrvVer}) does not match interface DLL Version {DllVer}. This may lead to unexpected problems or crashes. Update VJoy driver and vJoyInterface.dll", false); + + VjdStat status = currVJoy.GetVJDStatus(vJoyID); + if ((status == VjdStat.VJD_STAT_OWN) || ((status == VjdStat.VJD_STAT_FREE) && (!currVJoy.AcquireVJD(vJoyID)))) + { + vJoyAvailable[vJoyID - 1] = false; + AppLogger.LogToGui("ERROR. Failed to acquire vJoy device# {vJoyID}. Use another VJoy device or make sure there are no other VJoy feeder apps using the same device", false); + } + else + { + //vJoyObj.GetVJDAxisMax(vJoyID, axis, ref vJoyAxisMaxValue); + //AppLogger.LogToGui($"VJoy axis {axis} max value={vJoyAxisMaxValue}", false); + currVJoy.ResetVJD(vJoyID); + vJoyAvailable[vJoyID - 1] = true; + } + } + else + { + vJoyAvailable[vJoyID - 1] = false; + AppLogger.LogToGui($"ERROR. VJoy device# {vJoyID} or {axis} axis not available. Check vJoy driver installation and configuration", false); + } + } + catch + { + vJoyAvailable[vJoyID - 1] = false; + AppLogger.LogToGui("ERROR. vJoy initialization failed. Make sure that DS4Windows application can find vJoyInterface.dll library file", false); + } + } + } + + // Feed axis value to VJoy virtual joystic driver (DS4Windows sixaxis (SA) motion sensor steering wheel emulation feature can optionally feed VJoy analog axis instead of ScpVBus x360 axis + public static void FeedAxisValue(int value, uint vJoyID, HID_USAGES axis) + { + if (vJoyAvailable[vJoyID - 1]) + { + vJoyObj[vJoyID - 1].SetAxis(value, vJoyID, axis); + } + else if (!vJoyInitialized[vJoyID - 1]) + { + // If this was the first call to this FeedAxisValue function and VJoy driver connection is not yet initialized + // then try to do it now. Subsequent calls will see the the vJoy as available (if connection succeeded) and + // there is no need to re-initialize the connection everytime the feeder is used. + InitializeVJoyDevice(vJoyID, axis); + } + } + } +} diff --git a/DS4Windows/app.config b/DS4Windows/app.config deleted file mode 100644 index d1428ad712..0000000000 --- a/DS4Windows/app.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/DS4Windows/app.manifest b/DS4Windows/app.manifest index c87b5ff1d7..291591d8dc 100644 --- a/DS4Windows/app.manifest +++ b/DS4Windows/app.manifest @@ -23,12 +23,12 @@ - + - + @@ -49,11 +49,13 @@ DPIs. Windows Presentation Foundation (WPF) applications are automatically DPI-aware and do not need to opt in. Windows Forms applications targeting .NET Framework 4.6 that opt into this setting, should also set the 'EnableWindowsFormsHighDpiAutoResizing' setting to 'true' in their app.config. --> + + + + + True + 0 + True + 0,0,255 + 100 + 0 + DS4Win + False + 0 + 0 + 100 + 0,0,0 + 0,0,0 + 0,0,0 + True + False + 0 + False + 0 + 0 + 0 + 0 + False + 0 + 0 + 100 + 100 + 100 + 100 + 25 + 0.008 + 0 + 100 + 10 + 10 + 20 + 20 + 100 + 100 + 100 + 100 + 100 + 100 + False + False + Radial + Radial + + 10 + 10 + 100 + 100 + 20 + 20 + 100 + 100 + + + 10 + 10 + 100 + 100 + 20 + 20 + 100 + 100 + + 0 + 0 + 0 + 0 + 75 + 75 + False + False + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + 0.25 + 0.25 + 100 + 100 + 0 + 0 + 1|1|1|1|1|1 + 0 + False + 100 + + True + False + Mouse + -1 + and + None + 360 + 0 + + False + 0.1 + 0.1 + + -1 + 100 + 100 + 0 + True + + -1 + and + True + False + + + False + none + 50 + 1 + 0.7 + + 0 + 10 + 1 + False + True + Controls + -1 + and + True + 0 + 30 + 830 + RightStick + XY + 0.4 + 0.4 + 0 + False + 100 + False + 100 + False + + False + none + 50 + 0.4 + 0.7 + + + 80 + 80 + -1 + and + True + Yaw + 0 + + 4 + linear + + linear + + False + False + 5 + 5 + False + False + 135 + 135 + 50 + 50 + Controls + Controls + + + 5.3 + 0.9 + 0.1 + 0 + + + + + 5.3 + 0.9 + 0.1 + 0 + + + + + Accurate + False + 0 + + + linear + + Disabled + Disabled + 100 + 100 + None + None + linear + + linear + + linear + + True + 10 + 0 + 1 + + 90 + 90 + False + + + 0 + 8 + RightStick + XY + 0.4 + 0.4 + 0 + 100 + False + 100 + Linear + 0 + + None + 0.8 + 0.7 + + + Click + + 1 + 1 + 0.5 + 0.5 + 0 + True + + X360 + Disconnect Controller + + + + +"; + #endregion + } + + /// + /// Never mind. Mapping is not testable due to hard dependency on the + /// ControlService class. Does not help Mapping is static. + /// Too bulky. Don't bother + /// + public void CheckMappingConversion() + { + // Test profile reading. Will fail if an XML exception is thrown + XmlSerializer serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using StringReader sr = new StringReader(testProfileXml); + ProfileDTO dto = serializer.Deserialize(sr) as ProfileDTO; + dto.DeviceIndex = 8; // Use test slot + dto.MapTo(Global.store); + + // Test input state to use + DS4State inputState = new DS4State() + { + Square = true, + LX = 255, + LY = 128, + RX = 0, + RY = 255, + }; + + // Just use reference + DS4State cState = inputState; + + DS4State outState = new DS4State(); + DS4StateExposed exposedState = new DS4StateExposed(inputState); + cState = Mapping.SetCurveAndDeadzone(8, cState, outState); + + // Stopping point. Hard dependency on ControlService class + //Mapping.MapCustom(ind, cState, tempMapState, ExposedState[ind], touchPad[ind], this); + } + } +} diff --git a/DS4WindowsTests/ProfileMigrationTests.cs b/DS4WindowsTests/ProfileMigrationTests.cs new file mode 100644 index 0000000000..11a815bf7f --- /dev/null +++ b/DS4WindowsTests/ProfileMigrationTests.cs @@ -0,0 +1,457 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + + +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using DS4Windows; +using DS4WinWPF.DS4Control.DTOXml; + +namespace DS4WindowsTests +{ + [TestClass] + public class ProfileMigrationTests + { + private const int EXPECTED_JAYS_MIGRATED_VERSION = 5; + private string ds4winJays2KingsOldProfile = string.Empty; + private string ds4winJays2KingsExpectedMigratedProfile = string.Empty; + + public ProfileMigrationTests() + { + #region TempDS4WinProfileXML + ds4winJays2KingsOldProfile = @" + + + True + 0 + 0,0,255 + 100 + False + 0 + 0 + 100 + 0,0,0 + 0,0,0 + 0,0,0 + True + False + 0 + False + 0 + 0 + 0 + 25 + 0 + 0 + 0 + 0.25 + 0.25 + 1|1|1|1|1|1 + 0 + True + + + False + False + False + False + + + 100 + 0 + 0 + 0 + Disconnect Controller + + +"; + + ds4winJays2KingsExpectedMigratedProfile = @" + + + True + 0 + True + 0,0,255 + 100 + 0 + DS4Win + False + 0 + 0 + 100 + 0,0,0 + 0,0,0 + 0,0,0 + True + False + 0 + False + 0 + 0 + 0 + 0 + False + 0 + 0 + 100 + 100 + 100 + 100 + 25 + 0.008 + 0 + 100 + 10 + 10 + 20 + 20 + 100 + 100 + 100 + 100 + 100 + 100 + False + False + Radial + Radial + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + 0 + 0 + 0 + 0 + 75 + 75 + False + False + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + 0.25 + 0.25 + 100 + 100 + 0 + 0 + 1|1|1|1|1|1 + 0 + True + 100 + + False + False + Mouse + + and + None + 360 + 0 + + False + 0.1 + 0.1 + + -1 + 100 + 100 + 0 + True + + -1 + and + True + False + + + False + one-euro + 50 + 0.4 + 0.7 + + 0 + 10 + 1 + False + True + Controls + -1 + and + True + 0 + 30 + 830 + None + None + 0.4 + 0.4 + 0 + False + 100 + False + 100 + False + + False + one-euro + 50 + 0.4 + 0.7 + + + 80 + 80 + -1 + and + True + Yaw + 0 + + 4 + linear + linear + False + False + 5 + 5 + False + False + 135 + 135 + 50 + 50 + Controls + Controls + + + 0 + 0 + 0 + 0 + + + + + 0 + 0 + 0 + 0 + + + + + Accurate + False + 0 + + + linear + Disabled + Disabled + 100 + 100 + None + None + linear + linear + linear + False + 10 + 0 + 1 + + 90 + 90 + False + + + 0 + 8 + RightStick + XY + 0.4 + 0.4 + 0 + 100 + False + 100 + Linear + 0 + + None + 0.8 + 0.7 + + + Click + + 1 + 1 + 0.5 + 0.5 + 0 + True + + X360 + Disconnect Controller + + +"; + #endregion + } + + private void Setup() + { + + } + + [TestMethod] + public void CheckMigration() + { + ProfileMigration migration = new ProfileMigration(ds4winJays2KingsOldProfile); + bool requiredMigration = migration.RequiresMigration(); + + Assert.AreEqual(true, requiredMigration); + + migration.Migrate(); + string profileXml = migration.CurrentMigrationText; + + Assert.AreEqual(true, !string.IsNullOrEmpty(profileXml)); + + migration.ProfileReader.MoveToContent(); + string temp = migration.ProfileReader.GetAttribute("config_version"); + int configFileVersion = 0; + if (!string.IsNullOrEmpty(temp)) + { + int.TryParse(temp, out configFileVersion); + } + + Assert.AreEqual(EXPECTED_JAYS_MIGRATED_VERSION, configFileVersion); + + migration.Close(); + } + + [TestMethod] + public void CheckJaysProfileRead() + { + ProfileMigration migration = new ProfileMigration(ds4winJays2KingsOldProfile); + migration.Migrate(); + string profileXml = migration.CurrentMigrationText; + migration.Close(); + + Assert.AreEqual(true, !string.IsNullOrEmpty(profileXml)); + + // Test profile reading. Will fail if an XML exception is thrown + XmlSerializer serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using StringReader sr = new StringReader(profileXml); + BackingStore tempStore = new BackingStore(); + ProfileDTO dto = serializer.Deserialize(sr) as ProfileDTO; + dto.DeviceIndex = 0; // Use default slot + dto.MapTo(tempStore); + + // Check ColorString to test if profile elements were read at all + Assert.AreEqual("0,0,255", dto.ColorString); + DS4Color profileColor = tempStore.lightbarSettingInfo[0].ds4winSettings.m_Led; + Assert.AreEqual("0,0,255", + $"{profileColor.red},{profileColor.green},{profileColor.blue}"); + + // Test if output device type has been set properly. Uses default value from ProfileDTO + Assert.AreEqual(OutContType.X360, tempStore.outputDevType[0]); + Assert.AreEqual(BackingStore.DEFAULT_DINPUT_ONLY, tempStore.dinputOnly[0]); + + // Check that profile migration worked as expected + string testMigratedProfileStr = ObtainConvertedJaysXML(tempStore); + Assert.AreEqual(ds4winJays2KingsExpectedMigratedProfile, testMigratedProfileStr); + } + + private string ObtainConvertedJaysXML(BackingStore tempStore) + { + string testStr = string.Empty; + XmlSerializer serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using (Utf8StringWriter strWriter = new Utf8StringWriter()) + { + using XmlWriter xmlWriter = XmlWriter.Create(strWriter, + new XmlWriterSettings() + { + Encoding = Encoding.UTF8, + Indent = true, + }); + + // Write header explicitly + //xmlWriter.WriteStartDocument(); + //xmlWriter.WriteComment(string.Format(" DS4Windows Configuration Data. {0} ", DateTime.Now)); + //xmlWriter.WriteComment(string.Format(" Made with DS4Windows version {0} ", Global.exeversion)); + xmlWriter.WriteWhitespace("\r\n"); + xmlWriter.WriteWhitespace("\r\n"); + + // Write root element and children + ProfileDTO dto = new ProfileDTO(); + dto.DeviceIndex = 0; // Use default slot + dto.SerializeAppAttrs = false; + dto.MapFrom(tempStore); + // Omit xmlns:xsi and xmlns:xsd from output + serializer.Serialize(xmlWriter, dto, + new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty })); + xmlWriter.Flush(); + xmlWriter.Close(); + + testStr = strWriter.ToString(); + //Trace.WriteLine("TEST OUTPUT"); + //Trace.WriteLine(testStr); + } + + return testStr; + } + } +} diff --git a/DS4WindowsTests/ProfileTests.cs b/DS4WindowsTests/ProfileTests.cs new file mode 100644 index 0000000000..5b39a4d98c --- /dev/null +++ b/DS4WindowsTests/ProfileTests.cs @@ -0,0 +1,382 @@ +/* +DS4Windows +Copyright (C) 2023 Travis Nickles + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ + +using System.Text; +using System.Xml; +using System.Xml.Serialization; +using DS4Windows; +using DS4WinWPF.DS4Control.DTOXml; + +namespace DS4WindowsTests +{ + [TestClass] + public class ProfileTests + { + private string defaultProfileXml = string.Empty; + + public ProfileTests() + { + #region ProfileXMLString + // + //< !--Made with DS4Windows version 3.2.20-- > + //app_version=""3.2.20"" config_version=""5"" + defaultProfileXml = @" + + + True + 0 + True + 0,0,255 + 100 + 0 + DS4Win + False + 0 + 0 + 100 + 0,0,0 + 0,0,0 + 0,0,0 + True + False + 0 + False + 0 + 0 + 0 + 0 + False + 0 + 0 + 100 + 100 + 100 + 100 + 25 + 0.008 + 0 + 100 + 10 + 10 + 20 + 20 + 100 + 100 + 100 + 100 + 100 + 100 + False + False + Radial + Radial + + 10 + 10 + 100 + 100 + 20 + 20 + 100 + 100 + + + 10 + 10 + 100 + 100 + 20 + 20 + 100 + 100 + + 8 + 0 + 0 + 0 + 75 + 75 + False + False + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + + False + 4 + 0.2 + 0.01 + 0.2 + 1 + + 0.25 + 0.25 + 100 + 100 + 0 + 0 + 1|1|1|1|1|1 + 0 + False + 100 + + False + False + Controls + -1 + and + None + 360 + 0 + + False + 0.1 + 0.1 + + -1 + 100 + 100 + 0 + True + + -1 + and + True + False + + + False + none + 50 + 1 + 0.7 + + 0 + 10 + 1 + False + True + Controls + -1 + and + True + 0 + 30 + 830 + RightStick + XY + 0.4 + 0.4 + 0 + False + 100 + False + 100 + False + + False + none + 50 + 0.4 + 0.7 + + + 80 + 80 + -1 + and + True + Yaw + 0 + + 4 + linear + + linear + + False + False + 5 + 5 + False + False + 135 + 135 + 50 + 50 + Controls + Controls + + + 5.3 + 0.9 + 0.1 + 0 + + + + + 5.3 + 0.9 + 0.1 + 0 + + + + + Accurate + False + 0 + + + linear + + Disabled + Disabled + 100 + 100 + None + None + linear + + linear + + linear + + False + 10 + 0 + 1 + + 90 + 90 + False + + + 0 + 8 + RightStick + XY + 0.4 + 0.4 + 0 + 100 + False + 100 + Linear + 0 + + None + 0.8 + 0.7 + + + Click + + 1 + 1 + 0.5 + 0.5 + 0 + True + + X360 + Disconnect Controller + + +"; + #endregion + } + + + [TestMethod] + public void CheckReadProfile() + { + // Test profile reading. Will fail if an XML exception is thrown + XmlSerializer serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using StringReader sr = new StringReader(defaultProfileXml); + BackingStore tempStore = new BackingStore(); + ProfileDTO dto = serializer.Deserialize(sr) as ProfileDTO; + dto.DeviceIndex = 0; // Use default slot + dto.MapTo(tempStore); + + // Check settings + Assert.AreEqual(OutContType.X360, dto.OutputContDevice); + Assert.AreEqual(OutContType.X360, tempStore.outputDevType[0]); + } + + [TestMethod] + public void CheckWriteProfile() + { + BackingStore tempStore = new BackingStore(); + // Test profile reading. Will fail if an XML exception is thrown + XmlSerializer serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using (StringReader sr = new StringReader(defaultProfileXml)) + { + ProfileDTO dto = serializer.Deserialize(sr) as ProfileDTO; + dto.DeviceIndex = 0; // Use default slot + dto.MapTo(tempStore); + } + + string testStr = string.Empty; + serializer = new XmlSerializer(typeof(ProfileDTO), + ProfileDTO.GetAttributeOverrides()); + using (Utf8StringWriter strWriter = new Utf8StringWriter()) + { + using XmlWriter xmlWriter = XmlWriter.Create(strWriter, + new XmlWriterSettings() + { + Encoding = Encoding.UTF8, + Indent = true, + }); + + // Write header explicitly + //xmlWriter.WriteStartDocument(); + //xmlWriter.WriteComment(string.Format(" DS4Windows Configuration Data. {0} ", DateTime.Now)); + //xmlWriter.WriteComment(string.Format(" Made with DS4Windows version {0} ", Global.exeversion)); + xmlWriter.WriteWhitespace("\r\n"); + xmlWriter.WriteWhitespace("\r\n"); + + // Write root element and children + ProfileDTO dto = new ProfileDTO(); + dto.DeviceIndex = 0; // Use default slot + dto.SerializeAppAttrs = false; + dto.MapFrom(tempStore); + // Omit xmlns:xsi and xmlns:xsd from output + serializer.Serialize(xmlWriter, dto, + new XmlSerializerNamespaces(new[] { XmlQualifiedName.Empty })); + xmlWriter.Flush(); + xmlWriter.Close(); + + testStr = strWriter.ToString(); + //Trace.WriteLine("TEST OUTPUT"); + //Trace.WriteLine(testStr); + } + + Assert.AreEqual(true, !string.IsNullOrEmpty(testStr)); + Assert.AreEqual(defaultProfileXml, testStr); + } + } +} diff --git a/DS4WindowsWPF.sln b/DS4WindowsWPF.sln new file mode 100644 index 0000000000..627be20ed8 --- /dev/null +++ b/DS4WindowsWPF.sln @@ -0,0 +1,39 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio Version 17 +VisualStudioVersion = 17.8.34322.80 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DS4WinWPF", "DS4Windows\DS4WinWPF.csproj", "{0135A24D-5DBB-483C-9FC5-9A869E23DA9A}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DS4WindowsTests", "DS4WindowsTests\DS4WindowsTests.csproj", "{6BEB9062-56E7-4A0D-9243-BE43F09A711D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Debug|x64.ActiveCfg = Debug|x64 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Debug|x64.Build.0 = Debug|x64 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Debug|x86.ActiveCfg = Debug|x86 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Debug|x86.Build.0 = Debug|x86 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Release|x64.ActiveCfg = Release|x64 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Release|x64.Build.0 = Release|x64 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Release|x86.ActiveCfg = Release|x86 + {0135A24D-5DBB-483C-9FC5-9A869E23DA9A}.Release|x86.Build.0 = Release|x86 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Debug|x64.ActiveCfg = Debug|x64 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Debug|x64.Build.0 = Debug|x64 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Debug|x86.ActiveCfg = Debug|x86 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Debug|x86.Build.0 = Debug|x86 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Release|x64.ActiveCfg = Release|x64 + {6BEB9062-56E7-4A0D-9243-BE43F09A711D}.Release|x86.ActiveCfg = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {2BE30981-376A-4DEA-B2B1-247BADB864FC} + EndGlobalSection +EndGlobal diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000000..f288702d2f --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + Copyright (C) + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. diff --git a/NOTICE.txt b/NOTICE.txt new file mode 100644 index 0000000000..e087f4bbd3 --- /dev/null +++ b/NOTICE.txt @@ -0,0 +1,15 @@ +This project includes the source code of some third party projects. This file +will attempt to document some third party source code that is used in the +DS4Windows source code and state the original source. + +Crc32: +https://github.com/dariogriffo/Crc32 + +Font Awesome: +https://fontawesome.com/license + +1€ Filter (C# version): +http://cristal.univ-lille.fr/~casiez/1euro/OneEuroFilter.cs + +vJoyInterfaceCS: +https://github.com/shauleiz/vJoy/tree/master/apps/common/vJoyInterfaceCS diff --git a/README.md b/README.md index 1c72831a3b..9035ba8d4d 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,42 @@ # DS4Windows -Like those other ds4tools, but sexier. -DS4Windows is a portable program that allows you to get the best experience while using a DualShock 4 on your PC. By emulating a Xbox 360 controller, many more games are accessible. +Like those other DS4 tools, but sexier. -You can find the latest and older versions [here](https://github.com/Jays2Kings/DS4Windows/releases) +DS4Windows is an extract anywhere program that allows you to get the best +DualShock 4 experience on your PC. By emulating an Xbox 360 controller, many +more games are accessible. Other input controllers are also supported including the +DualSense, Switch Pro, and JoyCon controllers (**first party hardware only**). -## Requirements +This project is a fork of the work of Jays2Kings. + +![DS4Windows Preview](https://raw.githubusercontent.com/Ryochan7/DS4Windows/jay/ds4winwpf_screen_20200412.png) + +## License + +DS4Windows is licensed under the terms of the GNU General Public License version 3. +You can find a copy of the terms and conditions of that license at +[https://www.gnu.org/licenses/gpl-3.0.txt](https://www.gnu.org/licenses/gpl-3.0.txt). The license is also +available in this source code from the COPYING file. -[Microsoft .NET 4.5 or higher (needed to unzip the driver and for macros to work properly)](http://www.microsoft.com/en-us/download/details.aspx?id=42642) -DS4 Driver (Downloaded & Installed with DS4Windows) -Microsoft 360 Driver (link inside DS4Windows, already installed on Windows 7 SP1 and higher or if you've used a 360 controller before) -Sony DualShock 4 (This should be obvious) -Micro USB cable -(Optional)Bluetooth 2.1+, via adapter or built in pc [(My recommendation)](http://www.amazon.com/gp/product/B004LNXO28/ref=oh_aui_search_detailpage?ie=UTF8&psc=1) (Toshiba's bluetooth & Bluetooth adapters using CSR currently does not work) +## Downloads + +- **[Main builds of DS4Windows](https://github.com/Ryochan7/DS4Windows/releases)** + +## Requirements -Note: Hide DS4 currently doesn't work on Windows 10 without a workaround (disabling Network list service and restarting, but this causes serious issues with windows, use caution) -You can find more info out at [ds4windows.com](http://ds4windows.com) +- Windows 10 or newer (Thanks Microsoft) +- Microsoft .NET 8.0 Desktop Runtime. [x64](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-x64-installer) or [x86](https://dotnet.microsoft.com/en-us/download/dotnet/thank-you/runtime-desktop-8.0.0-windows-x86-installer) +- Visual C++ 2015-2022 Redistributable. [x64](https://aka.ms/vs/17/release/vc_redist.x64.exe) or [x86](https://aka.ms/vs/17/release/vc_redist.x86.exe) +- [ViGEmBus](https://vigem.org/) driver (DS4Windows will install it for you) +- **Sony** DualShock 4 or other supported controller +- Connection method: + - Micro USB cable + - [Sony Wireless Adapter](https://www.amazon.com/gp/product/B01KYVLKG2) + - Bluetooth 4.0 (via an + [adapter like this](https://www.newegg.com/Product/Product.aspx?Item=N82E16833166126) + or built in pc). Only use of Microsoft BT stack is supported. CSR BT stack is + confirmed to not work with the DS4 even though some CSR adapters work fine + using Microsoft BT stack. Toshiba's adapters currently do not work. + *Disabling 'Enable output data' in the controller profile settings might help with latency issues, but will disable lightbar and rumble support.* +- Disable **PlayStation Configuration Support** and +**Xbox Configuration Support** options in Steam diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000000..2bed421497 --- /dev/null +++ b/TODO.md @@ -0,0 +1,14 @@ +# TODO + +* ~~Change stick coordinate clamping for JoyCon. Make initial center offset on first input?~~ +* ~~Expose extra SL and SR buttons for JoyCon Joined mode. Keep using normal SL and SR for Split mode~~ +* ~~Add hooks to keep track of active display monitors for Absolute Mouse~~ +* ~~Figure out desired options for Absolute Mouse support~~ +* ~~Add absolute mouse options for various output types (Sticks and Touchpad)~~ +* ~~Add more localization ready strings~~ +* Try to add some form of Action Set support. Really missing playing Mass Effect 1 and 2 +* ~~Add rotation option for Touchpad Mouse Joystick~~ +* ~~Experiment with XmlSerializer class for reading Profiles.xml data~~ +* ~~Re-check Switch Pro and JoyCon rumble frequency interpretation~~ +* ~~Attempt to add stick delta acceleration for mouse output. Kind of missing that option from my old experiments~~ + diff --git a/USERGUIDE.md b/USERGUIDE.md new file mode 100644 index 0000000000..1957286492 --- /dev/null +++ b/USERGUIDE.md @@ -0,0 +1,114 @@ +## User Guide +After completing the initial setup of the required drivers and dependencies, you are greeted with the main DS4Windows tab, controllers. + +### Controllers +![Controller Tab](https://user-images.githubusercontent.com/32114370/189562818-8e2d5e0a-3c61-4eb0-a53c-caa731b120e4.png) + +Here all of the conected controllers are shown. Hovering your mouse over the Controller's ID will display the input delay of the specificed controller. + +![Input Delay Screenshot](https://user-images.githubusercontent.com/32114370/189563985-e18c074e-3caf-49a7-af36-ed12d77f88c6.png) + +The Link Profile/ID checkbox allows you to link a specified profile to a certain Controller ID so that when you plug in the controller next time the Selected Profile will always be applied to it. This is helpful if you use more than one controller. The edit button will take you to the Profiles tab to edit the Selected Profile. You can also use the dropdown to create a new profile. + +### Profiles + +![Profile Tab Screenshot](https://user-images.githubusercontent.com/32114370/189564567-f73805f8-e16a-4a0a-a7ca-619509b10b56.png) + +The **Profiles** tab displays all the profiles created. Profiles can be used to assign different settings for your controller for different circumstances. Along with creating new profiles, editing, renaming, deleting, and renaming, you can also import other profiles, and export your's for sharing with friends. When creating a new profile, it is recommended to use a preset option. For the output method, it must be chosen accordingly to what you want Windows to recognize the controller as. + +For Example: + +- You have a Pro Controller and want to use PS Remote Play with gyro? You need to choose DualShock 4 Output and adjust the profile for Gyro passthrough +- You have any of the supported controllers and want to play Celest, which only supports XInput devices? Set the Output to Xbox 360 +- You have a fake DS4 controller that is not recognized as an official one, but want to play Witcher 3 with lightbar support and PS glyphs/icons? Then choose DualShock 4 Output and adjust for lightbar passthrough + +![Output Controller Prompt Screenshot](https://user-images.githubusercontent.com/32114370/189565494-3bd6b11f-7298-4180-824e-7cde49daebb7.png) + +On the resulting screen is where you can fully customize the new profile. + + + +The **Controls** tab is for remapping the controller button outputs. To open the page below, click on the desired button to remap on the image of the controller. Then select the desired new output for that input. + + + +The **Special Actions** tab allows you to create actions that are triggered when a button or combination of button presses occur. + +The **Controller Readings** tab gives a live readout of the data from the joysticks being transmitted to DS4Windows + +The **Axis Config** tab allows you to adjust the settings of the joysticks and adjust parameters such as deadzone and sensativity. + +The **Lightbar** tab allows you to change the color of the lighbar on DualShock 4 controllers. + +The **Touchpad** tab allows configuration of the touchpad on DualShock 4 controllers to be output as mouse or controller movement. + +The **Gyro** tab contains the gyro settings and allows you to assign specfic commands to certain tiling actions. + +The **Other** tab contains the settings for which controller is being emulated, rumble percentage, and the polling rate. + +### Auto Profiles +![Auto Profiles Screenshot](https://user-images.githubusercontent.com/32114370/189568215-1fa93173-7982-4c5a-9b36-1deda15ce6a3.png) + +**Auto Profiles** allows you to assign certain profiles to a specified application. This allows you to use different settings, controls, and mappings for different applications. + +### Output Slots +![Output Slots Screenshot](https://user-images.githubusercontent.com/32114370/189568564-b46a38b2-f492-43a4-bd20-f2171edc7b0c.png) + +**Output Slots** shows which controllers that are connected are designated to the 8 slots that DS4Windows allows to be plugged in at one time. Here you can also select a controller and virtually plug and unplug it in. + +### Settings +![Settings Screenshot](https://user-images.githubusercontent.com/75176311/232901882-6e271499-cdff-4f93-bfa5-921205c7fb69.PNG) + +The **Settings** tab is where the settings for the DS4Windows application are. Options such as *Run at Startup*, *Start Minimized*, or *Show Notifications* live here. + +**Disconenct from BT when Stopping** - Stops the bluetooth connection to the controllers when DS4Windows is quit + +**Flash Lightbar at High Latency** - Flashes the DualShock 4's lightbar red when DS4Windows detects high input latency + +**Quick Change** - Auto disables bluetooth when connecting a controller via USB + +**Icon Choice** - Changes the Icon of the DS4Windows application + +**App Theme** - Switch DS4Windows to Light or Dark mode + +**External OSC Control & Monitoring** - Use Open Sound Control messages to remotely control and monitor buttons, sticks, triggers, and battery levels + +**UDP Server** - Setting for connecting the motion controls of a compatible controller to another program + +### Log + +The **Log** tab is where you can look at all of the events that the DS4Windows application has encountered. There is also a button to export the log for debugging purposes. + +## Device Detection Issue + +If your DS4 is not detected by DS4Windows and the lightbar continues to +flash yellow, there is a chance that Exclusive Mode has permanently +disabled your DS4 in Windows. The easiest way to test if this has happened is +for you to plug in the controller into a different USB port and see if it +works then. Although this problem mainly affected older versions of +DS4Windows (text written after version 1.5.15) for various reasons, +other mapping programs can cause the same problem to occur. + +If you suspect that your DS4 has been disabled, open the Device Manager +(Control Panel\Hardware and Sound\Device Manager) and look for devices listed +under the path "Human Interface Devices\HID-compliant game controller". + +![Disabled Device Example](https://i.imgur.com/KI3QX2i.png) + +If the icon shown for a device has a down arrow icon then you should +check the device's instance path and see if the device is a DualShock 4 device. +Right click the device item and select "Enable device" from the menu. +That will re-enable the device so it can be seen by applications again. + +## Disable Steam Controller Mapping Support + +With recent updates to the Steam client at the time writing this (2018-12-13), +Steam has enabled Xbox Configuration Support in the Steam client by default. +What this means is that Steam will automatically map a detected Xbox 360 +controller to KB+M bindings initially (Desktop Mode) before launching Steam +Big Picture Mode or launching a game. This presents a problem for DS4Windows +since the created virtual Xbox 360 controller will be mapped to KB+M actions +for desktop mode and games launched outside of the Steam client. In order to +use DS4Windows properly, you have to open Steam Big Picture Mode, navigate to +Settings > Controller> Controller Settings and uncheck **Xbox Configuration +Support** along with **PlayStation Configuration Support**. \ No newline at end of file diff --git a/contributing.md b/contributing.md new file mode 100644 index 0000000000..da24186268 --- /dev/null +++ b/contributing.md @@ -0,0 +1,8 @@ +## Pull Requests + +Pull requests for DS4Windows are welcome. Before making a pull request, please +test your changes to ensure that the changes made do not negatively affect +the performance of other parts of the application. Some consideration will +be made during code review to try to tweak the changes in order to improve +application performance. However, there is a chance that a pull request will be +rejected if no reasonable solution can be found to incorporate code changes. \ No newline at end of file diff --git a/contributors.txt b/contributors.txt new file mode 100644 index 0000000000..1d2787b8ec --- /dev/null +++ b/contributors.txt @@ -0,0 +1,76 @@ +Travis Nickles (Ryochan7) +Adamsw72 +Ahmed +AnessZurba +avsha114 +Axroxx +bernspedras +carloshbcabral +christranq +CrazyHPi +DandelionSprout +dante38 +Denellyne +dezerving +dondrakon +dpearson2699 +DraakjeYoblama +eemijun +EnzoChaussivert +Flo082002 +firodj +Geroyuni +GreySole +Haamar +h1nnak +hpesoj +jdanders +jdfeng +jmg2k +joaopedrogomes +justalemon +jyc001 +Kamilczak020 +Kanuan +Кладовая +Korney Czukowski (czukowski) +kurtanr +Leonardo Melati (Leomelati) +MakiseKurisu +markguleno +mayawei +mika-n +MikeCZ23 +nefarius +nelitow +Oliver-Noah +olokos +onuralpyilkin +PaulWentzel +peter9811 +Rajko Stojadinovic (rajkosto) +RedDevilus +RobbyCBennett +RokasKil +sabihoshi +SakifX9 +Sander0542 +shikulja +sitiom +SyaoranChang +sergejkiller +SteelShot +stryblt +sunnyqeen +taolatao147 +toshixm +tpneill +trlef19 +V-Olk +wingfixer +xAdler +xLive +xrossb +Ygov +Yohoki +Yuki-nyan diff --git a/disabled_device_example.png b/disabled_device_example.png new file mode 100644 index 0000000000..22c2009db8 Binary files /dev/null and b/disabled_device_example.png differ diff --git a/disabled_device_example_small.png b/disabled_device_example_small.png new file mode 100644 index 0000000000..b702ff5aff Binary files /dev/null and b/disabled_device_example_small.png differ diff --git a/doc/dev/bundle_translations.md b/doc/dev/bundle_translations.md new file mode 100644 index 0000000000..a5d97c185b --- /dev/null +++ b/doc/dev/bundle_translations.md @@ -0,0 +1,25 @@ +## Bundle Translations + +### Edit Project File Post-Build + +Open the DS4WindowsWPF.csproj file. Navigate to the Post-Build section. +Add two `:` characters before the `GOTO END` statement to comment the line out. +Build the program in Visual Studio or directly with MSBuild. The dedicated Lang folder +will be created with the compiled translation assemblies + +#### Add new Translations in project file + +Edit the `langs` variable in the Post-Build step with the .NET culture code for a +locale. + +### Add Lang folder loading + +.NET normally expects translation assemblies to be bundled in folders +for each locale directly next to the running executable. Since DS4Windows +uses a Lang subfolder, an extra step must be performed to make sure .NET will +find the compiled assemblies. + +A Python 3 (3.10) script is included in the solution `utils` folder (`inject_deps_path.py`). +It accepts the path to the relevant `DS4Windows.deps.json` file as a cmd argument. The script +will add necessary path variable for the project entry to include an extra include path +for the .NET Runtime. diff --git a/doc/dev/profile_version_info.md b/doc/dev/profile_version_info.md new file mode 100644 index 0000000000..6a836d27b2 --- /dev/null +++ b/doc/dev/profile_version_info.md @@ -0,0 +1,36 @@ +## Profile Version Info + +This document will present some of the distinctive (mostly backwards incompatible) +changes that justify incrementing the version number for the profile schema. +The **config_version** attribute in a profile will describe the last known schema +used to write out a profile. Some older profiles did not contain the +**config_version** attribute so tags used in the profile might have to be examined +to determine an approximate version number corresponding to the schema version. + +### 5 (DS4Windows 2.1.15) + +Replace old **UseTPforControls** option with a new **TouchpadOutputMode** +option. Will likely be used in the future to allow for more than two +modes for the Touchpad. Adding absolute mouse pointer support is one +idea + +### 4 (DS4Windows 2.1.6) + +Replace **GyroSmoothing** and **GyroSmoothingWeight** and bundle new tags +in the **GyroMouseSmoothingSettings** group. Allow 1 Euro Filter options + +### 3 (DS4Windows 2.1.3) + +Version 3 was the first profile schema to have a **config_version** +specified. It was used primarily as a placeholder. I don't know +if the schema really changed from what would be considered +version 2 + +### 2 + +Changed default values for **LSDeadZone** and **RSDeadZone**. +Added anti-dead zone info + +### 1 (DS4Windows 1.4.52) + +Initial schema as used in the last Jays2Kings build (1.4.52) diff --git a/ds4winwpf_screen_20200412.png b/ds4winwpf_screen_20200412.png new file mode 100644 index 0000000000..1c1c48fa4d Binary files /dev/null and b/ds4winwpf_screen_20200412.png differ diff --git a/extras/ViGEmBusInstaller_DS4Win.zip b/extras/ViGEmBusInstaller_DS4Win.zip new file mode 100644 index 0000000000..00dd7fdc50 Binary files /dev/null and b/extras/ViGEmBusInstaller_DS4Win.zip differ diff --git a/extras/Virtual Bus Driver.zip b/extras/Virtual Bus Driver.zip new file mode 100644 index 0000000000..0c4a449b3f Binary files /dev/null and b/extras/Virtual Bus Driver.zip differ diff --git a/extras/gplv3.snippet b/extras/gplv3.snippet new file mode 100644 index 0000000000..55dad6349c --- /dev/null +++ b/extras/gplv3.snippet @@ -0,0 +1,46 @@ + + + +
+ GPL v.3 License Notice + gplv3 + + Expansion + +
+ + + +Copyright (C) $year$ $name_of_authors$ + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +*/ +]]> + + + + year + The copyright year + year + + + name_of_authors + The authors of the relevant code + name of authors + + + +
+
\ No newline at end of file diff --git a/user_guide.md b/user_guide.md new file mode 100644 index 0000000000..1957286492 --- /dev/null +++ b/user_guide.md @@ -0,0 +1,114 @@ +## User Guide +After completing the initial setup of the required drivers and dependencies, you are greeted with the main DS4Windows tab, controllers. + +### Controllers +![Controller Tab](https://user-images.githubusercontent.com/32114370/189562818-8e2d5e0a-3c61-4eb0-a53c-caa731b120e4.png) + +Here all of the conected controllers are shown. Hovering your mouse over the Controller's ID will display the input delay of the specificed controller. + +![Input Delay Screenshot](https://user-images.githubusercontent.com/32114370/189563985-e18c074e-3caf-49a7-af36-ed12d77f88c6.png) + +The Link Profile/ID checkbox allows you to link a specified profile to a certain Controller ID so that when you plug in the controller next time the Selected Profile will always be applied to it. This is helpful if you use more than one controller. The edit button will take you to the Profiles tab to edit the Selected Profile. You can also use the dropdown to create a new profile. + +### Profiles + +![Profile Tab Screenshot](https://user-images.githubusercontent.com/32114370/189564567-f73805f8-e16a-4a0a-a7ca-619509b10b56.png) + +The **Profiles** tab displays all the profiles created. Profiles can be used to assign different settings for your controller for different circumstances. Along with creating new profiles, editing, renaming, deleting, and renaming, you can also import other profiles, and export your's for sharing with friends. When creating a new profile, it is recommended to use a preset option. For the output method, it must be chosen accordingly to what you want Windows to recognize the controller as. + +For Example: + +- You have a Pro Controller and want to use PS Remote Play with gyro? You need to choose DualShock 4 Output and adjust the profile for Gyro passthrough +- You have any of the supported controllers and want to play Celest, which only supports XInput devices? Set the Output to Xbox 360 +- You have a fake DS4 controller that is not recognized as an official one, but want to play Witcher 3 with lightbar support and PS glyphs/icons? Then choose DualShock 4 Output and adjust for lightbar passthrough + +![Output Controller Prompt Screenshot](https://user-images.githubusercontent.com/32114370/189565494-3bd6b11f-7298-4180-824e-7cde49daebb7.png) + +On the resulting screen is where you can fully customize the new profile. + + + +The **Controls** tab is for remapping the controller button outputs. To open the page below, click on the desired button to remap on the image of the controller. Then select the desired new output for that input. + + + +The **Special Actions** tab allows you to create actions that are triggered when a button or combination of button presses occur. + +The **Controller Readings** tab gives a live readout of the data from the joysticks being transmitted to DS4Windows + +The **Axis Config** tab allows you to adjust the settings of the joysticks and adjust parameters such as deadzone and sensativity. + +The **Lightbar** tab allows you to change the color of the lighbar on DualShock 4 controllers. + +The **Touchpad** tab allows configuration of the touchpad on DualShock 4 controllers to be output as mouse or controller movement. + +The **Gyro** tab contains the gyro settings and allows you to assign specfic commands to certain tiling actions. + +The **Other** tab contains the settings for which controller is being emulated, rumble percentage, and the polling rate. + +### Auto Profiles +![Auto Profiles Screenshot](https://user-images.githubusercontent.com/32114370/189568215-1fa93173-7982-4c5a-9b36-1deda15ce6a3.png) + +**Auto Profiles** allows you to assign certain profiles to a specified application. This allows you to use different settings, controls, and mappings for different applications. + +### Output Slots +![Output Slots Screenshot](https://user-images.githubusercontent.com/32114370/189568564-b46a38b2-f492-43a4-bd20-f2171edc7b0c.png) + +**Output Slots** shows which controllers that are connected are designated to the 8 slots that DS4Windows allows to be plugged in at one time. Here you can also select a controller and virtually plug and unplug it in. + +### Settings +![Settings Screenshot](https://user-images.githubusercontent.com/75176311/232901882-6e271499-cdff-4f93-bfa5-921205c7fb69.PNG) + +The **Settings** tab is where the settings for the DS4Windows application are. Options such as *Run at Startup*, *Start Minimized*, or *Show Notifications* live here. + +**Disconenct from BT when Stopping** - Stops the bluetooth connection to the controllers when DS4Windows is quit + +**Flash Lightbar at High Latency** - Flashes the DualShock 4's lightbar red when DS4Windows detects high input latency + +**Quick Change** - Auto disables bluetooth when connecting a controller via USB + +**Icon Choice** - Changes the Icon of the DS4Windows application + +**App Theme** - Switch DS4Windows to Light or Dark mode + +**External OSC Control & Monitoring** - Use Open Sound Control messages to remotely control and monitor buttons, sticks, triggers, and battery levels + +**UDP Server** - Setting for connecting the motion controls of a compatible controller to another program + +### Log + +The **Log** tab is where you can look at all of the events that the DS4Windows application has encountered. There is also a button to export the log for debugging purposes. + +## Device Detection Issue + +If your DS4 is not detected by DS4Windows and the lightbar continues to +flash yellow, there is a chance that Exclusive Mode has permanently +disabled your DS4 in Windows. The easiest way to test if this has happened is +for you to plug in the controller into a different USB port and see if it +works then. Although this problem mainly affected older versions of +DS4Windows (text written after version 1.5.15) for various reasons, +other mapping programs can cause the same problem to occur. + +If you suspect that your DS4 has been disabled, open the Device Manager +(Control Panel\Hardware and Sound\Device Manager) and look for devices listed +under the path "Human Interface Devices\HID-compliant game controller". + +![Disabled Device Example](https://i.imgur.com/KI3QX2i.png) + +If the icon shown for a device has a down arrow icon then you should +check the device's instance path and see if the device is a DualShock 4 device. +Right click the device item and select "Enable device" from the menu. +That will re-enable the device so it can be seen by applications again. + +## Disable Steam Controller Mapping Support + +With recent updates to the Steam client at the time writing this (2018-12-13), +Steam has enabled Xbox Configuration Support in the Steam client by default. +What this means is that Steam will automatically map a detected Xbox 360 +controller to KB+M bindings initially (Desktop Mode) before launching Steam +Big Picture Mode or launching a game. This presents a problem for DS4Windows +since the created virtual Xbox 360 controller will be mapped to KB+M actions +for desktop mode and games launched outside of the Steam client. In order to +use DS4Windows properly, you have to open Steam Big Picture Mode, navigate to +Settings > Controller> Controller Settings and uncheck **Xbox Configuration +Support** along with **PlayStation Configuration Support**. \ No newline at end of file diff --git a/utils/inject_deps_path.py b/utils/inject_deps_path.py new file mode 100644 index 0000000000..3bab276721 --- /dev/null +++ b/utils/inject_deps_path.py @@ -0,0 +1,33 @@ +import sys +import os +import json, re + +# Check for possible file path arg +if len(sys.argv) != 2: + sys.exit(1) + +# Check if path exists on file system +tempfile = sys.argv[1] +if not os.path.exists(tempfile): + sys.exit(1) + +# Open file +temp_json = None +pattern = re.compile("^DS4Windows/[0-9]+\.[0-9]+\.[0-9]+$") +with open(tempfile) as input_file: + temp_json = json.load(input_file) + for k, v in temp_json["libraries"].items(): + test_match = re.match(pattern, k) + if test_match: + temp_json["libraries"][k]["path"] = "./" + break + + #print(temp_json["libraries"]) + +# Check for json dict +if not temp_json: + sys.exit(1) + +output_string = json.dumps(temp_json, indent=2) +with open(tempfile, "w") as output_file: + output_file.write(output_string) diff --git a/utils/rsync_ignore_files.txt b/utils/rsync_ignore_files.txt new file mode 100644 index 0000000000..bcf68053ff --- /dev/null +++ b/utils/rsync_ignore_files.txt @@ -0,0 +1,35 @@ +/ar +/cs +/de +/el +/es +/fi +/fr +/he +/hu-HU +/idn +/it +/ja +/ko +/ms +/nl +/pl +/pt +/pt-BR +/ru +/se +/tr +/uk-UA +/vi +/zh-CN +/zh-Hans +/zh-Hant +/zh-TW +/ref +Logs +Profiles +*.xml +custom_exe_name.txt +task.bat +*.un~ +*_DS4Win.exe diff --git a/utils/sync_files.sh b/utils/sync_files.sh new file mode 100644 index 0000000000..e8e3adec4f --- /dev/null +++ b/utils/sync_files.sh @@ -0,0 +1,54 @@ +#!/bin/sh + +Help() +{ + echo "sync_files.sh [OPTION] SOURCE_DIR DEST_DIR"; + echo ""; + echo "Options:"; + echo "-h Print help text"; +} + +# Handle passed options (only help) +while getopts ":h" option; do + case $option in + h) #Display help + Help; + exit;; + esac +done + +shift $((OPTIND-1)) + +if [ $# -eq 0 ]; then + Help + exit 0 +fi + +# Handle checking positional arguments +if [ $# -ne 2 ]; then + echo "Must provide two positional arguments for directories"; + exit 1 +fi + +# Check for presence of exclude patterns file for rsync with +# EXCLUDE_PATTERNS_FILE envvar +EXCLUDE_FROM_ARG="" +if [ ! -z "${EXCLUDE_PATTERNS_FILE}" ]; then + EXCLUDE_FROM_ARG="--exclude-from=${EXCLUDE_PATTERNS_FILE}" +fi + +#echo "${EXCLUDE_FROM_ARG}" + +SOURCE_DIR=${1:-""} +if [ ! -d "$SOURCE_DIR" ]; then + echo "Must specify a source directory" + exit 1 +fi + +DEST_DIR=${2:-""} +if [ ! -d "$DEST_DIR" ]; then + echo "Must specify a destination directory" + exit 1 +fi + +rsync -aP "${EXCLUDE_FROM_ARG}" "${SOURCE_DIR}" "${DEST_DIR}"