Compare commits

..

406 Commits

Author SHA1 Message Date
JustArchi
8948817d55 Misc 2FA enhancements 2022-06-06 13:29:21 +02:00
JustArchi
6ff943aeaa Move timezoneOffset cookie back into session
It might still make sense in order to:
a) Postpone timezoneoffset calculation until we actually get logged in, which gives machine more time for re-initialization
b) Refresh it in case our timezone changes, or DST gets enabled/disabled
2022-06-06 13:23:28 +02:00
Renovate Bot
0576bbd3aa Update ASF-ui digest to 8ba8738 2022-06-06 02:41:44 +00:00
ArchiBot
6e70956ee9 Automatic translations update 2022-06-06 02:36:02 +00:00
Renovate Bot
77409699f0 Update wiki digest to 6647581 2022-06-05 18:08:58 +00:00
Sebastian Göls
dae3e93031 Make use of "or" keyword in switch statements (#2598) 2022-06-05 15:59:34 +02:00
JustArchi
3041850b92 Bump 2022-06-05 12:46:24 +02:00
JustArchi
7c00d8d03d Misc 2FA enhancements 2022-06-05 12:39:04 +02:00
JustArchi
aedad9d5b3 Closes #2596 2022-06-05 12:15:42 +02:00
JustArchi
ff7f661197 Misc 2022-06-04 22:46:37 +02:00
JustArchi
e57cc21b89 Update .gitignore 2022-06-04 22:06:01 +02:00
JustArchi
06bfe01087 Misc 2022-06-04 21:41:07 +02:00
JustArchi
bcceb0c39c Downgrade AngleSharp.XPath due to https://github.com/AngleSharp/AngleSharp.XPath/issues/36 2022-06-04 21:41:02 +02:00
Renovate Bot
996ee66554 Update ASF-ui digest to 6dcd14d 2022-06-04 09:57:02 +00:00
renovate[bot]
dad19956aa Update dependency AngleSharp.XPath to v2 (#2595)
* Update dependency AngleSharp.XPath to v2

* Update GitHub.cs

* netf fixes

Co-authored-by: Renovate Bot <bot@renovateapp.com>
Co-authored-by: JustArchi <JustArchi@JustArchi.net>
2022-06-04 11:56:36 +02:00
Renovate Bot
beeda2777d Update ASF-ui digest to 293db61 2022-06-03 06:16:50 +00:00
ArchiBot
53e06a7392 Automatic translations update 2022-06-03 02:32:08 +00:00
Renovate Bot
9a1d4913a0 Update ASF-ui digest to a53bdb7 2022-06-02 18:43:12 +00:00
ArchiBot
c65b40b45b Automatic translations update 2022-06-02 02:39:09 +00:00
Renovate Bot
23647f2e39 Update wiki digest to d48f2bf 2022-06-01 22:07:32 +00:00
JustArchi
feb7a72bd1 Bump 2022-06-01 21:14:13 +02:00
Łukasz Domeradzki
7fe5989f5d Rewrite Steam time to ulongs (#2594)
My latest "research" resulted in learning that under the hood, Steam unix time seconds is bullet-proof not only for year 2038 but for uint range as well. While I do not expect to be alive by 2106, let alone ASF still being operative, it makes sense to base our time on the correct backend implementation regardless.

Small breaking change for people using `GetUnixTime()`.
2022-06-01 21:13:50 +02:00
Łukasz Domeradzki
715ed034df Unify WebBrowser API in regards to nullable bodies (#2593)
* Unify logic for nullable bodies

* Update ArchiWebHandler.cs

* Misc
2022-06-01 21:13:40 +02:00
JustArchi
d82df0074f Bump 2022-06-01 16:47:24 +02:00
JustArchi
03c2ba049e Fix NLog
Without this, default ASP.NET console logger is still active, even if we don't want it
2022-06-01 16:45:53 +02:00
Renovate Bot
03bce5dd71 Update ASF-ui digest to 5c7d999 2022-05-31 22:28:53 +00:00
ArchiBot
023e38d5e0 Automatic translations update 2022-05-29 02:39:26 +00:00
JustArchi
6178b12bb1 Fix invalid STD retry on 429 without json body
It's getting more and more complicated... We have places where we accept errors but still want relevant JSON body (most of the Steam error-places), and now we also have a place where we expected error to not carry one. Moreover, we still want to account for invalid JSON body on 2xx and retry on them.

So let's make the code even more complicated than it already is by adding yet another endpoint that does exactly the same what the other endpoint does BUT allows us us to optionally accept null/invalid body on success/errors/both, lol. I hate myself.

Maybe we can obsolete the first endpoint eventually and stick with just the second?
2022-05-28 20:41:52 +02:00
ArchiBot
df95b82b10 Automatic translations update 2022-05-28 02:29:19 +00:00
Renovate Bot
93ac0b4e4a Update ASF-ui digest to c42a9b8 2022-05-27 04:03:04 +00:00
ArchiBot
38fc3ba6a3 Automatic translations update 2022-05-27 02:39:00 +00:00
Renovate Bot
2e87b78b45 Update wiki digest to c5694c9 2022-05-26 17:44:51 +00:00
Renovate Bot
dae256f069 Update ASF-ui digest to fa42805 2022-05-26 15:10:16 +00:00
renovate[bot]
8452c46c47 Update crazy-max/ghaction-import-gpg action to v5 (#2592)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-26 17:09:43 +02:00
Sebastian Göls
68e30b43c2 Use ArgumentNullException.ThrowIfNull when possible (#2591)
* Misc.

* Fix mistake
2022-05-26 13:29:12 +02:00
JustArchi
c9b1e46013 Avoid crash when executing STD command with disabled STD plugin 2022-05-26 11:47:11 +02:00
JustArchi
fd9770d78e Bump 2022-05-26 11:05:59 +02:00
Renovate Bot
a4374389b8 Update dependency ConfigureAwaitChecker.Analyzer to v5.0.0.1 2022-05-26 03:12:12 +00:00
ArchiBot
082cab42df Automatic translations update 2022-05-26 02:38:09 +00:00
Renovate Bot
3ff80b37f3 Update ASF-ui digest to 1bf5b24 2022-05-25 20:21:25 +00:00
JustArchi
07c354f9e7 Commit the most misc optimization in history
I found it accidentally, lol
2022-05-25 20:04:54 +02:00
Sebastian Göls
b83f8fc669 Update Program.cs (#2589) 2022-05-25 17:18:06 +02:00
Renovate Bot
d6a2f53ab0 Update wiki digest to f26dbc5 2022-05-25 11:51:00 +00:00
JustArchi
0261623ea9 Expose FinalUri in BasicResponse for plugins usage 2022-05-24 12:25:43 +02:00
JustArchi
b5ca484c2b Add ReturnRedirections for plugins usage
This will allow caller to handle redirections manually
2022-05-24 12:13:54 +02:00
Renovate Bot
a7c30e4878 Update ASF-ui digest to a790c6c 2022-05-22 03:51:41 +00:00
Renovate Bot
f26a4ae864 Update ASF-ui digest to 24ff55f 2022-05-21 05:09:18 +00:00
Renovate Bot
c2018b53a5 Update actions/upload-artifact action to v3.1.0 2022-05-20 20:28:10 +00:00
JustArchi
55421bb29f Throw on lack of previousMethodName
I don't believe we should support those calls for anything that doesn't supply it. Actually add another layer of safeguards.
2022-05-20 21:36:22 +02:00
Renovate Bot
52eabe4daf Update ASF-ui digest to 46fe13d 2022-05-20 05:16:48 +00:00
ArchiBot
86fc8a765c Automatic translations update 2022-05-20 02:34:05 +00:00
JustArchi
9162752b99 Misc 2022-05-19 21:38:40 +02:00
JustArchi
4436e8dc43 Add STD command trigger for STD plugin 2022-05-19 21:34:57 +02:00
JustArchi
1f0b996cf5 Improve login procedure
- Allow user to recover from SteamGuard/2FA failures when inputting manually
- Unify login failures in a single mechanism
- Add fallback for Steam informing us about lack of 2FA code when actually having mobile authenticator and supplying it (ultra rare screwup)
2022-05-19 15:33:53 +02:00
ArchiBot
4dc7acb914 Automatic translations update 2022-05-19 02:39:10 +00:00
Renovate Bot
d570a17532 Update wiki digest to 6958aab 2022-05-18 14:59:10 +00:00
Renovate Bot
e5184adede Update ASF-ui digest to 790ff09 2022-05-18 14:58:40 +00:00
JustArchi
13a5fa7c02 Misc 2022-05-18 11:45:31 +02:00
JustArchi
c698fe7b07 Bump 2022-05-18 11:31:49 +02:00
JustArchi
a08c85e40b Increase interactive console responsiveness, misc
Previously we were sleeping always, also after execution of the command and after wrong keys being pressed, which resulted in excessive delay if user mashed his keyboard like a madman before hitting c to enter the console, entirely unnecessarily.
2022-05-18 11:30:46 +02:00
JustArchi
055af32219 Address missed NLog breaking change 2022-05-18 11:20:35 +02:00
ArchiBot
080b500ebf Automatic translations update 2022-05-18 02:33:30 +00:00
JustArchi
4a329b0b15 Bump 2022-05-17 23:03:42 +02:00
JustArchi
e2494960ae Bump 2022-05-17 23:02:14 +02:00
JustArchi
2e987ccee6 Address NLog changes 2022-05-17 20:12:57 +02:00
renovate[bot]
99284e22c9 Update dependency NLog.Web.AspNetCore to v5 (#2579)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-17 20:09:34 +02:00
renovate[bot]
37eac5844e Update ASF-ui digest to 664643e (#2578)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-17 11:41:52 +02:00
Renovate Bot
35f295a860 Update ASF-ui digest to 8d0abfb 2022-05-16 19:07:27 +00:00
Renovate Bot
29d047271e Update actions/setup-node action to v3.2.0 2022-05-16 14:03:52 +00:00
Renovate Bot
948a86bfc9 Update ASF-ui digest to 2fe4a70 2022-05-16 04:50:08 +00:00
ArchiBot
f853c61821 Automatic translations update 2022-05-16 02:25:24 +00:00
JustArchi
5b1cb16c98 Stop wasting CPU cycles! 2022-05-13 19:33:08 +02:00
JustArchi
bdac1b2782 Bump 2022-05-13 18:22:24 +02:00
JustArchi
7532b89fd0 Closes #2572
At least the code is now shorter, lol
2022-05-13 18:15:15 +02:00
JustArchi
7cd351d1cd Misc
This applies only to Debug builds, as Release ones don't use checked arithmetic anyway
2022-05-13 18:12:31 +02:00
Renovate Bot
9c8d63318e Update ASF-ui digest to bb59242 2022-05-13 05:08:45 +00:00
ArchiBot
f0c0e07489 Automatic translations update 2022-05-13 02:42:57 +00:00
ArchiBot
d2e79ff3a4 Automatic translations update 2022-05-12 02:33:43 +00:00
Renovate Bot
ab7b998e3b Update dependency Microsoft.NET.Test.Sdk to v17.2.0 2022-05-11 21:19:10 +00:00
Łukasz Domeradzki
9c88d14c8e Resolve NU1507 (#2575)
* Attempt to resolve NU1507

* Let's try this then

* Revert "Let's try this then"

This reverts commit 86ef6f9abf.

* How about this

* And this?

* So why not this?

* And this?

* Revert "And this?"

This reverts commit e43fc83dcc.

* Revert "So why not this?"

This reverts commit e630dd8365.
2022-05-11 20:11:58 +02:00
ArchiBot
9a3c3bdbaf Automatic translations update 2022-05-11 02:35:21 +00:00
Renovate Bot
7b3598af20 Update dotnet monorepo to v3.1.25 2022-05-10 19:23:40 +00:00
Renovate Bot
35d2156855 Update ASF-ui digest to b22bef8 2022-05-10 16:40:51 +00:00
JustArchi
d589da7a39 Bump 2022-05-10 11:14:11 +02:00
JustArchi
c10de94bd0 Closes #2571 2022-05-10 11:11:45 +02:00
Renovate Bot
d164296d7e Update actions/setup-dotnet action to v2.1.0 2022-05-09 10:21:58 +00:00
Renovate Bot
b378a76072 Update ASF-ui digest to 0ed48ea 2022-05-08 22:02:09 +00:00
Archi
263a2db476 CI: Remove excessive continue on errors 2022-05-08 23:01:45 +02:00
Renovate Bot
61549fc983 Update ASF-ui digest to 1f02912 2022-05-07 03:46:37 +00:00
ArchiBot
19aad04143 Automatic translations update 2022-05-07 02:24:04 +00:00
Renovate Bot
5a5f3c6786 Update ASF-ui digest to a9ddf4a 2022-05-06 22:30:53 +00:00
Renovate Bot
bd68df2fd6 Update crowdin/github-action action to v1.4.9 2022-05-06 16:18:34 +00:00
renovate[bot]
2a97644468 Update docker/build-push-action action to v3 (#2565)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-06 10:20:55 +02:00
renovate[bot]
5304ca3e07 Update docker/login-action action to v2 (#2566)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-06 10:20:50 +02:00
renovate[bot]
f0471ac0eb Update docker/setup-buildx-action action to v2 (#2567)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-05-06 10:20:42 +02:00
ArchiBot
b0e7f1963c Automatic translations update 2022-05-06 02:27:24 +00:00
Renovate Bot
78990e8aff Update wiki digest to b43bf17 2022-05-05 13:03:59 +00:00
Renovate Bot
b871970d85 Update ASF-ui digest to 722f6b2 2022-05-05 00:18:06 +00:00
ArchiBot
d563a20288 Automatic translations update 2022-05-04 02:36:40 +00:00
Renovate Bot
b2fefa4476 Update wiki digest to 37d8dcc 2022-05-03 11:51:02 +00:00
ArchiBot
840cf25ea4 Automatic translations update 2022-04-30 02:36:10 +00:00
Renovate Bot
79587f68d7 Update ASF-ui digest to a351077 2022-04-30 00:09:30 +00:00
Archi
45adf9c1a1 Bump 2022-04-29 20:25:59 +02:00
Archi
1dcf98c849 Fix SteamPassword input
Asking for password with encryption enabled always resulted in an error, as the password wasn't properly set to the plaintext and we were back to square one.

The previous logic was overly complex, I don't know why, this should achieve the same and be much easier to understand while at it.
2022-04-29 17:55:33 +02:00
ArchiBot
a826b7f9b7 Automatic translations update 2022-04-29 02:37:09 +00:00
Renovate Bot
85c8397cf7 Update docker/setup-buildx-action action to v1.7.0 2022-04-28 11:01:51 +00:00
ArchiBot
dbf1c1ba51 Automatic translations update 2022-04-28 02:50:54 +00:00
Renovate Bot
359439e306 Update ASF-ui digest to 892742c 2022-04-27 13:48:33 +00:00
ArchiBot
763766e092 Automatic translations update 2022-04-27 02:42:35 +00:00
Renovate Bot
a4a347e957 Update mstest monorepo to v2.2.10 2022-04-26 22:17:23 +00:00
Renovate Bot
844ca93647 Update wiki digest to 0c633a3 2022-04-26 18:49:18 +00:00
Renovate Bot
16fe445ea9 Update ASF-ui digest to 83c8a83 2022-04-26 18:48:48 +00:00
Renovate Bot
34bf8fb84f Update crazy-max/ghaction-import-gpg action to v4.4.0 2022-04-25 14:36:52 +00:00
Renovate Bot
4873cd337a Update ASF-ui digest to 5554b10 2022-04-25 03:07:32 +00:00
ArchiBot
8c0249a62d Automatic translations update 2022-04-25 02:33:43 +00:00
ArchiBot
220ecf0c38 Automatic translations update 2022-04-24 02:24:03 +00:00
Renovate Bot
ebd79425f4 Update wiki digest to 370d1b3 2022-04-23 18:48:11 +00:00
Renovate Bot
2eaf934dde Update dependency Markdig.Signed to v0.30.2 2022-04-23 14:22:52 +00:00
Archi
599cd9bff8 Bump 2022-04-23 15:02:37 +02:00
Archi
339e83a818 Use saner custom schema IDs in swagger 2022-04-23 14:58:22 +02:00
Archi
f083bb2d3b Closes #2558 2022-04-23 13:11:10 +02:00
Archi
9f68d17a28 Add initialization for Madness
This is probably not needed, but might come useful in the future.
2022-04-23 13:09:51 +02:00
Renovate Bot
d8413f9633 Update ASF-ui digest to 5a6f341 2022-04-23 04:05:53 +00:00
ArchiBot
27d9d61309 Automatic translations update 2022-04-23 02:24:12 +00:00
Renovate Bot
2fc92ce427 Update dependency JustArchiNET.Madness to v3.5.2 2022-04-22 16:54:52 +00:00
Renovate Bot
86d94a7bbe Update swashbuckle-aspnetcore monorepo to v6.3.1 2022-04-22 14:44:55 +00:00
Renovate Bot
9647db8bf7 Update dependency Markdig.Signed to v0.30.1 2022-04-22 11:13:08 +00:00
Renovate Bot
2ce5018d62 Update ASF-ui digest to f23f502 2022-04-22 05:37:01 +00:00
ArchiBot
61768dbeb9 Automatic translations update 2022-04-22 02:41:44 +00:00
Renovate Bot
37ced5d4e3 Update dependency Markdig.Signed to v0.30.0 2022-04-21 19:21:48 +00:00
Renovate Bot
c1a695de7b Update actions/checkout action to v3.0.2 2022-04-21 16:13:25 +00:00
Renovate Bot
7040bdabf6 Update ASF-ui digest to e1d754d 2022-04-21 12:28:06 +00:00
ArchiBot
14512aec71 Automatic translations update 2022-04-21 02:36:31 +00:00
Renovate Bot
40d67ac185 Update dependency Markdig.Signed to v0.29.0 2022-04-20 18:53:26 +00:00
Renovate Bot
7de67e84f9 Update ASF-ui digest to 992113b 2022-04-20 04:04:09 +00:00
Renovate Bot
6c9df75a1a Update ASF-ui digest to 18c96be 2022-04-19 14:39:57 +00:00
ArchiBot
b98d8405e1 Automatic translations update 2022-04-19 02:37:37 +00:00
Archi
062b241232 Misc 2022-04-18 21:08:30 +02:00
Archi
b5af510eb9 Improve weak passwords reasons 2022-04-18 20:35:47 +02:00
renovate[bot]
2edcb7a0ce Update dependency JetBrains.Annotations to v2022 (#2557)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-04-18 19:56:26 +02:00
ArchiBot
58cf93ff48 Automatic translations update 2022-04-18 02:35:31 +00:00
Renovate Bot
9f0f3339c5 Update wiki digest to d965790 2022-04-17 12:56:19 +00:00
ArchiBot
6b88d49067 Automatic translations update 2022-04-17 02:23:50 +00:00
ArchiBot
b4e102682f Automatic translations update 2022-04-16 02:23:14 +00:00
Renovate Bot
a580c85234 Update wiki digest to 55b7332 2022-04-15 21:17:18 +00:00
Renovate Bot
a3cce515ec Update ASF-ui digest to e0d5a20 2022-04-15 18:48:42 +00:00
Archi
1f21c1f9f6 Bump 2022-04-15 19:41:18 +02:00
Archi
9c7014d5c1 Misc 2022-04-15 19:38:56 +02:00
Archi
0a01dfa22b Misc 2022-04-15 19:37:18 +02:00
qhy040404
a8bb107e23 Update README.md (#2555) 2022-04-15 19:24:07 +02:00
Renovate Bot
151f6cfe4a Update actions/checkout action to v3.0.1 2022-04-14 20:13:59 +00:00
Renovate Bot
d21e398ac0 Update crowdin/github-action action to v1.4.8 2022-04-14 03:10:04 +00:00
ArchiBot
16f7f82dc0 Automatic translations update 2022-04-14 02:28:46 +00:00
Renovate Bot
8a6a02e034 Update ASF-ui digest to ffa260b 2022-04-13 22:08:23 +00:00
Sebastian Göls
b8bfcd5df3 Simplify LogNullError calls (#2554)
* Remove necessity of nameof(...) in calls to ArchiLogger.LogNullError(...)

* Upgrade Madness

* Upgrade Madness

* Split up compound null log statements
2022-04-13 23:16:36 +02:00
Sebastian Göls
2326196e01 Slightly deduplicate utility code (#2553) 2022-04-13 21:44:57 +02:00
ArchiBot
380d785388 Automatic translations update 2022-04-13 02:29:12 +00:00
Renovate Bot
edd82b365c Update wiki digest to ced81fb 2022-04-12 19:39:24 +00:00
Renovate Bot
d49d106d64 Update dotnet monorepo to v3.1.24 2022-04-12 00:05:28 +00:00
Archi
78407fbd9c Remove obsolete statistics mapping
This already skipped one monthly cycle, everybody who remotely cares to use up-to-date ASF is already migrated to proper config, everybody else is not making use of it either way
2022-04-12 00:52:19 +02:00
Archi
1a87149765 Correct doc 2022-04-12 00:48:24 +02:00
Renovate Bot
f260015098 Update ASF-ui digest to 9bc1e73 2022-04-11 19:13:41 +00:00
Renovate Bot
5016abe45e Update actions/setup-node action to v3.1.1 2022-04-11 14:10:40 +00:00
Renovate Bot
2238897f37 Update ASF-ui digest to 02f5fc8 2022-04-11 03:47:19 +00:00
ArchiBot
493f40a97c Automatic translations update 2022-04-11 02:29:56 +00:00
Renovate Bot
5ec7ca050b Update ASF-ui digest to b16b9fa 2022-04-09 01:36:03 +00:00
ArchiBot
f727403295 Automatic translations update 2022-04-08 02:26:07 +00:00
Renovate Bot
027d23d894 Update ASF-ui digest to 8df1cd1 2022-04-07 20:37:03 +00:00
Renovate Bot
f36798b2c3 Update ASF-ui digest to 082828a 2022-04-07 11:00:19 +00:00
ArchiBot
202a92f66f Automatic translations update 2022-04-07 02:23:49 +00:00
Renovate Bot
48b2a4c859 Update wiki digest to 309c165 2022-04-06 22:51:35 +00:00
Renovate Bot
cfbc3d749f Update ASF-ui digest to 49413ea 2022-04-06 21:06:44 +00:00
Archi
a76af71227 Update RELEASE_TEMPLATE.md 2022-04-06 20:49:17 +02:00
Archi
cc5e5dfcc9 Bump 2022-04-06 20:18:01 +02:00
Archi
a185f2f03d Fix steam parental mess 2022-04-06 20:12:01 +02:00
Archi
3772b303c5 Bump 2022-04-06 17:09:02 +02:00
Archi
d6ed6e81a4 Let's try declaring base Chinese instead 2022-04-06 15:43:13 +02:00
Archi
0bbc85527a Allow cmdline arg for forbidding Steam parental generation 2022-04-06 14:16:26 +02:00
Archi
1eabe3a5ed Fix netf brain damage 2022-04-06 14:05:10 +02:00
Archi
f95b6bf089 Refuse to accept SteamParentalCode other than 4 0-9 digits 2022-04-06 13:58:35 +02:00
Renovate Bot
ff7b4582c7 Update ASF-ui digest to 498c8de 2022-04-06 00:07:06 +00:00
Renovate Bot
7e7fb9cd16 Update ASF-ui digest to 8f5ce0b 2022-04-05 19:39:26 +00:00
Archi
65bbaf628e Bump 2022-04-05 20:28:49 +02:00
Archi
db2cbde708 Bump 2022-04-05 20:28:30 +02:00
ArchiBot
b701acf72f Automatic translations update 2022-04-05 02:23:19 +00:00
Łukasz Domeradzki
ceb021dbdf Use windows-latest runner again (#2547)
* Attempt at resolving https://github.com/actions/virtual-environments/issues/5189

* Clean up dockerfiles from no longer required workarounds
2022-04-04 22:06:03 +02:00
ArchiBot
ce1c77780d Automatic translations update 2022-04-04 02:29:49 +00:00
Renovate Bot
5b7858c2a0 Update wiki digest to a05a01e 2022-04-03 19:13:33 +00:00
Archi
635afa7165 Update Madness 2022-04-02 16:41:48 +02:00
Archi
c79c314b20 Fix generic-netf
Again and again!
2022-04-02 16:08:41 +02:00
Archi
ec78ad1ac2 Add overflow-related fixes and improvements 2022-04-02 16:00:07 +02:00
Archi
9273d73640 Check for overflow and underflow in debug builds 2022-04-02 13:58:55 +02:00
Renovate Bot
d598b99a1e Update ASF-ui digest to ba9a208 2022-04-02 05:05:07 +00:00
Renovate Bot
f12b00bb4c Update ASF-ui digest to c7e3eee 2022-04-01 20:10:36 +00:00
Renovate Bot
ff7116d2ac Update actions/setup-node action to v3.1.0 2022-04-01 11:47:41 +00:00
Renovate Bot
ee435fc628 Update ASF-ui digest to d282988 2022-03-31 06:34:58 +00:00
Renovate Bot
c8f02779b6 Update ASF-ui digest to a78474f 2022-03-30 03:27:46 +00:00
ArchiBot
83667ed7c3 Automatic translations update 2022-03-30 02:50:37 +00:00
Archi
387ef3e0dd Update revolut handle 2022-03-30 00:41:27 +02:00
ArchiBot
7e8c6b7fb3 Automatic translations update 2022-03-29 02:24:49 +00:00
Renovate Bot
e97b440225 Update wiki digest to a9d72e4 2022-03-28 22:59:44 +00:00
ArchiBot
b1db99f328 Automatic translations update 2022-03-28 02:25:26 +00:00
Renovate Bot
ace0ca4555 Update dependency Markdig.Signed to v0.28.1 2022-03-27 09:46:26 +00:00
ArchiBot
33767ace78 Automatic translations update 2022-03-27 02:21:44 +00:00
Renovate Bot
5d5a76de40 Update ASF-ui digest to 711c0f2 2022-03-26 03:19:31 +00:00
ArchiBot
582680f69d Automatic translations update 2022-03-26 02:21:11 +00:00
ArchiBot
e65729ee1a Automatic translations update 2022-03-25 02:21:29 +00:00
Archi
83a353dfe0 Bump 2022-03-24 22:28:40 +01:00
ArchiBot
aea7c7640c Automatic translations update 2022-03-24 02:22:40 +00:00
Łukasz Domeradzki
7118185ac5 Remove support for IPC localization (#2545) 2022-03-24 01:47:12 +01:00
Renovate Bot
b681b74ee6 Update ASF-ui digest to 871721c 2022-03-22 20:45:48 +00:00
Archi
cc83222c3e Use shorter syntax for json properties 2022-03-22 16:33:47 +01:00
Archi
6c570738ee Fix handling inventory loading errors
"success" doesn't have to exist as a property in error json
2022-03-22 14:57:48 +01:00
Archi
393ddf6f10 Misc optimization 2022-03-22 12:27:07 +01:00
renovate[bot]
75a7df2751 Update peter-evans/dockerhub-description action to v3 (#2542)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-22 11:37:59 +01:00
Archi
0c3dfaa4ae Use generic delay for all unhandled disconnects
There are only handful of cases where we want to reconnect immediately, and login limiter delay usually kills those anyway
2022-03-21 14:50:36 +01:00
Renovate Bot
94e70e5ac2 Update ASF-ui digest to 97dcaf2 2022-03-19 01:15:00 +00:00
Archi
9ce527c938 Bump 2022-03-18 19:51:04 +01:00
Renovate Bot
660b05e4c4 Update ASF-ui digest to 0f8dfef 2022-03-18 11:13:17 +00:00
Archi
b39efb2b03 Re-enable ASF-ui updates 2022-03-18 12:12:38 +01:00
ArchiBot
53e0b62ced Automatic translations update 2022-03-18 02:21:32 +00:00
ArchiBot
d3980962fe Automatic translations update 2022-03-17 02:20:45 +00:00
Renovate Bot
517787efb8 Update wiki digest to 6505a66 2022-03-16 17:55:41 +00:00
lrcf
d06afa26d4 LICENSE-2.0.txt > LICENSE.txt (#2539) 2022-03-16 16:41:08 +01:00
Archi
4562e71e47 Misc 2022-03-16 15:34:37 +01:00
Renovate Bot
894471fa82 Update crazy-max/ghaction-import-gpg action to v4.3.0 2022-03-16 03:40:33 +00:00
ArchiBot
e9f6c15ba1 Automatic translations update 2022-03-16 02:21:54 +00:00
ArchiBot
814b93d1cf Automatic translations update 2022-03-15 02:19:58 +00:00
Renovate Bot
beafbd8f43 Update docker/build-push-action action to v2.10.0 2022-03-14 20:06:32 +00:00
ArchiBot
dbd0e006ed Automatic translations update 2022-03-14 02:18:10 +00:00
ArchiBot
4661803836 Automatic translations update 2022-03-13 02:13:18 +00:00
Renovate Bot
99ecd72660 Update wiki digest to 791cfff 2022-03-12 23:59:22 +00:00
Archi
799ec2965f Bump 2022-03-12 22:34:55 +01:00
Archi
c7e9c0c3b0 Bump 2022-03-12 22:34:35 +01:00
Sebastian Göls
1f3e861612 Correctly detect steam deck keyboard skins (#2535) 2022-03-12 22:16:45 +01:00
Renovate Bot
159b0620a7 Update dependency Markdig.Signed to v0.28.0 2022-03-11 14:37:14 +00:00
ArchiBot
e508602be7 Automatic translations update 2022-03-11 02:20:00 +00:00
Archi
6edf62d849 Set initial state of ShouldResumeFarming to false
ShouldResumeFarming indicates whether call to Resume() should start farming, which is used for example when account is marked as free to farm due to event. That event by default is triggered on ASF startup as well.

At the same time, the prerequisite to start farming is having our cache ready at least for the bot that is about to start farming. This happens in OnBotLicenseList() which notified CardsFarmer about new games added once it finishes, which also triggers the farming.

Previous behaviour resulted in a bit unwanted situation where CardsFarmer didn't bother waiting for cache to be ready, as the event about occupation triggered resume process, and that process due to true value started immediately. Changing default state of that value to false should suffice, as initial resume event won't cause the cards farming process to be started, and event about new games added already sets that flag back to true, so if cache being rebuilt happens before playing lock being released, Resume() should still trigger farming as wanted.

Give yourself a pat on the back if you understood something from that.
2022-03-10 12:36:31 +01:00
ArchiBot
021d414143 Automatic translations update 2022-03-09 02:19:23 +00:00
Renovate Bot
813587508e Update dotnet monorepo to v3.1.23 2022-03-08 16:53:12 +00:00
Renovate Bot
0e3d124663 Update swashbuckle-aspnetcore monorepo to v6.3.0 2022-03-08 02:27:31 +00:00
ArchiBot
91115b7cb7 Automatic translations update 2022-03-08 02:16:20 +00:00
Archi
0f12174564 Bump 2022-03-07 18:43:29 +01:00
Łukasz Domeradzki
d087aacbfb Closes #2532 2022-03-07 18:35:41 +01:00
Archi
1c0d2d88ed Address crowdin-cli 3.7.8 breaking change
And ensure it doesn't fail silently again the next time something like that happens

https://github.com/crowdin/crowdin-cli/issues/439
2022-03-07 13:28:32 +01:00
renovate[bot]
6b170c345d Update actions/upload-artifact action to v3 (#2530)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-03 20:39:53 +01:00
Archi
bc8a4a50d2 Bump 2022-03-03 14:51:41 +01:00
Archi
e025df3d9b Downgrade ASF-ui due to https://github.com/JustArchiNET/ASF-ui/issues/1556 2022-03-03 13:42:59 +01:00
renovate[bot]
5a97835531 Update actions/download-artifact action to v3 (#2529)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-02 22:33:21 +01:00
Renovate Bot
bce0557873 Update wiki commit hash to 98a9726 2022-03-02 17:07:56 +00:00
renovate[bot]
4c7cd204ce Update ASF-ui commit hash to 59d9442 (#2527)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-02 15:26:59 +01:00
Renovate Bot
7ba6b230df Update docker/login-action action to v1.14.1 2022-03-01 22:22:02 +00:00
renovate[bot]
6c4fba5173 Update actions/checkout action to v3 (#2526)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-03-01 20:41:47 +01:00
Renovate Bot
5cd6477b69 Update ASF-ui commit hash to 02d5b8d 2022-03-01 15:37:38 +00:00
Renovate Bot
1f5fbb5f92 Update crazy-max/ghaction-import-gpg action to v4.2.0 2022-03-01 10:35:48 +00:00
Renovate Bot
d0521ff9ca Update docker/login-action action to v1.14.0 2022-02-28 10:38:03 +00:00
Renovate Bot
1be15716fc Update ASF-ui commit hash to bdb5a1c 2022-02-26 03:47:28 +00:00
Archi
e00ee2cc55 Misc 2022-02-26 01:26:13 +01:00
Archi
8893fc8e70 Misc 2022-02-26 01:21:37 +01:00
renovate[bot]
86b41f0542 Update actions/setup-dotnet action to v2 (#2523)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-02-25 11:37:22 +01:00
Renovate Bot
a245c091a4 Update ASF-ui commit hash to 4b46137 2022-02-25 00:43:54 +00:00
Archi
abbe0cca22 Bump 2022-02-25 00:35:12 +01:00
Archi
d1c2b103b6 Closes #2522 2022-02-25 00:29:51 +01:00
Renovate Bot
9f1734efb7 Update ASF-ui commit hash to e35e350 2022-02-24 16:15:05 +00:00
renovate[bot]
729c2e889c Update actions/setup-node action to v3 (#2521)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-02-24 15:23:23 +01:00
Archi
a9edc7ad7a Bump 2022-02-24 14:17:11 +01:00
Renovate Bot
08a6486c00 Update actions/setup-dotnet action to v1.9.1 2022-02-24 09:23:50 +00:00
Renovate Bot
ca3bc1becd Update ASF-ui commit hash to 0113980 2022-02-22 11:53:12 +00:00
Renovate Bot
fe5028a399 Update crowdin/github-action action to v1.4.7 2022-02-18 16:53:00 +00:00
Archi
c1d9d04071 Rider cleanup & improvements 2022-02-18 15:40:33 +01:00
Renovate Bot
e5ae2abbf0 Update ASF-ui commit hash to 938820c 2022-02-18 12:29:14 +00:00
Archi
41fa5de5a8 Misc 2022-02-18 12:55:47 +01:00
Archi
697b78aa21 Don't expose SteamLogin in weak password warning
While not strictly a sensitive property, there is no good reason why we should print it in the log instead of a bot name, which is far less sensitive in nature.
2022-02-18 11:16:31 +01:00
Renovate Bot
1a7be0bac8 Update ASF-ui commit hash to 354a986 2022-02-18 02:25:11 +00:00
ArchiBot
9d88972ae0 Automatic translations update 2022-02-18 02:12:06 +00:00
Renovate Bot
aec4130afe Update ASF-ui commit hash to cb7478d 2022-02-17 18:36:45 +00:00
Renovate Bot
64228cd3d9 Update docker/login-action action to v1.13.0 2022-02-17 15:07:39 +00:00
Archi
3568a0e528 Make GetFirstSteamMasterID() public API 2022-02-17 13:50:45 +01:00
Archi
38c2b51f2b Make GetTradeToken() public API 2022-02-17 10:59:49 +01:00
Archi
450f365817 Expose GetProxyAccess() as public API 2022-02-17 10:54:55 +01:00
Renovate Bot
cf3f6aabdf Update ASF-ui commit hash to 898e3d5 2022-02-17 03:54:33 +00:00
Renovate Bot
842fb6e304 Update dependency Microsoft.NET.Test.Sdk to v17.1.0 2022-02-16 15:28:50 +00:00
Renovate Bot
a1169331aa Update ASF-ui commit hash to 6b45078 2022-02-16 03:39:15 +00:00
ArchiBot
2fb7d62e06 Automatic translations update 2022-02-16 02:13:41 +00:00
Renovate Bot
4e57153e91 Update ASF-ui commit hash to 9261c65 2022-02-15 21:39:10 +00:00
Renovate Bot
d2e78b6970 Update ASF-ui commit hash to d3543c3 2022-02-14 20:49:07 +00:00
Renovate Bot
ccef6554fe Update ASF-ui commit hash to 8d45f06 2022-02-13 18:06:17 +00:00
Renovate Bot
97875a87c2 Update ASF-ui commit hash to c42dc16 2022-02-13 03:58:51 +00:00
ArchiBot
2684f99563 Automatic translations update 2022-02-13 02:10:27 +00:00
Renovate Bot
a50318dc8b Update ASF-ui commit hash to 6b5e890 2022-02-12 22:05:07 +00:00
Renovate Bot
eeccc36fe4 Update ASF-ui commit hash to 7071136 2022-02-12 09:47:20 +00:00
Renovate Bot
1ead134578 Update ASF-ui commit hash to aa8a4af 2022-02-12 03:59:25 +00:00
ArchiBot
f03f8ebe70 Automatic translations update 2022-02-12 02:13:03 +00:00
Łukasz Domeradzki
aa8b360e1d Update README.md 2022-02-11 10:54:32 +01:00
Renovate Bot
8c22f9929c Update ASF-ui commit hash to 41e74a9 2022-02-11 03:03:36 +00:00
ArchiBot
3795b2de3a Automatic translations update 2022-02-11 02:10:40 +00:00
Archi
f4650fe570 Misc 2022-02-11 00:07:48 +01:00
Archi
fec57e0fff Preserve CachedCardCountsForGame across ASF runs 2022-02-11 00:05:43 +01:00
Archi
8e47a5906f Optimize SendCompletedSets() 2022-02-10 23:52:49 +01:00
Renovate Bot
f728ddf737 Update wiki commit hash to 27140b9 2022-02-10 19:43:12 +00:00
Archi
173cec5ef7 Bump 2022-02-10 20:14:51 +01:00
Archi
d16c4822eb Bump 2022-02-10 20:14:35 +01:00
Archi
03e3d74e51 Allow more than one persona flag to be used 2022-02-10 20:10:34 +01:00
Archi
0a3d011e2e More advanced improvements over persona state 2022-02-10 19:55:32 +01:00
Archi
f112a05569 Rider cleanup after merge 2022-02-10 19:44:53 +01:00
Deyvan
1c579d96ee Add VR to UserInterfaceMode (#2511)
* Add VR to UserInterfaceMode

* Add VRMode to BotConfig

* Add logic for VRMode

* Remove VR from EUserInterfaceMode

* Remake VRMode -> PersonaStateFlags

* Rename PersonaStateFlags -> OnlineFlags for more user-friendly

* Parameter checks for SetPersonaStateFlags

* oops

* Update Bot.cs
2022-02-10 19:42:42 +01:00
ArchiBot
19a0be1d26 Automatic translations update 2022-02-10 02:08:21 +00:00
Renovate Bot
a8de495c7c Update ASF-ui commit hash to ff43133 2022-02-09 03:04:43 +00:00
ArchiBot
ab8ceab055 Automatic translations update 2022-02-09 02:12:42 +00:00
Renovate Bot
64b72d1e55 Update ASF-ui commit hash to c7acea4 2022-02-08 22:28:45 +00:00
Łukasz Domeradzki
f807bdb660 Fix permissions when proxifying commands (#2509)
* Fix permissions when proxifying commands

* Version bump
2022-02-08 23:17:03 +01:00
Archi
5b66b70566 Add PlayingWasBlocked logic to GamesPlayedWhileIdle 2022-02-08 17:42:14 +01:00
Renovate Bot
41c06851a5 Update ASF-ui commit hash to 533e608 2022-02-08 03:51:33 +00:00
ArchiBot
4dbb964ba9 Automatic translations update 2022-02-08 02:09:13 +00:00
Renovate Bot
11471c759d Update ASF-ui commit hash to eaddc99 2022-02-07 23:44:16 +00:00
Renovate Bot
2aa4ab7fe8 Update ASF-ui commit hash to 114ff77 2022-02-07 04:53:06 +00:00
ArchiBot
dfc055c066 Automatic translations update 2022-02-07 02:08:26 +00:00
ArchiBot
1a0ac11f46 Automatic translations update 2022-02-06 02:17:05 +00:00
ArchiBot
7266864b3b Automatic translations update 2022-02-05 02:01:05 +00:00
Archi
b52f746138 Remove dead code 2022-02-04 14:47:13 +01:00
Archi
a2585ec8c9 Remove obsolete features 2022-02-04 14:46:09 +01:00
Renovate Bot
37781698e0 Update wiki commit hash to f917797 2022-02-04 10:06:13 +00:00
ArchiBot
2a8fe7611b Automatic translations update 2022-02-04 02:03:32 +00:00
Renovate Bot
8fdf14bb10 Update wiki commit hash to 15d73b5 2022-02-03 20:48:34 +00:00
Archi
31db72b2d6 Bump 2022-02-03 21:05:04 +01:00
Archi
f28ae15cc9 Bump 2022-02-03 19:55:01 +01:00
Archi
6fcc64dad1 Update RemoteCommunication.cs 2022-02-03 19:54:39 +01:00
Archi
e18046084e Remove TradeMatcher remote communication
Instead, make MatchActively work without specifying SteamTradeMatcher
2022-02-03 18:01:39 +01:00
Łukasz Domeradzki
c3c5f33289 Split global statistics into per-bot RemoteConnection (#2505)
* Split global statistics into per-bot RemoteConnection

* Add migration for existing statistics setting
2022-02-03 17:33:04 +01:00
Renovate Bot
e03734ef8f Update ASF-ui commit hash to e25e4c2 2022-02-03 02:08:27 +00:00
ArchiBot
a7c2ca6bc5 Automatic translations update 2022-02-03 02:06:56 +00:00
Renovate Bot
171fca42f2 Update ASF-ui commit hash to bb18713 2022-02-02 15:07:03 +00:00
Renovate Bot
e90ac74b16 Update ASF-ui commit hash to ad228aa 2022-02-02 03:41:32 +00:00
ArchiBot
a5ce8bf3d7 Automatic translations update 2022-02-02 02:08:44 +00:00
renovate[bot]
aad77569a7 Update dependency System.Linq.Async to v6 (#2504)
Co-authored-by: Renovate Bot <bot@renovateapp.com>
2022-02-01 20:11:23 +01:00
Renovate Bot
e74b3e4f78 Update docker/build-push-action action to v2.9.0 2022-02-01 12:23:46 +00:00
Renovate Bot
7db44c5835 Update ASF-ui commit hash to 68fb54f 2022-02-01 11:03:29 +00:00
ArchiBot
25a88f941d Automatic translations update 2022-02-01 02:15:13 +00:00
Renovate Bot
2eab00facc Update ASF-ui commit hash to ef8d48a 2022-01-31 21:41:04 +00:00
Renovate Bot
98e51a4543 Update ASF-ui commit hash to e205055 2022-01-31 14:21:42 +00:00
ArchiBot
2ee49db81d Automatic translations update 2022-01-31 02:07:28 +00:00
Renovate Bot
aab397dd2d Update wiki commit hash to a4368cd 2022-01-30 17:38:23 +00:00
Renovate Bot
7426fafcb0 Update ASF-ui commit hash to 837307f 2022-01-30 03:14:55 +00:00
ArchiBot
270bd7ae26 Automatic translations update 2022-01-30 02:08:13 +00:00
Renovate Bot
4c3713c19f Update wiki commit hash to ea00ec2 2022-01-29 23:48:59 +00:00
Renovate Bot
5791b1e552 Update dependency Humanizer to v2.14.1 2022-01-29 15:55:12 +00:00
Renovate Bot
5c59236a09 Update ASF-ui commit hash to 4f5ca7c 2022-01-29 01:17:20 +00:00
Renovate Bot
a7119bba89 Update ASF-ui commit hash to bb9711b 2022-01-28 15:21:16 +00:00
ArchiBot
3b64e14489 Automatic translations update 2022-01-27 02:08:44 +00:00
Renovate Bot
5f36ca91d7 Update ASF-ui commit hash to 652f1e9 2022-01-26 04:08:45 +00:00
ArchiBot
5a2cd25fa1 Automatic translations update 2022-01-26 02:13:04 +00:00
ArchiBot
20a5d509a7 Automatic translations update 2022-01-25 02:12:19 +00:00
Renovate Bot
0c457e7f3e Update wiki commit hash to 35d6943 2022-01-25 00:10:10 +00:00
Renovate Bot
4e6014d652 Update ASF-ui commit hash to 17f3ffb 2022-01-24 17:59:03 +00:00
Renovate Bot
1436fb6d6a Update ASF-ui commit hash to c8379bd 2022-01-24 13:25:22 +00:00
Renovate Bot
e2578c7960 Update dependency Markdig.Signed to v0.27.0 2022-01-23 16:41:54 +00:00
Archi
8fb1a2e1ea Bump 2022-01-23 14:31:20 +01:00
Archi
3e2951d1d0 Fix old IBotCommand plugin answers 2022-01-23 14:27:54 +01:00
Archi
1dcb103bf7 Bump 2022-01-23 13:01:41 +01:00
Archi
7ca8efb81f Fix steamID never being provided to original Response()
It matters in only one place anyway, but still.
2022-01-23 13:01:17 +01:00
Archi
c08f259806 Bump 2022-01-23 12:46:02 +01:00
ArchiBot
e0a8f96ec4 Automatic translations update 2022-01-23 02:07:51 +00:00
Archi
dae6f9d328 Use newer syntax for Enum.IsDefined() 2022-01-23 01:37:43 +01:00
Łukasz Domeradzki
4258fed873 Closes #2500 (#2501)
* Start work on #2500

* Update Bot.cs

* Misc refactor

* Update Bot.cs

* Add fallback for older plugins

* Misc

* Apply feedback
2022-01-23 00:14:14 +01:00
Renovate Bot
ab6e0a1e1b Update ASF-ui commit hash to 156992e 2022-01-22 18:51:14 +00:00
ArchiBot
959056523a Automatic translations update 2022-01-22 02:07:28 +00:00
Renovate Bot
245e3aa250 Update ASF-ui commit hash to 12ad1a4 2022-01-21 21:44:31 +00:00
Renovate Bot
170bd9fe42 Update ASF-ui commit hash to 1792331 2022-01-21 12:03:36 +00:00
Renovate Bot
2cf84d3691 Update ASF-ui commit hash to 351d4b7 2022-01-21 02:49:11 +00:00
ArchiBot
ae0ec5feee Automatic translations update 2022-01-21 02:09:07 +00:00
Renovate Bot
c495ad4f4a Update ASF-ui commit hash to 661a128 2022-01-20 20:44:19 +00:00
Renovate Bot
01e4085a52 Update ASF-ui commit hash to 2b2da73 2022-01-20 17:09:15 +00:00
ArchiBot
e89dad5792 Automatic translations update 2022-01-20 02:17:19 +00:00
Renovate Bot
8c6c7a5f3c Update ASF-ui commit hash to c985273 2022-01-19 21:20:37 +00:00
Renovate Bot
32f52e9de3 Update ASF-ui commit hash to 04a8efc 2022-01-19 03:26:14 +00:00
ArchiBot
aaabd81778 Automatic translations update 2022-01-19 02:07:42 +00:00
Renovate Bot
24200e3490 Update docker/build-push-action action to v2.8.0 2022-01-18 14:35:14 +00:00
Renovate Bot
a896075e88 Update ASF-ui commit hash to a3bc67f 2022-01-18 13:02:03 +00:00
ArchiBot
1bf35d1215 Automatic translations update 2022-01-18 02:15:40 +00:00
Renovate Bot
641aa435be Update wiki commit hash to ebfbf57 2022-01-17 20:37:03 +00:00
Renovate Bot
d3e48e69d4 Update ASF-ui commit hash to 1e5ccf7 2022-01-17 17:37:35 +00:00
Renovate Bot
8548044038 Update ASF-ui commit hash to 2c5aff8 2022-01-16 10:32:09 +00:00
ArchiBot
cdffde2d76 Automatic translations update 2022-01-16 02:16:57 +00:00
ArchiBot
afd7360676 Automatic translations update 2022-01-15 02:13:55 +00:00
Renovate Bot
7603efb289 Update ASF-ui commit hash to 94df465 2022-01-14 14:36:40 +00:00
Renovate Bot
3ad6f68bb9 Update crowdin/github-action action to v1.4.6 2022-01-14 10:25:23 +00:00
Renovate Bot
065facb5db Update ASF-ui commit hash to 6b2c2b6 2022-01-13 22:49:30 +00:00
Renovate Bot
8140784903 Update ASF-ui commit hash to 808b71f 2022-01-13 10:38:27 +00:00
Renovate Bot
c468f3e4e1 Update ASF-ui commit hash to 914506b 2022-01-13 01:34:43 +00:00
Renovate Bot
174317c674 Update ASF-ui commit hash to e48498f 2022-01-12 11:42:14 +00:00
ArchiBot
25690056da Automatic translations update 2022-01-12 09:33:03 +00:00
Renovate Bot
1950c1326e Update ASF-ui commit hash to 9301a40 2022-01-11 21:25:28 +00:00
Archi
876074a0ed Misc l10n 2022-01-11 12:27:05 +01:00
Renovate Bot
8c06051f52 Update ASF-ui commit hash to 6e8c8fd 2022-01-11 01:55:10 +00:00
Renovate Bot
b7d9c7b6da Update crowdin/github-action action to v1.4.5 2022-01-10 12:47:49 +00:00
Archi
ca048912cd Show ASF version in swagger spec
Also correct name to be more explicit
2022-01-10 12:49:05 +01:00
Archi
290aa3ba34 Bump 2022-01-10 11:21:50 +01:00
Archi
8620a90787 Remove all workarounds that should be no longer needed 2022-01-10 11:19:35 +01:00
Renovate Bot
189f998faf Update dependency SteamKit2 to v2.4.1 2022-01-10 03:06:39 +00:00
Archi
a5640f5a84 Fix permanently stopped IPC when ASF update has failed 2022-01-08 17:26:16 +01:00
Renovate Bot
b343d81f56 Update ASF-ui commit hash to 2089f03 2022-01-08 03:19:25 +00:00
Archi
edf2a19946 Add additional safeguards against running wrong package
e.g. Linux user calling dotnet ArchiSteamFarm.dll from win-x64 package
2022-01-07 19:08:40 +01:00
Archi
7e43a05517 Misc 2022-01-07 19:04:04 +01:00
Renovate Bot
db8ead92a1 Update ASF-ui commit hash to 44223fd 2022-01-07 05:34:52 +00:00
ArchiBot
e33c340183 Automatic translations update 2022-01-07 02:17:56 +00:00
Archi
a04781747e Bump 2022-01-06 20:48:26 +01:00
147 changed files with 3948 additions and 2744 deletions

View File

@@ -67,7 +67,7 @@ ASF is open-source project, developed mainly by **[JustArchi](https://github.com
### License
ASF is using **[Apache License 2.0](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE-2.0.txt)**.
ASF is using **[Apache License 2.0](https://github.com/JustArchiNET/ArchiSteamFarm/blob/main/LICENSE.txt)**.
> Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions.

2
.github/FUNDING.yml vendored
View File

@@ -2,4 +2,4 @@
github: JustArchi
patreon: JustArchi
custom: ["https://paypal.me/JustArchi", "https://pay.revolut.com/profile/ukaszyxm", "https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e", "https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_"]
custom: ["https://paypal.me/JustArchi", "https://pay.revolut.com/justarchi", "https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e", "https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_"]

View File

@@ -1,6 +1,6 @@
### Notice
**Pre-releases are experimental versions that often contain unpatched bugs, work-in-progress features or rewritten implementations. If you don't consider yourself advanced user, please download **[latest stable release](https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest)** instead. Pre-release versions are dedicated to users who know how to report bugs, deal with issues and give feedback - no technical support will be given. Check out ASF **[release cycle](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Release-cycle)** if you'd like to learn more.**
**Pre-releases are experimental versions that often contain unpatched bugs, work-in-progress features and rewritten implementations. If you don't consider yourself advanced user, please download **[latest stable release](https://github.com/JustArchiNET/ArchiSteamFarm/releases/latest)** instead. Pre-release versions are dedicated to users who know how to report bugs, deal with issues and give feedback - no technical support will be given. Check out ASF **[release cycle](https://github.com/JustArchiNET/ArchiSteamFarm/wiki/Release-cycle)** if you'd like to learn more.**
---
@@ -14,4 +14,4 @@ This is automated GitHub deployment, human-readable changelog should be availabl
ASF is available for free, this release was made possible thanks to the people that decided to support the project. If you're grateful for what we're doing, please consider a donation. Developing ASF requires massive amount of time and knowledge, especially when it comes to Steam (and its problems). Even $1 is highly appreciated and shows that you care. Thank you!
[![GitHub sponsor](https://img.shields.io/badge/GitHub-sponsor-ea4aaa.svg?logo=github-sponsors)](https://github.com/sponsors/JustArchi) [![Patreon support](https://img.shields.io/badge/Patreon-support-f96854.svg?logo=patreon)](https://www.patreon.com/JustArchi) [![Crypto donate](https://img.shields.io/badge/Crypto-donate-f7931a.svg?logo=bitcoin)](https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e) [![PayPal.me donate](https://img.shields.io/badge/PayPal.me-donate-00457c.svg?logo=paypal)](https://paypal.me/JustArchi) [![PayPal donate](https://img.shields.io/badge/PayPal-donate-00457c.svg?logo=paypal)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4) [![Revolut donate](https://img.shields.io/badge/Revolut-donate-0075eb.svg?logo=revolut)](https://pay.revolut.com/profile/ukaszyxm) [![Steam donate](https://img.shields.io/badge/Steam-donate-000000.svg?logo=steam)](https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_)
[![GitHub sponsor](https://img.shields.io/badge/GitHub-sponsor-ea4aaa.svg?logo=github-sponsors)](https://github.com/sponsors/JustArchi) [![Patreon support](https://img.shields.io/badge/Patreon-support-f96854.svg?logo=patreon)](https://www.patreon.com/JustArchi) [![Crypto donate](https://img.shields.io/badge/Crypto-donate-f7931a.svg?logo=bitcoin)](https://commerce.coinbase.com/checkout/0c23b844-c51b-45f4-9135-8db7c6fcf98e) [![PayPal.me donate](https://img.shields.io/badge/PayPal.me-donate-00457c.svg?logo=paypal)](https://paypal.me/JustArchi) [![PayPal donate](https://img.shields.io/badge/PayPal-donate-00457c.svg?logo=paypal)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=HD2P2P3WGS5Y4) [![Revolut donate](https://img.shields.io/badge/Revolut-donate-0075eb.svg?logo=revolut)](https://pay.revolut.com/justarchi) [![Steam donate](https://img.shields.io/badge/Steam-donate-000000.svg?logo=steam)](https://steamcommunity.com/tradeoffer/new/?partner=46697991&token=0ix2Ruv_)

11
.github/crowdin.yml vendored
View File

@@ -1,3 +1,4 @@
"base_path": ".."
"preserve_hierarchy": true
"files": [
{
@@ -5,7 +6,10 @@
"translation": "/ArchiSteamFarm/Localization/Strings.%locale%.resx",
"translation_replace": {
".lol-US.resx": ".qps-Ploc.resx",
".sr-CS.resx": ".sr-Latn.resx"
".sr-CS.resx": ".sr-Latn.resx",
".zh-CN.resx": ".zh-Hans.resx",
".zh-HK.resx": ".zh-Hant-HK.resx",
".zh-TW.resx": ".zh-Hant.resx"
}
},
{
@@ -13,7 +17,10 @@
"translation": "/ArchiSteamFarm.OfficialPlugins.SteamTokenDumper/Localization/Strings.%locale%.resx",
"translation_replace": {
".lol-US.resx": ".qps-Ploc.resx",
".sr-CS.resx": ".sr-Latn.resx"
".sr-CS.resx": ".sr-Latn.resx",
".zh-CN.resx": ".zh-Hans.resx",
".zh-HK.resx": ".zh-Hant-HK.resx",
".zh-TW.resx": ".zh-Hant.resx"
}
},
{

View File

@@ -19,6 +19,12 @@
"allowedVersions": "<= 3.1",
"matchManagers": [ "nuget" ],
"matchPackageNames": [ "Microsoft.Extensions.Configuration.Json", "Microsoft.Extensions.Logging.Configuration" ]
},
{
// TODO: https://github.com/AngleSharp/AngleSharp.XPath/issues/36
"allowedVersions": "< 2.0",
"matchManagers": [ "nuget" ],
"matchPackageNames": [ "AngleSharp.XPath" ]
}
]
}

View File

@@ -19,12 +19,12 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1.9.0
uses: actions/setup-dotnet@v2.1.0
with:
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
@@ -38,9 +38,8 @@ jobs:
run: dotnet test ArchiSteamFarm.Tests -c "${{ matrix.configuration }}" -p:ContinuousIntegrationBuild=true -p:UseAppHost=false --nologo
- name: Upload latest strings for translation on Crowdin
continue-on-error: true
if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' && matrix.configuration == 'Release' && startsWith(matrix.os, 'ubuntu-') }}
uses: crowdin/github-action@1.4.4
uses: crowdin/github-action@1.4.9
with:
crowdin_branch_name: main
config: '.github/crowdin.yml'

View File

@@ -17,15 +17,15 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
uses: docker/setup-buildx-action@v2.0.0
- name: Build ${{ matrix.configuration }} Docker image from ${{ matrix.file }}
uses: docker/build-push-action@v2.7.0
uses: docker/build-push-action@v3.0.0
with:
context: .
file: ${{ matrix.file }}

View File

@@ -15,22 +15,22 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
uses: docker/setup-buildx-action@v2.0.0
- name: Login to ghcr.io
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -55,7 +55,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile.Service
uses: docker/build-push-action@v2.7.0
uses: docker/build-push-action@v3.0.0
with:
context: .
file: Dockerfile.Service

View File

@@ -16,22 +16,22 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
uses: docker/setup-buildx-action@v2.0.0
- name: Login to ghcr.io
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -55,7 +55,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile
uses: docker/build-push-action@v2.7.0
uses: docker/build-push-action@v3.0.0
with:
context: .
platforms: ${{ env.PLATFORMS }}
@@ -70,8 +70,7 @@ jobs:
push: true
- name: Update DockerHub repository description
continue-on-error: true
uses: peter-evans/dockerhub-description@v2.4.3
uses: peter-evans/dockerhub-description@v3.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_PASSWORD }}

View File

@@ -16,22 +16,22 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1.6.0
uses: docker/setup-buildx-action@v2.0.0
- name: Login to ghcr.io
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Login to DockerHub
uses: docker/login-action@v1.12.0
uses: docker/login-action@v2.0.0
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
@@ -56,7 +56,7 @@ jobs:
echo "DH_REPOSITORY=$(echo ${{ secrets.DOCKERHUB_USERNAME }}/${{ github.event.repository.name }} | tr '[:upper:]' '[:lower:]')" >> "$GITHUB_ENV"
- name: Build and publish Docker image from Dockerfile
uses: docker/build-push-action@v2.7.0
uses: docker/build-push-action@v3.0.0
with:
context: .
platforms: ${{ env.PLATFORMS }}

View File

@@ -25,12 +25,12 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
- name: Setup .NET Core
uses: actions/setup-dotnet@v1.9.0
uses: actions/setup-dotnet@v2.1.0
with:
dotnet-version: ${{ env.DOTNET_SDK_VERSION }}
@@ -38,7 +38,7 @@ jobs:
run: dotnet --info
- name: Setup Node.js with npm
uses: actions/setup-node@v2.5.1
uses: actions/setup-node@v3.2.0
with:
check-latest: true
node-version: ${{ env.NODE_JS_VERSION }}
@@ -177,7 +177,7 @@ jobs:
# Create the final zip file
case "$(uname -s)" in
"Darwin")
# We prefer to use zip on OS X as 7z implementation on that OS doesn't handle file permissions (chmod +x)
# We prefer to use zip on macOS as 7z implementation on that OS doesn't handle file permissions (chmod +x)
if command -v zip >/dev/null; then
(
cd "${GITHUB_WORKSPACE}/out/${1}"
@@ -339,58 +339,50 @@ jobs:
Get-Job | Receive-Job -Wait
- name: Upload ASF-generic
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-generic
path: out/ASF-generic.zip
- name: Upload ASF-generic-netf
continue-on-error: true
if: startsWith(matrix.os, 'windows-')
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-generic-netf
path: out/ASF-generic-netf.zip
- name: Upload ASF-linux-arm
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-linux-arm
path: out/ASF-linux-arm.zip
- name: Upload ASF-linux-arm64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-linux-arm64
path: out/ASF-linux-arm64.zip
- name: Upload ASF-linux-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-linux-x64
path: out/ASF-linux-x64.zip
- name: Upload ASF-osx-arm64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-osx-arm64
path: out/ASF-osx-arm64.zip
- name: Upload ASF-osx-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-osx-x64
path: out/ASF-osx-x64.zip
- name: Upload ASF-win-x64
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: ${{ matrix.os }}_ASF-win-x64
path: out/ASF-win-x64.zip
@@ -402,61 +394,61 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
# TODO: It'd be perfect if we could match final artifacts to the platform they target, so e.g. linux build comes from the linux machine
# However, that is currently impossible due to https://github.com/dotnet/msbuild/issues/3897
# Therefore, we'll (sadly) pull artifacts from Windows machine only for now
- name: Download ASF-generic artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-generic
path: out
- name: Download ASF-generic-netf artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-generic-netf
path: out
- name: Download ASF-linux-arm artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-arm
path: out
- name: Download ASF-linux-arm64 artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-arm64
path: out
- name: Download ASF-linux-x64 artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-linux-x64
path: out
- name: Download ASF-osx-arm64 artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-osx-arm64
path: out
- name: Download ASF-osx-x64 artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-osx-x64
path: out
- name: Download ASF-win-x64 artifact from windows-latest
uses: actions/download-artifact@v2.1.0
uses: actions/download-artifact@v3.0.0
with:
name: windows-latest_ASF-win-x64
path: out
- name: Import GPG key for signing
uses: crazy-max/ghaction-import-gpg@v4.1.0
uses: crazy-max/ghaction-import-gpg@v5.0.0
with:
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
@@ -473,15 +465,13 @@ jobs:
)
- name: Upload SHA512SUMS
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: SHA512SUMS
path: out/SHA512SUMS
- name: Upload SHA512SUMS.sign
continue-on-error: true
uses: actions/upload-artifact@v2.3.1
uses: actions/upload-artifact@v3.1.0
with:
name: SHA512SUMS.sign
path: out/SHA512SUMS.sign

View File

@@ -10,7 +10,7 @@ jobs:
steps:
- name: Checkout code
uses: actions/checkout@v2.4.0
uses: actions/checkout@v3.0.2
with:
submodules: recursive
token: ${{ secrets.ARCHIBOT_GITHUB_TOKEN }}
@@ -26,7 +26,7 @@ jobs:
git reset --hard origin/master
- name: Download latest translations from Crowdin
uses: crowdin/github-action@1.4.4
uses: crowdin/github-action@1.4.9
with:
upload_sources: false
download_translations: true
@@ -38,7 +38,7 @@ jobs:
token: ${{ secrets.ASF_CROWDIN_API_TOKEN }}
- name: Import GPG key for signing
uses: crazy-max/ghaction-import-gpg@v4.1.0
uses: crazy-max/ghaction-import-gpg@v5.0.0
with:
gpg_private_key: ${{ secrets.ARCHIBOT_GPG_PRIVATE_KEY }}
git_config_global: true

35
.gitignore vendored
View File

@@ -18,13 +18,16 @@ ArchiSteamFarm/logs
# Ignore standard out folders for publishing
**/out
# JetBrains Rider
.idea/
# _ _
# | | (_) _ __ _ _ __ __
# | | | || '_ \ | | | |\ \/ /
# | |___ | || | | || |_| | > <
# |_____||_||_| |_| \__,_|/_/\_\
#
# https://github.com/github/gitignore/blob/master/Global/Linux.gitignore
# https://github.com/github/gitignore/blob/main/Global/Linux.gitignore
# 4f7062e132d7f88e68ab737e64fef872bd3a491f
*~
@@ -47,7 +50,7 @@ ArchiSteamFarm/logs
# | | | | | || (_| || (__ | |_| | ___) |
# |_| |_| |_| \__,_| \___| \___/ |____/
#
# https://github.com/github/gitignore/blob/master/Global/macOS.gitignore
# https://github.com/github/gitignore/blob/main/Global/macOS.gitignore
# 2bb963b16a1957c865335e53537036c2e97399b5
# General
@@ -84,7 +87,7 @@ Temporary Items
# |_| |_| \___/ |_| |_| \___/ |____/ \___| \_/ \___||_| \___/ | .__/
# |_|
#
# https://github.com/github/gitignore/blob/master/Global/MonoDevelop.gitignore
# https://github.com/github/gitignore/blob/main/Global/MonoDevelop.gitignore
# e8b2e1a9cc7c9ca49bb05c20a4c4491b85feba6d
#User Specific
@@ -102,13 +105,13 @@ test-results/
# \ V / | |\__ \| |_| || (_| || | ___) || |_ | |_| || (_| || || (_) |
# \_/ |_||___/ \__,_| \__,_||_||____/ \__| \__,_| \__,_||_| \___/
#
# https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
# 888439ee893d0097862f1d510585bd0e3cfd500f
# https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# 491040e88a572d300a59484cb78c86c5e944b70a
## 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
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
@@ -313,9 +316,6 @@ PublishScripts/
*.nuget.props
*.nuget.targets
# Nuget personal access tokens and Credentials
nuget.config
# Microsoft Azure Build Output
csx/
*.build.csdef
@@ -404,6 +404,17 @@ node_modules/
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
*.ncb
*.aps
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
@@ -460,6 +471,9 @@ ASALocalRun/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
@@ -491,7 +505,6 @@ FodyWeavers.xsd
*.msp
# JetBrains Rider
.idea/
*.sln.iml
# __ __ _ _
@@ -500,7 +513,7 @@ FodyWeavers.xsd
# \ V V / | || | | || (_| || (_) |\ V V / \__ \
# \_/\_/ |_||_| |_| \__,_| \___/ \_/\_/ |___/
#
# https://github.com/github/gitignore/blob/master/Global/Windows.gitignore
# https://github.com/github/gitignore/blob/main/Global/Windows.gitignore
# 5808b77453dec299d4daf8557b05a80be832a5b8
# Windows thumbnail cache files

2
ASF-ui

Submodule ASF-ui updated: 8b16b79e96...8ba873883b

View File

@@ -41,7 +41,7 @@ internal static class CatAPI {
ObjectResponse<MeowResponse>? response = await webBrowser.UrlGetToJsonObject<MeowResponse>(request).ConfigureAwait(false);
if (response == null) {
if (response?.Content == null) {
return null;
}
@@ -55,7 +55,7 @@ internal static class CatAPI {
#pragma warning disable CA1812 // False positive, the class is used during json deserialization
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
private sealed class MeowResponse {
[JsonProperty(PropertyName = "file", Required = Required.Always)]
[JsonProperty("file", Required = Required.Always)]
internal readonly string Link = "";
[JsonConstructor]

View File

@@ -28,7 +28,6 @@ using ArchiSteamFarm.Core;
using ArchiSteamFarm.Plugins.Interfaces;
using ArchiSteamFarm.Steam;
using ArchiSteamFarm.Steam.Data;
using ArchiSteamFarm.Steam.Storage;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using SteamKit2;
@@ -41,7 +40,7 @@ namespace ArchiSteamFarm.CustomPlugins.ExamplePlugin;
// Your plugin class should inherit the plugin interfaces it wants to handle
// If you do not want to handle a particular action (e.g. OnBotMessage that is offered in IBotMessage), it's the best idea to not inherit it at all
// This will keep your code compact, efficient and less dependent. You can always add additional interfaces when you'll need them, this example project will inherit quite a bit of them to show you potential usage
internal sealed class ExamplePlugin : IASF, IBot, IBotCommand, IBotConnection, IBotFriendRequest, IBotMessage, IBotModules, IBotTradeOffer {
internal sealed class ExamplePlugin : IASF, IBot, IBotCommand2, IBotConnection, IBotFriendRequest, IBotMessage, IBotModules, IBotTradeOffer {
// This is used for identification purposes, typically you want to use a friendly name of your plugin here, such as the name of your main class
// Please note that this property can have direct dependencies only on structures that were initialized by the constructor, as it's possible to be called before OnLoaded() takes place
public string Name => nameof(ExamplePlugin);
@@ -86,11 +85,11 @@ internal sealed class ExamplePlugin : IASF, IBot, IBotCommand, IBotConnection, I
// Since ASF already had to do initial parsing in order to determine that the command is unknown, args[] are splitted using standard ASF delimiters
// If by any chance you want to handle message in its raw format, you also have it available, although for usual ASF pattern you can most likely stick with args[] exclusively. The message has CommandPrefix already stripped for your convenience
// If you do not recognize the command, just return null/empty and allow ASF to gracefully return "unknown command" to user on usual basis
public async Task<string?> OnBotCommand(Bot bot, ulong steamID, string message, string[] args) {
public async Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
// In comparison with OnBotMessage(), we're using asynchronous CatAPI call here, so we declare our method as async and return the message as usual
// Notice how we handle access here as well, it'll work only for FamilySharing+
switch (args[0].ToUpperInvariant()) {
case "CAT" when bot.HasAccess(steamID, BotConfig.EAccess.FamilySharing):
case "CAT" when access >= EAccess.FamilySharing:
// Notice how we can decide whether to use bot's AWH WebBrowser or ASF's one. For Steam-related requests, AWH's one should always be used, for third-party requests like those it doesn't really matter
// Still, it makes sense to pass AWH's one, so in case you get some errors or alike, you know from which bot instance they come from. It's similar to using Bot's ArchiLogger compared to ASF's one
string? randomCatURL = await CatAPI.GetRandomCatURL(bot.ArchiWebHandler.WebBrowser).ConfigureAwait(false);

View File

@@ -120,7 +120,7 @@ internal sealed class GlobalCache : SerializableFile {
}
if (globalCache == null) {
ASF.ArchiLogger.LogNullError(nameof(globalCache));
ASF.ArchiLogger.LogNullError(globalCache);
return null;
}
@@ -150,7 +150,7 @@ internal sealed class GlobalCache : SerializableFile {
LastChangeNumber = currentChangeNumber;
foreach ((uint appID, SteamApps.PICSChangesCallback.PICSChangeData appData) in appChanges) {
if (!AppChangeNumbers.TryGetValue(appID, out uint previousChangeNumber) || (appData.ChangeNumber <= previousChangeNumber)) {
if (!AppChangeNumbers.TryGetValue(appID, out uint previousChangeNumber) || (previousChangeNumber >= appData.ChangeNumber)) {
continue;
}
@@ -184,7 +184,7 @@ internal sealed class GlobalCache : SerializableFile {
bool save = false;
foreach ((uint appID, uint changeNumber) in appChangeNumbers) {
if (AppChangeNumbers.TryGetValue(appID, out uint previousChangeNumber) && (previousChangeNumber == changeNumber)) {
if (AppChangeNumbers.TryGetValue(appID, out uint previousChangeNumber) && (previousChangeNumber >= changeNumber)) {
continue;
}
@@ -281,19 +281,38 @@ internal sealed class GlobalCache : SerializableFile {
ArgumentNullException.ThrowIfNull(packages);
ArgumentNullException.ThrowIfNull(depots);
bool save = false;
foreach ((uint appID, ulong token) in apps) {
if (SubmittedApps.TryGetValue(appID, out ulong previousToken) && (previousToken == token)) {
continue;
}
SubmittedApps[appID] = token;
save = true;
}
foreach ((uint packageID, ulong token) in packages) {
if (SubmittedPackages.TryGetValue(packageID, out ulong previousToken) && (previousToken == token)) {
continue;
}
SubmittedPackages[packageID] = token;
save = true;
}
foreach ((uint depotID, string key) in depots) {
if (SubmittedDepots.TryGetValue(depotID, out string? previousKey) && (previousKey == key)) {
continue;
}
SubmittedDepots[depotID] = key;
save = true;
}
Utilities.InBackground(Save);
if (save) {
Utilities.InBackground(Save);
}
}
private static bool IsValidDepotKey(string depotKey) {

View File

@@ -78,15 +78,29 @@
<value>{0} nelze načíst, nová instance bude inicializována...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Neexistují žádné aplikace, které by vyžadovaly aktualizaci této instance bota.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Načítám celkem {0} přístupových tokenů...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Načítání {0} přístupových tokenů...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Načítání {0} přístupových tokenů bylo dokončeno.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Dokončeno načítání celkem {0} přístupových tokenů.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Načítání všech úložišť, celkem z {0} aplikací...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Získávání {0} informací o aplikaci...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
@@ -95,16 +109,45 @@
<value>Načítání informací o aplikaci {0} bylo dokončeno.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Získávání {0} tokenů úložišť...</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>Načítání {0} přístupových tokenů bylo dokončeno.</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Načítání všech tokenbů úložišť, celkem z {0} aplikací bylo dokončeno.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Nejsou k dispozici žádné nové údaje k odeslání, vše je aktuální.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Data nelze odeslat, protože neexistuje žádné platné SteamID, které bychom mohli klasifikovat jako přispěvatele. Zvažte nastavení {0} parametrů.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Odesílání celkem registrovaných aplikací/balíčků/úložišť: {0}/{1}/{2}...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Odeslání se nezdařilo z důvodu příliš mnoha odeslaných požadavků. Pokusíme se znovu přibližně za {0}.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Data byla úspěšně odeslána. Server zaregistroval celkem nové aplikace/balíčky/úložiště: {0} ({1} ověřeno)/{2} ({3} ověřeno)/{4} ({5} ověřeno).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Nové aplikace: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Ověřené aplikace: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Nové balíčky: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
@@ -113,9 +156,18 @@
<value>Ověřené balíčky: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Nová úložiště: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Ověřená úložiště: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} inicializován, žádný plugin nebude rozpoznávat: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Načítání globální mezipaměti STD...</value>
</data>

View File

@@ -168,7 +168,13 @@
<value>{0} wurde initialisiert, das Plugin wird keinen der folgenden Werte verarbeiten: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Globaler STD-Cache wird geladen...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Überprüfe STD globale Cache-Integrität...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>Fehler beim Überprüfen der globalen STD-Cache-Integrität. Dies deutet auf eine mögliche Datei-/Speicher-Beschädigung hin; stattdessen wird eine neue Instanz initialisiert.</value>
</data>
</root>

View File

@@ -62,34 +62,119 @@
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} on poistettu käytöstä puuttuvan koontitunnuksen vuoksi</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} on tällä hetkellä poistettu käytöstä asetuksistasi. Jos haluat auttaa SteamDB:tä tietojen lähettämisessä, ole hyvä ja tutustu wikimme.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} on alustettu onnistuneesti, kiitos etukäteen avustasi. Ensimmäinen lähetys tapahtuu noin {1} jälkeen.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} ei voitu ladata. Uusi instanssi alustetaan...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Ei ole sovelluksia, jotka vaatisivat päivitystä tässä botin instanssissa.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Haetaan yhteensä {0} sovelluksen käyttötunnisteita...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Haetaan {0} sovelluksen käyttötunnisteita...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Saatiin haettua {0} sovelluksen käyttötunnisteet.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Saatiin haettua yhteensä {0} sovelluksen käyttötunnisteet.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Haetaan kaikkia depotteja yhteensä {0} sovellukselle...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Haetaan {0} sovelluksen tietoja...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Saatiin haettua {0} sovelluksen tiedot.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Haetaan {0} depot-avainta...</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>Saatiin haettua {0} depot-avainta.</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Saatiin haettua kaikki depot-avaimet yhteensä {0} sovellukselle.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Uutta dataa ei ole lähetettäväksi, kaikki on ajan tasalla.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Tietoja ei voitu lähettää, koska ei ole voimassa olevaa SteamID-ryhmää, jonka voisimme luokitella osallistujaksi. Harkitse ominaisuuden {0} asettamista.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Lähetetään yhteensä {0}/{1}/{2} rekisteröityjä sovelluksia/paketteja/varikoita...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>Lähetys epäonnistui liian monen pyynnön vuoksi, yritämme uudelleen noin {0} kuluttua.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Tiedot on lähetetty onnistuneesti. Palvelin on rekisteröinyt yhteensä uusia sovelluksia/paketteja/depoteja: {0} ({1} vahvistettu)/{2} ({3} vahvistettu)/{4} ({5} vahvistettu).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>Uudet sovellukset: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>Vahvistetut sovellukset: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>Uudet paketit: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Vahvistetut paketit: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Uudet depotit: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Vahvistetut depotit: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} alustettu, laajennus ei käsittele yhtään näistä: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Ladataan STD:n globaalia välimuistia...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Tarkistetaan STD-välimuistin eheys...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>STD:n globaalin välimuistin eheyden varmistaminen epäonnistui. Tämä viittaa mahdolliseen tiedoston/muistin korruptioon, uusi instanssi käynnistetään sen sijaan.</value>
</data>
</root>

View File

@@ -82,14 +82,35 @@
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>יישומים חדשים: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>יישומים מאומתים: {0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>חבילות חדשות: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>חבילות מאומתות: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} אותחל, הפלאגין לא יפתור אף אחד מאלה: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>טוען מטמון עולמי מסוג STD...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>מאמת את שלמות מטמון ה-STD העולמי...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>נכשל אימות שלמות מטמון ה-STD העולמי. זה מרמז על פגיעה פוטנציאלית בקובץ/זיכרון, במקום זה הוא יאותחל מחדש.</value>
</data>
</root>

View File

@@ -101,13 +101,22 @@
<value>Ricezione di tutti i depositi per un totale di {0} app...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>Recuperate {0} informazioni app...</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Hai completato il recupero di {0} informazioni app.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Recupero {0} chiavi...</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>Completato il recupero di {0} chiavi.</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Finito il recupero di tutte le chiavi del deposito per un totale di {0} applicazioni.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
@@ -143,11 +152,29 @@
<value>Nuovi pacchetti: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>Pacchetti verificati: {0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Nuove app: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>App verificate: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} inizializzato, il plugin non risolverà nessuno dei seguenti: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Caricamento cache globale STD...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Convalida integrità cache globale STD...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>Impossibile verificare l'integrità globale della cache STD. Questo suggerisce un potenziale danneggiamento di file/memoria, una nuova istanza verrà inizializzata.</value>
</data>
</root>

View File

@@ -63,42 +63,42 @@
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>{0} foi desativado devido à falta de um token de compilação</value>
<value>O {0} foi desativado devido a um token de compilação ausente</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>{0} está desativado de acordo com sua configuração. Se você gostaria de ajudar o SteamDB no envio de dados, por favor, confira nosso wiki.</value>
<value>O {0} está desativado de acordo com a sua configuração. Caso deseje ajudar o SteamDB com o envio de informações, dê uma olhada na nossa wiki.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>{0} foi inicializado com sucesso, obrigado antecipadamente pela sua ajuda. O primeiro envio ocorrerá em aproximadamente {1} a partir de agora.</value>
<value>O {0} foi inicializado com sucesso, agradecemos a sua ajuda. O primeiro envio ocorrerá em aproximadamente {1}.</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>{0} não pôde ser carregado, uma instância nova será inicializada...</value>
<value>O {0} não pôde ser carregado, uma instância nova será inicializada...</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>Não há aplicativos que necessitem de ser atualizados nesta instância de bot.</value>
<value>Não há aplicativos que exijam atualizações na instância atual.</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Recuperando um total de {0} tokens de acesso a aplicativos...</value>
<value>Recuperando um total de {0} tokens de acesso para aplicativos...</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>Recuperando {0} tokens de acesso a aplicativos...</value>
<value>Recuperando {0} tokens...</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>Concluímos a recuperação de {0} tokens de acesso ao aplicativo.</value>
<value>Recuperamos {0} tokens.</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>Obtivemos um total de {0} tokens de acesso aos aplicativos.</value>
<value>Recuperamos um total de {0} tokens de acesso.</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>Recuperando todos os depósitos por um total de {0} apps...</value>
<value>Recuperando depots para todos os {0} aplicativos...</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
@@ -106,38 +106,38 @@
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>Concluímos a recuperação de {0} informações de aplicativo.</value>
<value>Recuperamos um total de {0} informações de aplicativos.</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>Recuperando {0} chaves de depósito...</value>
<value>Recuperando {0} códigos de depots...</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>Terminamos de recuperar {0} chaves de depósito.</value>
<value>Recuperamos códigos para {0} depots.</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>Terminamos de recuperar todas as chaves de depósito para um total de {0} apps.</value>
<value>Recuperamos códigos de acesso para {0} aplicativos.</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>Não há novos dados para enviar, tudo está atualizado.</value>
<value>Não há novos dados a serem enviados. Tudo está atualizado.</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>Não foi possível enviar os dados porque não há um conjunto SteamID válido que possamos classificar como colaborador. Considere configurar a propriedade {0}.</value>
<value>Não foi possível enviar os dados porque não conseguimos identificar um ID Steam válido para definir como colaborador. Considere configurar a propriedade "{0}".</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>Enviando um total de apps/pacotes/pacotes registrados: {0}/{1}/{2}...</value>
<value>Enviando um total de {0} aplicativos, {1} pacotes e {2} depots registrados...</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>O envio falhou devido a muitas solicitações enviadas, tentaremos novamente em aproximadamente {0} a partir de agora.</value>
<value>O envio falhou porque muitas solicitações foram enviadas pelo cliente. Tentaremos novamente em aproximadamente {0}.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>Os dados foram enviados com sucesso. O servidor registrou um total de novos aplicativos/pacotes/depósitos: {0} ({1} verificado)/{2} ({3} verificado)/{4} ({5} verificado).</value>
<value>Os dados foram enviados com sucesso. O servidor registrou um total de {0} aplicativos ({1} verificados), {2} pacotes ({3} verificados) e {4} depots ({5} verificados).</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
@@ -157,24 +157,24 @@
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>Novos depósitos: {0}</value>
<value>Novos depots: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>Depósitos verificados: {0}</value>
<value>Depots verificados: {0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} inicializado, o plugin não resolverá nenhum desses: {1}.</value>
<value>{0} inicializado, o plugin ignorará os seguintes pacotes: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Carregando cache STD global...</value>
<value>Carregando cache global do STD...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Validando integridade do cache STD global...</value>
<value>Validando integridade do cache global do STD...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>Falha ao verificar a integridade do cache STD global. Isso sugere uma potencial corrupção de arquivo/memória, uma instância nova será inicializada em vez disso.</value>
<value>Falha ao verificar a integridade do cache global do STD. Isto pode indicar uma possível corrupção de arquivo/memória, uma nova instância será inicializada.</value>
</data>
</root>

View File

@@ -168,7 +168,13 @@
<value>{0} INITIALIZD, TEH PLUGIN WILL NOT RESOLVE ANY OV DOSE: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>LOADIN STD GLOBAL CACHE...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>VALIDATIN STD GLOBAL CACHE INTEGRITY...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>FAILD 2 VERIFY STD GLOBAL CACHE INTEGRITY. DIS SUGGESTS POTENTIAL FILE/MEMS CORRUPSHUN, FRESH INSTANCE WILL BE INITIALIZD INSTEAD.</value>
</data>
</root>

View File

@@ -168,7 +168,13 @@
<value>{0} инициализирован, плагин не взаимодействует ни с одним из их: {1}.</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>Загрузка глобального кэша STD...</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>Проверка целостности глобального кэша STD...</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>Не удалось проверить целостность глобального кэша STD. Это говорит о потенциальном повреждении файла/памяти, вместо этого будет инициализирован новый экземпляр.</value>
</data>
</root>

View File

@@ -0,0 +1,180 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<data name="PluginDisabledMissingBuildToken" xml:space="preserve">
<value>由於 {0} 缺少組建權杖而被停用</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginDisabledInConfig" xml:space="preserve">
<value>目前 {0} 已根據您的設定被停用。如果您想幫助 SteamDB 提交資料,請查看我們的 Wiki。</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin")</comment>
</data>
<data name="PluginInitializedAndEnabled" xml:space="preserve">
<value>已成功初始化 {0},先感謝您的幫助。第一次提交將大約在 {1} 後進行。</value>
<comment>{0} will be replaced by the name of the plugin (e.g. "SteamTokenDumperPlugin"), {1} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="FileCouldNotBeLoadedFreshInit" xml:space="preserve">
<value>無法載入 {0},將初始化一個新實例…</value>
<comment>{0} will be replaced by the name of the file (e.g. "GlobalCache")</comment>
</data>
<data name="BotNoAppsToRefresh" xml:space="preserve">
<value>此 Bot 中沒有需要再刷新的應用程式。</value>
</data>
<data name="BotRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>正在檢索共 {0} 個應用程式存取權杖…</value>
<comment>{0} will be replaced by the number (total count) of app access tokens being retrieved</comment>
</data>
<data name="BotRetrievingAppAccessTokens" xml:space="preserve">
<value>正在檢索 {0} 個應用程式存取權杖…</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppAccessTokens" xml:space="preserve">
<value>已完成檢索 {0} 個應用程式存取權杖。</value>
<comment>{0} will be replaced by the number (count this batch) of app access tokens retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalAppAccessTokens" xml:space="preserve">
<value>已完成檢索共 {0} 個應用程式存取權杖。</value>
<comment>{0} will be replaced by the number (total count) of app access tokens retrieved</comment>
</data>
<data name="BotRetrievingTotalDepots" xml:space="preserve">
<value>正在檢索共 {0} 個應用程式的 Depot…</value>
<comment>{0} will be replaced by the number (total count) of apps being retrieved</comment>
</data>
<data name="BotRetrievingAppInfos" xml:space="preserve">
<value>正在檢索 {0} 個應用程式資料…</value>
<comment>{0} will be replaced by the number (count this batch) of app infos being retrieved</comment>
</data>
<data name="BotFinishedRetrievingAppInfos" xml:space="preserve">
<value>已完成檢索 {0} 個應用程式資料。</value>
<comment>{0} will be replaced by the number (count this batch) of app infos retrieved</comment>
</data>
<data name="BotRetrievingDepotKeys" xml:space="preserve">
<value>正在檢索 {0} 個應用程式的 Depot 金鑰…</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys being retrieved</comment>
</data>
<data name="BotFinishedRetrievingDepotKeys" xml:space="preserve">
<value>已完成檢索 {0} 個應用程式的 Depot 金鑰。</value>
<comment>{0} will be replaced by the number (count this batch) of depot keys retrieved</comment>
</data>
<data name="BotFinishedRetrievingTotalDepots" xml:space="preserve">
<value>已完成檢索共 {0} 個應用程式的 Depot 金鑰。</value>
<comment>{0} will be replaced by the number (total count) of apps retrieved</comment>
</data>
<data name="SubmissionNoNewData" xml:space="preserve">
<value>沒有要提交的新資料,一切都是最新狀態。</value>
</data>
<data name="SubmissionNoContributorSet" xml:space="preserve">
<value>無法提交資料,因為沒有可以讓我們歸類為貢獻者的有效 SteamID 集。 考慮設定 {0} 屬性。</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SteamOwnerID") that the user is expected to set</comment>
</data>
<data name="SubmissionInProgress" xml:space="preserve">
<value>正在提交註冊的應用程式/程式包/Depot 共:{0}/{1}/{2}…</value>
<comment>{0} will be replaced by the number of app access tokens being submitted, {1} will be replaced by the number of package access tokens being submitted, {2} will be replaced by the number of depot keys being submitted</comment>
</data>
<data name="SubmissionFailedTooManyRequests" xml:space="preserve">
<value>由於發送的請求過多導致提交失敗,我們將在約 {0} 後重試。</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "53 minutes")</comment>
</data>
<data name="SubmissionSuccessful" xml:space="preserve">
<value>已成功提交資料。伺服器共已註冊了新的應用程式/程式包/Depot 共:{0} ({1} 個已驗證)/{2} ({3} 個已驗證)/{4} ({5} 個已驗證)。</value>
<comment>{0} will be replaced by the number of new app access tokens that the server has registered, {1} will be replaced by the number of verified app access tokens that the server has registered, {2} will be replaced by the number of new package access tokens that the server has registered, {3} will be replaced by the number of verified package access tokens that the server has registered, {4} will be replaced by the number of new depot keys that the server has registered, {5} will be replaced by the number of verified depot keys that the server has registered</comment>
</data>
<data name="SubmissionSuccessfulNewApps" xml:space="preserve">
<value>新的應用程式:{0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedApps" xml:space="preserve">
<value>已驗證的應用程式:{0}</value>
<comment>{0} will be replaced by list of the apps (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewPackages" xml:space="preserve">
<value>新的程式包:{0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedPackages" xml:space="preserve">
<value>已驗證的程式包:{0}</value>
<comment>{0} will be replaced by list of the packages (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulNewDepots" xml:space="preserve">
<value>新的 Depot{0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="SubmissionSuccessfulVerifiedDepots" xml:space="preserve">
<value>已被驗證的 Depot{0}</value>
<comment>{0} will be replaced by list of the depots (IDs, numbers), separated by a comma</comment>
</data>
<data name="PluginSecretListInitialized" xml:space="preserve">
<value>{0} 已被初始化,外掛程式將無法解析其中任何一個:{1}。</value>
<comment>{0} will be replaced by the name of the config property (e.g. "SecretPackageIDs"), {1} will be replaced by list of the objects (IDs, numbers), separated by a comma</comment>
</data>
<data name="LoadingGlobalCache" xml:space="preserve">
<value>正在載入 STD 全域快取…</value>
</data>
<data name="ValidatingGlobalCacheIntegrity" xml:space="preserve">
<value>正在驗證 STD 全域快取完整性…</value>
</data>
<data name="GlobalCacheIntegrityValidationFailed" xml:space="preserve">
<value>無法驗證 STD 全域快取完整性。這表示可能有檔案/記憶損壞,將初始化一個新實例。</value>
</data>
</root>

View File

@@ -1,95 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" xmlns="" id="root">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"/>
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0"/>
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string"/>
<xsd:attribute name="type" type="xsd:string"/>
<xsd:attribute name="mimetype" type="xsd:string"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string"/>
<xsd:attribute name="name" type="xsd:string"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1"/>
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3"/>
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4"/>
<xsd:attribute ref="xml:space"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1"/>
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required"/>
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral,
PublicKeyToken=b77a5c561934e089
</value>
</resheader>
</root>

View File

@@ -30,27 +30,27 @@ using SteamKit2;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
internal sealed class RequestData {
[JsonProperty(PropertyName = "guid", Required = Required.Always)]
[JsonProperty("guid", Required = Required.Always)]
private static string Guid => ASF.GlobalDatabase?.Identifier.ToString("N") ?? throw new InvalidOperationException(nameof(ASF.GlobalDatabase.Identifier));
[JsonProperty(PropertyName = "token", Required = Required.Always)]
[JsonProperty("token", Required = Required.Always)]
private static string Token => SharedInfo.Token;
[JsonProperty(PropertyName = "v", Required = Required.Always)]
[JsonProperty("v", Required = Required.Always)]
private static byte Version => SharedInfo.ApiVersion;
[JsonProperty(PropertyName = "apps", Required = Required.Always)]
[JsonProperty("apps", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Apps;
[JsonProperty(PropertyName = "depots", Required = Required.Always)]
[JsonProperty("depots", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Depots;
private readonly ulong SteamID;
[JsonProperty(PropertyName = "subs", Required = Required.Always)]
[JsonProperty("subs", Required = Required.Always)]
private readonly ImmutableDictionary<string, string> Subs;
[JsonProperty(PropertyName = "steamid", Required = Required.Always)]
[JsonProperty("steamid", Required = Required.Always)]
private string SteamIDText => new SteamID(SteamID).Render();
internal RequestData(ulong steamID, IReadOnlyCollection<KeyValuePair<uint, ulong>> apps, IReadOnlyCollection<KeyValuePair<uint, ulong>> accessTokens, IReadOnlyCollection<KeyValuePair<uint, string>> depots) {

View File

@@ -29,12 +29,12 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ResponseData {
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "data", Required = Required.DisallowNull)]
[JsonProperty("data", Required = Required.DisallowNull)]
internal readonly InternalData? Data;
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
#pragma warning disable CS0649 // False positive, the field is used during json deserialization
[JsonProperty(PropertyName = "success", Required = Required.Always)]
[JsonProperty("success", Required = Required.Always)]
internal readonly bool Success;
#pragma warning restore CS0649 // False positive, the field is used during json deserialization
@@ -42,22 +42,22 @@ internal sealed class ResponseData {
private ResponseData() { }
internal sealed class InternalData {
[JsonProperty(PropertyName = "new_apps", Required = Required.Always)]
[JsonProperty("new_apps", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewApps = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "new_depots", Required = Required.Always)]
[JsonProperty("new_depots", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewDepots = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "new_subs", Required = Required.Always)]
[JsonProperty("new_subs", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> NewPackages = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_apps", Required = Required.Always)]
[JsonProperty("verified_apps", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedApps = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_depots", Required = Required.Always)]
[JsonProperty("verified_depots", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedDepots = ImmutableHashSet<uint>.Empty;
[JsonProperty(PropertyName = "verified_subs", Required = Required.Always)]
[JsonProperty("verified_subs", Required = Required.Always)]
internal readonly ImmutableHashSet<uint> VerifiedPackages = ImmutableHashSet<uint>.Empty;
[JsonConstructor]

View File

@@ -24,10 +24,11 @@ namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
internal static class SharedInfo {
internal const byte ApiVersion = 2;
internal const byte AppInfosPerSingleRequest = byte.MaxValue;
internal const byte HoursBetweenUploads = 24;
internal const byte MaximumHoursBetweenRefresh = 8; // Per single bot account, makes sense to be 2 or 3 times less than MinimumHoursBetweenUploads
internal const byte MaximumMinutesBeforeFirstUpload = 60; // Must be greater or equal to MinimumMinutesBeforeFirstUpload
internal const byte MinimumHoursBetweenUploads = 24;
internal const byte MinimumMinutesBeforeFirstUpload = 10; // Must be less or equal to MaximumMinutesBeforeFirstUpload
internal const byte MinimumMinutesBetweenUploads = 5; // Rate limiting for the server
internal const string ServerURL = "https://asf-token-dumper.xpaw.me";
internal const string Token = "STEAM_TOKEN_DUMPER_TOKEN"; // This is filled automatically during our CI build with API key provided by xPaw for ASF project

View File

@@ -44,7 +44,7 @@ public sealed class SteamTokenDumperConfig {
public ImmutableHashSet<uint> SecretPackageIDs { get; private set; } = ImmutableHashSet<uint>.Empty;
[JsonProperty(Required = Required.DisallowNull)]
public bool SkipAutoGrantPackages { get; private set; }
public bool SkipAutoGrantPackages { get; private set; } = true;
[JsonConstructor]
internal SteamTokenDumperConfig() { }

View File

@@ -23,6 +23,7 @@ using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;
using System.Composition;
using System.Globalization;
using System.Linq;
@@ -43,7 +44,7 @@ using SteamKit2;
namespace ArchiSteamFarm.OfficialPlugins.SteamTokenDumper;
[Export(typeof(IPlugin))]
internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotSteamClient, ISteamPICSChanges {
internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotCommand2, IBotSteamClient, ISteamPICSChanges {
[JsonProperty]
internal static SteamTokenDumperConfig? Config { get; private set; }
@@ -53,6 +54,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
private static readonly Timer SubmissionTimer = new(SubmitData);
private static GlobalCache? GlobalCache;
private static DateTimeOffset LastUploadAt = DateTimeOffset.MinValue;
[JsonProperty]
public override string Name => nameof(SteamTokenDumperPlugin);
@@ -138,12 +140,48 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
// ReSharper disable once SuspiciousLockOverSynchronizationPrimitive - this is not a mistake, we need extra synchronization, and we can re-use the semaphore object for that
lock (SubmissionSemaphore) {
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.MinimumHoursBetweenUploads));
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.HoursBetweenUploads));
}
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.PluginInitializedAndEnabled, nameof(SteamTokenDumperPlugin), startIn.ToHumanReadable()));
}
public Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
ArgumentNullException.ThrowIfNull(bot);
if (!Enum.IsDefined(access)) {
throw new InvalidEnumArgumentException(nameof(access), (int) access, typeof(EAccess));
}
if ((args == null) || (args.Length == 0)) {
throw new ArgumentNullException(nameof(args));
}
switch (args[0].ToUpperInvariant()) {
case "STD" when access >= EAccess.Owner:
if (Config is not { Enabled: true }) {
return Task.FromResult((string?) string.Format(CultureInfo.CurrentCulture, ArchiSteamFarm.Localization.Strings.WarningFailedWithError, nameof(Config)));
}
TimeSpan minimumTimeBetweenUpload = TimeSpan.FromMinutes(SharedInfo.MinimumMinutesBetweenUploads);
if (LastUploadAt + minimumTimeBetweenUpload > DateTimeOffset.UtcNow) {
return Task.FromResult((string?) string.Format(CultureInfo.CurrentCulture, Strings.SubmissionFailedTooManyRequests, minimumTimeBetweenUpload.ToHumanReadable()));
}
// ReSharper disable once SuspiciousLockOverSynchronizationPrimitive - this is not a mistake, we need extra synchronization, and we can re-use the semaphore object for that
lock (SubmissionSemaphore) {
SubmissionTimer.Change(TimeSpan.Zero, TimeSpan.FromHours(SharedInfo.HoursBetweenUploads));
}
return Task.FromResult((string?) ArchiSteamFarm.Localization.Strings.Done);
case "STD" when access > EAccess.None:
return Task.FromResult((string?) ArchiSteamFarm.Localization.Strings.ErrorAccessDenied);
default:
return Task.FromResult((string?) null);
}
}
public async Task OnBotDestroy(Bot bot) {
ArgumentNullException.ThrowIfNull(bot);
@@ -460,6 +498,10 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
throw new InvalidOperationException(nameof(ASF.WebBrowser));
}
if (LastUploadAt + TimeSpan.FromMinutes(SharedInfo.MinimumMinutesBetweenUploads) > DateTimeOffset.UtcNow) {
return;
}
if (!await SubmissionSemaphore.WaitAsync(0).ConfigureAwait(false)) {
return;
}
@@ -475,7 +517,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
return;
}
ulong contributorSteamID = ASF.GlobalConfig is { SteamOwnerID: > 0 } && new SteamID(ASF.GlobalConfig.SteamOwnerID).IsIndividualAccount ? ASF.GlobalConfig.SteamOwnerID : Bot.Bots.Values.Where(static bot => bot.SteamID > 0).OrderByDescending(static bot => bot.OwnedPackageIDs.Count).FirstOrDefault()?.SteamID ?? 0;
ulong contributorSteamID = ASF.GlobalConfig is { SteamOwnerID: > 0 } && new SteamID(ASF.GlobalConfig.SteamOwnerID).IsIndividualAccount ? ASF.GlobalConfig.SteamOwnerID : Bot.Bots.Values.Where(static bot => bot.SteamID > 0).MaxBy(static bot => bot.OwnedPackageIDs.Count)?.SteamID ?? 0;
if (contributorSteamID == 0) {
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionNoContributorSet, nameof(ASF.GlobalConfig.SteamOwnerID)));
@@ -488,7 +530,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionInProgress, appTokens.Count, packageTokens.Count, depotKeys.Count));
ObjectResponse<ResponseData>? response = await ASF.WebBrowser.UrlPostToJsonObject<ResponseData, RequestData>(request, data: requestData, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors).ConfigureAwait(false);
ObjectResponse<ResponseData>? response = await ASF.WebBrowser.UrlPostToJsonObject<ResponseData, RequestData>(request, data: requestData, requestOptions: WebBrowser.ERequestOptions.ReturnClientErrors | WebBrowser.ERequestOptions.AllowInvalidBodyOnErrors).ConfigureAwait(false);
if (response == null) {
ASF.ArchiLogger.LogGenericWarning(ArchiSteamFarm.Localization.Strings.WarningFailed);
@@ -496,6 +538,9 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
return;
}
// We've communicated with the server and didn't timeout, regardless of the success, this was the last upload attempt
LastUploadAt = DateTimeOffset.UtcNow;
if (response.StatusCode.IsClientErrorCode()) {
ASF.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, ArchiSteamFarm.Localization.Strings.WarningFailedWithError, response.StatusCode));
@@ -510,7 +555,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
// ReSharper disable once SuspiciousLockOverSynchronizationPrimitive - this is not a mistake, we need extra synchronization, and we can re-use the semaphore object for that
lock (SubmissionSemaphore) {
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.MinimumHoursBetweenUploads));
SubmissionTimer.Change(startIn, TimeSpan.FromHours(SharedInfo.HoursBetweenUploads));
}
ASF.ArchiLogger.LogGenericInfo(string.Format(CultureInfo.CurrentCulture, Strings.SubmissionFailedTooManyRequests, startIn.ToHumanReadable()));
@@ -519,7 +564,7 @@ internal sealed class SteamTokenDumperPlugin : OfficialPlugin, IASF, IBot, IBotS
return;
}
if (!response.Content.Success) {
if (response.Content is not { Success: true }) {
ASF.ArchiLogger.LogGenericError(ArchiSteamFarm.Localization.Strings.WarningFailed);
return;

View File

@@ -19,6 +19,7 @@
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections.Generic;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using static ArchiSteamFarm.Core.Utilities;
@@ -34,9 +35,28 @@ public sealed class Utilities {
[TestMethod]
public void ContextSpecificWordsWeakenPassphrases() => Assert.IsTrue(TestPasswordStrength("archisteamfarmpassword").IsWeak);
[TestMethod]
public void EasyPasswordsHaveMeaningfulReason() {
(bool isWeak, string? reason) = TestPasswordStrength("CorrectHorse");
Assert.IsTrue(isWeak);
Assert.IsTrue(reason?.Contains("Capitalization doesn't help very much", StringComparison.OrdinalIgnoreCase));
}
[TestMethod]
public void LongPassphraseIsNotWeak() => Assert.IsFalse(TestPasswordStrength("10chars<!>asdf").IsWeak);
[TestMethod]
public void MemePasswordIsNotWeak() => Assert.IsFalse(TestPasswordStrength("correcthorsebatterystaple").IsWeak);
[TestMethod]
public void RepeatedPasswordsHaveMeaningfulReason() {
(bool isWeak, string? reason) = TestPasswordStrength("abcabcabc");
Assert.IsTrue(isWeak);
Assert.IsTrue(reason?.Contains("Avoid repeated words and characters", StringComparison.OrdinalIgnoreCase));
}
[TestMethod]
public void RepetitiveCharactersWeakenPassphrases() => Assert.IsTrue(TestPasswordStrength("testaaaatest").IsWeak);
@@ -48,5 +68,13 @@ public sealed class Utilities {
[TestMethod]
public void ShortPassphraseIsWeak() => Assert.IsTrue(TestPasswordStrength("four").IsWeak);
[TestMethod]
public void StraightRowsPasswordsHaveMeaningfulReason() {
(bool isWeak, string? reason) = TestPasswordStrength("`1234567890-=");
Assert.IsTrue(isWeak);
Assert.IsTrue(reason?.Contains("Straight rows of keys are easy to guess", StringComparison.OrdinalIgnoreCase));
}
}
#pragma warning restore CA1724 // We don't care about the potential conflict, as ASF class name has a priority

View File

@@ -302,6 +302,7 @@
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNullPropagation/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseNullPropagationWhenPossible/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UsePositionalDeconstructionPattern/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseStringInterpolationWhenPossible/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseThrowIfNullMethod/@EntryIndexedValue">WARNING</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=UseVerbatimString/@EntryIndexedValue">SUGGESTION</s:String>
<s:String x:Key="/Default/CodeInspection/Highlighting/InspectionSeverities/=WrongIndentSize/@EntryIndexedValue">WARNING</s:String>

View File

@@ -33,7 +33,6 @@
<PackageReference Include="Microsoft.AspNetCore.Cors" />
<PackageReference Include="Microsoft.AspNetCore.Diagnostics" />
<PackageReference Include="Microsoft.AspNetCore.HttpOverrides" />
<PackageReference Include="Microsoft.AspNetCore.Localization" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCaching" />
<PackageReference Include="Microsoft.AspNetCore.ResponseCompression" />
<PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" />
@@ -64,7 +63,7 @@
</ItemGroup>
<ItemGroup>
<Content Include="..\LICENSE-2.0.txt">
<Content Include="..\LICENSE.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
<Link>%(RecursiveDir)%(Filename)%(Extension)</Link>

View File

@@ -35,7 +35,7 @@ internal sealed class FixedSizeConcurrentQueue<T> : IEnumerable<T> {
set {
if (value == 0) {
ASF.ArchiLogger.LogNullError(nameof(value));
ASF.ArchiLogger.LogNullError(value);
return;
}

View File

@@ -0,0 +1,126 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2022 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// |
// http://www.apache.org/licenses/LICENSE-2.0
// |
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections;
using System.Collections.Concurrent;
using System.Collections.Generic;
using JetBrains.Annotations;
using Newtonsoft.Json;
namespace ArchiSteamFarm.Collections;
public sealed class ObservableConcurrentDictionary<TKey, TValue> : IDictionary<TKey, TValue>, IReadOnlyDictionary<TKey, TValue> where TKey : notnull {
public event EventHandler? OnModified;
[PublicAPI]
public int Count => BackingDictionary.Count;
[PublicAPI]
public bool IsEmpty => BackingDictionary.IsEmpty;
public bool IsReadOnly => false;
[JsonProperty(Required = Required.DisallowNull)]
private readonly ConcurrentDictionary<TKey, TValue> BackingDictionary = new();
int ICollection<KeyValuePair<TKey, TValue>>.Count => BackingDictionary.Count;
int IReadOnlyCollection<KeyValuePair<TKey, TValue>>.Count => BackingDictionary.Count;
IEnumerable<TKey> IReadOnlyDictionary<TKey, TValue>.Keys => BackingDictionary.Keys;
ICollection<TKey> IDictionary<TKey, TValue>.Keys => BackingDictionary.Keys;
IEnumerable<TValue> IReadOnlyDictionary<TKey, TValue>.Values => BackingDictionary.Values;
ICollection<TValue> IDictionary<TKey, TValue>.Values => BackingDictionary.Values;
public TValue this[TKey key] {
get => BackingDictionary[key];
set {
if (BackingDictionary.TryGetValue(key, out TValue? savedValue) && EqualityComparer<TValue>.Default.Equals(savedValue, value)) {
return;
}
BackingDictionary[key] = value;
OnModified?.Invoke(this, EventArgs.Empty);
}
}
public void Add(KeyValuePair<TKey, TValue> item) {
(TKey key, TValue value) = item;
Add(key, value);
}
public void Add(TKey key, TValue value) => TryAdd(key, value);
public void Clear() {
if (BackingDictionary.IsEmpty) {
return;
}
BackingDictionary.Clear();
OnModified?.Invoke(this, EventArgs.Empty);
}
public bool Contains(KeyValuePair<TKey, TValue> item) => ((ICollection<KeyValuePair<TKey, TValue>>) BackingDictionary).Contains(item);
public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex) => ((ICollection<KeyValuePair<TKey, TValue>>) BackingDictionary).CopyTo(array, arrayIndex);
public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator() => BackingDictionary.GetEnumerator();
public bool Remove(KeyValuePair<TKey, TValue> item) {
ICollection<KeyValuePair<TKey, TValue>> collection = BackingDictionary;
if (!collection.Remove(item)) {
return false;
}
OnModified?.Invoke(this, EventArgs.Empty);
return true;
}
public bool Remove(TKey key) {
if (!BackingDictionary.TryRemove(key, out _)) {
return false;
}
OnModified?.Invoke(this, EventArgs.Empty);
return true;
}
bool IDictionary<TKey, TValue>.ContainsKey(TKey key) => BackingDictionary.ContainsKey(key);
bool IReadOnlyDictionary<TKey, TValue>.ContainsKey(TKey key) => BackingDictionary.ContainsKey(key);
IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
bool IReadOnlyDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value) => BackingDictionary.TryGetValue(key, out value!);
bool IDictionary<TKey, TValue>.TryGetValue(TKey key, out TValue value) => BackingDictionary.TryGetValue(key, out value!);
[PublicAPI]
public bool TryAdd(TKey key, TValue value) {
if (!BackingDictionary.TryAdd(key, value)) {
return false;
}
OnModified?.Invoke(this, EventArgs.Empty);
return true;
}
[PublicAPI]
public bool TryGetValue(TKey key, out TValue? value) => BackingDictionary.TryGetValue(key, out value);
}

View File

@@ -96,7 +96,7 @@ public static class ASF {
}
internal static string GetFilePath(EFileType fileType) {
if (!Enum.IsDefined(typeof(EFileType), fileType)) {
if (!Enum.IsDefined(fileType)) {
throw new InvalidEnumArgumentException(nameof(fileType), (int) fileType, typeof(EFileType));
}
@@ -263,7 +263,7 @@ public static class ASF {
}
if (binaryAsset.DownloadURL == null) {
ArchiLogger.LogNullError(nameof(binaryAsset.DownloadURL));
ArchiLogger.LogNullError(binaryAsset.DownloadURL);
return null;
}
@@ -319,12 +319,16 @@ public static class ASF {
await PluginsCore.OnUpdateProceeding(newVersion).ConfigureAwait(false);
try {
bool kestrelWasRunning = ArchiKestrel.IsRunning;
if (kestrelWasRunning) {
// We disable ArchiKestrel here as the update process moves the core files and might result in IPC crash
// TODO: It might fail if the update was triggered from the API, this should be something to improve in the future, by changing the structure into request -> return response -> finish update
await ArchiKestrel.Stop().ConfigureAwait(false);
} catch (Exception e) {
ArchiLogger.LogGenericWarningException(e);
try {
await ArchiKestrel.Stop().ConfigureAwait(false);
} catch (Exception e) {
ArchiLogger.LogGenericWarningException(e);
}
}
ArchiLogger.LogGenericInfo(Strings.PatchingFiles);
@@ -342,6 +346,16 @@ public static class ASF {
} catch (Exception e) {
ArchiLogger.LogGenericException(e);
if (kestrelWasRunning) {
// We've temporarily disabled ArchiKestrel but the update has failed, let's bring it back up
// We can't even be sure if it's possible to bring it back up in this state, but it's worth trying anyway
try {
await ArchiKestrel.Start().ConfigureAwait(false);
} catch (Exception ex) {
ArchiLogger.LogGenericWarningException(ex);
}
}
return null;
}
@@ -461,9 +475,7 @@ public static class ASF {
[UnconditionalSuppressMessage("AssemblyLoadTrimming", "IL2026:RequiresUnreferencedCode", Justification = "We don't care about trimmed assemblies, as we need it to work only with the known (used) ones")]
private static void LoadAssembliesRecursively(Assembly assembly, ISet<string> loadedAssembliesNames) {
if (assembly == null) {
throw new ArgumentNullException(nameof(assembly));
}
ArgumentNullException.ThrowIfNull(assembly);
if ((loadedAssembliesNames == null) || (loadedAssembliesNames.Count == 0)) {
throw new ArgumentNullException(nameof(loadedAssembliesNames));
@@ -849,7 +861,7 @@ public static class ASF {
private static async Task RegisterBots() {
if ((GlobalConfig == null) || (GlobalDatabase == null) || (WebBrowser == null)) {
throw new ArgumentNullException($"{nameof(GlobalConfig)} || {nameof(GlobalDatabase)} || {nameof(WebBrowser)}");
throw new InvalidOperationException($"{nameof(GlobalConfig)} || {nameof(GlobalDatabase)} || {nameof(WebBrowser)}");
}
// Ensure that we ask for a list of servers if we don't have any saved servers available
@@ -896,7 +908,7 @@ public static class ASF {
private static async Task UpdateAndRestart() {
if (GlobalConfig == null) {
throw new ArgumentNullException(nameof(GlobalConfig));
throw new InvalidOperationException(nameof(GlobalConfig));
}
if (!SharedInfo.BuildInfo.CanUpdate || (GlobalConfig.UpdateChannel == GlobalConfig.EUpdateChannel.None)) {
@@ -959,7 +971,7 @@ public static class ASF {
string fileName = Path.GetFileName(file);
if (string.IsNullOrEmpty(fileName)) {
ArchiLogger.LogNullError(nameof(fileName));
ArchiLogger.LogNullError(fileName);
return false;
}
@@ -967,7 +979,7 @@ public static class ASF {
string relativeFilePath = Path.GetRelativePath(targetDirectory, file);
if (string.IsNullOrEmpty(relativeFilePath)) {
ArchiLogger.LogNullError(nameof(relativeFilePath));
ArchiLogger.LogNullError(relativeFilePath);
return false;
}
@@ -976,7 +988,7 @@ public static class ASF {
switch (relativeDirectoryName) {
case null:
ArchiLogger.LogNullError(nameof(relativeDirectoryName));
ArchiLogger.LogNullError(relativeDirectoryName);
return false;
case "":
@@ -1040,7 +1052,7 @@ public static class ASF {
string? directory = Path.GetDirectoryName(file);
if (string.IsNullOrEmpty(directory)) {
ArchiLogger.LogNullError(nameof(directory));
ArchiLogger.LogNullError(directory);
return false;
}

View File

@@ -79,9 +79,7 @@ internal static class ArchiNet {
}
internal static async Task<string?> FetchBuildChecksum(Version version, string variant) {
if (version == null) {
throw new ArgumentNullException(nameof(version));
}
ArgumentNullException.ThrowIfNull(version);
if (string.IsNullOrEmpty(variant)) {
throw new ArgumentNullException(nameof(variant));
@@ -95,7 +93,7 @@ internal static class ArchiNet {
ObjectResponse<ChecksumResponse>? response = await ASF.WebBrowser.UrlGetToJsonObject<ChecksumResponse>(request).ConfigureAwait(false);
if (response == null) {
if (response?.Content == null) {
return null;
}
@@ -130,30 +128,30 @@ internal static class ArchiNet {
[SuppressMessage("ReSharper", "ClassCannotBeInstantiated")]
internal sealed class ListedUser {
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "items_count", Required = Required.Always)]
[JsonProperty("items_count", Required = Required.Always)]
internal readonly ushort ItemsCount;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
internal readonly HashSet<Asset.EType> MatchableTypes = new();
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "steam_id", Required = Required.Always)]
[JsonProperty("steam_id", Required = Required.Always)]
internal readonly ulong SteamID;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "trade_token", Required = Required.Always)]
[JsonProperty("trade_token", Required = Required.Always)]
internal readonly string TradeToken = "";
internal float Score => GamesCount / (float) ItemsCount;
#pragma warning disable CS0649 // False positive, it's a field set during json deserialization
[JsonProperty(PropertyName = "games_count", Required = Required.Always)]
[JsonProperty("games_count", Required = Required.Always)]
private readonly ushort GamesCount;
#pragma warning restore CS0649 // False positive, it's a field set during json deserialization
internal bool MatchEverything { get; private set; }
[JsonProperty(PropertyName = "matchable_backgrounds", Required = Required.Always)]
[JsonProperty("matchable_backgrounds", Required = Required.Always)]
private byte MatchableBackgroundsNumber {
set {
switch (value) {
@@ -173,7 +171,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_cards", Required = Required.Always)]
[JsonProperty("matchable_cards", Required = Required.Always)]
private byte MatchableCardsNumber {
set {
switch (value) {
@@ -193,7 +191,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_emoticons", Required = Required.Always)]
[JsonProperty("matchable_emoticons", Required = Required.Always)]
private byte MatchableEmoticonsNumber {
set {
switch (value) {
@@ -213,7 +211,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "matchable_foil_cards", Required = Required.Always)]
[JsonProperty("matchable_foil_cards", Required = Required.Always)]
private byte MatchableFoilCardsNumber {
set {
switch (value) {
@@ -233,7 +231,7 @@ internal static class ArchiNet {
}
}
[JsonProperty(PropertyName = "match_everything", Required = Required.Always)]
[JsonProperty("match_everything", Required = Required.Always)]
private byte MatchEverythingNumber {
set {
switch (value) {

View File

@@ -20,6 +20,7 @@
// limitations under the License.
using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Globalization;
using System.IO;
@@ -121,8 +122,8 @@ internal static class OS {
}
internal static void Init(GlobalConfig.EOptimizationMode optimizationMode) {
if (!Enum.IsDefined(typeof(GlobalConfig.EOptimizationMode), optimizationMode)) {
throw new ArgumentNullException(nameof(optimizationMode));
if (!Enum.IsDefined(optimizationMode)) {
throw new InvalidEnumArgumentException(nameof(optimizationMode), (int) optimizationMode, typeof(GlobalConfig.EOptimizationMode));
}
switch (optimizationMode) {
@@ -226,34 +227,67 @@ internal static class OS {
}
internal static bool VerifyEnvironment() {
#if NETFRAMEWORK
// This is .NET Framework build, we support that one only on mono for platforms not supported by .NET Core
// We're not going to analyze source builds, as we don't know what changes the author has made, assume they have a point
if (SharedInfo.BuildInfo.IsCustomBuild) {
return true;
}
// All windows variants have valid .NET Core build, and generic-netf is supported only on mono
if (OperatingSystem.IsWindows() || !RuntimeMadness.IsRunningOnMono) {
return false;
}
if (SharedInfo.BuildInfo.Variant.EndsWith("-netf", StringComparison.Ordinal)) {
#if NETFRAMEWORK
// All Windows variants (7+) have valid .NET Core build
if (OperatingSystem.IsWindows()) {
return false;
}
return RuntimeInformation.OSArchitecture switch {
// Sadly we can't tell a difference between ARMv6 and ARMv7 reliably, we'll believe that this linux-arm user knows what he's doing and he's indeed in need of generic-netf on ARMv6
Architecture.Arm => true,
// Non-Windows variants of generic-netf are supported only in Mono
if (!RuntimeMadness.IsRunningOnMono) {
return false;
}
// Apart from real x86, this also covers all unknown architectures, such as sparc, ppc64, and anything else Mono might support, we're fine with that
Architecture.X86 => true,
// Platforms not supported by .NET Core
return RuntimeInformation.OSArchitecture switch {
// Sadly we can't tell a difference between ARMv6 and ARMv7 reliably, we'll believe that this linux-arm user knows what he's doing and he's indeed in need of generic-netf on ARMv6
Architecture.Arm => true,
// Everything else is covered by .NET Core
_ => false
};
// Apart from real x86, this also covers all unknown architectures, such as sparc, ppc64, and anything else Mono might support, we're fine with that
Architecture.X86 => true,
// Everything else is covered by .NET Core
_ => false
};
#else
// This is .NET Core build, we support all scenarios
return true;
// .NET Framework build running on .NET Core? Very funny - only if somebody lied during build process
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(SharedInfo.BuildInfo.Variant), SharedInfo.BuildInfo.Variant));
return false;
#endif
}
if (SharedInfo.BuildInfo.Variant == "generic") {
// Generic is supported everywhere
return true;
}
if ((SharedInfo.BuildInfo.Variant == "docker") || SharedInfo.BuildInfo.Variant.StartsWith("linux-", StringComparison.Ordinal)) {
// OS-specific Linux and Docker builds are supported only on Linux
return OperatingSystem.IsLinux();
}
if (SharedInfo.BuildInfo.Variant.StartsWith("osx-", StringComparison.Ordinal)) {
// OS-specific macOS build is supported only on macOS
return OperatingSystem.IsMacOS();
}
if (SharedInfo.BuildInfo.Variant.StartsWith("win-", StringComparison.Ordinal)) {
// OS-specific Windows build is supported only on Windows
return OperatingSystem.IsWindows();
}
// Unknown combination, we intend to cover all of the available ones above, so this results in an error
ASF.ArchiLogger.LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.WarningUnknownValuePleaseReport, nameof(SharedInfo.BuildInfo.Variant), SharedInfo.BuildInfo.Variant));
return false;
}
[SupportedOSPlatform("Windows")]

View File

@@ -41,7 +41,7 @@ using ArchiSteamFarm.Web;
namespace ArchiSteamFarm.Core;
internal sealed class Statistics : IAsyncDisposable {
internal sealed class RemoteCommunication : IAsyncDisposable {
private const ushort MaxItemsForFairBots = ArchiWebHandler.MaxItemsInSingleInventoryRequest * WebBrowser.MaxTries; // Determines which fair bots we'll deprioritize when matching due to excessive number of inventory requests they need to make, which are likely to fail in the process or cause excessive delays
private const byte MaxMatchedBotsHard = 40; // Determines how many bots we can attempt to match in total, where match attempt is equal to analyzing bot's inventory
private const byte MaxMatchingRounds = 10; // Determines maximum amount of matching rounds we're going to consider before leaving the rest of work for the next batch
@@ -61,7 +61,7 @@ internal sealed class Statistics : IAsyncDisposable {
private readonly SemaphoreSlim MatchActivelySemaphore = new(1, 1);
#pragma warning disable CA2213 // False positive, .NET Framework can't understand DisposeAsync()
private readonly Timer MatchActivelyTimer;
private readonly Timer? MatchActivelyTimer;
#pragma warning restore CA2213 // False positive, .NET Framework can't understand DisposeAsync()
private readonly SemaphoreSlim RequestsSemaphore = new(1, 1);
@@ -71,25 +71,33 @@ internal sealed class Statistics : IAsyncDisposable {
private DateTime LastPersonaStateRequest;
private bool ShouldSendHeartBeats;
internal Statistics(Bot bot) {
internal RemoteCommunication(Bot bot) {
Bot = bot ?? throw new ArgumentNullException(nameof(bot));
MatchActivelyTimer = new Timer(
MatchActively,
null,
TimeSpan.FromHours(1) + TimeSpan.FromSeconds(ASF.LoadBalancingDelay * Bot.Bots?.Count ?? 0), // Delay
TimeSpan.FromHours(8) // Period
);
if (Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.MatchActively)) {
MatchActivelyTimer = new Timer(
MatchActively,
null,
TimeSpan.FromHours(1) + TimeSpan.FromSeconds(ASF.LoadBalancingDelay * Bot.Bots?.Count ?? 0), // Delay
TimeSpan.FromHours(8) // Period
);
}
}
public async ValueTask DisposeAsync() {
MatchActivelySemaphore.Dispose();
RequestsSemaphore.Dispose();
await MatchActivelyTimer.DisposeAsync().ConfigureAwait(false);
if (MatchActivelyTimer != null) {
await MatchActivelyTimer.DisposeAsync().ConfigureAwait(false);
}
}
internal async Task OnHeartBeat() {
if (!Bot.BotConfig.RemoteCommunication.HasFlag(BotConfig.ERemoteCommunication.PublicListing)) {
return;
}
// Request persona update if needed
if ((DateTime.UtcNow > LastPersonaStateRequest.AddHours(MinPersonaStateTTL)) && (DateTime.UtcNow > LastAnnouncementCheck.AddHours(MinAnnouncementCheckTTL))) {
LastPersonaStateRequest = DateTime.UtcNow;
@@ -125,12 +133,20 @@ internal sealed class Statistics : IAsyncDisposable {
}
internal async Task OnLoggedOn() {
if (!Bot.BotConfig.RemoteCommunication.HasFlag(BotConfig.ERemoteCommunication.SteamGroup)) {
return;
}
if (!await Bot.ArchiWebHandler.JoinGroup(SharedInfo.ASFGroupSteamID).ConfigureAwait(false)) {
Bot.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, nameof(ArchiWebHandler.JoinGroup)));
}
}
internal async Task OnPersonaState(string? nickname = null, string? avatarHash = null) {
if (!Bot.BotConfig.RemoteCommunication.HasFlag(BotConfig.ERemoteCommunication.PublicListing)) {
return;
}
if ((DateTime.UtcNow < LastAnnouncementCheck.AddHours(MinAnnouncementCheckTTL)) && (ShouldSendHeartBeats || (LastHeartBeat == DateTime.MinValue))) {
return;
}
@@ -171,7 +187,7 @@ internal sealed class Statistics : IAsyncDisposable {
HashSet<Asset.EType> acceptedMatchableTypes = Bot.BotConfig.MatchableTypes.Where(AcceptedMatchableTypes.Contains).ToHashSet();
if (acceptedMatchableTypes.Count == 0) {
Bot.ArchiLogger.LogNullError(nameof(acceptedMatchableTypes));
Bot.ArchiLogger.LogNullError(acceptedMatchableTypes);
LastAnnouncementCheck = DateTime.UtcNow;
ShouldSendHeartBeats = false;
@@ -229,12 +245,20 @@ internal sealed class Statistics : IAsyncDisposable {
}
private async Task<bool?> IsEligibleForListing() {
// Bot must be eligible for matching first
bool? isEligibleForMatching = await IsEligibleForMatching().ConfigureAwait(false);
if (isEligibleForMatching != true) {
return isEligibleForMatching;
}
// Bot must have STM enabled in TradingPreferences
if (!Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.SteamTradeMatcher)) {
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.BotConfig.TradingPreferences)}: {Bot.BotConfig.TradingPreferences}"));
return false;
}
// Bot must have public inventory
bool? hasPublicInventory = await Bot.HasPublicInventory().ConfigureAwait(false);
@@ -255,13 +279,6 @@ internal sealed class Statistics : IAsyncDisposable {
return false;
}
// Bot must have STM enable in TradingPreferences
if (!Bot.BotConfig.TradingPreferences.HasFlag(BotConfig.ETradingPreferences.SteamTradeMatcher)) {
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.BotConfig.TradingPreferences)}: {Bot.BotConfig.TradingPreferences}"));
return false;
}
// Bot must have at least one accepted matchable type set
if ((Bot.BotConfig.MatchableTypes.Count == 0) || Bot.BotConfig.MatchableTypes.All(static type => !AcceptedMatchableTypes.Contains(type))) {
Bot.ArchiLogger.LogGenericTrace(string.Format(CultureInfo.CurrentCulture, Strings.WarningFailedWithError, $"{nameof(Bot.BotConfig.MatchableTypes)}: {string.Join(", ", Bot.BotConfig.MatchableTypes)}"));
@@ -463,7 +480,7 @@ internal sealed class Statistics : IAsyncDisposable {
if (inventoryStateChanges.TryGetValue(set, out Dictionary<ulong, uint>? pastChanges) && (pastChanges.Count > 0)) {
foreach ((ulong classID, uint amount) in pastChanges) {
if (!ourFullSet.TryGetValue(classID, out uint fullAmount) || (fullAmount == 0) || (fullAmount < amount)) {
Bot.ArchiLogger.LogNullError(nameof(fullAmount));
Bot.ArchiLogger.LogNullError(fullAmount);
return (false, skippedSetsThisRound.Count > 0);
}
@@ -475,7 +492,7 @@ internal sealed class Statistics : IAsyncDisposable {
}
if (!ourTradableSet.TryGetValue(classID, out uint tradableAmount) || (tradableAmount == 0) || (tradableAmount < amount)) {
Bot.ArchiLogger.LogNullError(nameof(tradableAmount));
Bot.ArchiLogger.LogNullError(tradableAmount);
return (false, skippedSetsThisRound.Count > 0);
}

View File

@@ -78,10 +78,7 @@ public static class Utilities {
[PublicAPI]
public static string? GetCookieValue(this CookieContainer cookieContainer, Uri uri, string name) {
ArgumentNullException.ThrowIfNull(cookieContainer);
if (uri == null) {
throw new ArgumentNullException(nameof(uri));
}
ArgumentNullException.ThrowIfNull(uri);
if (string.IsNullOrEmpty(name)) {
throw new ArgumentNullException(nameof(name));
@@ -97,7 +94,7 @@ public static class Utilities {
}
[PublicAPI]
public static uint GetUnixTime() => (uint) DateTimeOffset.UtcNow.ToUnixTimeSeconds();
public static ulong GetUnixTime() => (ulong) DateTimeOffset.UtcNow.ToUnixTimeSeconds();
[PublicAPI]
public static async void InBackground(Action action, bool longRunning = false) {
@@ -113,16 +110,10 @@ public static class Utilities {
}
[PublicAPI]
public static async void InBackground<T>(Func<T> function, bool longRunning = false) {
public static void InBackground<T>(Func<T> function, bool longRunning = false) {
ArgumentNullException.ThrowIfNull(function);
TaskCreationOptions options = TaskCreationOptions.DenyChildAttach;
if (longRunning) {
options |= TaskCreationOptions.LongRunning | TaskCreationOptions.PreferFairness;
}
await Task.Factory.StartNew(function, CancellationToken.None, options, TaskScheduler.Default).ConfigureAwait(false);
InBackground(void() => function(), longRunning);
}
[PublicAPI]
@@ -170,6 +161,9 @@ public static class Utilities {
[PublicAPI]
public static bool IsClientErrorCode(this HttpStatusCode statusCode) => statusCode is >= HttpStatusCode.BadRequest and < HttpStatusCode.InternalServerError;
[PublicAPI]
public static bool IsRedirectionCode(this HttpStatusCode statusCode) => statusCode is >= HttpStatusCode.Ambiguous and < HttpStatusCode.BadRequest;
[PublicAPI]
public static bool IsServerErrorCode(this HttpStatusCode statusCode) => statusCode is >= HttpStatusCode.InternalServerError and < (HttpStatusCode) 600;
@@ -202,7 +196,11 @@ public static class Utilities {
}
[PublicAPI]
public static IElement? SelectSingleElementNode(this IElement element, string xpath) => (IElement?) element.SelectSingleNode(xpath);
public static IElement? SelectSingleElementNode(this IElement element, string xpath) {
ArgumentNullException.ThrowIfNull(element);
return (IElement?) element.SelectSingleNode(xpath);
}
[PublicAPI]
public static IElement? SelectSingleNode(this IDocument document, string xpath) {
@@ -259,6 +257,14 @@ public static class Utilities {
}
}
internal static ulong MathAdd(ulong first, int second) {
if (second >= 0) {
return first + (uint) second;
}
return first - (uint) -second;
}
internal static bool RelativeDirectoryStartsWith(string directory, params string[] prefixes) {
if (string.IsNullOrEmpty(directory)) {
throw new ArgumentNullException(nameof(directory));
@@ -285,9 +291,28 @@ public static class Utilities {
}
Result result = Zxcvbn.Core.EvaluatePassword(password, forbiddenPhrases);
FeedbackItem feedback = result.Feedback;
return (result.Score < 4, string.IsNullOrEmpty(feedback.Warning) ? feedback.Suggestions.FirstOrDefault() : feedback.Warning);
IList<string>? suggestions = result.Feedback.Suggestions;
if (!string.IsNullOrEmpty(result.Feedback.Warning)) {
suggestions ??= new List<string>(1);
suggestions.Insert(0, result.Feedback.Warning);
}
if (suggestions != null) {
for (byte i = 0; i < suggestions.Count; i++) {
string suggestion = suggestions[i];
if ((suggestion.Length == 0) || (suggestion[^1] == '.')) {
continue;
}
suggestions[i] = $"{suggestion}.";
}
}
return (result.Score < 4, suggestions is { Count: > 0 } ? string.Join(" ", suggestions.Where(static suggestion => suggestion.Length > 0)) : null);
}
internal static void WarnAboutIncompleteTranslation(ResourceManager resourceManager) {
@@ -295,9 +320,7 @@ public static class Utilities {
// Skip translation progress for English and invariant (such as "C") cultures
switch (CultureInfo.CurrentUICulture.TwoLetterISOLanguageName) {
case "en":
case "iv":
case "qps":
case "en" or "iv" or "qps":
return;
}
@@ -305,7 +328,7 @@ public static class Utilities {
ResourceSet? defaultResourceSet = resourceManager.GetResourceSet(CultureInfo.GetCultureInfo("en-US"), true, true);
if (defaultResourceSet == null) {
ASF.ArchiLogger.LogNullError(nameof(defaultResourceSet));
ASF.ArchiLogger.LogNullError(defaultResourceSet);
return;
}
@@ -313,7 +336,7 @@ public static class Utilities {
HashSet<DictionaryEntry> defaultStringObjects = defaultResourceSet.Cast<DictionaryEntry>().ToHashSet();
if (defaultStringObjects.Count == 0) {
ASF.ArchiLogger.LogNullError(nameof(defaultStringObjects));
ASF.ArchiLogger.LogNullError(defaultStringObjects);
return;
}
@@ -322,7 +345,7 @@ public static class Utilities {
ResourceSet? currentResourceSet = resourceManager.GetResourceSet(CultureInfo.CurrentUICulture, true, true);
if (currentResourceSet == null) {
ASF.ArchiLogger.LogNullError(nameof(currentResourceSet));
ASF.ArchiLogger.LogNullError(currentResourceSet);
return;
}

View File

@@ -48,7 +48,7 @@ public sealed class ArchiCacheable<T> : IDisposable {
[PublicAPI]
public async Task<(bool Success, T? Result)> GetValue(EFallback fallback = EFallback.DefaultForType) {
if (!Enum.IsDefined(typeof(EFallback), fallback)) {
if (!Enum.IsDefined(fallback)) {
throw new InvalidEnumArgumentException(nameof(fallback), (int) fallback, typeof(EFallback));
}

View File

@@ -60,7 +60,7 @@ public static class ArchiCryptoHelper {
private static byte[] EncryptionKey = Encoding.UTF8.GetBytes(nameof(ArchiSteamFarm));
internal static async Task<string?> Decrypt(ECryptoMethod cryptoMethod, string encryptedString) {
if (!Enum.IsDefined(typeof(ECryptoMethod), cryptoMethod)) {
if (!Enum.IsDefined(cryptoMethod)) {
throw new InvalidEnumArgumentException(nameof(cryptoMethod), (int) cryptoMethod, typeof(ECryptoMethod));
}
@@ -79,7 +79,7 @@ public static class ArchiCryptoHelper {
}
internal static string? Encrypt(ECryptoMethod cryptoMethod, string decryptedString) {
if (!Enum.IsDefined(typeof(ECryptoMethod), cryptoMethod)) {
if (!Enum.IsDefined(cryptoMethod)) {
throw new InvalidEnumArgumentException(nameof(cryptoMethod), (int) cryptoMethod, typeof(ECryptoMethod));
}
@@ -98,7 +98,7 @@ public static class ArchiCryptoHelper {
}
internal static string Hash(EHashingMethod hashingMethod, string stringToHash) {
if (!Enum.IsDefined(typeof(EHashingMethod), hashingMethod)) {
if (!Enum.IsDefined(hashingMethod)) {
throw new InvalidEnumArgumentException(nameof(hashingMethod), (int) hashingMethod, typeof(EHashingMethod));
}
@@ -129,7 +129,7 @@ public static class ArchiCryptoHelper {
throw new ArgumentOutOfRangeException(nameof(hashLength));
}
if (!Enum.IsDefined(typeof(EHashingMethod), hashingMethod)) {
if (!Enum.IsDefined(hashingMethod)) {
throw new InvalidEnumArgumentException(nameof(hashingMethod), (int) hashingMethod, typeof(EHashingMethod));
}
@@ -159,11 +159,15 @@ public static class ArchiCryptoHelper {
throw new ArgumentNullException(nameof(passwordHash));
}
if (passwordHash.Length > byte.MaxValue) {
throw new ArgumentOutOfRangeException(nameof(passwordHash));
}
if ((salt == null) || (salt.Length == 0)) {
throw new ArgumentNullException(nameof(salt));
}
if (!Enum.IsDefined(typeof(EHashingMethod), hashingMethod)) {
if (!Enum.IsDefined(hashingMethod)) {
throw new InvalidEnumArgumentException(nameof(hashingMethod), (int) hashingMethod, typeof(EHashingMethod));
}

View File

@@ -113,6 +113,10 @@ internal sealed class CrossProcessFileBasedSemaphore : ICrossProcessSemaphore, I
try {
stopwatch.Stop();
if (stopwatch.ElapsedMilliseconds >= int.MaxValue) {
return false;
}
millisecondsTimeout -= (int) stopwatch.ElapsedMilliseconds;
if (millisecondsTimeout <= 0) {
@@ -158,7 +162,7 @@ internal sealed class CrossProcessFileBasedSemaphore : ICrossProcessSemaphore, I
string? directoryPath = Path.GetDirectoryName(FilePath);
if (string.IsNullOrEmpty(directoryPath)) {
ASF.ArchiLogger.LogNullError(nameof(directoryPath));
ASF.ArchiLogger.LogNullError(directoryPath);
return;
}

View File

@@ -42,6 +42,8 @@ using NLog.Web;
namespace ArchiSteamFarm.IPC;
internal static class ArchiKestrel {
internal static bool IsRunning => KestrelWebHost != null;
internal static HistoryTarget? HistoryTarget { get; private set; }
private static IHost? KestrelWebHost;
@@ -74,7 +76,27 @@ internal static class ArchiKestrel {
// Set default content root
builder.UseContentRoot(SharedInfo.HomeDirectory);
// Firstly initialize settings that user is free to override
// Check if custom config is available
string absoluteConfigDirectory = Path.Combine(Directory.GetCurrentDirectory(), SharedInfo.ConfigDirectory);
string customConfigPath = Path.Combine(absoluteConfigDirectory, SharedInfo.IPCConfigFile);
bool customConfigExists = File.Exists(customConfigPath);
if (customConfigExists && Debugging.IsDebugConfigured) {
try {
string json = await File.ReadAllTextAsync(customConfigPath).ConfigureAwait(false);
if (!string.IsNullOrEmpty(json)) {
JObject jObject = JObject.Parse(json);
ASF.ArchiLogger.LogGenericDebug($"{SharedInfo.IPCConfigFile}: {jObject.ToString(Formatting.Indented)}");
}
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
}
}
// Enable NLog integration for logging
builder.ConfigureLogging(
static logging => {
logging.ClearProviders();
@@ -82,32 +104,6 @@ internal static class ArchiKestrel {
}
);
// Check if custom config is available
string absoluteConfigDirectory = Path.Combine(Directory.GetCurrentDirectory(), SharedInfo.ConfigDirectory);
string customConfigPath = Path.Combine(absoluteConfigDirectory, SharedInfo.IPCConfigFile);
bool customConfigExists = File.Exists(customConfigPath);
if (customConfigExists) {
if (Debugging.IsDebugConfigured) {
try {
string json = await File.ReadAllTextAsync(customConfigPath).ConfigureAwait(false);
if (!string.IsNullOrEmpty(json)) {
JObject jObject = JObject.Parse(json);
ASF.ArchiLogger.LogGenericDebug($"{SharedInfo.IPCConfigFile}: {jObject.ToString(Formatting.Indented)}");
}
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
}
}
// Use custom config for logging configuration
builder.ConfigureLogging(static (hostingContext, logging) => logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging")));
}
// Enable NLog integration for logging
builder.UseNLog();
builder.ConfigureWebHostDefaults(

View File

@@ -75,7 +75,7 @@ public sealed class ASFController : ArchiController {
}
/// <summary>
/// Encrypts data with ASF encryption mechanisms using provided details.
/// Hashes data with ASF hashing mechanisms using provided details.
/// </summary>
[Consumes("application/json")]
[HttpPost("Hash")]

View File

@@ -123,7 +123,10 @@ public sealed class BotController : ArchiController {
}
if (!request.BotConfig.IsSteamPasswordSet && bot.BotConfig.IsSteamPasswordSet) {
request.BotConfig.SetDecryptedSteamPassword(await bot.BotConfig.GetDecryptedSteamPassword().ConfigureAwait(false));
request.BotConfig.SteamPassword = bot.BotConfig.SteamPassword;
// Since we're inheriting the password, we should also inherit the format, whatever that might be
request.BotConfig.PasswordFormat = bot.BotConfig.PasswordFormat;
}
if (!request.BotConfig.IsSteamParentalCodeSet && bot.BotConfig.IsSteamParentalCodeSet) {
@@ -261,7 +264,7 @@ public sealed class BotController : ArchiController {
ArgumentNullException.ThrowIfNull(request);
if ((request.Type == ASF.EUserInputType.None) || !Enum.IsDefined(typeof(ASF.EUserInputType), request.Type) || string.IsNullOrEmpty(request.Value)) {
if ((request.Type == ASF.EUserInputType.None) || !Enum.IsDefined(request.Type) || string.IsNullOrEmpty(request.Value)) {
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsInvalid, $"{nameof(request.Type)} || {nameof(request.Value)}")));
}

View File

@@ -54,12 +54,6 @@ public sealed class CommandController : ArchiController {
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsEmpty, nameof(request.Command))));
}
ulong steamOwnerID = ASF.GlobalConfig?.SteamOwnerID ?? GlobalConfig.DefaultSteamOwnerID;
if (steamOwnerID == 0) {
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsInvalid, nameof(ASF.GlobalConfig.SteamOwnerID))));
}
Bot? targetBot = Bot.Bots?.OrderBy(static bot => bot.Key, Bot.BotsComparer).Select(static bot => bot.Value).FirstOrDefault();
if (targetBot == null) {
@@ -80,7 +74,7 @@ public sealed class CommandController : ArchiController {
command = command[commandPrefix.Length..];
}
string? response = await targetBot.Commands.Response(steamOwnerID, command).ConfigureAwait(false);
string? response = await targetBot.Commands.Response(EAccess.Owner, command).ConfigureAwait(false);
return Ok(new GenericResponse<string>(response));
}

View File

@@ -51,7 +51,7 @@ public sealed class TwoFactorAuthenticationController : ArchiController {
ArgumentNullException.ThrowIfNull(request);
if (request.AcceptedType.HasValue && ((request.AcceptedType.Value == Confirmation.EType.Unknown) || !Enum.IsDefined(typeof(Confirmation.EType), request.AcceptedType.Value))) {
if (request.AcceptedType.HasValue && ((request.AcceptedType.Value == Confirmation.EType.Unknown) || !Enum.IsDefined(request.AcceptedType.Value))) {
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorIsInvalid, nameof(request.AcceptedType))));
}

View File

@@ -95,7 +95,7 @@ public sealed class TypeController : ArchiController {
string? valueText = value?.ToString();
if (string.IsNullOrEmpty(valueText)) {
ASF.ArchiLogger.LogNullError(nameof(valueText));
ASF.ArchiLogger.LogNullError(valueText);
return BadRequest(new GenericResponse(false, string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nameof(valueText))));
}

View File

@@ -1,84 +0,0 @@
// _ _ _ ____ _ _____
// / \ _ __ ___ | |__ (_)/ ___| | |_ ___ __ _ _ __ ___ | ___|__ _ _ __ _ __ ___
// / _ \ | '__|/ __|| '_ \ | |\___ \ | __|/ _ \ / _` || '_ ` _ \ | |_ / _` || '__|| '_ ` _ \
// / ___ \ | | | (__ | | | || | ___) || |_| __/| (_| || | | | | || _|| (_| || | | | | | | |
// /_/ \_\|_| \___||_| |_||_||____/ \__|\___| \__,_||_| |_| |_||_| \__,_||_| |_| |_| |_|
// |
// Copyright 2015-2022 Łukasz "JustArchi" Domeradzki
// Contact: JustArchi@JustArchi.net
// |
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
// |
// http://www.apache.org/licenses/LICENSE-2.0
// |
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Headers;
using Microsoft.Extensions.Primitives;
using Microsoft.Net.Http.Headers;
namespace ArchiSteamFarm.IPC.Integration;
[SuppressMessage("ReSharper", "ClassNeverInstantiated.Global")]
internal sealed class LocalizationMiddleware {
private static readonly ImmutableDictionary<string, string> CultureConversions = new Dictionary<string, string>(2, StringComparer.OrdinalIgnoreCase) {
{ "lol-US", SharedInfo.LolcatCultureName },
{ "sr-CS", "sr-Latn" }
}.ToImmutableDictionary(StringComparer.OrdinalIgnoreCase);
private readonly RequestDelegate Next;
public LocalizationMiddleware(RequestDelegate next) => Next = next ?? throw new ArgumentNullException(nameof(next));
[UsedImplicitly]
public async Task InvokeAsync(HttpContext context) {
ArgumentNullException.ThrowIfNull(context);
RequestHeaders headers = context.Request.GetTypedHeaders();
IList<StringWithQualityHeaderValue> acceptLanguageHeader = headers.AcceptLanguage;
if (acceptLanguageHeader.Count == 0) {
await Next(context).ConfigureAwait(false);
return;
}
bool valuesChanged = false;
for (int i = 0; i < acceptLanguageHeader.Count; i++) {
StringSegment language = acceptLanguageHeader[i].Value;
if (!language.HasValue || string.IsNullOrEmpty(language.Value)) {
continue;
}
if (!CultureConversions.TryGetValue(language.Value, out string? replacement) || string.IsNullOrEmpty(replacement)) {
continue;
}
acceptLanguageHeader[i] = StringWithQualityHeaderValue.Parse(replacement);
valuesChanged = true;
}
if (valuesChanged) {
// The getter returns a temporary collection; To make sure our changes are persisted, we need to assign it back
headers.AcceptLanguage = acceptLanguageHeader;
}
await Next(context).ConfigureAwait(false);
}
}

View File

@@ -55,7 +55,7 @@ public sealed class TwoFactorAuthenticationConfirmationsRequest {
/// <summary>
/// A helper property which works the same as <see cref="AcceptedCreatorIDs" /> but with values written as strings - for javascript compatibility purposes. Use either this one, or <see cref="AcceptedCreatorIDs" />, not both.
/// </summary>
[JsonProperty(PropertyName = $"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(AcceptedCreatorIDs)}", Required = Required.DisallowNull)]
[JsonProperty($"{SharedInfo.UlongCompatibilityStringPrefix}{nameof(AcceptedCreatorIDs)}", Required = Required.DisallowNull)]
public ImmutableHashSet<string> SAcceptedCreatorIDs {
get => AcceptedCreatorIDs.Select(static creatorID => creatorID.ToString(CultureInfo.InvariantCulture)).ToImmutableHashSet();
set {

View File

@@ -30,7 +30,6 @@ using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using ArchiSteamFarm.Core;
@@ -44,7 +43,6 @@ using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Headers;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Localization;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Net.Http.Headers;
@@ -109,8 +107,7 @@ internal sealed class Startup {
CacheControlHeaderValue cacheControl = new();
switch (extension.ToUpperInvariant()) {
case ".CSS":
case ".JS":
case ".CSS" or ".JS":
// Add support for SRI-protected static files
// SRI requires from us to notify the caller (especially proxy) to avoid modifying the data
cacheControl.NoTransform = true;
@@ -136,12 +133,6 @@ internal sealed class Startup {
}
);
// Add support for additional localization mappings
app.UseMiddleware<LocalizationMiddleware>();
// Add support for localization
app.UseRequestLocalization();
// Use routing for our API controllers, this should be called once we're done with all the static files mess
#if !NETFRAMEWORK
app.UseRouting();
@@ -233,29 +224,6 @@ internal sealed class Startup {
// Add support for response compression
services.AddResponseCompression();
// Add support for localization
services.AddLocalization();
services.AddRequestLocalization(
static options => {
// We do not set the DefaultRequestCulture here, because it will default to Thread.CurrentThread.CurrentCulture in this case, which is set when loading GlobalConfig
try {
CultureInfo lolcatCulture = CultureInfo.CreateSpecificCulture(SharedInfo.LolcatCultureName);
options.SupportedCultures = options.SupportedUICultures = CultureInfo.GetCultures(CultureTypes.AllCultures).Append(lolcatCulture).ToList();
} catch (Exception e) {
// Fallback for platforms that do not support qps-Ploc culture
ASF.ArchiLogger.LogGenericDebuggingException(e);
options.SupportedCultures = options.SupportedUICultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
}
// The default checks the URI and cookies and only then for headers; ASFs IPC does not use either of the higher priority mechanisms anywhere else and we don't want to start here.
options.RequestCultureProviders = new List<IRequestCultureProvider>(1) { new AcceptLanguageHeaderRequestCultureProvider() };
}
);
string? ipcPassword = ASF.GlobalConfig != null ? ASF.GlobalConfig.IPCPassword : GlobalConfig.DefaultIPCPassword;
if (!string.IsNullOrEmpty(ipcPassword)) {
@@ -291,7 +259,11 @@ internal sealed class Startup {
}
);
options.CustomSchemaIds(static type => type.GetUnifiedName());
// We require custom schema IDs due to conflicting type names, choosing the proper one is tricky as there is no good answer and any kind of convention has a potential to create conflict
// FullName and Name both do, ToString() for unknown to me reason doesn't, and I don't have courage to call our WebUtilities.GetUnifiedName() better than what .NET ships with (because it isn't)
// Let's use ToString() until we find a good enough reason to change it
options.CustomSchemaIds(static type => type.ToString());
options.EnableAnnotations(true, true);
options.SchemaFilter<CustomAttributesSchemaFilter>();
@@ -309,7 +281,8 @@ internal sealed class Startup {
Url = new Uri(SharedInfo.LicenseURL)
},
Title = $"{SharedInfo.ASF} API"
Title = $"{SharedInfo.AssemblyName} API",
Version = SharedInfo.Version.ToString()
}
);

View File

@@ -20,7 +20,6 @@
// limitations under the License.
#if NETFRAMEWORK
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
#endif
@@ -38,21 +37,14 @@ namespace ArchiSteamFarm.IPC;
internal static class WebUtilities {
#if NETFRAMEWORK
internal static IMvcCoreBuilder AddControllers(this IServiceCollection services) {
if (services == null) {
throw new ArgumentNullException(nameof(services));
}
ArgumentNullException.ThrowIfNull(services);
return services.AddMvcCore();
}
internal static IMvcCoreBuilder AddNewtonsoftJson(this IMvcCoreBuilder mvc, Action<MvcJsonOptions> setupAction) {
if (mvc == null) {
throw new ArgumentNullException(nameof(mvc));
}
if (setupAction == null) {
throw new ArgumentNullException(nameof(setupAction));
}
ArgumentNullException.ThrowIfNull(mvc);
ArgumentNullException.ThrowIfNull(setupAction);
// Add JSON formatters that will be used as default ones if no specific formatters are asked for
mvc.AddJsonFormatters();
@@ -61,18 +53,6 @@ internal static class WebUtilities {
return mvc;
}
internal static IServiceCollection AddRequestLocalization(this IServiceCollection services, Action<RequestLocalizationOptions> action) {
if (services == null) {
throw new ArgumentNullException(nameof(services));
}
if (action == null) {
throw new ArgumentNullException(nameof(action));
}
return services.Configure(action);
}
#endif
internal static string? GetUnifiedName(this Type type) {

View File

@@ -1029,12 +1029,6 @@ namespace ArchiSteamFarm.Localization {
}
}
public static string InteractiveConsoleNotAvailable {
get {
return ResourceManager.GetString("InteractiveConsoleNotAvailable", resourceCulture);
}
}
public static string BotGamesToRedeemInBackgroundCount {
get {
return ResourceManager.GetString("BotGamesToRedeemInBackgroundCount", resourceCulture);

View File

@@ -79,7 +79,7 @@
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
</data>
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
<value>ASF V{0} претърпя критичен срив, преди основния записващ модул, да стартира!</value>
<value>ASF V{0} претърпя критичен срив, преди основния записващ модул да стартира!</value>
<comment>{0} will be replaced by version number</comment>
</data>
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
@@ -101,7 +101,9 @@
<value>{0} е невалиден!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Бота не е настроен. Забравихте ли да проверите конфигурацията на ASF? Следвайте инструкцийте в "wiki" ако срещате трудности.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} е нулев!</value>
<comment>{0} will be replaced by object's name</comment>
@@ -190,7 +192,7 @@
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Моля, въведете SteamGuard кода, който е бил пратен на Вашият e-mail: </value>
<value>Моля, въведете SteamGuard кода, изпратен на Вашият e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -222,38 +224,86 @@
<value>Не е намерен бот с името {0}!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Има {0}/{1} работещи бота, с общо {2} игри ({3} карти) оставащи за "фармене".</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>Ботът фарми играта: {0} ({1}, {2} оставащи карти) от общо {3} игри ({4} карти) остават за "фармене" (~{5} оставащо време).</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>Ботът фарми игрите: {0} от общо {1} игри ({2} карти) остават за "фармене" (~{3} оставащо време).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>Проверяване на първата страница със значки...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>Проверяване на други страници със значки...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Избран алгоритъм за фармене: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Готово!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Остават общо {0} игри ({1} карти) за "фармене" (~{2} оставащо време)...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>Фарменето на карти приключи!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>Фарменето на карти завърши: {0} ({1}) след {2} игра!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Фарменето на карти завърши за игрите: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Статус на фарменето за {0} ({1}): {2} карти остават</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>Фарменето е спряно!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>Отказване на това желание, тъй като е активирана постоянна пауза!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>Няма нищо за фармене на този акаунт!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Сега се фарми: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Сега се фарми: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Игрането не е възможно в момента, ще пробваме по-късно!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Все още се фарми: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Все още се фарми: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Фарменето прекратено: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>Фарменето прекратено: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Непозната команда!</value>
</data>
@@ -268,7 +318,9 @@
<value>Приемане на подарък: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>Този акаунт е ограничен, фарменето е невъзможен докато ограничението не бъде премахнато!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID: {0} | Статус: {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string</comment>
@@ -290,10 +342,18 @@
<value>2FA Token: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
<value>Автоматичното фармене е паузирано!</value>
</data>
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
<value>Автоматичното фармене е възобновено!</value>
</data>
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
<value>Автоматичното фармене е вече паузирано!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>Автоматичното фармене е вече възобновено!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>Свързан към Steam!</value>
</data>
@@ -350,7 +410,10 @@
<value>Вече се притежава: {0} | {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotPointsBalance" xml:space="preserve">
<value>Баланс на точките: {0}</value>
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>Ограничението надвишено, ще повторим след {0} на "отброяване"...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
@@ -369,8 +432,12 @@
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
<value>Премахнат изтекъл ключ за вход!</value>
</data>
<data name="BotStatusNotIdling" xml:space="preserve">
<value>Бота не фарми нищо.</value>
</data>
<data name="BotStatusLimited" xml:space="preserve">
<value>Бота е ограничен и не може да "дропне" карти чрез фармене.</value>
</data>
<data name="BotStatusConnecting" xml:space="preserve">
<value>Ботът се свързва към мрежата на Steam.</value>
</data>
@@ -402,8 +469,12 @@
<data name="BotConnectionLost" xml:space="preserve">
<value>Връзката с мрежата на Steam е загубена. Повторно свързване...</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>Акаунтът вече не е зает: фарменето на карти е възобновено!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>Акаунтът в момента се ползва: ASF ще възобнови фарменето на карти, когато е свободен...</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>Свързване…</value>
</data>
@@ -441,7 +512,10 @@
<value>ASF ще се опита да ползва вашият предпочитан {0} език, но преводът за този език е само {1} завършен. Може би може да ни помогнете да подобрим ASF с превод на вашия език?</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
<value>Фарменето на {0} ({1}) е временно забранено, тъй като ASF не е в състояние да "играе" тази игра в момента.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningIdlingGameMismatch" xml:space="preserve">
<value>ASF откри несъответствие на ID за {0} ({1}) и ще използва ID на {2} вместо това.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by game's ID (number)</comment>
@@ -450,8 +524,12 @@
<value>{0} V{1}</value>
<comment>{0} will be replaced by program's name (e.g. "ASF"), {1} will be replaced by program's version (e.g. "1.0.0.0"). This string typically has nothing to translate and you should leave it as it is, unless you need to change the format, e.g. in RTL languages.</comment>
</data>
<data name="BotAccountLocked" xml:space="preserve">
<value>Този акаунт е заключен, фарменето на карти е недостъпно завинаги!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>Бота е заключен и не може да "дропне" карти чрез фармене.</value>
</data>
<data name="ErrorFunctionOnlyInHeadlessMode" xml:space="preserve">
<value>Тази функция е възможна само в headless режим!</value>
</data>
@@ -462,7 +540,9 @@
<data name="ErrorAccessDenied" xml:space="preserve">
<value>Достъпът отказан!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>Вие използвате версия, която е по-нова от последната версия за актуализация. Моля, имайте предвид, че предварителните версии са посветени на потребителите, които знаят как да докладват за бъгове, да се справят с проблеми и да дават обратна връзка - няма да ви бъде осигурена техническа подръжка.</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>Текущо използване на паметта: {0} MB.
Работно време на процеса: {1}</value>
@@ -554,10 +634,6 @@
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Интерактивната конзола е вече активна, натиснете 'c' за да влезето в команден режим.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Интерактивната конзола не е налична, защото липсва {0} конфигурирана стойност.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Ботът има {0} игри оставащи в опашката на заден фон.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -569,7 +645,10 @@
<value>Успешно извършени {0} потвърждения!</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>Изчакване до {0}, за да се гарантира, че е може да започне фарменето на карти...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>Изтриване на старите файлове след обновление...</value>
</data>
@@ -579,13 +658,21 @@
<data name="IPCConfigChanged" xml:space="preserve">
<value>IPC настройките са били променени!</value>
</data>
<data name="BotTradeOfferResult" xml:space="preserve">
<value>Предложението за размяна {0} е определено като {1} поради {2}.</value>
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>Получили сте код за грешна парола {0} пъти поред. Вашата парола за този акаунт най-вероятно е грешна, прекратяване!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
<value>Резултат: {0}</value>
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>Опитвате се да подкарате {0} вариант на ASF в неподдържана страна: {1}. Осигурете аргумент за отхвърляне на това твърдение ако наистина знаете какво правите.</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>Непознат аргумент в командната линия: {0}</value>
<comment>{0} will be replaced by unrecognized command that has been provided</comment>
@@ -593,19 +680,57 @@
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
<value>Папката с настройките не може да бъде открита, прекратяване!</value>
</data>
<data name="BotIdlingSelectedGames" xml:space="preserve">
<value>Играят се избраните {0}: {1}</value>
<comment>{0} will be replaced by internal name of the config property (e.g. "GamesPlayedWhileIdle"), {1} will be replaced by comma-separated list of appIDs that user has chosen</comment>
</data>
<data name="AutomaticFileMigration" xml:space="preserve">
<value>{0} config file ще бъде прехвърлен на последния синтаксис...</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>Вашата IPC парола изглежда много слаба. Помислете за избиране на по-сложна за увеличаване на сигурността. Детайли: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Вашата Steam парола за {0} изглежда много слаба. Помислете за избиране на по-сложна за увеличаване на сигурността. Детайли: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Вашият криптиращ ключ изглежда много слаб. Помислете за избиране на по-сложна за увеличаване на сигурността. Детайли: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Вашият криптиращ ключ е много къс. Препоръчваме да ползвате някой, който е поне {0} байта (символа) голям.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Ползвате {0} настройка от {1} стойност, но не сте осигурили персонализиран крипто-ключ. Трябва да осигурите персонализиран крипто-ключ за увеличена защита.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Ползвате {0} настройка от {1} стойност, но не сте осигурили персонализиран крипто-ключ. Това напълно нарушава защитата, тъй като ASF е принуден да ползва собствен (познат) ключ. Трябва да осигурите персонализиран крипто-ключ, за да ползвате предлаганата защита от тези настройки.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Опитвате се да стартирате ASF като администратор. Това предполага значителен риск за защитата на вашата машина, и тъй като ASF не изисква административен достъп, за да работи, Ви препоръчваме да я стартирате като потребител, който НЕ Е администратор, по възможност.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Стартирали сте ASF| в неподдържана среда, осигурявайки аргумент, който отхвърля това твърдение. Имайте в предвид, че не осигуряваме никаква подръжка при подобен сценарий и вършите всичко на свой риск. Предупредени сте.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>Извлича се checksum от отдалечения сървър...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>Потвърждава се checksum на сваления файл срещу този на отдалечения сървър...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>Отдалечения сървър не знае нищо за версията до която се опитвате да ъпгрейднете. Подобна ситуация е възможна ако версията е публикувана скоро - отказване да се продължи с ъпдейта като допълнителна мярка за сигурност.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Отдалечения сървър отговори с различен checksum, това може да показва корумпирано сваляне или MITM атака - отказване да се продължи с ъпдейта!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Пачват се ASF файлове...</value>
</data>
</root>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Zadejte kód autentifikátoru SteamGuard, který byl zaslán na Váš email: </value>
<value>Prosím, zadejte ověřovací kód SteamGuard, který byl odeslán na váš e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ StackTrace:
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktivní konzole je nyní aktivní, napište "c" pro vstup do příkazového režimu.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktivní konzole není dostupná z důvodu chybějící {0} konfigurace.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot má {0} zbývajících her ve frontě.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ StackTrace:
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Vaše Steam heslo pro '{0}' se zdá být slabé. Pro větší zabezpečení zvažte změnu hesla na silnější variantu. Detaily: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Váš šifrovací klíč se zdá být slabý. Zvažte výběr silnější varianty pro zvýšení bezpečnosti. Detaily: {0}</value>

View File

@@ -104,7 +104,9 @@ StackTrace:
<value>{0} er ikke gyldig!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Ingen bots er defineret. Har du glemt at konfigurere din ASF? Følg 'opsætning'-guiden på wikien, hvis du er forvirret.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} er null!</value>
<comment>{0} will be replaced by object's name</comment>
@@ -225,37 +227,82 @@ StackTrace:
<value>Kunne ikke finde nogen bot der hedder {0}!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Der er {0}/{1} bots kørende med en total af {2} spil ({3} kort) tilbage at idle.</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>Botten idler spil: {0} ({1}, {2} kort drop tilbage) fra i alt {3} spil ({4} kort) tilbage at idle (~{5} tilbage).</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>Botten idler spil: {0} fra en total af {1} spil ({2} kort) tilbage at idle (~{3} tilbage).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>Tjekker første badge side...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>Tjekker andre badge sider...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Valgte idle algoritme: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Færdig!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Vi har totalt {0} spil ({1} kort) tilbage at idle (~{2} tilbage)...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>Idling færdig!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>Færdiggjort idling: {0} ({1}) efter {2} spilletid!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Færdig med at idle spil: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Idle status for {0} ({1}): {2} kort tilbage</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>Idling stoppede!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>Ignorere denne anmodning da permanent pause er aktiveret!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>Vi har ikke noget at idle på denne konto!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Idler nu: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Idler nu: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Det er ikke muligt at spille nu, vi vil prøve igen senere!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Idler stadig: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Idler stadig: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Stoppede med at idle: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Ukendt kommando!</value>
@@ -372,7 +419,9 @@ StackTrace:
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
<value>Fjernede udløbet login nøgle!</value>
</data>
<data name="BotStatusNotIdling" xml:space="preserve">
<value>Botten idler ikke noget.</value>
</data>
<data name="BotStatusConnecting" xml:space="preserve">
<value>Botten er forbundet til Steam-netværket.</value>
@@ -559,10 +608,6 @@ Processens oppetid: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Den interaktive konsol er nu aktiv, tast "c" for at skifte til kommando-mode.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Den interaktive konsol den ikke tilgængelig på grund af at {0} mangler en eller flere konfigurationsindstillinger.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot har {0} spil tilbage i sin baggrundskø.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -614,11 +659,15 @@ Processens oppetid: {1}</value>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Du forsøger at køre ASF som administrator (root). Dette medfører en betydelig sikkerhedsrisiko for din maskine, og da ASF ikke kræver root-adgang for dens drift, vi anbefaler at køre det som ikke-administrator bruger hvis det er muligt.</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Retter ASF-filer...</value>
</data>
</root>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Bitte geben Sie den Steam Guard Authentifizierungscode ein, welcher Ihnen per E-Mail geschickt wurde: </value>
<value>Bitte geben Sie den SteamGuard Authentifizierungstoken ein, der an Ihre E-Mail Adresse geschickt wurde: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -370,7 +370,7 @@ StackTrace:
<value>Bot-Instanz nicht gestartet, weil diese in der Konfigurationsdatei deaktiviert ist!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>Der TwoFactorCodeMismatch-Fehlercode wurde {0} Mal in Folge empfangen. Entweder sind Ihre 2FA-Anmeldeinformationen nicht mehr gültig oder die Systemuhr ist nicht synchronisiert. Der Vorgang wird abgebrochen!</value>
<value>Der TwoFactorCodeMismatch-Fehlercode wurde {0} Mal in Folge empfangen. Entweder sind Ihre 2FA-Anmedeinformationen nicht mehr gültig oder die Systemuhr ist nicht synchronisiert. Der Vorgang wird abgebrochen!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
@@ -445,10 +445,10 @@ StackTrace:
<value>Bot stellt eine Verbindung zum Steam-Netzwerk her.</value>
</data>
<data name="BotStatusNotRunning" xml:space="preserve">
<value>Bot läuft nicht.</value>
<value>Bot ist nicht in Betrieb.</value>
</data>
<data name="BotStatusPaused" xml:space="preserve">
<value>Bot ist pausiert oder läuft im manuellen Modus.</value>
<value>Bot ist pausiert oder wird im manuellen Modus ausgeführt.</value>
</data>
<data name="BotStatusPlayingNotAvailable" xml:space="preserve">
<value>Bot wird zurzeit benutzt.</value>
@@ -476,13 +476,13 @@ StackTrace:
<value>Benutzerkonto ist nicht mehr in Verwendung: Sammelprozess fortgesetzt!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>Benutzerkonto ist in Verwendung: ASF wird den Sammelprozess fortsetzen, wenn es wieder möglich ist...</value>
<value>Benutzerkonto ist in Verwendung: ASF wird den Sammelprozess fortsetzen, sobald diese wieder verfügbar ist...</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>Verbinde...</value>
</data>
<data name="BotHeartBeatFailed" xml:space="preserve">
<value>Die Verbindung zum Client konnte nicht getrennt werden. Verzichte auf diese Bot-Instanz!</value>
<value>Die Verbindung zum Client konnte nicht getrennt werden. Auf diese Bot-Instanz wird verzichtet!</value>
</data>
<data name="BotSteamDirectoryInitializationFailed" xml:space="preserve">
<value>SteamDirectory konnte nicht initialisiert werden: Die Verbindung mit dem Steam-Netzwerk könnte viel länger dauern als sonst!</value>
@@ -491,7 +491,7 @@ StackTrace:
<value>Anhalten...</value>
</data>
<data name="ErrorBotConfigInvalid" xml:space="preserve">
<value>Deine Bot-Konfiguration ist ungültig. Bitte überprüfen Sie den Inhalt von {0} und versuchen Sie es erneut!</value>
<value>Ihre Bot-Konfiguration ist ungültig. Bitte überprüfen Sie den Inhalt von {0} und versuchen Sie es erneut!</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorDatabaseInvalid" xml:space="preserve">
@@ -506,10 +506,10 @@ StackTrace:
<value>Bitte lesen Sie den Abschnitt zu unseren Datenschutzrichtlinien im Wiki, wenn Sie wissen möchten was ASF im Detail alles macht!</value>
</data>
<data name="Welcome" xml:space="preserve">
<value>Es sieht so aus, als ob Sie das Programm zum ersten Mal gestartet haben, willkommen!</value>
<value>Es sieht so aus, als ob Sie das Programm zum ersten Mal gestartet haben. Willkommen!</value>
</data>
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>Ihre angegebene CurrentCulture ist ungültig, ASF wird weiterhin mit dem Standard laufen!</value>
<value>Ihre angegebene CurrentCulture ist ungültig, ASF wird weiterhin mit dem Standard ausgeführt!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>ASF wird versuchen, Ihre bevorzugte Sprache {0} zu verwenden, jedoch wurde die Übersetzung in dieser Sprache nur zu {1} abgeschlossen. Können Sie uns vielleicht helfen, die ASF-Übersetzung in Ihrer Sprache zu verbessern?</value>
@@ -531,7 +531,7 @@ StackTrace:
<value>Das Benutzerkonto ist gesperrt, der Sammelprozess ist permanent unmöglich!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>Benutzerkonto ist gesperrt und kann keine Sammelkarten erhalten.</value>
<value>Der Bot ist gesperrt und kann keine Sammelkarten erhalten.</value>
</data>
<data name="ErrorFunctionOnlyInHeadlessMode" xml:space="preserve">
<value>Diese Funktion steht nur im Headless-Modus zur Verfügung!</value>
@@ -556,7 +556,7 @@ Prozesslaufzeit: {1}</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="DoneClearingDiscoveryQueue" xml:space="preserve">
<value>Fertig mit dem Löschen der Steam-Entdeckungsliste #{0}.</value>
<value>Steam-Entdeckungsliste #{0} wurde erfolgreich geleert.</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="BotOwnsOverviewPerGame" xml:space="preserve">
@@ -623,10 +623,10 @@ Prozesslaufzeit: {1}</value>
<value>Nichts gefunden!</value>
</data>
<data name="PluginsWarning" xml:space="preserve">
<value>Sie haben ein oder mehrere benutzerdefinierte Plugins in ASF geladen. Da wir keine Unterstützung für modifizierte Setups anbieten können, bitten wir Sie sich im Falle von Problemen an die entsprechenden Entwickler der Plugins zu wenden.</value>
<value>Sie haben ein oder mehrere benutzerdefinierte Plugins in ASF geladen. Da wir keine Unterstützung für modifizierte Setups anbieten können, bitten wir Sie, sich im Falle von Problemen an die entsprechenden Entwickler der Plugins zu wenden.</value>
</data>
<data name="PleaseWait" xml:space="preserve">
<value>Bitte warte...</value>
<value>Bitte warten...</value>
</data>
<data name="EnterCommand" xml:space="preserve">
<value>Befehl eingeben: </value>
@@ -637,10 +637,6 @@ Prozesslaufzeit: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktive Konsole ist jetzt aktiv, geben Sie 'c' ein, um den Befehlsmodus zu wechseln.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Die interaktive Konsole ist aufgrund der fehlenden Konfigurationseigenschaften {0} nicht verfügbar.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot hat {0} Spiele, die in seiner Hintergrundwarteschlange verbleiben.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -653,14 +649,14 @@ Prozesslaufzeit: {1}</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>Wir warten bis zu {0} um sicherzustellen, dass es möglich ist, den Sammelprozess zu starten...</value>
<value>Wir warten bis zu {0}, um sicherzustellen, dass der Sammelprozess gestartet werden kann...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>Alte Dateien nach dem Update bereinigen...</value>
</data>
<data name="BotGeneratingSteamParentalCode" xml:space="preserve">
<value>Erstelle Steam-Jugendschutz-Code, das kann einige Zeit dauern. Eventuell solltest du stattdessen den Code in der Konfiguration hinterlegen...</value>
<value>Erstelle Steam-Jugendschutz-Code, das kann einige Zeit dauern. Eventuell sollten Sie stattdessen den Code in der Konfiguration hinterlegen...</value>
</data>
<data name="IPCConfigChanged" xml:space="preserve">
<value>Die IPC-Konfiguration wurde geändert!</value>
@@ -696,46 +692,48 @@ Prozesslaufzeit: {1}</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>Dein IPC-Passwort scheint schwach zu sein. Für erhöhte Sicherheit solltest du überlegen, ein Stärkeres auszusuchen. Details: {0}</value>
<value>Ihr IPC-Passwort scheint schwach zu sein. Für erhöhte Sicherheit sollten Sie überlegen, ein Stärkeres auszusuchen. Details: {0}Ihr</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Dein Steam-Passwort für '{0}' scheint schwach zu sein. Für erhöhte Sicherheit solltest du überlegen, ein Stärkeres auszusuchen. Details: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<value>Ihr Steam-Passwort für '{0}' scheint schwach zu sein. Für erhöhte Sicherheit sollten Sie überlegen, ein Stärkeres auszusuchen. Details: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Dein kryptografischer Schlüssel scheint schwach zu sein. Für erhöhte Sicherheit solltest du überlegen, einen Stärkeren auszusuchen. Details: {0}</value>
<value>Ihr kryptografischer Schlüssel scheint schwach zu sein. Für erhöhte Sicherheit sollten Sie überlegen, einen Stärkeren auszusuchen. Details: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Dein kryptografischer Schlüssel ist zu kurz. Wir empfehlen einen zu verwenden, der mindestens {0} Bytes (Zeichen) lang ist.</value>
<value>Ihr kryptografischer Schlüssel ist zu kurz. Wir empfehlen einen zu verwenden, der mindestens {0} Bytes (Zeichen) lang ist.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Du verwendest {0} für {1}, hast aber keinen eigenen kryptografischen Schlüssel mit --cryptkey spezifiziert. Für erhöhte Sicherheit solltest du einen eigenen kryptografischen Schlüssel verwenden.</value>
<value>Sie verwenden {0} für {1}, haben aber keinen eigenen kryptografischen Schlüssel mit --cryptkey spezifiziert. Für erhöhte Sicherheit sollten Sie einen eigenen kryptografischen Schlüssel verwenden.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Du verwendest {0} für {1}, hast aber keinen eigenen kryptografischen Schlüssel mit --cryptkey spezifiziert. Dies umgeht den Schutz komplett, da ASF gezwungen ist den internen (öffentlich bekannten) Schlüssel zu verwenden. Du solltest einen eigenen kryptografischen Schlüssel verwenden, um Nutzen von dieser Einstellung zu haben.</value>
<value>Sie verwenden {0} für {1}, haben aber keinen eigenen kryptografischen Schlüssel mit --cryptkey spezifiziert. Dies umgeht den Schutz komplett, da ASF gezwungen ist den internen (öffentlich bekannten) Schlüssel zu verwenden. Sie sollten einen eigenen kryptografischen Schlüssel verwenden, um Nutzen von dieser Einstellung zu haben.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Sie versuchen ASF als Administrator (root) auszuführen. Dies stellt ein signifikantes Sicherheitsrisiko für Ihr Gerät dar und da ASF diese Rechte nicht benötigt, unterstützen wir dieses Szenario nicht. Verwenden Sie das Kommandozeilenargument --ignore-unsupported-environment, wenn Sie wirklich wissen, was Sie tun.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Du verwendest ASF in einer nicht unterstützten Umgebung und verwendest das Argument --ignore-unsupported-environment. Bitte beachte, dass wir für dieses Szenario keinerlei Unterstützung anbieten und du das Risiko vollständig auf dich selber nehmen musst. Du wurdest gewarnt.</value>
<value>Sie nutzen ASF in einer nicht unterstützten Umgebung und verwenden das Argument --ignore-unsupported-environment. Bitte beachten Sie, dass wir für dieses Szenario keinerlei Unterstützung anbieten und Sie das Risiko vollständig bei Ihnen liegt. Sie wurden gewarnt.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>Rufe Prüfsumme vom ASF Server ab...</value>
<value>Rufe Prüfsumme vom ASF-Server ab...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>Verifiziere Prüfsumme der heruntergeladenen Datei mmit der des ASF Servers...</value>
<value>Verifiziere Prüfsumme der heruntergeladenen Datei mit der des ASF Servers...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>Der Server weiß nichts von der Version, zu der wir versuchen zu aktualisieren. Diese Situation ist möglich wenn die Version erst kürzlich veröffentlicht wurde - Wir weigern uns als zusätzliche Sicherheitsmaßnahme das Updateprozedere zum jetzigen Zeitpunkt durchzuführen.</value>
<value>Die angeforderte Version, zu der wir versuchen zu aktualisieren, ist auf dem Server nicht Verfügbar. Diese Situation ist möglich, wenn die Version erst kürzlich veröffentlicht wurde. Als zusätzliche Sicherheitsmaßnahme wird das Updateprozedere zum jetzigen Zeitpunkt nicht fortgesetzt.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Der Server antwortete mit einer unterschiedlichen Prüfsumme. Dies kann einen korrupten Download oder eine MITM-Attacke indizieren; Wir weigern uns mit dem Update fortzufahren!</value>
<value>Der Server antwortete mit einer unterschiedlichen Prüfsumme. Dies kann einen korrupten Download oder eine MITM-Attacke indizieren; Das Update wird abgebrochen!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Update ASF-Dateien...</value>
<value>Aktualisiere ASF-Dateien...</value>
</data>
</root>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Εισάγετε τον κωδικό Steam Guard που έχει αποσταλεί στο e-mail σας: </value>
<value>Παρακαλώ εισάγετε τον κωδικό SteamGuard που στάλθηκε στο e-mail σας: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ StackTrace:
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Η διαδραστική κονσόλα είναι ενεργή, πατήστε 'c' για να εισάγετε εντολή.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Η διαδραστική κονσόλα δεν είναι διαθέσιμη διότι λείπει η ιδιότητα {0} από το αρχείο διαμόρφωσης.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Το bot έχει {0} παιχνίδια που απομένουν στην ουρά.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ StackTrace:
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Ο κωδικός πρόσβασης Steam για το '{0}' φαίνεται να είναι αδύναμος. Εξετάστε το ενδεχόμενο να επιλέξετε έναν ισχυρότερο για αυξημένη ασφάλεια. Λεπτομέρειες: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Το κλειδί κρυπτογράφησής σας φαίνεται να είναι αδύναμο. Εξετάστε το ενδεχόμενο να επιλέξετε ένα ισχυρότερο για αυξημένη ασφάλεια. Λεπτομέρειες: {0}</value>

View File

@@ -636,10 +636,6 @@ Tiempo de actividad del proceso: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>La consola interactiva está activa, presiona 'c' para entrar al modo de comandos.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>La consola interactiva no está disponible debido a que falta la propiedad de configuración {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>El bot tiene {0} juegos restantes en la cola en segundo plano.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -700,7 +696,7 @@ Tiempo de actividad del proceso: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Parece que tu contraseña de Steam para '{0}' es débil. Considera elegir una más fuerte para mayor seguridad. Detalles: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Parece que tu clave de cifrado es débil. Considera elegir una más fuerte para mayor seguridad. Detalles: {0}</value>

View File

@@ -252,7 +252,6 @@
</root>

View File

@@ -63,7 +63,7 @@
</value>
</resheader>
<data name="AcceptingTrade" xml:space="preserve">
<value>Hyväksytään vaihtoa: {0}</value>
<value>Hyväksytään vaihtokauppaa: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="AutoUpdateCheckInfo" xml:space="preserve">
@@ -76,11 +76,11 @@
<comment>{0} will be replaced by content string. Please note that this string should include newline for formatting.</comment>
</data>
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
<value>Kohdassa {0} muokattu arvo {1} on epäkelpo</value>
<value>Kohdassa {0} määritelty arvo {1} on virheellinen</value>
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
</data>
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
<value>ASF V{0} on törmännyt ylitsepääsemättömään poikkeukseen ennen kuin ytimen lokinkirjaus moduuli ehdittiin käynnistää!</value>
<value>ASF V{0} on törmännyt ylitsepääsemättömään poikkeukseen ennen kuin ytimen lokinkirjausmoduuli ehdittiin käynnistää!</value>
<comment>{0} will be replaced by version number</comment>
</data>
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
@@ -97,20 +97,22 @@ StackTrace:
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>Yleisiä asetuksia ei voitu ladata. Tarkista että {0} on olemassa ja validi. Seuraa wikin 'setting up' ohjetta mikäli tarvitset apua.</value>
<value>Yleisiä asetuksia ei voitu ladata. Tarkista että {0} on olemassa ja oikein. Seuraa wikin 'setting up' ohjetta mikäli tarvitset apua.</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
<value>{0} on virheellinen!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Yhtään bottia ei ole määritelty. Unohditko määrittää ASF:n asetuksesi? Noudata 'Setting up' -opasta wikissä, jos olet hämmentynyt.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} on ei mitään!</value>
<value>{0} on tyhjä!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorParsingObject" xml:space="preserve">
<value>{0} jäsentäminen epäonnistui!</value>
<value>Objektin {0} jäsentäminen epäonnistui!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
@@ -127,7 +129,7 @@ StackTrace:
<value>Päivittämistä ei voitu jatkaa koska kyseinen versio ei sisällä yhtään tiedostoa!</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>Huomasimme tarpeen käyttäjän toimille, mutta prosessi on käynnistetty headless-tilassa!</value>
<value>Vastaanotettiin pyyntö käyttäjän syötteelle, mutta prosessi on käynnistetty headless-tilassa!</value>
</data>
<data name="Exiting" xml:space="preserve">
<value>Suljetaan...</value>
@@ -146,14 +148,14 @@ StackTrace:
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="LoggingIn" xml:space="preserve">
<value>Kirjaudutaan to {0}...</value>
<value>Kirjaudutaan sisään {0}...</value>
<comment>{0} will be replaced by service's name</comment>
</data>
<data name="NoBotsAreRunning" xml:space="preserve">
<value>Yhtään bottia ei ole käynnissä, poistutaan...</value>
</data>
<data name="RefreshingOurSession" xml:space="preserve">
<value>Virkistetään istuntomme!</value>
<value>Päivitetään istuntomme!</value>
</data>
<data name="RejectingTrade" xml:space="preserve">
<value>Hylätään vaihto: {0}</value>
@@ -189,11 +191,11 @@ StackTrace:
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
</data>
<data name="UserInputSteam2FA" xml:space="preserve">
<value>Syötä 2FA koodi Steam varmennus sovelluksesta: </value>
<value>Syötä 2FA-koodi Steam-varmennussovelluksesta: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Syötä SteamGuard varmennuskoodi, joka lähetettiin sähköpostiisi: </value>
<value>Syötä SteamGuard -varmennuskoodi, joka lähetettiin sähköpostiisi: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -225,43 +227,91 @@ StackTrace:
<value>Bottia nimeltä {0} ei voitu löytää!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Tällä hetkellä on käytössä {0}/{1} bottia, joilla on {2} peliä ({3} korttia) jäljellä farmattavaksi.</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>Botti farmaa peliä: {0} ({1}, {2} korttia jäljellä) jäljellä olevista {3} pelistä ({4} korttia). Farmausta jäljellä: ~{5}.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>Botti farmaa pelejä: {0} jäljellä olevista {1} pelistä ({2} korttia). Farmausta jäljellä: ~{3}.</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>Tarkastellaan ensimmäistä badge sivua...</value>
<value>Tarkastellaan ensimmäistä badge-sivua...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>Tarkastellaan muita badge sivuja...</value>
<value>Tarkastellaan muita badge-sivuja...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Valittu farmauksen algoritmi: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Valmis!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Farmattavana yhteensä {0} peliä ({1} korttia), ~{2} jäljellä...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>Farmaus valmis!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>Farmaus valmis: {0} ({1}) Kulunut peliaika: {2}!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Farmaus valmistunut seuraavien pelien osalta: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Farmattavana {0} ({1}): {2} korttia jäljellä</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>Farmaus pysäytetty!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>Tämä pyyntö jätetään huomioimatta, kun pysyvä tauko on päällä!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>Tällä tilillä ei ole mitään farmattavaa!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Nyt farmataan: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Nyt farmataan: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Pelaaminen ei ole tällä hetkellä mahdollista, yritetään myöhemmin uudestaan!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Farmataan edelleen: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Farmataan edelleen: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Farmaus pysäytetty: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>Farmaus pysäytetty: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Tuntematon komento!</value>
</data>
<data name="WarningCouldNotCheckBadges" xml:space="preserve">
<value>Merkkien hakeminen epäonnistui, yritetään myöhemmin uudestaan!</value>
<value>Merkkien tietojen hakeminen epäonnistui, yritetään myöhemmin uudestaan!</value>
</data>
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
<value>Ei voitu tarkastaan korttien tilaa kohteelle: {0} ({1}), yritetään myöhemmin uudestaan!</value>
@@ -271,13 +321,15 @@ StackTrace:
<value>Hyväksytään lahjaa: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>Tämä tili on rajoitettu, farmaus ei ole mahdollista ennen kuin rajoitus poistetaan!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID: {0} | Tila: {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string</comment>
</data>
<data name="BotAddLicenseWithItems" xml:space="preserve">
<value>ID: {0} | Tila: {1} | Tuotteet: {2}</value>
<value>ID: {0} | Tila: {1} | Tavarat: {2}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string, {2} will be replaced by list of granted IDs (numbers), separated by a comma</comment>
</data>
<data name="BotAlreadyRunning" xml:space="preserve">
@@ -287,16 +339,24 @@ StackTrace:
<value>Muutetaan .maFile ASF:n käyttämään muotoon...</value>
</data>
<data name="BotAuthenticatorImportFinished" xml:space="preserve">
<value>Mobiili authentikaattorin tuonti onnistui!</value>
<value>Mobiilivarmentajan tuonti onnistui!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>2FA Koodi: {0}</value>
<value>2FA-koodi: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
<value>Automattinen farmaus on pysäytetty!</value>
</data>
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
<value>Automaattista farmausta on jatkettu!</value>
</data>
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
<value>Automattinen farmaus on jo pysäytetty!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>Automattista farmausta on jo jatkettu!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>Yhdistetty Steamiin!</value>
</data>
@@ -307,7 +367,7 @@ StackTrace:
<value>Katkaistaan yhteyttä...</value>
</data>
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
<value>Ei käynnistetä tätä bottia koska se on poistettu käytöstä configuraatiossa!</value>
<value>Ei käynnistetä tätä bottia koska se on poistettu käytöstä asetustiedostossa!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>Saimme TwoFactorCodeMismatch virhekoodin {0} kertaa putkeen. Joko 2FA tilitiedot eivät ole enää voimassa, tai kellosi ei ole synkronoitu, keskeytetään!</value>
@@ -325,33 +385,38 @@ StackTrace:
<value>Kirjaudutaan sisään...</value>
</data>
<data name="BotLogonSessionReplaced" xml:space="preserve">
<value>Tämä käyttäjä vaikuttaisi olevan käytössä toisessa ASF instanssissa. Tällaista käyttäytymistä ei ole määritelty, kieltäydytään suorittamasta!</value>
<value>Tämä käyttäjä vaikuttaisi olevan käytössä toisessa ASF-instanssissa. Tällaista käyttäytymistä ei ole määritelty, kieltäydytään suorittamasta!</value>
</data>
<data name="BotLootingFailed" xml:space="preserve">
<value>Vaihtotarjous epäonnistui!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>Vaihtoa ei voitu lähettää koska yhtään käyttäjää master-oikeuksilla ei ole määritelty!</value>
<value>Vaihtoa ei voitu lähettää koska yhtään käyttäjää pääkäyttöoikeuksilla ei ole määritelty!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>Vaihtopyyntö lähetetty onnistuneesti!</value>
</data>
<data name="BotSendingTradeToYourself" xml:space="preserve">
<value>Et voi tehdä vaihtokauppaa itsesi kanssa!</value>
</data>
<data name="BotNoASFAuthenticator" xml:space="preserve">
<value>Tällä botilla ei ole ASF 2FA käytössä! Unohditko ottaa ASF 2FA authentikaattorin käyttöön?</value>
<value>Tällä botilla ei ole ASF 2FA-käytössä! Unohditko ottaa ASF 2FA-varmennuksen käyttöön?</value>
</data>
<data name="BotNotConnected" xml:space="preserve">
<value>Tämä botti instanssi ei ole yhdistettynä!</value>
</data>
<data name="BotNotOwnedYet" xml:space="preserve">
<value>Omistamattomat: {0}</value>
<value>Ei vielä omistettu: {0}</value>
<comment>{0} will be replaced by query (string)</comment>
</data>
<data name="BotOwnedAlreadyWithName" xml:space="preserve">
<value>Omistetut {0} | {1}</value>
<value>Jo omistetut {0} | {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotPointsBalance" xml:space="preserve">
<value>Pistesaldo: {0}</value>
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>Yritysmäärä on ylitetty, yritetään uudelleen {0} jälkeen...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
@@ -370,8 +435,12 @@ StackTrace:
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
<value>Poistettu vanhentunut kirjautumisavain!</value>
</data>
<data name="BotStatusNotIdling" xml:space="preserve">
<value>Botti ei farmaa mitään.</value>
</data>
<data name="BotStatusLimited" xml:space="preserve">
<value>Botti on rajoitettu eikä tämän takia voi saada yhtään korttia farmaamalla.</value>
</data>
<data name="BotStatusConnecting" xml:space="preserve">
<value>Botti yhdistää Steam-verkkoon.</value>
</data>
@@ -403,8 +472,12 @@ StackTrace:
<data name="BotConnectionLost" xml:space="preserve">
<value>Yhteys Steam-verkkoon katkesi. Yhdistetään uudelleen...</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>Tili ei ole enää varattu: farmausta jatketaan!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>Tiliä käytetään tällä hetkellä muualla: ASF jatkaa farmaamista kun tili vapautuu...</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>Yhdistetään...</value>
</data>
@@ -438,8 +511,14 @@ StackTrace:
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>Antamasi CurrentCulture on epäkelpo, ASF jatkaa toimintaa oletusarvolla!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>ASF koettaa käyttää haluttua lokalisaatiota ({0}), mutta käännös tällä kielellä on vain {1} valmis. Ehkä voisit auttaa meitä parantamaan ASF:n käännöstä omalle kielellesi?</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
<value>Pelin {0} ({1}) farmaus on väliaikaisesti poistettu käytöstä, koska ASF ei pysty pelaamaan tätä peliä tällä hetkellä.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningIdlingGameMismatch" xml:space="preserve">
<value>ASF huomasi ID poikkeavuuden kohteessa {0} ({1}) ja käyttää ID:tä {2} tämän sijaan.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by game's ID (number)</comment>
@@ -448,8 +527,12 @@ StackTrace:
<value>{0} V{1}</value>
<comment>{0} will be replaced by program's name (e.g. "ASF"), {1} will be replaced by program's version (e.g. "1.0.0.0"). This string typically has nothing to translate and you should leave it as it is, unless you need to change the format, e.g. in RTL languages.</comment>
</data>
<data name="BotAccountLocked" xml:space="preserve">
<value>Tämä tili on lukittu, farmaus on pysyvästi pois käytöstä!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>Botti on lukittu, eikä voi tämän takia saada yhtään korttia farmaamalla.</value>
</data>
<data name="ErrorFunctionOnlyInHeadlessMode" xml:space="preserve">
<value>Tämä funktio on käytettävissä vain headless-tilassa!</value>
</data>
@@ -460,8 +543,14 @@ StackTrace:
<data name="ErrorAccessDenied" xml:space="preserve">
<value>Pääsy kielletty!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>Käytät versiota joka on uudempi kuin uusin julkaistu versio käyttämälläsi päivityskanavalla. Huomoithan että esijulkaistut versiot ovat tarkoitettu käyttäjille, jotka osaavat raportoida virheistä, selviävät ongelmien kanssa sekä antavat palautetta - teknistä tukea ei anneta.</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>Nykyinen muistinkäyttö: {0} MB.
Prosessin käyttöaika: {1}</value>
<comment>{0} will be replaced by number (in megabytes) of memory being used, {1} will be replaced by translated TimeSpan string (such as "25 minutes"). Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ClearingDiscoveryQueue" xml:space="preserve">
<value>Tyhjennetään Steamin discovery-jonoa #{0}...</value>
<comment>{0} will be replaced by queue number</comment>
@@ -533,7 +622,9 @@ StackTrace:
<data name="NothingFound" xml:space="preserve">
<value>Mitään ei löytynyt!</value>
</data>
<data name="PluginsWarning" xml:space="preserve">
<value>Olet ladannut yhden tai useamman mukautetun lisäosan ASF: ään. Koska emme pysty tarjoamaan tukea modatuille ympäristöille, ole hyvä ja käänny ongelmien ilmetessä käyttöönottamiesi lisäosien tekijöiden puoleen.</value>
</data>
<data name="PleaseWait" xml:space="preserve">
<value>Odota hetki...</value>
</data>
@@ -546,10 +637,6 @@ StackTrace:
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Vuorovaikutteinen konsoli on nyt aktiivinen. Paina 'c' siirtyäksesi komento-tilaan.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Vuorovaikutteinen konsoli ei ole käytettävissä, koska {0} asetus puuttuu.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Botilla on {0} peliä jäljellä taustajonossa.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -557,8 +644,14 @@ StackTrace:
<data name="ErrorSingleInstanceRequired" xml:space="preserve">
<value>ASF prosessi on jo käynnissä tässä työhakemistossa. Keskeytetään!</value>
</data>
<data name="BotHandledConfirmations" xml:space="preserve">
<value>Onnistuneesti käsiteltiin {0} vahvistusta!</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>Odotetaan enintään {0} varmistaaksemme, että olemme vapaita aloittamaan farmauksen...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>Siivotaan vanhat tiedostot päivityksen jälkeen...</value>
</data>
@@ -568,25 +661,79 @@ StackTrace:
<data name="IPCConfigChanged" xml:space="preserve">
<value>IPC asetusta on muutettu!</value>
</data>
<data name="BotTradeOfferResult" xml:space="preserve">
<value>Vaihtotarjous {0} on tilassa {1} syystä {2}.</value>
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>Vastaanotettu invalidPassword -virhekoodi {0} kertaa peräkkäin. Salasanasi tälle tilille on todennäköisesti väärin, keskeytetään!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
<value>Tulos: {0}</value>
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>Yrität suorittaa ASF:n {0} varianttia ympäristössä jota ei tueta: {1}. Lisää --ignore-unsupported-environment -argumentti, jos todella tiedät mitä olet tekemässä.</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>Tuntematon komentorivin argumentti: {0}</value>
<comment>{0} will be replaced by unrecognized command that has been provided</comment>
</data>
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
<value>Asetushakemistoa ei kyetty löytämään, keskeytetään!</value>
</data>
<data name="BotIdlingSelectedGames" xml:space="preserve">
<value>Pelataan valittuja {0}: {1}</value>
<comment>{0} will be replaced by internal name of the config property (e.g. "GamesPlayedWhileIdle"), {1} will be replaced by comma-separated list of appIDs that user has chosen</comment>
</data>
<data name="AutomaticFileMigration" xml:space="preserve">
<value>{0} asetustiedosto muutetaan uusimpaan syntaksiin...</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>IPC-salasanasi näyttää olevan heikko. Harkitse vahvemman salasanan valitsemista turvallisuuden parantamiseksi. Yksityiskohdat: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Steam-salasanasi '{0}' näyttää olevan heikko. Harkitse vahvemman salasanan valitsemista turvallisuuden lisäämiseksi. Yksityiskohdat: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Salausavaimesi näyttää olevan heikko. Harkitse vahvemman valintaa turvallisuuden parantamiseksi. Yksityiskohdat: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Salausavaimesi on liian lyhyt. Suosittelemme käyttämään salausavainta, joka on vähintään {0} tavua (merkkiä) pitkä.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Käytät ominaisuuden {1} asetusta {0}, mutta et antanut mukautettua --cryptkey -argumenttia. Sinun pitäisi antaa mukautettu --cryptkey lisäturvallisuuden takaamiseksi.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Käytät ominaisuuden {1} asetusta {0}, mutta et antanut mukautettua --cryptkey -argumenttia. Tämä tekee suojauksen täysin tyhjäksi, koska ASF joutuu käyttämään omaa (tunnettua) avaintaan. Sinun tulisi antaa mukautettu --cryptkey tämän asetuksen turvallisuushyöydyn saavuttamiseksi.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Yrität käynnistää ASF:ää järjestelmänvalvojana (root). Tämä aiheuttaa merkittävän turvallisuusriskin koneellesi ja koska ASF ei tarvitse pääkäyttäjän oikeuksia toimintaansa, suosittelemme käyttämään sitä ei-järjestelmänvalvojan tunnuksilla, jos mahdollista.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Käytössäsi on ASF tukemattomassa ympäristössä, käyttäen --ignore-unsupported-environment argumenttia. Huomioithan, että emme tarjoa minkäänlaista tukea tälle skenaariolle ja teet sen täysin omalla vastuullasi. Sinua on varoitettu.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>Haetaan tarkistussummaa etäpalvelimelta...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>Tarkistetaan ladatun binäärin tarkistussummaa etäpalvelimelta saatuun...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>Etäpalvelin ei tiedä mitään julkaisusta, johon olemme päivittämässä. Tämä tilanne on mahdollinen, jos julkistaminen on hiljattain julkaistu - kieltäydytään jatkamasta päivitystä ylimääräisenä turvatoimenpiteenä.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Etäpalvelin on vastannut eri tarkistussummalla, mikä saattaa merkitä viallista latausta tai MITM-hyökkäystä, kieltäydytään jatkamasta päivitystä!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Paikataan ASF-tiedostoja...</value>
</data>
</root>

View File

@@ -194,10 +194,7 @@ StackTrace :
<value>Veuillez entrer votre code 2FA généré par votre application d'authentification de Steam : </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Veuillez entrer le code dauthentification SteamGuard qui a été envoyé sur votre e-mail : </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Veuillez entrer votre nom dutilisateur Steam : </value>
<comment>Please note that this translation should end with space</comment>
@@ -637,10 +634,6 @@ Durée de fonctionnement : {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>La console interactive est maintenant active, tapez 'c' pour entrer en mode commande.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>La console interactive n'est pas disponible en raison de la propriété de configuration {0} manquante.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Le bot a {0} jeux restants dans sa file d'attente.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +694,7 @@ Durée de fonctionnement : {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Votre mot de passe Steam pour '{0}' semble faible. Pensez à choisir un mot de passe plus fort pour plus de sécurité. Détails: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Votre clé de chiffrement semble faible. Pensez à en choisir une plus forte pour plus sécurité. Détails: {0}</value>

View File

@@ -192,10 +192,7 @@ StackTrace:
<value>אנא הכנס את קוד האימות מאפליקציית המאמת של Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>אנא הזן את קוד האימות של SteamGuard אשר נשלח אליך בדואר אלקטרוני: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>נא הזינו את משתמש ה- Steam שלכם: </value>
<comment>Please note that this translation should end with space</comment>
@@ -212,7 +209,9 @@ StackTrace:
<data name="IPCReady" xml:space="preserve">
<value>שרת IPC מוכן!</value>
</data>
<data name="IPCStarting" xml:space="preserve">
<value>מתחיל שרת IPC...</value>
</data>
<data name="BotAlreadyStopped" xml:space="preserve">
<value>בוט זה כבר הפסיק!</value>
</data>
@@ -286,10 +285,18 @@ StackTrace:
<value>אסימון 2FA: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
<value>החקלאות האוטומטית נעצרה!</value>
</data>
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
<value>החציבה האוטומטית שבה לפעול!</value>
</data>
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
<value>החציבה האוטומטית כבר בהשהיה!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>החציבה האוטומטית כבר שבה לפעול!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>מחובר לסטים!</value>
</data>
@@ -477,8 +484,10 @@ StackTrace:
<comment>{0} will be replaced by the bug's name provided by ASF</comment>
</data>
<data name="BotWalletBalance" xml:space="preserve">
<value>יתרה בארנק: {1}{0}</value>
<comment>{0} will be replaced by wallet balance value, {1} will be replaced by currency name</comment>
</data>

View File

@@ -190,10 +190,7 @@ StackTrace: {2}</value>
<value>Add meg a 2FA kódot a Steam hitelesítő alkalmazásból: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Add meg a SteamGuard hitelesítő kódot amit e-mailben kaptál: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Add meg a Steames felhasználó neved: </value>
<comment>Please note that this translation should end with space</comment>
@@ -225,20 +222,34 @@ StackTrace: {2}</value>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>A bot a {0} játékot farmolja. Összesen {1} játék ({2} kártya) maradt hátra (kb. {3} mire végez).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>A kitűzők első oldalának ellenőrzése...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>A többi kitűző oldal ellenőrzése...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>A kiválasztott farmoló algoritmus: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Kész!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Még összesen {0} játék ({1} kártya) maradt (kb. {2} míg végez)...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>Farmolás befejezve!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>Farmolás befejezve: {0} ({1}) készen van {2} játékidő után!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Farmolás állapota a következő a játékhoz: {0} ({1}): {2} kártya maradt</value>
@@ -565,10 +576,6 @@ Ennyi ideje fut: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Az interaktív konzol aktív, nyomd meg a 'c' billentyűt, hogy a parancs módba lépj.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Az interaktív konzol nem elérhető mivel a(z) {0} tulajdonság hiányzik a konfigurációból.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>A botnak {0} játéka maradt a várólistán.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -189,10 +189,7 @@
<value>Silakan masukkan kode 2FA dari aplikasi authenticator Steam Anda: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Silakan masukkan kode otentikasi SteamGuard yang dikirim ke e-mail Anda: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Masukkan login Steam Anda: </value>
<comment>Please note that this translation should end with space</comment>
@@ -515,7 +512,6 @@
<value>Mengeksekusi...</value>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot mempunyai {0} game tersisa di dalam antrian.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -193,7 +193,7 @@
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Inserisci il codice di autenticazione di SteamGuard che è stato inviato al tuo indirizzo e-mail: </value>
<value>Inserisci il codice di autenticazione SteamGuard che è stato inviato al tuo indirizzo e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -635,10 +635,6 @@ Tempo di attività: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>La console interattiva è stata attivata, digita 'c' per entrare nella modalità comando.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>La console interattiva non è disponibile a causa della proprietà di configurazione {0} mancante.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Il bot ha {0} giochi rimanenti nella coda di background.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -693,17 +689,49 @@ Tempo di attività: {1}</value>
<value>Il file di configurazione {0} verrà migrato all'ultima sintassi...</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>La tua password IPC sembra essere debole. Considera di sceglierne una più forte per una maggiore sicurezza. Dettagli: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>La tua password di Steam per '{0}' sembra essere debole. Considera di sceglierne una più forte per una maggiore sicurezza. Dettagli: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>La tua chiave di crittografia sembra essere debole. Considera di sceglierne una più forte per una maggiore sicurezza. Dettagli: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>La chiave di crittografia è troppo corta. Si consiglia di utilizzarne una lunga almeno {0} byte (caratteri).</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Stai usando {0} come impostazione della proprietà {1}, ma non hai fornito un --cryptkey personalizzato. Dovresti fornire un --cryptkey personalizzato per una maggiore sicurezza.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Stai usando {0} come impostazione della proprietà {1}, ma non hai fornito un --cryptkey personalizzato. Questo sconfigge completamente la protezione, in quanto ASF è costretto a utilizzare la propria chiave (conosciuta). Dovresti fornire un --cryptkey personalizzato per sfruttare il vantaggio di sicurezza offerto da questa impostazione.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Stai tentando di eseguire ASF come amministratore (root). Questo causa un rischio significativo per la sicurezza della vostra macchina e poiché ASF non richiede l'accesso root per il suo funzionamento, si consiglia di eseguirlo come utente non amministratore, se possibile.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Stai eseguendo ASF in ambiente non supportato, fornendo --ignore-unsupported-environment come argomento. Si prega di notare che non offriamo alcun tipo di supporto per questo scenario e lo stai facendo a tuo rischio e pericolo. Siete avvisati.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>Recupero del checksum dal server remoto...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>Verifica del checksum del binario scaricato con quello dal server remoto...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>Il server remoto non sa nulla della versione alla quale stiamo aggiornando. Questa situazione è possibile se la versione è stata pubblicata di recente, come misura di sicurezza aggiuntiva si rifiuta l'aggiornamento a questa versione per il momento.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Il server remoto ha risposto con un checksum diverso, questo potrebbe indicare un download danneggiato o un attacco MITM, procedura di aggiornamento fermata!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Patching dei file ASF...</value>
</data>
</root>

View File

@@ -191,10 +191,7 @@
<value>Steam 認証アプリの二次認証コードを入力してください: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>あなたのメールアドレスに送信された SteamGuard 認証コードを入力してください: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>あなたの Steam アカウント名を入力してください: </value>
<comment>Please note that this translation should end with space</comment>
@@ -600,10 +597,6 @@ Process uptime: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>対話型コンソールがアクティブになりました。コマンドモードに入るには「c」と入力します。</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>{0} の設定が見つからないため、対話型コンソールが無効にしました。</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>bot のバックグラウンドキューに {0} つのゲームが残っています。</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -256,7 +256,6 @@
</root>

View File

@@ -192,10 +192,7 @@ StackTrace:
<value>Steam 인증 어플의 2차 인증 코드를 입력하세요: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>E-mail로 받은 SteamGuard 인증 코드를 입력하세요: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Steam 로그인 아이디를 입력하세요: </value>
<comment>Please note that this translation should end with space</comment>
@@ -635,10 +632,6 @@ StackTrace:
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>대화형 콘솔이 활성화되었습니다. 명령어 모드로 들어가려면 ' c '를 입력하십시오.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>환경설정 속성값 {0} 이 누락되어 대화형 콘솔을 사용할 수 없습니다.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>{0} 개의 게임이 이 봇의 배경 큐에 남아있습니다.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -192,10 +192,7 @@ StackTrace:
<value>Prašome įvesti 2FA kodą iš jūsų Steam autentifikavimo programėlės: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Prašome įvesti „Steam Guard“ autentifikavimo kodą, kuris buvo išsiųstas į jūsų el. paštą: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Prašome įvesti savo Steam prisijungimo vardą: </value>
<comment>Please note that this translation should end with space</comment>
@@ -555,10 +552,6 @@ Proceso veikimo laikas: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktyvi konsolė aktyvuota, norėdami pateikti į komandų rėžimą paspauskite „c“.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktyvi konsolė yra negalima dėl trūkstamų konfigūracinių parametrų: {0}</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Boto foninėje eilėje yra likę {0} žaidimai.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -192,10 +192,7 @@ StackTrace:
<value>Lūdzu, ievadi savu 2FA kodu no Steam autentifikatora aplikācijas: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Lūdzu, ievadi SteamGuard autentifikācijas kodu, kas tika aizsūtīts uz Jūsu e-pastu: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Lūdzu, ievadiet savu Steam lietotājvārdu: </value>
<comment>Please note that this translation should end with space</comment>
@@ -563,10 +560,6 @@ Darbspējas laiks: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktīvā konsole ir pieejama, raksti 'c', lai piekļūtu komandu rindai.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktīvā konsole nav pieejama, jo konfigurācijā trūkst {0} vērtība.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Botam palikušas {0} rindā stāvošas spēles.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -193,10 +193,7 @@ StackTrace:
<value>Voer de 2FA code in van je Steam authenticator app: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Voer de SteamGuard authenticator-code in die naar je e-mail is verzonden: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Voer je Steam gebruikersnaam in: </value>
<comment>Please note that this translation should end with space</comment>
@@ -574,10 +571,6 @@ Proces uptime: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>De interactieve console is nu actief, typ 'c' om naar de opdrachtprompt te gaan.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>De interactieve console is niet beschikbaar vanwege de ontbrekende configuratie-eigenschap {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot heeft {0} spellen resterend in de achtergrondwachtrij.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -616,10 +609,22 @@ Proces uptime: {1}</value>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>Uw IPC wachtwoord is zwak. Vanwege beveiliging redenen zal het veiliger zijn om een sterker wachtwoord te kiezen. Details: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Je Steam wachtwoord voor '{0}' lijkt zwak te zijn. Overweeg om een sterker wachtwoord te kiezen voor betere veiligheid. Details: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Uw IPC wachtwoord is zwak. Vanwege beveiliging redenen zal het veiliger zijn om een sterker wachtwoord te kiezen. Details: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Uw encryptiesleutel is te kort. We raden u aan om er één te gebruiken die minstens {0} bytes (tekens) lang is.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Wprowadź kod SteamGuard, który został wysłany na Twój adres e-mail: </value>
<value>Podaj kod uwierzytelniania SteamGuard, który został wysłany na Twój adres e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ Czas procesu: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktywna konsola jest teraz aktywna, wciśnij 'c', aby przejść do trybu poleceń.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktywna konsola nie jest dostępna ze względu na brakującą konfigurację {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot ma {0} gier oczekujących w tle.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ Czas procesu: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Twoje hasło Steam dla '{0}' wydaje się słabe. Rozważ wybór silniejszego dla zwiększenia bezpieczeństwa. Szczegóły: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Twój klucz szyfrowania wydaje się słaby. Rozważ wybór silniejszego dla zwiększenia bezpieczeństwa. Szczegóły: {0}</value>

View File

@@ -105,7 +105,7 @@ StackTrace:
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Nenhum bot foi definido. Você esqueceu de configurar seu Archi Steam Farm? Siga o guia de "configuração" no wiki se você estiver com dúvidas.</value>
<value>Nenhum bot definido. Você esqueceu de configurar o ASF? Confira o guia "Primeiros passos" na wiki caso esteja com dúvidas.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} é nulo!</value>
@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Insira o código de autenticação do Steam Guard enviado por e-mail: </value>
<value>Insira o código do Steam Guard recebido por e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -355,7 +355,7 @@ StackTrace:
<value>A coleta automática já está pausada!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>A coleta automática já está pausada!</value>
<value>A coleta automática já está retomada!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>Conectado ao Steam!</value>
@@ -637,10 +637,6 @@ Tempo de execução: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>O console interativo está ativo, digite 'c' para enviar comandos.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>O console interativo não está disponível devido à falta da propriedade de configuração {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Há {0} jogos restantes na lista de ativação em segundo plano desse bot.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -696,48 +692,48 @@ Tempo de execução: {1}</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>Sua senha IPC parece muito fraca. Considere escolher uma senha mais forte para melhorar sua segurança. Detalhe: {0}</value>
<value>A senha do servidor IPC é muito fraca. Escolha uma senha mais forte para aumentar a segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Sua senha Steam para '{0}' parece ser fraca. Considere escolher uma mais forte para aumentar a segurança. Detalhes: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<value>A senha da conta Steam "{0}" é muito fraca. Escolha uma senha mais forte para aumentar a segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Sua chave de criptografia parece ser fraca. Considere escolher uma mais forte para melhorar sua segurança. Detalhe: {0}</value>
<value>A chave de criptografia é muito fraca. Escolha uma senha mais forte para aumentar a segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>Sua chave de criptografia é muito curta. É recomendado utilizar uma com no mínimo {0} caracteres.</value>
<value>A chave de criptografia é muito curta. Recomendamos usar uma chave que tenha pelo menos {0} bytes (caracteres) de comprimento.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Você está utilizando {0} configuração de {1}, mas você não forneceu uma senha de criptografia personalizada. Você deve fornecer uma senha de criptografia para melhorar sua segurança.</value>
<value>Você está usando a configuração {0} da propriedade {1} sem uma --cryptkey personalizada. Forneça uma --cryptkey personalizada para aumentar a segurança.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Você está utilizando {0} configuração de {1}, mas você não forneceu uma senha de criptografia personalizada. Isto anula totalmente a proteção, porque o Archi Steam Farm é forçado a utilizar sua própria senha (pública). Você deverá fornecer uma senha de criptografia personalizada para utilizar os benefícios de segurança fornecidos por esta configuração.</value>
<value>Você está usando a configuração {0} da propriedade {1} sem uma --cryptkey personalizada. O ASF será forçado a usar a chave padrão, que é menos segura e inutiliza a proteção configurada. Forneça uma --cryptkey personalizada para se beneficiar da segurança adicional.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Você está utilizando o Archi Steam Farm como administrador (Root). Isto não é necessário, e poderá trazer riscos a sua máquina. É recomendado rodar em modo usuário se possível.</value>
<value>Você está tentando executar o ASF como administrador (root). Isto causa um risco de segurança significativo à sua máquina e já que o ASF não requer acesso root para o seu funcionamento, recomendamos executá-lo como usuário não-administrador, se possível.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Você está executando o Archi Steam Farm em um ambiente não suportado, utilizando o argumento --ignore-unported-environment. Por favor, note que não oferecemos qualquer tipo de apoio a este cenário, e você está fazendo isso inteiramente por sua conta e risco! Você foi avisado.</value>
<value>Você está executando o ASF em um ambiente não suportado, utilizando o argumento --ignore-unported-environment. Por favor, note que não oferecemos qualquer tipo de apoio a este cenário, e você está fazendo isso inteiramente por sua conta e risco! Você foi avisado.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>Obtendo checksum do servidor remoto...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>Comparando a checksum do binário baixado junto ao servidor remoto...</value>
<value>Comparando a checksum do binário baixado com a do servidor remoto...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>O servidor remoto não reconhece a versão para a qual estamos atualizando. Esta situação pode ser possível se a versão foi publicada recentemente, recusando-se a prosseguir imediatamente com o processo de atualização, como uma medida de segurança adicional.</value>
<value>O servidor remoto não sabe nada sobre a versão para a qual estamos atualizando. Esta situação é possível se a atualização foi publicada recentemente - recusando-se a prosseguir com o processo de atualização imediatamente como uma medida de segurança adicional.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>O servidor remoto retornou com uma chave de verificação diferente. Isto pode indicar que o download corrompeu, ou um ataque MITM, não será possível prosseguir com a atualização!</value>
<value>O servidor remoto respondeu com um checksum diferente, isto pode indicar download corrompido ou um ataque MITM, recusando-se a prosseguir com o procedimento de atualização!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>Extraindo arquivos do Archi Steam Farm...</value>
<value>Atualizando arquivos do ASF...</value>
</data>
</root>

View File

@@ -75,27 +75,46 @@
{0}</value>
<comment>{0} will be replaced by content string. Please note that this string should include newline for formatting.</comment>
</data>
<data name="ErrorConfigPropertyInvalid" xml:space="preserve">
<value>A propriedade configurada {0} é invalida: {1}</value>
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
</data>
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
<value>ASF V{0} encontrou uma exceção fatal antes de o módulo de registo ter sido inicializado!</value>
<comment>{0} will be replaced by version number</comment>
</data>
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
<value>Exceção: {0}() {1}
StackTrace:
{2}</value>
<comment>{0} will be replaced by function name, {1} will be replaced by exception message, {2} will be replaced by entire stack trace. Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ErrorExitingWithNonZeroErrorCode" xml:space="preserve">
<value>A fechar com um código de erro não zero!</value>
</data>
<data name="ErrorFailingRequest" xml:space="preserve">
<value>Falha na solicitação: {0}</value>
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>A configuração global não pôde ser carregada. Certifica-te de que {0} existe e é valido! Segue o guia "configuração" na wiki caso estejas confuso.</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
<value>{0} é inválido!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Nenhum bot está definido. Esqueceste-te de configurar o teu ASF? Segue o guia "configuração" na wiki se estiveres confuso.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} é nulo!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorParsingObject" xml:space="preserve">
<value>Falha ao analisar {0}!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
<value>O pedido falhou após {0} tentativas!</value>
<comment>{0} will be replaced by maximum number of tries</comment>
@@ -103,9 +122,15 @@ StackTrace:
<data name="ErrorUpdateCheckFailed" xml:space="preserve">
<value>Não foi possível verificar a versão mais recente!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>Não foi possível continuar a atualização, pois não existe nenhum recurso relacionado com a versão em execução! A atualização automática para essa versão não foi possível.</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>Não foi possível prosseguir com uma atualização, pois essa versão não inclui nenhum recurso!</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>Solicitação para entrada do utilizador foi recebida, mas o processo está a ser executado em modo 'headless'!</value>
</data>
<data name="Exiting" xml:space="preserve">
<value>A sair...</value>
</data>
@@ -119,7 +144,7 @@ StackTrace:
<value>O arquivo de configuração global foi removido!</value>
</data>
<data name="IgnoringTrade" xml:space="preserve">
<value>A rejeitar a troca: {0}</value>
<value>A ignorar a troca: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="LoggingIn" xml:space="preserve">
@@ -129,8 +154,13 @@ StackTrace:
<data name="NoBotsAreRunning" xml:space="preserve">
<value>Não existe bots em execução, a sair...</value>
</data>
<data name="RefreshingOurSession" xml:space="preserve">
<value>A atualizar a sessão!</value>
</data>
<data name="RejectingTrade" xml:space="preserve">
<value>A rejeitar troca: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="Restarting" xml:space="preserve">
<value>A reiniciar...</value>
</data>
@@ -140,62 +170,149 @@ StackTrace:
<data name="Success" xml:space="preserve">
<value>Sucesso!</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>A verificar por novas versões...</value>
<data name="UnlockingParentalAccount" xml:space="preserve">
<value>Desbloqueando conta parental...</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>A procurar por novas versões...</value>
</data>
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
<value>A transferir a nova versão: {0} ({1} MB)... Enquanto esperas, considera doar se aprecias o trabalho feito! :)</value>
<comment>{0} will be replaced by version string, {1} will be replaced by update size (in megabytes)</comment>
</data>
<data name="UpdateFinished" xml:space="preserve">
<value>Processo de atualização terminado!</value>
</data>
<data name="UpdateNewVersionAvailable" xml:space="preserve">
<value>Uma nova versão do ASF está disponível! Considera atualizá-la manualmente!</value>
</data>
<data name="UpdateVersionInfo" xml:space="preserve">
<value>Versão local: {0} | Versão remota: {1}</value>
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
</data>
<data name="UserInputSteam2FA" xml:space="preserve">
<value>Por favor, insere to teu código de autenticação de dois fatores (2FA) da tua app de autenticador da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Por favor insere o código de autenticação do SteamGuard que foi enviado para o teu e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Por favor insere o teu login da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
<value>Por favor insere o código parental da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
<value>Por favor insere a tua senha da Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
<value>Um valor desconhecido para {0} foi recebido, por favor reporta isto: {1}</value>
<comment>{0} will be replaced by object's name, {1} will be replaced by value for that object</comment>
</data>
<data name="IPCReady" xml:space="preserve">
<value>Servidor IPC pronto!</value>
</data>
<data name="IPCStarting" xml:space="preserve">
<value>A inicializar o servidor IPC...</value>
</data>
<data name="BotAlreadyStopped" xml:space="preserve">
<value>Este bot já parou!</value>
</data>
<data name="BotNotFound" xml:space="preserve">
<value>Não foi possível encontrar qualquer bot chamado {0}!</value>
<value>Não foi possível encontrar nenhum bot chamado {0}!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Há {0}/{1} bots em execução, com um total de {2} jogos ({3} cards) restantes para coletar.</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>O bot está a farmar o jogo: {0} ({1}, {2} cartas restantes) de um total de {3} jogos ({4} cartas) restantes para farmar (~{5} restantes).</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>O bot está a farmar jogos: {0} de um total de {1} jogos ({2} cartas) restantes para coletar (~{3} restantes).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>A verificar a primeira página de medalhas...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>A verificar as outras páginas de medalhas...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Algoritmo de 'farming' escolhido: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Feito!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Temos um total de {0} jogos ({1} cartas) restantes para coletar (~{2} restantes)...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>O 'farming' terminou!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>'Farming' terminado: {0} ({1}) após {2} de tempo de jogo!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Acabou de 'farmar' jogos: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Estado do 'farming' para {0} ({1}): {2} cartas restantes</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>O 'farming' parou!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>A ignorar este pedido, pois a pausa permanente está ligada!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>Não temos nada para 'farmar' nesta conta!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Agora a 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Agora a 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Jogar está atualmente indisponível, tentaremos mais tarde!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Ainda a 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Ainda a 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Parou de 'farmar': {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>Parou de 'farmar': {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Comando desconhecido!</value>
</data>
<data name="WarningCouldNotCheckBadges" xml:space="preserve">
<value>Não foi possível de obter a informação das medalhas, tentaremos novamente mais tarde!</value>
</data>
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
<value>Não foi possível verificar o estado das cartas para o jogo: {0} ({1}), tentaremos mais tarde!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
@@ -204,7 +321,9 @@ StackTrace:
<value>A aceitar presente: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>Esta conta está limitada, o processo de 'farming' está indisponível até que a restrição seja removida!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID: {0} | Estado: {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string</comment>
@@ -219,28 +338,43 @@ StackTrace:
<data name="BotAuthenticatorConverting" xml:space="preserve">
<value>A converter ficheiro .maFile em formato ASF...</value>
</data>
<data name="BotAuthenticatorImportFinished" xml:space="preserve">
<value>Autenticação móvel importada com sucesso!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>Token 2FA: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
<value>O 'farm' automático foi pausado!</value>
</data>
<data name="BotAutomaticIdlingNowResumed" xml:space="preserve">
<value>O 'farm' automático foi continuado!</value>
</data>
<data name="BotAutomaticIdlingPausedAlready" xml:space="preserve">
<value>O 'farm' automático já está pausado!</value>
</data>
<data name="BotAutomaticIdlingResumedAlready" xml:space="preserve">
<value>O 'farm' automático já foi continuado!</value>
</data>
<data name="BotConnected" xml:space="preserve">
<value>Conectado ao Steam!</value>
</data>
<data name="BotDisconnected" xml:space="preserve">
<value>Desconectado do Steam!</value>
</data>
<data name="BotDisconnecting" xml:space="preserve">
<value>Desconectando...</value>
</data>
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
<value>Não é possível iniciar este bot porque está desativado no ficheiro de configuração!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>O código de erro TwoFactorCodeMismatch foi recebido {0} vezes de seguida. Ou as tuas credenciais de 2FA perderam a validade ou o teu relógio está dessincronizado, a abortar!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
<value>Desconectado da Steam: {0}</value>
<value>Desconectado do Steam: {0}</value>
<comment>{0} will be replaced by logging off reason (string)</comment>
</data>
<data name="BotLoggedOn" xml:space="preserve">
@@ -251,33 +385,38 @@ StackTrace:
<value>A iniciar sessão...</value>
</data>
<data name="BotLogonSessionReplaced" xml:space="preserve">
<value>Esta conta parece estar sendo usada em outra instância do ASF, o que é um comportamento indefinido, recusando-se a mantê-la em execução!</value>
<value>Esta conta parece estar a ser usada noutra instância do ASF, que é um comportamento não definido, a recusar mantê-lo em execução!</value>
</data>
<data name="BotLootingFailed" xml:space="preserve">
<value>A proposta de troca falhou!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>A troca não pôde ser enviada porque não há nenhum usuário com permissão master definida!</value>
<value>A troca não pôde ser enviada porque não há nenhum usuário com permissão mestra definida!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>Proposta enviada com sucesso!</value>
</data>
<data name="BotSendingTradeToYourself" xml:space="preserve">
<value>Não podes enviar uma troca para ti mesmo!</value>
</data>
<data name="BotNoASFAuthenticator" xml:space="preserve">
<value>Esse bot não tem a autenticação de dois fatores ligada! Esqueceu-se de importar seu autenticador como autenticação de dois fatores?</value>
<value>Este bot não tem a autenticação de dois fatores ligada! Esqueceste-te de importar o teu autenticador como ASF 2FA?</value>
</data>
<data name="BotNotConnected" xml:space="preserve">
<value>A instância deste bot não está conectado!</value>
</data>
<data name="BotNotOwnedYet" xml:space="preserve">
<value>Ainda não possui: {0}</value>
<value>Ainda não possuído: {0}</value>
<comment>{0} will be replaced by query (string)</comment>
</data>
<data name="BotOwnedAlreadyWithName" xml:space="preserve">
<value>Já possui: {0} | {1}</value>
<value>Já possuído: {0} | {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotPointsBalance" xml:space="preserve">
<value>Saldo dos pontos: {0}</value>
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>Taxa de limite excedida, tentaremos novamente daqui a {0}...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
@@ -293,17 +432,23 @@ StackTrace:
<value>Chave: {0} | Estado: {1} | Itens: {2}</value>
<comment>{0} will be replaced by cd-key (string), {1} will be replaced by status string, {2} will be replaced by list of key-value pairs, separated by a comma</comment>
</data>
<data name="BotRemovedExpiredLoginKey" xml:space="preserve">
<value>Chave de login expirada removida!</value>
</data>
<data name="BotStatusNotIdling" xml:space="preserve">
<value>O bot não está a 'farmar' nada.</value>
</data>
<data name="BotStatusLimited" xml:space="preserve">
<value>O bot está limitado e não pode coletar quaisquer cartas via 'farming'.</value>
</data>
<data name="BotStatusConnecting" xml:space="preserve">
<value>O bot está a conectar-se à rede da Steam.</value>
</data>
<data name="BotStatusNotRunning" xml:space="preserve">
<value>O bot não está ligado.</value>
<value>O bot não está em execução.</value>
</data>
<data name="BotStatusPaused" xml:space="preserve">
<value>O Bot está parado ou está a ser executado no modo manual.</value>
<value>O bot está pausado ou está a ser executado no modo manual.</value>
</data>
<data name="BotStatusPlayingNotAvailable" xml:space="preserve">
<value>O bot está a ser usado.</value>
@@ -327,8 +472,12 @@ StackTrace:
<data name="BotConnectionLost" xml:space="preserve">
<value>A conexão com a rede da Steam foi perdida. Reconectando...</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>A conta já não está ocupada: o processo de 'farming' foi continuado!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>A conta está a ser usada neste momento: o ASF irá continuar o 'farming' mal esteja livre...</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>A ligar...</value>
</data>
@@ -362,8 +511,14 @@ StackTrace:
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>O seu CurrentCulture fornecido é inválido, o ASF continuará executando com o valor padrão!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>O ASF tentará usar o teu idioma preferido {0}, mas a traudção para essa língua está apenas {1} completa. Talvez queiras ajudar-nos a melhorar a tradução do ASF para a tua língua?</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
<value>'Farming' {0} ({1}) está temporariamente desativado, pois o ASF não é capaz de jogar esse jogo neste momento.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningIdlingGameMismatch" xml:space="preserve">
<value>O ASF detectou uma incompatibilidade de ID para {0} ({1}) e usará o ID do {2} como alternativa.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by game's ID (number)</comment>
@@ -372,22 +527,38 @@ StackTrace:
<value>{0} V{1}</value>
<comment>{0} will be replaced by program's name (e.g. "ASF"), {1} will be replaced by program's version (e.g. "1.0.0.0"). This string typically has nothing to translate and you should leave it as it is, unless you need to change the format, e.g. in RTL languages.</comment>
</data>
<data name="BotAccountLocked" xml:space="preserve">
<value>Esta conta está bloqueada, o processo de 'farming' está permanentemente indisponível!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>O bot está bloqueado e não pode coletar nenhuma carta via 'farming'.</value>
</data>
<data name="ErrorFunctionOnlyInHeadlessMode" xml:space="preserve">
<value>Esta função só está disponível no modo headless!</value>
</data>
<data name="BotOwnedAlready" xml:space="preserve">
<value>Já possuído: {0}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="ErrorAccessDenied" xml:space="preserve">
<value>Acesso negado!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>Estás a usar uma versão que é mais recente que a versão mais recente lançada no teu canal de atualizações. Por favor nota que versões de pré-lançamento são destinadas para utilizadores que sabem como relatar bugs, lidar com problemas e dar feedback - nenhum suporte técnico será dado.</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>Uso de memória atual: {0} MB.
Tempo de execução: {1}</value>
<comment>{0} will be replaced by number (in megabytes) of memory being used, {1} will be replaced by translated TimeSpan string (such as "25 minutes"). Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ClearingDiscoveryQueue" xml:space="preserve">
<value>A limpar a fila de descoberta da Steam #{0}...</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="DoneClearingDiscoveryQueue" xml:space="preserve">
<value>Limpeza da lista de descoberta da Steam #{0} completada.</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="BotOwnsOverviewPerGame" xml:space="preserve">
<value>{0}/{1} bots já possuem o jogo {2}.</value>
<comment>{0} will be replaced by number of bots that already own particular game being checked, {1} will be replaced by total number of bots that were checked during the process, {2} will be replaced by game's ID (number)</comment>
@@ -395,12 +566,18 @@ StackTrace:
<data name="BotRefreshingPackagesData" xml:space="preserve">
<value>Atualizando dados de pacotes...</value>
</data>
<data name="WarningDeprecated" xml:space="preserve">
<value>A utilização de {0} é obsoleto e será removido nas versões futuras do programa. Por favor usa {1}.</value>
<comment>{0} will be replaced by the name of deprecated property (such as argument, config property or likewise), {1} will be replaced by the name of valid replacement (such as another argument or config property)</comment>
</data>
<data name="BotAcceptedDonationTrade" xml:space="preserve">
<value>Doação aceite: {0}</value>
<comment>{0} will be replaced by trade's ID (number)</comment>
</data>
<data name="WarningWorkaroundTriggered" xml:space="preserve">
<value>Uma solução para o erro {0} foi ativada.</value>
<comment>{0} will be replaced by the bug's name provided by ASF</comment>
</data>
<data name="TargetBotNotConnected" xml:space="preserve">
<value>A instância do bot alvo não está conectada!</value>
</data>
@@ -409,14 +586,20 @@ StackTrace:
<comment>{0} will be replaced by wallet balance value, {1} will be replaced by currency name</comment>
</data>
<data name="BotHasNoWallet" xml:space="preserve">
<value>Bot não tem carteira.</value>
<value>O bot não tem carteira.</value>
</data>
<data name="BotLevel" xml:space="preserve">
<value>O bot está a nível {0}.</value>
<comment>{0} will be replaced by bot's level</comment>
</data>
<data name="ActivelyMatchingItems" xml:space="preserve">
<value>Correspondendo itens da Steam, ronda #{0}...</value>
<comment>{0} will be replaced by round number</comment>
</data>
<data name="DoneActivelyMatchingItems" xml:space="preserve">
<value>Itens da Steam correspondidos, ronda #{0}.</value>
<comment>{0} will be replaced by round number</comment>
</data>
<data name="ErrorAborted" xml:space="preserve">
<value>Cancelado!</value>
</data>
@@ -424,7 +607,10 @@ StackTrace:
<value>Corresponde a um total de {0} conjuntos nesta rodada.</value>
<comment>{0} will be replaced by number of sets traded</comment>
</data>
<data name="WarningExcessiveBotsCount" xml:space="preserve">
<value>Estás a executar mais contas de bots pessoais que o nosso limite máximo recomendado ({0}). Está ciente que esta configuração não é suportada e pode causar problemas variados relacionados com o Steam, incluindo suspensão da conta. Confere o FAQ para mais detalhes.</value>
<comment>{0} will be replaced by our maximum recommended bots count (number)</comment>
</data>
<data name="PluginLoaded" xml:space="preserve">
<value>{0} foi carregado com sucesso!</value>
<comment>{0} will be replaced by the name of the custom ASF plugin</comment>
@@ -436,7 +622,9 @@ StackTrace:
<data name="NothingFound" xml:space="preserve">
<value>Nada encontrado!</value>
</data>
<data name="PluginsWarning" xml:space="preserve">
<value>Abriste um ou múltiplos plugins personalizados no ASF. Já que não podemos oferecer apoio para configurações modificadas, por favor contacta os programadores apropriados dos plugins que decidiste usar caso haja problemas.</value>
</data>
<data name="PleaseWait" xml:space="preserve">
<value>Por favor, aguarde...</value>
</data>
@@ -444,38 +632,108 @@ StackTrace:
<value>Inserir comando: </value>
</data>
<data name="Executing" xml:space="preserve">
<value>Executando...</value>
<value>A executar...</value>
</data>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>A consola interativa está agora ativa, digite 'c' para entrar no modo de comando.</value>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>O bot tem {0} jogos restantes na fila de segundo plano.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
</data>
<data name="ErrorSingleInstanceRequired" xml:space="preserve">
<value>O ASF já está em execução nesta diretoria de trabalho, a abortar!</value>
</data>
<data name="BotHandledConfirmations" xml:space="preserve">
<value>{0} confirmações tratadas com sucesso!</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>À espera até {0} para garantir que estamos livres para começarmos a 'farmar'...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>A limpar ficheiros antigos após a atualização...</value>
</data>
<data name="BotGeneratingSteamParentalCode" xml:space="preserve">
<value>A gerar o código parental da Steam, isto pode demorar um bocado, considera colocá-lo no 'config'...</value>
</data>
<data name="IPCConfigChanged" xml:space="preserve">
<value>A configuração IPC foi alterada!</value>
</data>
<data name="BotTradeOfferResult" xml:space="preserve">
<value>A proposta de troca {0} foi determinada a ser {1} devido a {2}.</value>
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>O código de erro InvalidPassword foi recebido {0} vezes seguidas. A tua senha para esta conta está provavelmente errada, a abortar!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
<value>Resultado: {0}</value>
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>Estás a tentar executar a {0} variante do ASF num ambiente não suportado: {1}. Fornece o argumento --ignore-unsupported-environment se tens a certeza do que estás a fazer.</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>Argumento da linha de comando desconhecido: {0}</value>
<comment>{0} will be replaced by unrecognized command that has been provided</comment>
</data>
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
<value>O diretório da configuração não foi encontrado, a abortar!</value>
</data>
<data name="BotIdlingSelectedGames" xml:space="preserve">
<value>A jogar o selecionado {0}: {1}</value>
<comment>{0} will be replaced by internal name of the config property (e.g. "GamesPlayedWhileIdle"), {1} will be replaced by comma-separated list of appIDs that user has chosen</comment>
</data>
<data name="AutomaticFileMigration" xml:space="preserve">
<value>{0} ficheiro de configuração vai ser migrado para a sintaxe mais recente...</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>A tua senha IPC parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>A tua senha do Steam para '{0}' parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>A tua chave de encriptação parece ser fraca. Considera escolher uma mais forte para uma melhor segurança. Detalhes: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>A tua chave de encriptação é demasiado curta. Recomendamos uma que seja pelo menos {0} bytes (carateres) de comprimento.</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>Estás a usar a definição {0} da propriedade {1}, mas não forneceste uma --cryptkey personalizada. Deves fornecer uma --cryptkey personalizada para uma melhor segurança.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>Estás a usar a definição {0} da propriedade {1}, mas não forneceste uma --cryptkey personalizada. Isto futiliza a proteção, pois o ASF é forçado a usar a sua chave (que é conhecida). Deves fornecer uma --cryptkey personalizada para usufruires da segurança oferecida por esta definição.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>Estás a tentar executar o ASF como administrador (root). Isto causa um risco de segurança significativo para o teu computador e como o ASF não requer acesso root para o seu funcionamento, recomendamos executá-lo como um utilizador não-administador se for possível.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>Estás a executar o ASF num ambiente não suportado, fornecendo o argumento --ignore-unsupported-environment. Toma atenção que não oferecemos qualquer apoio para este cenário e estás a fazê-lo inteiramente por tua conta. Foste avisado.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>A obter checksum do servidor remoto...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>A verificar checksum do binário transferido contra o do servidor remoto...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>O servidor remoto não sabe nada sobre a versão para a qual estamos a atualizar. Esta situção é possível se a versão foi publicada recentemente - a recusar prosseguir com a atualização imediatamente como uma medida de segurança adicional.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>O servidor remoto respondeu com uma 'checksum' diferente, isto pode indicar um download corrompido ou um ataque MITM, recusando prosseguir com a atualização!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>A atualizar os ficheiros do ASF...</value>
</data>
</root>

View File

@@ -195,7 +195,7 @@ STACKTRACE:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>PLZ ENTR STEAMGUARD AUTH CODE DAT WUZ SENT ON UR E-MAIL: </value>
<value>PLZ ENTR STEAMGUARD AUTH CODE DAT WUZ SENT 2 UR E-MAIL: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ PROCES UPTIME: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>INTERACTIV CONSOLE IZ NAO ACTIV, TYPE C IN ORDR 2 ENTR COMMAND MODE.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>INTERACTIV CONSOLE IZ NOT AVAILABLE DUE 2 MISIN {0} CONFIG PROPERTY.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>BOT HAS {0} GAMEZ REMAININ IN ITZ BAKGROUND KEW.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ PROCES UPTIME: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>UR STEAM PASWORD 4 '{0}' SEEMS 2 BE WEAK. CONSIDR CHOOSIN STRONGR WAN 4 INCREASD SECURITY. DETAILS: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>UR ENCRYPSHUN KEY SEEMS 2 BE WEAK. CONSIDR CHOOSIN STRONGR WAN 4 INCREASD SECURITY. DETAILS: {0}</value>
@@ -719,13 +715,25 @@ PROCES UPTIME: {1}</value>
<value>URE USIN {0} SETTIN OV {1} PROPERTY, BUT U DIDNT PROVIDE CUSTOM --cryptkey. DIS ENTIRELY DEFEATS TEH PROTECSHUN, AS ASF IZ FORCD 2 USE ITZ OWN (KNOWN) KEY. U SHUD PROVIDE CUSTOM --cryptkey 4 MAKIN USE OV TEH SECURITY BENEFIT OFFERD BY DIS SETTIN.</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>URE ATTEMPTIN 2 RUN ASF AS TEH ADMINISTRATOR (ROOT). DIS CAUSEZ SIGNIFICANT SECURITY RISK 2 UR MACHINE, AN AS ASF DOEZ NOT REQUIRE ROOT ACCES 4 ITZ OPERASHUN, WE RECOMMEND 2 RUN IT AS NON-ADMINISTRATOR USR IF POSIBLE.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>URE RUNNIN ASF IN UNSUPPORTD ENVIRONMENT, SUPPLYIN --ignore-unsupported-environment ARGUMENT. PLZ NOWT DAT WE DO NOT OFFR ANY KIND OV SUPPORT 4 DIS SCENARIO AN URE DOIN IT ENTIRELY AT UR OWN RISK. UVE BEEN WARND.</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>FETCHIN CHECKSUM FRUM TEH REMOTE SERVR...</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>VERIFYIN CHECKSUM OV TEH DOWNLOADD BINARY AGAINST TEH WAN FRUM TEH REMOTE SERVR...</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>REMOTE SERVR DOESNT KNOE ANYTHIN BOUT TEH RELEASE WERE UPDATIN 2. DIS SITUASHUN IZ POSIBLE IF TEH RELEASE WUZ PUBLISHD RESENTLY - REFUSIN 2 PROCED WIF TEH UPDATE PROCEDURE RITE AWAY AS AN ADDISHUNAL SECURITY MEASURE.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>REMOTE SERVR HAS REPLID WIF DIFFERENT CHECKSUM, DIS MITE INDICATE CORRUPTD DOWNLOAD OR MITM ATTACK, REFUSIN 2 PROCED WIF TEH UPDATE PROCEDURE!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>PATCHIN ASF FILEZ...</value>
</data>
</root>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Please enter SteamGuard auth code that was sent on your e-mail: </value>
<value>Please enter SteamGuard auth code that was sent to your e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ Process uptime: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interactive console is now active, type 'c' in order to enter command mode.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interactive console is not available due to missing {0} config property.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot has {0} games remaining in its background queue.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ Process uptime: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Your Steam password for '{0}' seems to be weak. Consider choosing a stronger one for increased security. Details: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Your encryption key seems to be weak. Consider choosing a stronger one for increased security. Details: {0}</value>

View File

@@ -194,10 +194,7 @@ StackTrace:
<value>Te rog să introduci codul 2FA de pe autentificatorul Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Te rog să introduci codul de autentificare SteamGuard, care a fost trimis pe adresa de e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Te rugăm să introduci datele de autentificare Steam: </value>
<comment>Please note that this translation should end with space</comment>
@@ -637,10 +634,6 @@ Proces: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Consola interactivă este acum activă, tastați 'c' pentru a introduce modul de comandă.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Consola interactivă nu este disponibilă deoarece lipsesc {0} din configurare.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Botul are {0} jocuri rămase la rând în fundal.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -195,7 +195,7 @@
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Пожалуйста, введите код авторизации SteamGuard, отправленный вам на e-mail: </value>
<value>Пожалуйста, введите код авторизации SteamGuard, который был отправлен на ваш e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Включена интерактивная консоль, нажмите 'c' чтобы перейти в режим команд.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Интерактивная консоль недоступна из-за отсутствия параметра конфигурации {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>У бота в фоновой очереди осталось {0} игр.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Ваш пароль Steam для '{0}' кажется ненадежным. Подумайте о том, чтобы использовать более надежный пароль для повышения безопасности. Подробности: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Ваш ключ шифрования кажется слабым. Подумайте о том, чтобы использовать более надежный вариант для повышения безопасности. Подробности: {0}</value>

View File

@@ -194,10 +194,7 @@ StackTrace:
<value>Zadaj autentifikačný 2FA kód z aplikácie Steam: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Zadaj SteamGuard kód, ktorý ti bol poslaný na e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Zadaj Steam login: </value>
<comment>Please note that this translation should end with space</comment>
@@ -638,10 +635,6 @@ Doba prevádzky procesu: {1}</value>
<value>Interaktivní konzole je nyní aktivní, napište "c" pro vstup do příkazového režimu.
Interaktívna konzola je teraz aktívna, napíšte "c" pre vstup do príkazového režimu.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktívna konzola nie je dostupná z dôvodu chýbajúcej {0} konfigurácie.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot má {0} zostávajúcich hier vo fronte.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -193,7 +193,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Molimo Vas unesite vaš SteamGuard autentikacioni kod koji poslat na vaš e-mail: </value>
<value>Molimo Vas unesite vaš SteamGuard autentikacioni kod koji vam je poslat na vaš e-mail: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -610,10 +610,6 @@ Vrijeme rada procesa: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Interaktivna konsola je dostupna, pritisnice "c" da bi ste je koristili.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Interaktivna konsola nije dostupna zbog nedostatka {0} u konfiguraciji.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot ima {0} igricu/e preostale u pozadinskom redu.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -193,10 +193,7 @@ StackTrace:
<value>Vänligen ange din 2FA kod från din Steam authenticator-app: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Vänligen ange SteamGuard auth koden som skickades till din e-post: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>Vänligen ange din Steam-inloggning: </value>
<comment>Please note that this translation should end with space</comment>
@@ -503,7 +500,6 @@ StackTrace:
</root>

View File

@@ -165,10 +165,7 @@ StackTrace:
<value>โปรดป้อนรหัส 2FA ของคุณจากแอปยืนยันตัวตน Steam ของคุณ: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>โปรดป้อนรหัสยืนยัน SteamGuard ที่ถูกส่งไปยังอีเมลของคุณ: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>โปรดป้อนชื่อล็อกอิน Steam ของคุณ: </value>
<comment>Please note that this translation should end with space</comment>
@@ -456,7 +453,6 @@ StackTrace:
<data name="Result" xml:space="preserve">
<value>ผลลัพธ์: {0}</value>
<comment>{0} will be replaced by generic result of various functions that use this string</comment>

View File

@@ -63,11 +63,11 @@
</value>
</resheader>
<data name="AcceptingTrade" xml:space="preserve">
<value>Onaylanan takas: {0}</value>
<value>Takas onaylanıyor: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="AutoUpdateCheckInfo" xml:space="preserve">
<value>ASF, her {0} zaman aralığında yeni sürümleri kontrol edecektir.</value>
<value>ASF, her {0} sonra yeni sürümleri kontrol edecektir.</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "24 hours")</comment>
</data>
<data name="Content" xml:space="preserve">
@@ -80,12 +80,12 @@
<comment>{0} will be replaced by name of the configuration property, {1} will be replaced by invalid value</comment>
</data>
<data name="ErrorEarlyFatalExceptionInfo" xml:space="preserve">
<value>ASF v{0}, çekirdek kayıt günlüğü modülü başlatılmadan önce kritik bir hata ile karşılaştı!</value>
<value>ASF v{0}, çekirdek kayıt günlüğü modülü bile başlatılamadan önce kritik bir hata ile karşılaştı!</value>
<comment>{0} will be replaced by version number</comment>
</data>
<data name="ErrorEarlyFatalExceptionPrint" xml:space="preserve">
<value>İstisna: {0}() {1}
Yığın izleme:
Yığın Kaydı:
{2}</value>
<comment>{0} will be replaced by function name, {1} will be replaced by exception message, {2} will be replaced by entire stack trace. Please note that this string should include newlines for formatting.</comment>
</data>
@@ -97,7 +97,7 @@ Yığın izleme:
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>Genel yapılandırma yüklenemedi, lütfen {0} öğesinin var ve geçerli olduğundan emin olun! Eğer kafanız karıştıysa; wikideki kurulum kılavuzuna göz atın.</value>
<value>Genel yapılandırma yüklenemedi, lütfen {0} öğesinin var ve geçerli olduğundan emin olun! Eğer kafanız karıştıysa; wikideki 'setting up / kurulum' rehberine göz atın.</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
@@ -105,14 +105,14 @@ Yığın izleme:
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Tanımlı bot yok. ASF'ni yapılandırmayı mı unuttun? Ne olduğunu anlayamadıysan, viki'de 'setting up' rehberine bak.</value>
<value>Tanımlanmış bot yok. ASF'yi yapılandırmayı unuttunuz mu? Kafanız karıştıysa wiki'deki 'setting up / kurulum' rehberine bakın.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} boş!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorParsingObject" xml:space="preserve">
<value>{0} nesnesi işlenirken bir hata oluştu!</value>
<value>{0} ayrıştırılamadı!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorRequestFailedTooManyTimes" xml:space="preserve">
@@ -123,10 +123,10 @@ Yığın izleme:
<value>En son sürüm kontrol edilemedi!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>Şu anda çalışan sürüme ait hiçbir dosya olmadığı için güncelleme işlemine devam edemedi! Bu sürüme otomatik güncelleme yapmak mümkün değil.</value>
<value>Şu anda çalışan sürüme ait hiçbir dosya olmadığı için güncelleme işlemine devam edilemedi! Bu sürüme otomatik güncelleme yapmak mümkün değil.</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>Sürüm herhangi bir öğe içermediğinden güncelleme ile devam edemedi!</value>
<value>Sürüm herhangi bir öğe içermediğinden güncelleme devam edemedi!</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>Kullanıcı girdisi için bir istek alındı; ancak işlem headless modda çalışıyor!</value>
@@ -144,7 +144,7 @@ Yığın izleme:
<value>Genel yapılandırma dosyası kaldırıldı!</value>
</data>
<data name="IgnoringTrade" xml:space="preserve">
<value>Yoksayılan takas: {0}</value>
<value>Takas yoksayılıyor: {0}</value>
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="LoggingIn" xml:space="preserve">
@@ -171,13 +171,13 @@ Yığın izleme:
<value>Başarılı!</value>
</data>
<data name="UnlockingParentalAccount" xml:space="preserve">
<value>Ebeveyn hesabının kilidi açıliyor...</value>
<value>Aile görünümünün kilidi açılıyor...</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>Yeni sürüm kontrol ediliyor...</value>
</data>
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
<value>Yeni sürüm indiriliyor: {0} ({1} MB)... Beklerken, yaptığımız çalışmayı takdir ediyorsanız bağış yapmayı düşünün! :)</value>
<value>Yeni sürüm indiriliyor: {0} ({1} MB)... Beklerken, yaptığımız çalışmayı takdir ediyorsanız bağış yapabilirsiniz! :)</value>
<comment>{0} will be replaced by version string, {1} will be replaced by update size (in megabytes)</comment>
</data>
<data name="UpdateFinished" xml:space="preserve">
@@ -203,7 +203,7 @@ Yığın izleme:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
<value>Lütfen Steam aile kodunu girin: </value>
<value>Lütfen Steam aile kilidini girin: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
@@ -281,11 +281,11 @@ Yığın izleme:
<value>Bu hesapta çalıştırılacak hiçbir şey bulamadık!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Şimdi çalıştırılan: {0} ({1})</value>
<value>Şu an çalıştırılan: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Şimdi çalıştırılan: {0}</value>
<value>Şu an çalıştırılan: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
@@ -314,11 +314,11 @@ Yığın izleme:
<value>Rozet bilgisi alınamadı, daha sonra tekrar deneyeceğiz!</value>
</data>
<data name="WarningCouldNotCheckCardsStatus" xml:space="preserve">
<value>{0} ({1}) için kartların durumunu kontrol edemedik, daha sonra tekrar deneyelim!</value>
<value>{0} ({1}) için kartların durumunu kontrol edemedik, daha sonra tekrar deneyeceğiz!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotAcceptingGift" xml:space="preserve">
<value>Kabul edilen hediye: {0}...</value>
<value>Hediye kabul ediliyor: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
@@ -342,7 +342,7 @@ Yığın izleme:
<value>Mobil kimlik doğrulayıcısının aktarılması başarıyla tamamlandı!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>2FD Kodu: {0}</value>
<value>2AD Kodu: {0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
@@ -370,7 +370,7 @@ Yığın izleme:
<value>Bu bot örneği, yapılandırma dosyasında devre dışı bırakıldığından başlatılmıyor!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>Üst üste TwoFactorCodeMismatch hata kodu {0} alındı. 2FA kimlik bilgileriniz artık geçerli değil veya saatiniz eşitlenmemiş, iptal ediliyor!</value>
<value>Üst üste {0} kez 2AD Kodu Uyuşmazlığı hata kodu alındı (TwoFactorCodeMismatch). Ya 2AD kodlarınız artık geçerli değil ya da cihazınızın saati yanlış, iptal ediliyor!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
@@ -385,13 +385,13 @@ Yığın izleme:
<value>Giriş yapılıyor...</value>
</data>
<data name="BotLogonSessionReplaced" xml:space="preserve">
<value>Bu hesap, çalışmaya devam etmeyi reddeden, tanımlanmamış bir davranış olan başka bir ASF örneğinde kullanılmak üzere görünüyor!</value>
<value>Bu hesap başka bir ASF işleminde kullanılıyor gibi gözüküyor ve ASF bu durumda ne yapacağını bilmiyor, o yüzden başlatılamıyor!</value>
</data>
<data name="BotLootingFailed" xml:space="preserve">
<value>Takas teklifi başarısız oldu!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>Takas gönderilemedi çünkü master izniyle tanımlanmış hiçbir kullanıcı yok!</value>
<value>Ana Steam hesabınız tanımlanmadığı için takas teklifi gönderilemedi!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>Takas teklifi başarıyla gönderildi!</value>
@@ -406,11 +406,11 @@ Yığın izleme:
<value>Bu bot bağlı değil!</value>
</data>
<data name="BotNotOwnedYet" xml:space="preserve">
<value>Henüz sahip olunmayan: {0}</value>
<value>Henüz buna sahip değil: {0}</value>
<comment>{0} will be replaced by query (string)</comment>
</data>
<data name="BotOwnedAlreadyWithName" xml:space="preserve">
<value>Zaten sahip olunan: {0} | {1}</value>
<value>Zaten buna sahip: {0} | {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotPointsBalance" xml:space="preserve">
@@ -418,7 +418,7 @@ Yığın izleme:
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>Hız sınırııldı, {0} bekledikten sonra yeniden deneyeceğiz...</value>
<value>İstek sınırııldı, {0} bekledikten sonra yeniden deneyeceğiz...</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
</data>
<data name="BotReconnecting" xml:space="preserve">
@@ -482,7 +482,7 @@ Yığın izleme:
<value>Bağlanılıyor...</value>
</data>
<data name="BotHeartBeatFailed" xml:space="preserve">
<value>İstemcinin bağlantısını kesmek başarısız oldu. Bu bot örneği terk ediliyor!</value>
<value>İstemcinin bağlantısı kesilemedi. Bu bot örneği terk ediliyor!</value>
</data>
<data name="BotSteamDirectoryInitializationFailed" xml:space="preserve">
<value>SteamDirectory başlatılamadı, Steam Ağı ile bağlantı kurmak her zamankinden daha uzun sürebilir!</value>
@@ -520,7 +520,7 @@ Yığın izleme:
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="WarningIdlingGameMismatch" xml:space="preserve">
<value>ASF {0} ({1}) için bir uyumsuzluk tespit etti ve bunun yerine ID {2} kullanılacak.</value>
<value>ASF {0} ({1}) için bir uyumsuzluk tespit etti ve bunun yerine {2} ID'si kullanılacak.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by game's ID (number)</comment>
</data>
<data name="BotVersion" xml:space="preserve">
@@ -537,14 +537,14 @@ Yığın izleme:
<value>Bu işlev yalnızca headless modda kullanılabilir!</value>
</data>
<data name="BotOwnedAlready" xml:space="preserve">
<value>Zaten sahip olunan: {0}</value>
<value>Zaten buna sahip: {0}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="ErrorAccessDenied" xml:space="preserve">
<value>Erişim reddedildi!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>Güncelleme kanalınız için yayınlanmış en son sürümden daha yeni bir sürüm kullanıyorsunuz. Lütfen ön yayın sürümlerinin, hata raporlamayı, sorunlarla başa çıkmayı ve geribildirim yapmayı bilen kişiler için olduğunu unutmayın. Teknik destek verilmeyecektir.</value>
<value>Güncelleme kanalınız için yayınlanmış en son sürümden daha yeni bir sürüm kullanıyorsunuz. Lütfen ön yayın sürümlerinin, hata raporlamayı, sorunlarla başa çıkmayı ve geribildirim yapmayı bilen kişiler için olduğunu unutmayın - teknik destek verilmeyecektir.</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>Geçerli bellek kullanımı: {0} MB.
@@ -556,7 +556,7 @@ Süreç çalışma zamanı: {1}</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="DoneClearingDiscoveryQueue" xml:space="preserve">
<value>Steam keşif kuyruğu #{0} temizlenmesi bitti.</value>
<value>Steam keşif kuyruğu #{0} temizlendi.</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="BotOwnsOverviewPerGame" xml:space="preserve">
@@ -571,7 +571,7 @@ Süreç çalışma zamanı: {1}</value>
<comment>{0} will be replaced by the name of deprecated property (such as argument, config property or likewise), {1} will be replaced by the name of valid replacement (such as another argument or config property)</comment>
</data>
<data name="BotAcceptedDonationTrade" xml:space="preserve">
<value>Kabul edilen takas bağışı: {0}</value>
<value>Kaılıksız takas kabul edildi: {0}</value>
<comment>{0} will be replaced by trade's ID (number)</comment>
</data>
<data name="WarningWorkaroundTriggered" xml:space="preserve">
@@ -637,10 +637,6 @@ Süreç çalışma zamanı: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Etkileşimli konsol şimdi etkin, komut girme moduna girmek için 'c' tuşuna basın.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Etkileşimli konsol eksik {0} yapılandırma özelliği nedeniyle kullanılamıyor.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot kuyruğunda {0} oyun kaldı.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -649,7 +645,7 @@ Süreç çalışma zamanı: {1}</value>
<value>ASF süreci, zaten bu dizinde çalıştığından iptal ediliyor!</value>
</data>
<data name="BotHandledConfirmations" xml:space="preserve">
<value>{0} onaylama başarıyla ele alındı!</value>
<value>{0} onaylama başarıyla sonuçlandırıldı!</value>
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
@@ -670,7 +666,7 @@ Süreç çalışma zamanı: {1}</value>
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>Arka arkaya {0} kere InvalidPassword hata kodu alındı. Bu hesap için parolanız muhtemelen yanlış, iptal ediliyor!</value>
<value>Arka arkaya {0} kere Yanlış Şifre hata kodu alındı (InvalidPassword). Bu hesap için parolanız muhtemelen yanlış, iptal ediliyor!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
@@ -681,7 +677,7 @@ Süreç çalışma zamanı: {1}</value>
<value>Desteklenmeyen ortamda {0} ASF varyantını çalıştırmaya çalışıyorsun: {1}. Ne yaptığınızı gerçekten biliyorsan, --ignore-unsupported-environment argümanını sağla.</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>Bilinmeyen komut satırı bağımsız değişkeni: {0}</value>
<value>Bilinmeyen komut satırı argümanı: {0}</value>
<comment>{0} will be replaced by unrecognized command that has been provided</comment>
</data>
<data name="ErrorConfigDirectoryNotFound" xml:space="preserve">
@@ -701,7 +697,7 @@ Süreç çalışma zamanı: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>'{0}' için Steam parolanız zayıf görünüyor. Daha fazla güvenlik için daha güçlü bir tane seçmeyi düşünün. Ayrıntılar: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Şifreleme anahtarınız zayıf görünüyor. Daha fazla güvenlik için daha güçlü bir tane seçmeyi düşünün. Ayrıntılar: {0}</value>
@@ -720,7 +716,7 @@ Süreç çalışma zamanı: {1}</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>ASF'yi yönetici (root) olarak çalıştırmaya çalışıyorsunuz. Bu, makineniz için önemli bir güvenlik riskine neden olur ve ASF'nin çalışması için kök erişimi gerektirmez. Mümkünse yönetici olmadan çalıştırmanızı öneriyoruz.</value>
<value>ASF'yi yönetici (root) olarak çalıştırmaya çalışıyorsunuz. Bu, makineniz için önemli bir güvenlik riskine neden olur ve ASF'nin çalışması için yönetici izni gerekmediği için mümkünse yönetici olmadan çalıştırmanızı öneriyoruz.</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>ASF'yi desteklenmeyen ortamda çalıştırıyorsunuz ve --ignore-unsupported-environment argümanı sağlıyorsunuz. Lütfen bu senaryo için herhangi bir destek sağlamadığımızı ve bunu tamamen kendi sorumluluğunuzda yaptığınızı unutmayın. Uyarıldınız.</value>
@@ -735,9 +731,9 @@ Süreç çalışma zamanı: {1}</value>
<value>Uzak sunucu, güncelleme yaptığımız sürüm hakkında hiçbir şey bilmiyor. Bu durum, sürüm yakın zamanda yayınlandıysa mümkündür - ek bir güvenlik önlemi olarak güncelleme prosedürüne hemen devam etmeyi reddeder.</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>Uzak sunucu farklı bir sağlama toplamı ile yanıt verdi, bu, güncelleme prosedürüne devam etmeyi reddeden bozuk indirme veya MITM saldırısını gösterebilir!</value>
<value>Uzak sunucu farklı bir sağlama sayısı ile yanıt verdi, bu güncelleme dosyalarının bozuk indiğine veya MITM saldırısına işaret olabilir, güncelleme durduruluyor!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>ASF dosyaları yamanıyor...</value>
<value>ASF dosyaları yamalanıyor...</value>
</data>
</root>

View File

@@ -104,7 +104,9 @@
<value>{0} невірний!</value>
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>Не налаштовано жодного боту. Можливо ви забули налаштувати ASF? Скористуйтеся розділом 'налаштування' у нашій wiki, якщо не знаєте, що робити.</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} має значення null!</value>
<comment>{0} will be replaced by object's name</comment>
@@ -225,38 +227,86 @@
<value>Не вдалося знайти бота з ім'ям {0}!</value>
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>Запущено {0}/{1} ботів, усього залишилось {2} ігор ({3} карток) які потрібно фармити.</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
<value>Бот фармить гру: {0} ({1}, {2} карток залишилося обробити). Всього залишилося {3} ігор ({4} карток), (приблизно {5}) які треба фармити.</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm, {3} will be replaced by total number of games to farm, {4} will be replaced by total number of cards to farm, {5} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="BotStatusIdlingList" xml:space="preserve">
<value>Бот фармить ігри: {0} з {1} ігор ({2} картки) які треба фармити (залишилось приблизно {3}).</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>Перевірка першої сторінки зі значками...</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>Перевірка інших сторінок зі значками...</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>Обраний алгоритм фарму: {0}</value>
<comment>{0} will be replaced by the name of chosen farming algorithm</comment>
</data>
<data name="Done" xml:space="preserve">
<value>Виконано!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>Всього залишилось {0} ігор ({1} карток), які потрібно фармити (приблизно {2})...</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
<value>Фарм закінчено!</value>
</data>
<data name="IdlingFinishedForGame" xml:space="preserve">
<value>Закінчено фарм: {0} ({1}) після {2} ігрового часу!</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinishedForGames" xml:space="preserve">
<value>Закінчено фарм ігор: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="IdlingStatusForGame" xml:space="preserve">
<value>Статус фарма для {0} ({1}): залишилося {2} карт</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name, {2} will be replaced by number of cards left to farm</comment>
</data>
<data name="IdlingStopped" xml:space="preserve">
<value>Фарм зупинено!</value>
</data>
<data name="IgnoredPermanentPauseEnabled" xml:space="preserve">
<value>Ігнорування запиту, тому що ввімкнена постійна пауза!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>На цьому акаунті нема чого фармити!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>Зараз фармиться: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>Зараз фармиться: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>Зараз запустити ігру неможливо, спробуємо пізніше!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>Все ще фармиться: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>Все ще фармиться: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>Зупинено фарм: {0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>Зупинено фарм: {0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
<value>Невідома команда!</value>
</data>
@@ -271,7 +321,9 @@
<value>Прийняття подарунку: {0}...</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>Цей акаунт обмежений, фарм буде недоступним доки ви не позбудетесь обмежень!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID: {0} | Стан: {1}</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by status string</comment>
@@ -559,10 +611,6 @@
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Інтерактивну консоль активовано, натисніть 'c' щоб перейти до режиму команд.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Інтерактивну консоль не активовано через відсутність параметру конфігурації {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Бот має {0} ігор у фоновій черзі.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -195,7 +195,7 @@ StackTrace:
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>Xin vui lòng nhập mã SteamGuard đã được gửi vào email của bạn: </value>
<value>Vui lòng nhập mã SteamGuard đã được gửi tới email của bạn: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
@@ -637,10 +637,6 @@ Thời gian hoạt động: {1}</value>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>Bảng điều khiển tương tác hiện đang hoạt động, ấn 'c' để vào chế độ lệnh.</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>Bảng điều khiển tương tác không khả dụng do thiếu thuộc tính cấu hình {0}.</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot có {0} trò chơi còn lại trong hàng chờ.</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@ Thời gian hoạt động: {1}</value>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>Mật khẩu Steam cho '{0}' của bạn có vẻ yếu. Hãy cân nhắc việc chọn mật khẩu mạnh hơn để tăng tính bảo mật. Chi tiết: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>Khóa mã hóa của bạn có vẻ yếu. Hãy cân nhắc việc chọn một cái mạnh hơn để tăng tính bảo mật. Chi tiết: {0}</value>

View File

@@ -637,10 +637,6 @@
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>交互式控制台已启用,输入 c 以进入命令模式。</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>由于缺少 {0} 配置属性,交互式控制台目前不可用。</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>机器人的后台队列中剩余 {0} 个游戏。</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -701,7 +697,7 @@
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>您 '{0}' 的 Steam 密码似乎很弱。请考虑选择更强的密码来增强安全性,详情 {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>您的加密密钥似乎很弱。请考虑选择更强的密钥来增强安全性,详情 {0}</value>

View File

@@ -192,10 +192,7 @@
<value>請輸入您的 Steam 身份驗證器應用程式上顯示的雙重驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>請輸入寄送至您的電子信箱的 Steam Guard 驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>請輸入您的 Steam 帳戶: </value>
<comment>Please note that this translation should end with space</comment>
@@ -546,10 +543,6 @@
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>互動式主控台現在處於活動狀態鍵入「c」以進入命令模式。</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>由於缺少 {0} 配置屬性,交互式主控台不可用。</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>機械人的後台佇列中還有 {0} 個遊戲。</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>

View File

@@ -96,7 +96,7 @@
<comment>{0} will be replaced by URL of the request</comment>
</data>
<data name="ErrorGlobalConfigNotLoaded" xml:space="preserve">
<value>無法載入全域設定檔,請確保 {0} 存在且有效!如果您覺得困惑,請參閱 Wiki 中的「安裝指南」。</value>
<value>無法載入全域設定檔,請確保 {0} 存在且有效!如果仍有問題,請參閱 Wiki 中的「安裝指南」。</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorIsInvalid" xml:space="preserve">
@@ -104,7 +104,7 @@
<comment>{0} will be replaced by object's name</comment>
</data>
<data name="ErrorNoBotsDefined" xml:space="preserve">
<value>沒有設定任何機器人,您是否忘記設定 ASF 了?如果您不明白發生了什麼,請閱讀 Wiki 上的「安裝指南」。</value>
<value>沒有設定任何 Bot。您是否忘記設定 ASF 了?如果您不明白發生了什麼,請閱讀 Wiki 上的「設定指南」。</value>
</data>
<data name="ErrorObjectIsNull" xml:space="preserve">
<value>{0} 為空值!</value>
@@ -122,16 +122,16 @@
<value>無法檢查最新版本!</value>
</data>
<data name="ErrorUpdateNoAssetForThisVersion" xml:space="preserve">
<value>無法進行更新,因為沒有與目前執行中的版本相關的資!無法自動更新到該版本。</value>
<value>無法進行更新,因為沒有與目前執行中的版本相關的資源檔案!無法自動更新到該版本。</value>
</data>
<data name="ErrorUpdateNoAssets" xml:space="preserve">
<value>無法進行更新,因為此版本沒有提供任何資</value>
<value>無法進行更新,因為此版本沒有提供任何資源檔案</value>
</data>
<data name="ErrorUserInputRunningInHeadlessMode" xml:space="preserve">
<value>收到一個使用者輸入請求,但程目前正以無介面模式執行!</value>
<value>收到一個使用者輸入請求,但程目前正以無介面模式執行!</value>
</data>
<data name="Exiting" xml:space="preserve">
<value>正在退出...</value>
<value>正在退出</value>
</data>
<data name="WarningFailed" xml:space="preserve">
<value>失敗!</value>
@@ -147,11 +147,11 @@
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="LoggingIn" xml:space="preserve">
<value>正在登到 {0}...</value>
<value>正在登到 {0}</value>
<comment>{0} will be replaced by service's name</comment>
</data>
<data name="NoBotsAreRunning" xml:space="preserve">
<value>沒有執行中的 Bot正在退出…</value>
<value>沒有執行中的 Bot正在退出…</value>
</data>
<data name="RefreshingOurSession" xml:space="preserve">
<value>更新工作階段 </value>
@@ -161,22 +161,22 @@
<comment>{0} will be replaced by trade number</comment>
</data>
<data name="Restarting" xml:space="preserve">
<value>正在重新啟動...</value>
<value>正在重新啟動</value>
</data>
<data name="Starting" xml:space="preserve">
<value>正在啟動...</value>
<value>正在啟動</value>
</data>
<data name="Success" xml:space="preserve">
<value>成功!</value>
</data>
<data name="UnlockingParentalAccount" xml:space="preserve">
<value>正在解鎖家庭監護帳戶...</value>
<value>正在解鎖家庭監護帳號…</value>
</data>
<data name="UpdateCheckingNewVersion" xml:space="preserve">
<value>正在檢查新版本...</value>
<value>正在檢查新版本</value>
</data>
<data name="UpdateDownloadingNewVersion" xml:space="preserve">
<value>正在下載新版本:{0}({1} MB)…等待期間,如果喜歡這個軟體,請考慮捐助 ASF:)</value>
<value>正在下載新版本:{0} ({1} MB)…等待期間,如果喜歡這個軟體,請考慮捐助 ASF:)</value>
<comment>{0} will be replaced by version string, {1} will be replaced by update size (in megabytes)</comment>
</data>
<data name="UpdateFinished" xml:space="preserve">
@@ -190,15 +190,15 @@
<comment>{0} will be replaced by current version, {1} will be replaced by remote version</comment>
</data>
<data name="UserInputSteam2FA" xml:space="preserve">
<value>請輸入的 Steam Guard 行動驗證器上的兩步驟驗證代碼: </value>
<value>請輸入的 Steam Guard 行動驗證器上的雙重驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamGuard" xml:space="preserve">
<value>請輸入寄送至的電子信箱的 Steam Guard 驗證代碼: </value>
<value>請輸入寄送至的電子信箱的 Steam Guard 驗證代碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamLogin" xml:space="preserve">
<value>請輸入的 Steam 帳戶:</value>
<value>請輸入的 Steam 帳號: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamParentalCode" xml:space="preserve">
@@ -206,7 +206,7 @@
<comment>Please note that this translation should end with space</comment>
</data>
<data name="UserInputSteamPassword" xml:space="preserve">
<value>請輸入的 Steam 密碼:</value>
<value>請輸入的 Steam 密碼: </value>
<comment>Please note that this translation should end with space</comment>
</data>
<data name="WarningUnknownValuePleaseReport" xml:space="preserve">
@@ -217,7 +217,7 @@
<value>IPC 伺服器已就緒!</value>
</data>
<data name="IPCStarting" xml:space="preserve">
<value>IPC 伺服器啟動中……</value>
<value>正在啟動 IPC 伺服器…</value>
</data>
<data name="BotAlreadyStopped" xml:space="preserve">
<value>這個 Bot 已經停止了!</value>
@@ -227,7 +227,7 @@
<comment>{0} will be replaced by bot's name query (string)</comment>
</data>
<data name="BotStatusOverview" xml:space="preserve">
<value>有 {0}/{1} 個 Bot 正在行,總共有 {2} 個遊戲 ({3} 張卡片) 等待掛卡。</value>
<value>有 {0}/{1} 個 Bot 正在行,總共有 {2} 個遊戲 ({3} 張卡片) 等待掛卡。</value>
<comment>{0} will be replaced by number of active bots, {1} will be replaced by total number of bots, {2} will be replaced by total number of games left to farm, {3} will be replaced by total number of cards left to farm</comment>
</data>
<data name="BotStatusIdling" xml:space="preserve">
@@ -239,10 +239,10 @@
<comment>{0} will be replaced by list of the games (IDs, numbers), {1} will be replaced by total number of games to farm, {2} will be replaced by total number of cards to farm, {3} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="CheckingFirstBadgePage" xml:space="preserve">
<value>正在檢查徽章頁面第一頁...</value>
<value>正在檢查徽章頁面第一頁</value>
</data>
<data name="CheckingOtherBadgePages" xml:space="preserve">
<value>正在檢查其他徽章頁面...</value>
<value>正在檢查其他徽章頁面</value>
</data>
<data name="ChosenFarmingAlgorithm" xml:space="preserve">
<value>選擇的掛卡演算法為:{0}</value>
@@ -252,7 +252,7 @@
<value>完成!</value>
</data>
<data name="GamesToIdle" xml:space="preserve">
<value>總共有 {0} 個遊戲 (總數 {1} 張卡片) 需要掛卡 (仍需約 {2})...</value>
<value>總共有 {0} 個遊戲 ({1} 張卡片) 需要掛卡 (仍需約 {2})</value>
<comment>{0} will be replaced by number of games, {1} will be replaced by number of cards, {2} will be replaced by translated TimeSpan string (such as "1 day, 5 hours and 30 minutes")</comment>
</data>
<data name="IdlingFinished" xml:space="preserve">
@@ -277,33 +277,33 @@
<value>正在忽略此請求,因為強制暫停已啟用!</value>
</data>
<data name="NothingToIdle" xml:space="preserve">
<value>本帳目前沒有需要掛卡的遊戲!</value>
<value>本帳目前沒有需要掛卡的遊戲!</value>
</data>
<data name="NowIdling" xml:space="preserve">
<value>正在掛卡: {0} ({1})</value>
<value>正在掛卡{0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="NowIdlingList" xml:space="preserve">
<value>正在掛卡: {0}</value>
<value>正在掛卡{0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="PlayingNotAvailable" xml:space="preserve">
<value>目前無法執行,我們將稍後再試!</value>
</data>
<data name="StillIdling" xml:space="preserve">
<value>仍在掛卡: {0} ({1})</value>
<value>仍在掛卡{0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StillIdlingList" xml:space="preserve">
<value>仍在掛卡: {0}</value>
<value>仍在掛卡{0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="StoppedIdling" xml:space="preserve">
<value>停止掛卡: {0} ({1})</value>
<value>停止掛卡{0} ({1})</value>
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="StoppedIdlingList" xml:space="preserve">
<value>停止掛卡: {0}</value>
<value>停止掛卡{0}</value>
<comment>{0} will be replaced by list of the games (IDs, numbers), separated by a comma</comment>
</data>
<data name="UnknownCommand" xml:space="preserve">
@@ -317,11 +317,11 @@
<comment>{0} will be replaced by game's ID (number), {1} will be replaced by game's name</comment>
</data>
<data name="BotAcceptingGift" xml:space="preserve">
<value>接受禮物:{0}…</value>
<value>接受禮物:{0}…</value>
<comment>{0} will be replaced by giftID (number)</comment>
</data>
<data name="BotAccountLimited" xml:space="preserve">
<value>本帳為受限帳,在限制解除前將無法掛卡!</value>
<value>本帳為受限帳,在限制解除前將無法掛卡!</value>
</data>
<data name="BotAddLicense" xml:space="preserve">
<value>ID{0} | 狀態:{1}</value>
@@ -335,13 +335,13 @@
<value>Bot 已在執行中!</value>
</data>
<data name="BotAuthenticatorConverting" xml:space="preserve">
<value>正在將 .maFile 轉換成 ASF 的檔案格式…</value>
<value>正在將 .maFile 轉換成 ASF 的檔案格式…</value>
</data>
<data name="BotAuthenticatorImportFinished" xml:space="preserve">
<value>已成功匯入行動驗證器!</value>
</data>
<data name="BotAuthenticatorToken" xml:space="preserve">
<value>兩步驟驗證權杖:{0}</value>
<value>雙重驗證權杖:{0}</value>
<comment>{0} will be replaced by generated 2FA token (string)</comment>
</data>
<data name="BotAutomaticIdlingNowPaused" xml:space="preserve">
@@ -363,13 +363,13 @@
<value>已與 Steam 中斷連線!</value>
</data>
<data name="BotDisconnecting" xml:space="preserve">
<value>正在中斷連線...</value>
<value>正在中斷連線</value>
</data>
<data name="BotInstanceNotStartingBecauseDisabled" xml:space="preserve">
<value>這個 Bot 將不會啟動,因為它在設定檔中被停用!</value>
</data>
<data name="BotInvalidAuthenticatorDuringLogin" xml:space="preserve">
<value>已連續收到 {0} 次 TwoFactorCodeMismatch 錯誤訊息。你的兩步驟驗證憑證可能已失效,或者時間不同步,正在中止!</value>
<value>已連續收到 {0} 次 TwoFactorCodeMismatch 錯誤訊息。您的雙重驗證憑證可能已失效,或者時間不同步,正在中止!</value>
<comment>{0} will be replaced by maximum allowed number of failed 2FA attempts</comment>
</data>
<data name="BotLoggedOff" xml:space="preserve">
@@ -381,25 +381,25 @@
<comment>{0} will be replaced by steam ID (number)</comment>
</data>
<data name="BotLoggingIn" xml:space="preserve">
<value>登入中...</value>
<value>正在登入…</value>
</data>
<data name="BotLogonSessionReplaced" xml:space="preserve">
<value>這個帳似乎正被另一個 ASF 使用中,這是未定義的行為,拒絕讓它繼續執行!</value>
<value>這個帳似乎正被另一個 ASF 使用中,這是未定義的行為,拒絕讓它繼續執行!</value>
</data>
<data name="BotLootingFailed" xml:space="preserve">
<value>交易提案已失敗!</value>
</data>
<data name="BotLootingMasterNotDefined" xml:space="preserve">
<value>無法發送交易提案,因為沒有帳設有 master 權限!</value>
<value>無法發送交易提案,因為沒有帳設有 master 權限!</value>
</data>
<data name="BotLootingSuccess" xml:space="preserve">
<value>交易提案發送成功!</value>
</data>
<data name="BotSendingTradeToYourself" xml:space="preserve">
<value>無法對自己發出交易請求!</value>
<value>無法對自己發出交易請求!</value>
</data>
<data name="BotNoASFAuthenticator" xml:space="preserve">
<value>這個 Bot 並未啟用 ASF 兩步驟驗證!您是否忘記將兩步驟驗證導入至 ASF</value>
<value>這個 Bot 並未啟用 ASF 雙重驗證!您是否忘記將雙重驗證導入至 ASF</value>
</data>
<data name="BotNotConnected" xml:space="preserve">
<value>此 Bot 尚未連線!</value>
@@ -417,11 +417,11 @@
<comment>{0} will be replaced by the points balance value (integer)</comment>
</data>
<data name="BotRateLimitExceeded" xml:space="preserve">
<value>超過頻率限制,我們將在 {0} 後重試…</value>
<value>超過頻率限制,我們將在 {0} 後重試…</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "25 minutes")</comment>
</data>
<data name="BotReconnecting" xml:space="preserve">
<value>正在重新連線...</value>
<value>正在重新連線</value>
</data>
<data name="BotRedeem" xml:space="preserve">
<value>序號:{0} | 狀態:{1}</value>
@@ -469,16 +469,16 @@
<comment>{0} will be replaced by failure reason (string)</comment>
</data>
<data name="BotConnectionLost" xml:space="preserve">
<value>與 Steam 網路的連線中斷,正在重新連線…</value>
<value>與 Steam 網路的連線中斷,正在重新連線…</value>
</data>
<data name="BotAccountFree" xml:space="preserve">
<value>帳不再被佔用,已恢復掛卡!</value>
<value>帳不再被佔用,已恢復掛卡!</value>
</data>
<data name="BotAccountOccupied" xml:space="preserve">
<value>帳號目前使用中ASF 將在該帳號空閒時繼續掛卡…</value>
<value>帳號目前使用中ASF 將在該帳號空閒時繼續掛卡…</value>
</data>
<data name="BotConnecting" xml:space="preserve">
<value>正在連線...</value>
<value>正在連線</value>
</data>
<data name="BotHeartBeatFailed" xml:space="preserve">
<value>無法與用戶端中斷連線,正在中止此 Bot</value>
@@ -487,31 +487,31 @@
<value>無法初始化 SteamDirectory與 Steam 網路的連線可能需要更長的時間!</value>
</data>
<data name="BotStopping" xml:space="preserve">
<value>正在停止...</value>
<value>正在停止</value>
</data>
<data name="ErrorBotConfigInvalid" xml:space="preserve">
<value>的 Bot 設定無效,請確認 {0} 的內容然後再試一次!</value>
<value>的 Bot 設定無效,請確認 {0} 的內容然後再試一次!</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="ErrorDatabaseInvalid" xml:space="preserve">
<value>無法載入長存資料庫,如果問題仍然存在,請刪除 {0} 以重建資料庫!</value>
<value>無法載入持久性資料庫,如果問題仍然存在,請刪除 {0} 以重建資料庫!</value>
<comment>{0} will be replaced by file's path</comment>
</data>
<data name="Initializing" xml:space="preserve">
<value>正在初始化 {0}...</value>
<value>正在初始化 {0}</value>
<comment>{0} will be replaced by service name that is being initialized</comment>
</data>
<data name="WarningPrivacyPolicy" xml:space="preserve">
<value>如果對 ASF 的實際運作方式有疑慮,請查看 Wiki 中的隱私政策章節!</value>
<value>如果對 ASF 的實際運作方式有疑慮,請查看 Wiki 中的隱私政策章節!</value>
</data>
<data name="Welcome" xml:space="preserve">
<value>看來這是您首次使用本程式,歡迎!</value>
</data>
<data name="ErrorInvalidCurrentCulture" xml:space="preserve">
<value>提供的 CurrentCulture 無效ASF 將以預設值繼續執行!</value>
<value>提供的 CurrentCulture 無效ASF 將以預設值繼續執行!</value>
</data>
<data name="TranslationIncomplete" xml:space="preserve">
<value>ASF 將使用的偏好語系 {0},但該語言的翻譯只完成了 {1}。或許能協助我們完善 ASF 的翻譯。</value>
<value>ASF 將使用的偏好語系 {0},但該語言的翻譯只完成了 {1}。或許能協助我們完善 ASF 的翻譯。</value>
<comment>{0} will be replaced by culture code, such as "en-US", {1} will be replaced by completeness percentage, such as "78.5%"</comment>
</data>
<data name="IdlingGameNotPossible" xml:space="preserve">
@@ -527,7 +527,7 @@
<comment>{0} will be replaced by program's name (e.g. "ASF"), {1} will be replaced by program's version (e.g. "1.0.0.0"). This string typically has nothing to translate and you should leave it as it is, unless you need to change the format, e.g. in RTL languages.</comment>
</data>
<data name="BotAccountLocked" xml:space="preserve">
<value>此帳已被封鎖,永久無法掛卡!</value>
<value>此帳已被封鎖,永久無法掛卡!</value>
</data>
<data name="BotStatusLocked" xml:space="preserve">
<value>Bot 已被封鎖,無法透過掛卡得到卡片。</value>
@@ -543,7 +543,7 @@
<value>存取被拒!</value>
</data>
<data name="WarningPreReleaseVersion" xml:space="preserve">
<value>目前使用的版本高於最新的正式版本。請注意:預覽版本是專門給了解如何回報錯誤、處理問題並提供回饋的使用者使用 (將不會提供任何技術支援)。</value>
<value>目前使用的版本高於最新的正式版本。請注意:預覽版本是專門給了解如何回報錯誤、處理問題並提供回饋的使用者使用 (將不會提供任何技術支援)。</value>
</data>
<data name="BotStats" xml:space="preserve">
<value>目前記憶體使用量:{0} MB。
@@ -551,7 +551,7 @@
<comment>{0} will be replaced by number (in megabytes) of memory being used, {1} will be replaced by translated TimeSpan string (such as "25 minutes"). Please note that this string should include newlines for formatting.</comment>
</data>
<data name="ClearingDiscoveryQueue" xml:space="preserve">
<value>正在瀏覽 Steam 探索佇列 #{0}…</value>
<value>正在瀏覽 Steam 探索佇列 #{0}…</value>
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="DoneClearingDiscoveryQueue" xml:space="preserve">
@@ -559,11 +559,11 @@
<comment>{0} will be replaced by queue number</comment>
</data>
<data name="BotOwnsOverviewPerGame" xml:space="preserve">
<value>{0}/{1} 個 Bot 已擁有遊戲 {2}。</value>
<value>{0}/{1} 個 Bot 已擁有遊戲 {2}。</value>
<comment>{0} will be replaced by number of bots that already own particular game being checked, {1} will be replaced by total number of bots that were checked during the process, {2} will be replaced by game's ID (number)</comment>
</data>
<data name="BotRefreshingPackagesData" xml:space="preserve">
<value>更新套件資料中…</value>
<value>更新套件資料中…</value>
</data>
<data name="WarningDeprecated" xml:space="preserve">
<value>{0} 的用法已棄用,並且將在未來的版本中移除,請改用 {1}。</value>
@@ -592,7 +592,7 @@
<comment>{0} will be replaced by bot's level</comment>
</data>
<data name="ActivelyMatchingItems" xml:space="preserve">
<value>正在比對 Steam 物品,第 #{0} 輪…</value>
<value>正在比對 Steam 物品,第 #{0} 輪…</value>
<comment>{0} will be replaced by round number</comment>
</data>
<data name="DoneActivelyMatchingItems" xml:space="preserve">
@@ -607,7 +607,7 @@
<comment>{0} will be replaced by number of sets traded</comment>
</data>
<data name="WarningExcessiveBotsCount" xml:space="preserve">
<value>執行的個人 Bot 帳數量超過我們的建議上限 ({0})。請留意,此設定不受支援,且可能會導致各種 Steam 相關問題,包括帳停權。請參閱常見問答了解詳情。</value>
<value>執行的個人 Bot 帳數量超過我們的建議上限 ({0})。請留意,此設定不受支援,且可能會導致各種 Steam 相關問題,包括帳停權。請參閱常見問答了解詳情。</value>
<comment>{0} will be replaced by our maximum recommended bots count (number)</comment>
</data>
<data name="PluginLoaded" xml:space="preserve">
@@ -615,7 +615,7 @@
<comment>{0} will be replaced by the name of the custom ASF plugin</comment>
</data>
<data name="PluginLoading" xml:space="preserve">
<value>正在載入 {0} V{1}…</value>
<value>正在載入 {0} V{1}…</value>
<comment>{0} will be replaced by the name of the custom ASF plugin, {1} will be replaced by its version</comment>
</data>
<data name="NothingFound" xml:space="preserve">
@@ -625,21 +625,17 @@
<value>你已載入一個以上的自訂外掛程式。由於我們無法支援修改過的配置,如遭遇任何問題,請向相關外掛程式的開發人員尋求協助。</value>
</data>
<data name="PleaseWait" xml:space="preserve">
<value>請稍候⋯⋯</value>
<value>請稍候</value>
</data>
<data name="EnterCommand" xml:space="preserve">
<value>輸入指令:</value>
<value>輸入指令: </value>
</data>
<data name="Executing" xml:space="preserve">
<value>執行中……</value>
<value>正在執行…</value>
</data>
<data name="InteractiveConsoleEnabled" xml:space="preserve">
<value>已開啟互動式主控台按「C」進入指令模式</value>
</data>
<data name="InteractiveConsoleNotAvailable" xml:space="preserve">
<value>由於缺少 {0} 設定內容,互動式主控台無法使用。</value>
<comment>{0} will be replaced by the name of the missing config property (string)</comment>
</data>
<data name="BotGamesToRedeemInBackgroundCount" xml:space="preserve">
<value>Bot 的背景佇列中剩下 {0} 個遊戲。</value>
<comment>{0} will be replaced by remaining number of games in BGR's queue</comment>
@@ -652,14 +648,14 @@
<comment>{0} will be replaced by number of confirmations</comment>
</data>
<data name="BotExtraIdlingCooldown" xml:space="preserve">
<value>最多等待 {0} 以確保我們可以開始掛卡…</value>
<value>最多等待 {0} 以確保我們可以開始掛卡…</value>
<comment>{0} will be replaced by translated TimeSpan string (such as "1 minute")</comment>
</data>
<data name="UpdateCleanup" xml:space="preserve">
<value>正在清理更新後的過時檔案…</value>
<value>正在清理更新後的過時檔案…</value>
</data>
<data name="BotGeneratingSteamParentalCode" xml:space="preserve">
<value>正在產生 Steam 家庭監護代碼,這會需要一段時間,請考慮將它寫入設定檔中…</value>
<value>正在產生 Steam 家庭監護代碼,這會需要一段時間,請考慮將它寫入設定檔中…</value>
</data>
<data name="IPCConfigChanged" xml:space="preserve">
<value>IPC 設定檔已變更!</value>
@@ -669,7 +665,7 @@
<comment>{0} will be replaced by trade offer ID (number), {1} will be replaced by internal ASF enum name, {2} will be replaced by technical reason why the trade was determined to be in this state</comment>
</data>
<data name="BotInvalidPasswordDuringLogin" xml:space="preserve">
<value>連續收到 InvalidPassword 錯誤代碼 {0} 次。您的帳密碼大概是錯的,中止!</value>
<value>連續收到 InvalidPassword 錯誤代碼 {0} 次。您的帳密碼大概是錯的,中止!</value>
<comment>{0} will be replaced by maximum allowed number of failed login attempts</comment>
</data>
<data name="Result" xml:space="preserve">
@@ -677,7 +673,7 @@
<comment>{0} will be replaced by generic result of various functions that use this string</comment>
</data>
<data name="WarningUnsupportedEnvironment" xml:space="preserve">
<value>正嘗試執行 {0} 不同的 ASF 於不支援的環境中:{1}。如果真的知道在做什麼的話,請加上 --ignore-unsupported-environment 參數。</value>
<value>正嘗試執行 {0} 不同的 ASF 於不支援的環境中:{1}。如果真的知道在做什麼的話,請加上 --ignore-unsupported-environment 參數。</value>
</data>
<data name="WarningUnknownCommandLineArgument" xml:space="preserve">
<value>未知的命令列參數:{0}</value>
@@ -691,40 +687,52 @@
<comment>{0} will be replaced by internal name of the config property (e.g. "GamesPlayedWhileIdle"), {1} will be replaced by comma-separated list of appIDs that user has chosen</comment>
</data>
<data name="AutomaticFileMigration" xml:space="preserve">
<value>{0} 設定檔將會改版成最新的語法…</value>
<value>{0} 設定檔將會改版成最新的語法…</value>
<comment>{0} will be replaced with the relative path to the affected config file</comment>
</data>
<data name="WarningWeakIPCPassword" xml:space="preserve">
<value>你的IPC密碼看起來很弱 你可以考慮換一個安全性更高的密碼 細節:{0}</value>
<value>您的 IPC 密碼看起來很弱。請考慮換一個強度更高的密碼來增加安全性。詳細資訊: {0}</value>
<comment>{0} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakSteamPassword" xml:space="preserve">
<value>你的steam 密碼 {0} 看起來很弱 你可以考慮換一個 細節: {1}</value>
<comment>{0} will be replaced by either the affected bot name or the path to the bots configuration file, {1} will be replaced by additional details about the password being considered weak</comment>
<value>你的 Steam 密碼{0}看起來很弱。請考慮換一個強度更高的密碼來增加安全性。詳細資訊: {1}</value>
<comment>{0} will be replaced by the affected bot name, {1} will be replaced by additional details about the password being considered weak</comment>
</data>
<data name="WarningWeakCryptKey" xml:space="preserve">
<value>的加密鑰看起來很弱 可以考慮換一個 細節:{0}</value>
<value>的加密鑰看起來很弱。請考慮換一個強度更高的金鑰來增加安全性。詳細資訊: {0}</value>
<comment>{0} will be replaced by additional details about the encryption key being considered weak</comment>
</data>
<data name="WarningTooShortCryptKey" xml:space="preserve">
<value>的加密鑰太短 我們推薦使用{0} 以上長度的密鑰</value>
<value>的加密鑰太短我們推薦使用 {0} 位元組 (字元) 以上長度的金鑰。</value>
<comment>{0} will be replaced by the number of bytes (characters) recommended</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForHashing" xml:space="preserve">
<value>正在使用 {0} 設 {1} 屬性 但你沒有提供一個自定義的加密密鑰 你應該提供一個自定義的加密密鑰以提高安全性</value>
<value>正在使用 {0} 設 {1} 屬性。但您沒有提供一個自定義的 --cryptkey。您應該提供自定義 --cryptkey 以提高安全性</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "SCrypt"), {1} will be replaced by the name of the property (e.g. "IPCPassword")</comment>
</data>
<data name="WarningDefaultCryptKeyUsedForEncryption" xml:space="preserve">
<value>正在使用 {0} 設 {1} 屬性 但你沒有提供一個自定義的加密密鑰 這很不安全 你應該提供一個自定義的加密密鑰</value>
<value>正在使用 {0} 設 {1} 屬性。但您沒有提供一個自定義的 --cryptkey。這完全破壞了保護因為 ASF 被迫使用自己的 (已知) 金鑰。您應該提供自定義 --cryptkey 用於使用此設定提供的安全優勢。</value>
<comment>{0} will be replaced by the name of a particular setting (e.g. "AES"), {1} will be replaced by the name of the property (e.g. "SteamPassword")</comment>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>你在不支援的環境下提供了 --ignore-unsupported-environment 參數 請注意 我們不為這種情況提供任何支持 風險請完全由你自行承擔 我們已經警告過你了</value>
<data name="WarningRunningAsRoot" xml:space="preserve">
<value>您正在以管理員權限 (Root) 執行 ASF。這會給您的機器帶來重大的安全風險且由於 ASF 的操作不需要 Root 權限,我們建議盡可能以非管理員使用者身份執行它。</value>
</data>
<data name="WarningRunningInUnsupportedEnvironment" xml:space="preserve">
<value>您在不受支援的環境中執行 ASF並提供 --ignore-unsupported-environment 引數。請注意,我們不對這種情況提供任何形式的支援,您完全需要自行承擔風險。你已經被警告過了。</value>
</data>
<data name="FetchingChecksumFromRemoteServer" xml:space="preserve">
<value>正在從遠端伺服器擷取核對和…</value>
</data>
<data name="VerifyingChecksumWithRemoteServer" xml:space="preserve">
<value>正在驗證已下載的二進制檔案與來自遠端伺服器的核對和…</value>
</data>
<data name="ChecksumMissing" xml:space="preserve">
<value>遠端伺服器對我們要更新到的版本一無所知。如果該版本是最近發布的,則可能出現這種情況──立刻拒絕進行更新程序作為額外的安全措施。</value>
</data>
<data name="ChecksumWrong" xml:space="preserve">
<value>遠端伺服器回覆了不同的核對和,這可能意味著下載檔案損毀或遭受中間人攻擊,拒絕繼續更新程序!</value>
</data>
<data name="PatchingFiles" xml:space="preserve">
<value>正在修補 ASF 檔案…</value>
</data>
</root>

View File

@@ -50,6 +50,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Debug($"{previousMethodName}() {message}");
}
@@ -57,6 +61,10 @@ public sealed class ArchiLogger {
public void LogGenericDebuggingException(Exception exception, [CallerMemberName] string? previousMethodName = null) {
ArgumentNullException.ThrowIfNull(exception);
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
if (!Debugging.IsUserDebugging) {
return;
}
@@ -70,6 +78,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Error($"{previousMethodName}() {message}");
}
@@ -77,6 +89,10 @@ public sealed class ArchiLogger {
public void LogGenericException(Exception exception, [CallerMemberName] string? previousMethodName = null) {
ArgumentNullException.ThrowIfNull(exception);
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Error(exception, $"{previousMethodName}()");
}
@@ -86,6 +102,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Info($"{previousMethodName}() {message}");
}
@@ -95,6 +115,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Trace($"{previousMethodName}() {message}");
}
@@ -104,6 +128,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Warn($"{previousMethodName}() {message}");
}
@@ -111,15 +139,23 @@ public sealed class ArchiLogger {
public void LogGenericWarningException(Exception exception, [CallerMemberName] string? previousMethodName = null) {
ArgumentNullException.ThrowIfNull(exception);
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Warn(exception, $"{previousMethodName}()");
}
[PublicAPI]
public void LogNullError(string nullObjectName, [CallerMemberName] string? previousMethodName = null) {
public void LogNullError(object? nullObject, [CallerArgumentExpression("nullObject")] string? nullObjectName = null, [CallerMemberName] string? previousMethodName = null) {
if (string.IsNullOrEmpty(nullObjectName)) {
throw new ArgumentNullException(nameof(nullObjectName));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
LogGenericError(string.Format(CultureInfo.CurrentCulture, Strings.ErrorObjectIsNull, nullObjectName), previousMethodName);
}
@@ -128,6 +164,10 @@ public sealed class ArchiLogger {
throw new ArgumentNullException(nameof(message));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
if (((chatGroupID == 0) || (chatID == 0)) && (steamID == 0)) {
throw new InvalidOperationException($"(({nameof(chatGroupID)} || {nameof(chatID)}) && {nameof(steamID)})");
}
@@ -160,6 +200,10 @@ public sealed class ArchiLogger {
internal async Task LogFatalException(Exception exception, [CallerMemberName] string? previousMethodName = null) {
ArgumentNullException.ThrowIfNull(exception);
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
Logger.Fatal(exception, $"{previousMethodName}()");
// If LogManager has been initialized already, don't do anything else
@@ -209,7 +253,11 @@ public sealed class ArchiLogger {
internal void LogInvite(SteamID steamID, bool? handled = null, [CallerMemberName] string? previousMethodName = null) {
if ((steamID == null) || (steamID.AccountType == EAccountType.Invalid)) {
throw new ArgumentNullException(nameof(steamID));
throw new ArgumentOutOfRangeException(nameof(steamID));
}
if (string.IsNullOrEmpty(previousMethodName)) {
throw new ArgumentNullException(nameof(previousMethodName));
}
ulong steamID64 = steamID;

View File

@@ -73,7 +73,7 @@ internal static class Logging {
}
internal static async Task<string?> GetUserInput(ASF.EUserInputType userInputType, string botName = SharedInfo.ASF) {
if ((userInputType == ASF.EUserInputType.None) || !Enum.IsDefined(typeof(ASF.EUserInputType), userInputType)) {
if ((userInputType == ASF.EUserInputType.None) || !Enum.IsDefined(userInputType)) {
throw new InvalidEnumArgumentException(nameof(userInputType), (int) userInputType, typeof(ASF.EUserInputType));
}
@@ -179,7 +179,6 @@ internal static class Logging {
ArchiveNumbering = ArchiveNumberingMode.Rolling,
ArchiveOldFileOnStartup = true,
CleanupFileName = false,
ConcurrentWrites = false,
DeleteOldFileOnStartup = true,
FileName = Path.Combine("${currentdir}", SharedInfo.LogFile),
Layout = GeneralLayout,
@@ -187,8 +186,7 @@ internal static class Logging {
};
#pragma warning restore CA2000 // False positive, we're adding this disposable object to the global scope, so we can't dispose it
LogManager.Configuration.AddTarget(fileTarget);
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, fileTarget));
InitializeTarget(LogManager.Configuration, fileTarget);
LogManager.ReconfigExistingLoggers();
}
@@ -211,8 +209,7 @@ internal static class Logging {
ColoredConsoleTarget coloredConsoleTarget = new("ColoredConsole") { Layout = GeneralLayout };
#pragma warning restore CA2000 // False positive, we're adding this disposable object to the global scope, so we can't dispose it
config.AddTarget(coloredConsoleTarget);
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, coloredConsoleTarget));
InitializeTarget(config, coloredConsoleTarget);
LogManager.Configuration = config;
}
@@ -230,8 +227,7 @@ internal static class Logging {
MaxCount = 20
};
LogManager.Configuration.AddTarget(historyTarget);
LogManager.Configuration.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, historyTarget));
InitializeTarget(LogManager.Configuration, historyTarget);
LogManager.ReconfigExistingLoggers();
}
@@ -240,12 +236,6 @@ internal static class Logging {
}
internal static void StartInteractiveConsole() {
if ((ASF.GlobalConfig == null) || (ASF.GlobalConfig.SteamOwnerID == 0)) {
ASF.ArchiLogger.LogGenericWarning(string.Format(CultureInfo.CurrentCulture, Strings.InteractiveConsoleNotAvailable, nameof(ASF.GlobalConfig.SteamOwnerID)));
return;
}
Utilities.InBackground(HandleConsoleInteractively, true);
ASF.ArchiLogger.LogGenericInfo(Strings.InteractiveConsoleEnabled);
}
@@ -321,6 +311,8 @@ internal static class Logging {
while (!Program.ShutdownSequenceInitialized) {
try {
if (IsWaitingForUserInput || !Console.KeyAvailable) {
await Task.Delay(ConsoleResponsivenessDelay).ConfigureAwait(false);
continue;
}
@@ -368,13 +360,11 @@ internal static class Logging {
Console.WriteLine($@"<> {Strings.Executing}");
ulong steamOwnerID = ASF.GlobalConfig?.SteamOwnerID ?? GlobalConfig.DefaultSteamOwnerID;
// ReSharper disable once RedundantSuppressNullableWarningExpression - required for .NET Framework
string? response = await targetBot.Commands.Response(steamOwnerID, command!).ConfigureAwait(false);
string? response = await targetBot.Commands.Response(EAccess.Owner, command!).ConfigureAwait(false);
if (string.IsNullOrEmpty(response)) {
ASF.ArchiLogger.LogNullError(nameof(response));
ASF.ArchiLogger.LogNullError(response);
Console.WriteLine(Strings.ErrorIsEmpty, nameof(response));
continue;
@@ -391,8 +381,6 @@ internal static class Logging {
ASF.ArchiLogger.LogGenericException(e);
return;
} finally {
await Task.Delay(ConsoleResponsivenessDelay).ConfigureAwait(false);
}
}
}
@@ -405,6 +393,22 @@ internal static class Logging {
}
}
private static void InitializeTarget(LoggingConfiguration config, Target target) {
ArgumentNullException.ThrowIfNull(config);
ArgumentNullException.ThrowIfNull(target);
config.AddTarget(target);
if (!Debugging.IsUserDebugging) {
// Silence default ASP.NET logging
config.LoggingRules.Add(new LoggingRule("Microsoft*", target) { FinalMinLevel = LogLevel.Warn });
config.LoggingRules.Add(new LoggingRule("Microsoft.Hosting.Lifetime*", target) { FinalMinLevel = LogLevel.Info });
config.LoggingRules.Add(new LoggingRule("System*", target) { FinalMinLevel = LogLevel.Warn });
}
config.LoggingRules.Add(new LoggingRule("*", LogLevel.Debug, target));
}
private static void OnConfigurationChanged(object? sender, LoggingConfigurationChangedEventArgs e) {
ArgumentNullException.ThrowIfNull(e);

View File

@@ -46,7 +46,7 @@ internal sealed class HistoryTarget : TargetWithLayout {
set {
if (value == 0) {
ASF.ArchiLogger.LogNullError(nameof(value));
ASF.ArchiLogger.LogNullError(value);
return;
}

View File

@@ -61,7 +61,7 @@ internal sealed class SteamTarget : AsyncTaskTarget {
protected override async Task WriteAsyncTask(LogEventInfo logEvent, CancellationToken cancellationToken) {
ArgumentNullException.ThrowIfNull(logEvent);
base.Write(logEvent);
Write(logEvent);
if ((SteamID == 0) || (Bot.Bots == null) || Bot.Bots.IsEmpty) {
return;

View File

@@ -27,14 +27,15 @@ using JetBrains.Annotations;
namespace ArchiSteamFarm.Plugins.Interfaces;
[PublicAPI]
public interface IBotCommand : IPlugin {
public interface IBotCommand2 : IPlugin {
/// <summary>
/// ASF will call this method for unrecognized commands.
/// </summary>
/// <param name="bot">Bot object related to this callback.</param>
/// <param name="steamID">64-bit long unsigned integer of steamID executing the command.</param>
/// <param name="access">Access of user executing the command.</param>
/// <param name="message">Command message in its raw format, stripped of <see cref="GlobalConfig.CommandPrefix" />.</param>
/// <param name="args">Pre-parsed message using standard ASF delimiters.</param>
/// <param name="steamID">Optionally, steamID of the user who executed the command - may not be available with value of 0 (e.g. ASF API).</param>
/// <returns>Response to the command, or null/empty (as the task value) if the command isn't handled by this plugin.</returns>
Task<string?> OnBotCommand(Bot bot, ulong steamID, string message, string[] args);
Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0);
}

View File

@@ -22,6 +22,7 @@
using System;
using System.Collections.Generic;
using System.Collections.Immutable;
using System.ComponentModel;
using System.Composition;
using System.Composition.Convention;
using System.Composition.Hosting;
@@ -266,11 +267,11 @@ internal static class PluginsCore {
}
}
internal static async Task<string?> OnBotCommand(Bot bot, ulong steamID, string message, string[] args) {
internal static async Task<string?> OnBotCommand(Bot bot, EAccess access, string message, string[] args, ulong steamID = 0) {
ArgumentNullException.ThrowIfNull(bot);
if ((steamID == 0) || !new SteamID(steamID).IsIndividualAccount) {
throw new ArgumentOutOfRangeException(nameof(steamID));
if (!Enum.IsDefined(access)) {
throw new InvalidEnumArgumentException(nameof(access), (int) access, typeof(EAccess));
}
if (string.IsNullOrEmpty(message)) {
@@ -288,7 +289,7 @@ internal static class PluginsCore {
IList<string?> responses;
try {
responses = await Utilities.InParallel(ActivePlugins.OfType<IBotCommand>().Select(plugin => plugin.OnBotCommand(bot, steamID, message, args))).ConfigureAwait(false);
responses = await Utilities.InParallel(ActivePlugins.OfType<IBotCommand2>().Select(plugin => plugin.OnBotCommand(bot, access, message, args, steamID))).ConfigureAwait(false);
} catch (Exception e) {
ASF.ArchiLogger.LogGenericException(e);
@@ -590,9 +591,7 @@ internal static class PluginsCore {
}
internal static async Task OnUpdateFinished(Version newVersion) {
if (newVersion == null) {
throw new ArgumentNullException(nameof(newVersion));
}
ArgumentNullException.ThrowIfNull(newVersion);
if ((ActivePlugins == null) || (ActivePlugins.Count == 0)) {
return;
@@ -606,9 +605,7 @@ internal static class PluginsCore {
}
internal static async Task OnUpdateProceeding(Version newVersion) {
if (newVersion == null) {
throw new ArgumentNullException(nameof(newVersion));
}
ArgumentNullException.ThrowIfNull(newVersion);
if ((ActivePlugins == null) || (ActivePlugins.Count == 0)) {
return;

Some files were not shown because too many files have changed in this diff Show More