Compare commits

...

170 Commits

Author SHA1 Message Date
747d17f27c 更新 .github/workflows/windows_test.yaml
Some checks failed
Windows Nightly Build / build (push) Failing after 29s
2024-10-02 21:18:45 +08:00
8398de5af1 更新 .github/workflows/windows_test.yaml 2024-10-02 21:16:03 +08:00
a42cb45534 添加 .github/workflows/windows_test.yaml 2024-10-02 21:15:01 +08:00
xkeyC
968a2a957b
Merge pull request #51 from StarCitizenToolBox/dependabot/pub/flutter_lints-5.0.0
build(deps): bump flutter_lints from 4.0.0 to 5.0.0
2024-09-30 09:13:20 +08:00
dependabot[bot]
3757c27939
build(deps): bump flutter_lints from 4.0.0 to 5.0.0
Bumps [flutter_lints](https://github.com/flutter/packages/tree/main/packages) from 4.0.0 to 5.0.0.
- [Release notes](https://github.com/flutter/packages/releases)
- [Commits](https://github.com/flutter/packages/commits/flutter_lints-v5.0.0/packages)

---
updated-dependencies:
- dependency-name: flutter_lints
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-30 00:49:29 +00:00
xkeyC
2a940b9312 Release: 2.12.2 56 2024-09-23 21:10:32 +08:00
xkeyC
2f17dba2fa bump: flutter_rust_bridge 2024-09-23 21:09:04 +08:00
xkeyC
6e1e50f34e
Merge pull request #50 from kerbcat-bot/weblate-sctoolbox-CoreApp
Translations update from 42Kit Translate
2024-09-23 21:05:46 +08:00
dependabot[bot]
bfc0c5d3d7 build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.3.0...v2.4.0)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-23 13:04:19 +00:00
xkeyC
8c6c980bb8 ui optimization 2024-09-23 21:03:45 +08:00
xkeyC
6a6360540b bugfix 2024-09-23 20:35:19 +08:00
xkeyC
d905f8c13e Release: 2.12.1 55 2024-09-11 20:55:57 +08:00
xkeyC
0d70cb711a Release: 2.12.1 55 2024-09-11 20:50:32 +08:00
xkeyC
f283f4db43 feat: hotfix channel support 2024-09-11 20:50:01 +08:00
xkeyC
3ce635075c feat: 启动游戏时不再隐藏浏览器弹窗,以解决长时间加载的问题 2024-09-11 20:48:25 +08:00
xkeyC
ffd32ec7ff fix: game path scan 2024-09-11 20:41:14 +08:00
xkeyC
ba102bbab8
Merge pull request #48 from StarCitizenToolBox/dependabot/pub/ffigen-14.0.0
build(deps): bump ffigen from 13.0.0 to 14.0.0
2024-09-09 09:04:00 +08:00
xkeyC
79d56dd267
Merge pull request #47 from StarCitizenToolBox/dependabot/pub/re_editor-0.4.0
build(deps): bump re_editor from 0.3.1 to 0.4.0
2024-09-09 09:03:53 +08:00
dependabot[bot]
134b4f0983
build(deps): bump ffigen from 13.0.0 to 14.0.0
Bumps [ffigen](https://github.com/dart-lang/native/tree/main/pkgs) from 13.0.0 to 14.0.0.
- [Release notes](https://github.com/dart-lang/native/releases)
- [Commits](https://github.com/dart-lang/native/commits/HEAD/pkgs)

---
updated-dependencies:
- dependency-name: ffigen
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 00:45:08 +00:00
dependabot[bot]
6090d772fe
build(deps): bump re_editor from 0.3.1 to 0.4.0
Bumps [re_editor](https://github.com/reqable/re-editor) from 0.3.1 to 0.4.0.
- [Changelog](https://github.com/reqable/re-editor/blob/main/CHANGELOG.md)
- [Commits](https://github.com/reqable/re-editor/commits/v0.4.0)

---
updated-dependencies:
- dependency-name: re_editor
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-09-09 00:45:04 +00:00
xkeyC
3da318ec71 fix: l10n 2024-09-04 13:57:38 +08:00
xkeyC
f453821e15 bump: flutter_rust_bridge 2.3.0 2024-09-04 12:22:13 +08:00
xkeyC
de955f1226
Merge pull request #46 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.3.0
build(deps): update flutter_rust_bridge requirement from =2.2.0 to =2.3.0 in /rust
2024-08-22 09:34:22 +08:00
dependabot[bot]
636f5cdb53
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.2.0...v2.3.0)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-19 01:02:26 +00:00
xkeyC
340e38a8e7
Merge pull request #44 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.2.0
build(deps): update flutter_rust_bridge requirement from =2.1.0 to =2.2.0 in /rust
2024-08-12 09:00:26 +08:00
xkeyC
f0a3b527cf
Merge pull request #45 from StarCitizenToolBox/dependabot/pub/window_manager-0.4.0
build(deps): bump window_manager from 0.3.9 to 0.4.0
2024-08-12 09:00:05 +08:00
dependabot[bot]
d1c7f2b72b
build(deps): bump window_manager from 0.3.9 to 0.4.0
Bumps [window_manager](https://github.com/leanflutter/window_manager) from 0.3.9 to 0.4.0.
- [Release notes](https://github.com/leanflutter/window_manager/releases)
- [Changelog](https://github.com/leanflutter/window_manager/blob/main/CHANGELOG.md)
- [Commits](https://github.com/leanflutter/window_manager/compare/v0.3.9...v0.4.0)

---
updated-dependencies:
- dependency-name: window_manager
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 00:25:46 +00:00
dependabot[bot]
e5d83aea04
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.1.0...v2.2.0)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-08-12 00:13:16 +00:00
xkeyC
cf7230f980 Release: 2.12.0 2024-07-21 17:12:06 +08:00
xkeyC
44ec80cc73 feat: Vulkan Crash 扫描
close: https://github.com/StarCitizenToolBox/app/issues/43
2024-07-21 17:07:38 +08:00
xkeyC
53e44db817 一键诊断:将修改中文用户名指引 更换为 新建一个英文管理员账户,修改操作太困难且风险较高
close https://github.com/StarCitizenToolBox/app/issues/41
2024-07-21 16:58:02 +08:00
xkeyC
41f10e408f bump: pub 2024-07-21 16:57:09 +08:00
xkeyC
bc25c92bba Deprecate: sctoolbox.sccsgo.com 2024-07-13 10:09:24 +08:00
xkeyC
8fee9dba05 feat: Optimize UX 2024-07-07 17:49:15 +08:00
xkeyC
6ff0b7c902 merge: Deprecated 2024-07-07 17:17:09 +08:00
xkeyC
79239de308 Merge remote-tracking branch 'origin/main' 2024-07-07 16:50:34 +08:00
xkeyC
7def53649a bump: flutter_rust_bridge rust/windows 2024-07-07 16:50:23 +08:00
xkeyC
4dd47d02eb Rlease: 2.11.3 53 2024-06-28 23:32:57 +08:00
xkeyC
4d36b5d7c1 Release: 2.11.3 2024-06-28 23:10:09 +08:00
xkeyC
bbd1aa91ff bump: flutter_rust_bridge 2024-06-23 21:35:56 +08:00
xkeyC
26e28799ff fix: remove bilibili RSS 2024-06-22 19:40:51 +08:00
xkeyC
83adfbc303 fix: page switch 2024-06-22 15:48:59 +08:00
xkeyC
a9980208d3 bump: App to 2.11.2 2024-06-17 20:16:56 +08:00
xkeyC
f88f73d3a8 bump: flutter_rust_bridge 40 2024-06-17 19:16:09 +08:00
xkeyC
ae14a26f08
Merge pull request #40 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.40
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.39 to =2.0.0-dev.40 in /rust
2024-06-17 09:14:58 +08:00
dependabot[bot]
c6720baa5e
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.39...v2.0.0-dev.40)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-17 01:14:10 +00:00
xkeyC
d1716bd873
Merge pull request #39 from StarCitizenToolBox/dependabot/pub/flutter_rust_bridge-2.0.0-dev.40
build(deps): bump flutter_rust_bridge from 2.0.0-dev.39 to 2.0.0-dev.40
2024-06-17 09:03:12 +08:00
dependabot[bot]
853b9034c0
build(deps): bump flutter_rust_bridge from 2.0.0-dev.39 to 2.0.0-dev.40
Bumps [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) from 2.0.0-dev.39 to 2.0.0-dev.40.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.39...v2.0.0-dev.40)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-17 01:01:33 +00:00
xkeyC
c7d70084d8 fix: SCLoggerHelper 2024-06-16 12:11:19 +08:00
xkeyC
2e69068209 fix: HomeUI performance game not install 2024-06-16 12:06:46 +08:00
xkeyC
38a1ddab72 fix: Window Size 2024-06-16 12:03:37 +08:00
xkeyC
6265acb2ad feat: Cross-platform logic updates 2024-06-16 11:52:25 +08:00
xkeyC
cd812cac66 feat: init macos linux support 2024-06-16 10:36:38 +08:00
xkeyC
5cf8d5a0a0 fix https://github.com/StarCitizenToolBox/app/issues/34 : LocalizationUIModel checkLangUpdate 2024-06-16 09:35:07 +08:00
xkeyC
a94f49eca2 fix https://github.com/StarCitizenToolBox/app/issues/33 : getRSILauncherPath 2024-06-16 09:22:07 +08:00
xkeyC
62289b3b30 fix https://github.com/StarCitizenToolBox/app/issues/27 : unp4k missing runtime 2024-06-16 09:14:51 +08:00
xkeyC
536daa176a bump: flutter_rust_bridge 2.0.0-dev.39 2024-06-16 09:07:22 +08:00
xkeyC
cb69211a78 bump: flutter_rust_bridge 2.0.0-dev.38 2024-06-11 19:55:35 +08:00
xkeyC
222b9e8fef
Merge pull request #36 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.38
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.37 to =2.0.0-dev.38 in /rust
2024-06-11 19:41:15 +08:00
xkeyC
8913fe167f
Merge pull request #37 from StarCitizenToolBox/dependabot/cargo/rust/windows-0.57.0
build(deps): update windows requirement from 0.56.0 to 0.57.0 in /rust
2024-06-11 19:41:07 +08:00
xkeyC
8b78c6d052
Merge pull request #38 from StarCitizenToolBox/dependabot/pub/flutter_rust_bridge-2.0.0-dev.38
build(deps): bump flutter_rust_bridge from 2.0.0-dev.37 to 2.0.0-dev.38
2024-06-11 19:40:57 +08:00
dependabot[bot]
f413d924ad
build(deps): bump flutter_rust_bridge from 2.0.0-dev.37 to 2.0.0-dev.38
Bumps [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) from 2.0.0-dev.37 to 2.0.0-dev.38.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.37...v2.0.0-dev.38)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-10 01:22:52 +00:00
dependabot[bot]
ebbce1ed57
build(deps): update windows requirement from 0.56.0 to 0.57.0 in /rust
Updates the requirements on [windows](https://github.com/microsoft/windows-rs) to permit the latest version.
- [Release notes](https://github.com/microsoft/windows-rs/releases)
- [Commits](https://github.com/microsoft/windows-rs/compare/0.56.0...0.57.0)

---
updated-dependencies:
- dependency-name: windows
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-10 00:47:19 +00:00
dependabot[bot]
dc5392258f
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.37...v2.0.0-dev.38)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-10 00:46:42 +00:00
xkeyC
b530742634 feat: RsiLauncherEnhance add zh_TW Support 2024-06-04 20:29:55 +08:00
xkeyC
20227fbd4b bump: flutter_rust_bridge 2.0.0-dev.37 2024-06-04 20:29:31 +08:00
xkeyC
56d4988cfc
Merge pull request #35 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.37
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.36 to =2.0.0-dev.37 in /rust
2024-06-04 20:17:59 +08:00
dependabot[bot]
47c6f2205a
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.36...v2.0.0-dev.37)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-03 00:58:27 +00:00
xkeyC
003a6d1cb1 bump: flutter_rust_bridge: ^2.0.0-dev.36 2024-05-29 21:52:04 +08:00
xkeyC
f7dfe108c9
Merge pull request #32 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.36
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.35 to =2.0.0-dev.36 in /rust
2024-05-29 21:32:39 +08:00
dependabot[bot]
638f8760b7
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.35...v2.0.0-dev.36)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-27 01:10:09 +00:00
xkeyC
3f7ee82d45 bump: dependencies 2024-05-22 20:05:50 +08:00
xkeyC
ad70e21e2c
Merge pull request #30 from StarCitizenToolBox/dependabot/pub/flutter_rust_bridge-2.0.0-dev.34
build(deps): bump flutter_rust_bridge from 2.0.0-dev.33 to 2.0.0-dev.34
2024-05-22 19:50:32 +08:00
xkeyC
976d3474f9
Merge pull request #31 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.34
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.33 to =2.0.0-dev.34 in /rust
2024-05-22 19:50:13 +08:00
dependabot[bot]
5f0b11d6ef
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.33...v2.0.0-dev.34)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-20 01:11:33 +00:00
dependabot[bot]
a114f052b1
build(deps): bump flutter_rust_bridge from 2.0.0-dev.33 to 2.0.0-dev.34
Bumps [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) from 2.0.0-dev.33 to 2.0.0-dev.34.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.33...v2.0.0-dev.34)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-05-20 00:45:49 +00:00
xkeyC
32b7f2a9fc bump: Flutter 3.22.0 2024-05-14 15:35:48 +08:00
xkeyC
858479f28e bump: Flutter 3.22.0 2024-05-14 15:34:36 +08:00
xkeyC
c90bc803b5
Merge pull request #28 from kerbcat-bot/weblate-sctoolbox-CoreApp
Translations update from 42Kit Translate
2024-05-09 14:47:31 +08:00
xkeyC
40dec20b89 Translated using Weblate (English)
Currently translated at 100.0% (480 of 480 strings)

Translation: SCToolBox/CoreApp
Translate-URL: http://translate.42kit.com/projects/sctoolbox/CoreApp/en/
2024-05-09 06:46:26 +00:00
xkeyC
725277eef7 Release: 2.11.1 51 2024-05-08 17:04:15 +08:00
xkeyC
5eb0c6dda8 fix: LocalizationUIModel savePath.create 2024-05-08 12:21:43 +08:00
xkeyC
6f146ed84b fix: LocalizationUIModel downloadLocalizationFile wait flush 2024-05-08 10:50:52 +08:00
xkeyC
fb8ae2cb4f Release: 2.11.0 50 2024-05-07 21:11:23 +08:00
xkeyC
348704c669 feat: AnalyticsApi update 2024-05-07 21:08:16 +08:00
xkeyC
155c8a0564 feat: rm async-std , use futures 2024-05-07 20:20:08 +08:00
xkeyC
24313ab3b8 feat: fix debug crash 2024-05-07 20:16:03 +08:00
xkeyC
5a6ea3acad bump: flutter_rust_bridge 2024-05-06 22:48:50 +08:00
xkeyC
9ec541299b l10n: update README.md 2024-05-06 20:50:30 +08:00
xkeyC
9b40863169 l10n: update 2024-05-06 20:30:31 +08:00
xkeyC
60ceb84625 l10n: update 2024-05-06 20:29:32 +08:00
xkeyC
b287dfc627 Merge branch 'main' of https://github.com/StarCitizenToolBox/app 2024-05-06 20:23:26 +08:00
xkeyC
6e823dea9f feat: RsiLauncherEnhanceDialogUI fold DownloaderBoost 2024-05-06 20:22:59 +08:00
xkeyC
34d1007e30 feat: UnP4kc fix missing runtime
close https://github.com/StarCitizenToolBox/app/issues/27
2024-05-06 20:21:35 +08:00
xkeyC
4dbcdf2e9f
feat: update README 2024-05-06 10:57:23 +08:00
xkeyC
c9f1bce9fd
feat: update README 2024-05-06 10:54:15 +08:00
xkeyC
1816b18637
Merge pull request #26 from everland-3769/main
README_zh-TW.md 翻譯更新
2024-05-06 10:41:42 +08:00
everland.3769
9b3dbfae6f
Update README_zh-TW.md 2024-05-06 09:44:33 +08:00
xkeyC
f1a424f98c
Merge pull request #25 from everland-3769/main
intl_zh_TW.arb 翻譯更新
2024-05-05 23:10:22 +08:00
澄清石灰水
c7190b5ec5
Update intl_zh_TW.arb 2024-05-05 23:07:08 +08:00
xkeyC
b965c6262f feat: AdvancedLocalizationUI Error Message 2024-05-05 21:50:18 +08:00
xkeyC
0920696444 fix 2024-05-05 21:28:53 +08:00
xkeyC
9af96a2061 l10n: 自定义汉化文件 2024-05-05 21:03:11 +08:00
xkeyC
2c744cc5bd feat: 安装自定义汉化文件 2024-05-05 20:58:58 +08:00
澄清石灰水
dffcf7adea
Update intl_zh_TW.arb 2024-05-05 19:48:57 +08:00
xkeyC
90f254b1d8 fix: string 2024-05-05 18:52:04 +08:00
xkeyC
f8390e0367
Merge pull request #24 from everland-3769/main
README.md 語言切換修正
2024-05-05 18:50:57 +08:00
澄清石灰水
3452d99de6
Merge branch 'StarCitizenToolBox:main' into main 2024-05-05 18:46:43 +08:00
澄清石灰水
d672c3c8a9
Update README_zh-TW.md 2024-05-05 18:43:34 +08:00
澄清石灰水
0c3b15ac7a
Update README.md 2024-05-05 18:43:22 +08:00
xkeyC
1ecd03813d fix: ui.json 2024-05-05 17:08:46 +08:00
xkeyC
3e5a258cf8 feat: Unp4kcState errorMessage 2024-05-05 16:47:42 +08:00
xkeyC
8d2b4983c0 l10n: Update 2024-05-05 16:34:38 +08:00
xkeyC
a8e88983e2 feat: move json file data to code 2024-05-05 15:06:02 +08:00
xkeyC
f392463a84 feat: 高级汉化 2024-05-05 14:59:07 +08:00
xkeyC
0bb0f7deb4 l10n:roll zh_TW 2024-05-05 11:06:54 +08:00
xkeyC
58e0406dd0
Merge pull request #23 from everland-3769/main
更新 intl_zh_TW.arb 與 README.md 內的翻譯與功能
2024-05-05 10:59:09 +08:00
澄清石灰水
817eab3604
Update README.md 2024-05-04 23:03:55 +08:00
澄清石灰水
a44b2a9316
Update README_zh-TW.md 2024-05-04 23:03:14 +08:00
澄清石灰水
af96c53658
Update README_zh-TW.md 2024-05-04 22:57:45 +08:00
澄清石灰水
0e76292882
Update README_zh-TW.md 2024-05-04 22:55:04 +08:00
澄清石灰水
69005a2133
Update README.md 2024-05-04 22:50:51 +08:00
澄清石灰水
b2c0bd91a0
更新 intl_zh_TW.arb 內的大量內容
改善了大量未正確翻譯的字串
2024-05-04 22:38:43 +08:00
xkeyC
9a875fc5a5 feat: AdvancedLocalization Init 2024-05-03 22:35:31 +08:00
xkeyC
4e506a11a0 feat: new LocalizationDialogUI 2024-05-03 14:39:46 +08:00
xkeyC
edc65e68c9 feat: Remove custom localization 2024-05-03 13:13:44 +08:00
xkeyC
dd14a34285 feat: delete logs when inDays > 7 2024-05-03 13:12:11 +08:00
xkeyC
d05aa0d5f8 feat: RSI 启动器增强使用须知 2024-05-01 15:30:17 +08:00
xkeyC
37b584d85b fix: Unp4kCModel 2024-05-01 15:28:32 +08:00
xkeyC
4ebd7b70dc feat: Français in RsiLauncherEnhanceDialogUI 2024-05-01 14:49:45 +08:00
xkeyC
6019cc96fd feat: check RSI Launcher running 2024-05-01 14:30:47 +08:00
xkeyC
f6907f233a feat: RSILauncherEnhance 2024-05-01 13:48:37 +08:00
xkeyC
5d0c3f5fd4 feat: rust/ deprecate lazy_static , use once_cell 2024-04-30 20:04:42 +08:00
xkeyC
3dbf993099 update: rust/ rename to win32_api.rs
fix: setForegroundWindow
2024-04-28 22:28:48 +08:00
xkeyC
288df33b39 update: rust/windows features 2024-04-28 21:58:17 +08:00
xkeyC
c5549cf4c8 feat: Change App Name, add rust/set_foreground_window 2024-04-28 21:50:36 +08:00
xkeyC
e9c494096f bump: dependencies 2024-04-28 20:31:12 +08:00
xkeyC
a7e1d8d0b7 feat: unp4kTools extract_memory 2024-04-27 16:23:57 +08:00
xkeyC
9bdccc3bbf feat: unp4kc use TemporaryDirectory 2024-04-27 14:40:01 +08:00
xkeyC
b5cde95661 Merge branch 'main' of https://github.com/StarCitizenToolBox/app 2024-04-27 14:25:42 +08:00
xkeyC
0f349bee33 feat: use notify-rust, remove dart/windows_ui 2024-04-27 14:25:11 +08:00
xkeyC
1117d2f12f
bump: workflows 2024-04-27 12:53:12 +08:00
xkeyC
d2694a1e25 fix: 因 RSI 官网变更,移除自动填充功能 (不再支持) 2024-04-26 22:55:38 +08:00
xkeyC
2c71f3baba update: Unp4kCModel Duration.zero 2024-04-17 23:37:28 +08:00
xkeyC
a8e91d6332 update: Unp4kCModel 2024-04-17 23:09:28 +08:00
xkeyC
097b9d9bce feat: Optimize RsProcess 2024-04-17 21:40:39 +08:00
xkeyC
603ef46f10 feat: RsProcess 2024-04-16 22:34:50 +08:00
xkeyC
90ff0025d6 bump: flutter_rust_bridge 2.0.0-dev.32 2024-04-16 19:29:19 +08:00
xkeyC
90bb8e6611 feat: unp4kc 2024-04-14 19:52:42 +08:00
xkeyC
dd17ddc92a fix: LocalizationUIModel.checkLangUpdate 2024-04-12 20:09:16 +08:00
xkeyC
bfebeeb1d3 l10n: update 2024-04-12 20:06:06 +08:00
xkeyC
c0f0b54d82 Merge branch 'main' of https://github.com/StarCitizenToolBox/app 2024-04-12 20:05:27 +08:00
xkeyC
6793511bcf feat: compatible RSI launcher 2.0 2024-04-12 20:05:07 +08:00
xkeyC
1ab785fbbc fix: open Dir 2024-04-12 20:02:00 +08:00
xkeyC
4d6a21d02a
Merge pull request #22 from kerbcat-bot/weblate-sctoolbox-CoreApp
Translations update from 42KIT Weblate
2024-04-12 08:08:24 +08:00
t6u
c7abe8ef24 Translated using Weblate (English)
Currently translated at 100.0% (366 of 366 strings)

Translation: SCToolBox/CoreApp
Translate-URL: http://translate.42kit.com/projects/sctoolbox/CoreApp/en/
2024-04-11 23:07:16 +00:00
xkeyC
b8c4e05a32 fix: doctor_action_info_game_abnormal_exit info 2024-04-11 20:09:50 +08:00
xkeyC
e302d9e927 feat: 日本語 Support 2024-04-11 20:04:07 +08:00
xkeyC
df54a44e0e bump: flutter_rust_bridge: ^2.0.0-dev.31 2024-04-11 19:52:13 +08:00
xkeyC
cdbf4d7812
Merge pull request #20 from StarCitizenToolBox/dependabot/cargo/rust/flutter_rust_bridge-eq-2.0.0-dev.30
build(deps): update flutter_rust_bridge requirement from =2.0.0-dev.28 to =2.0.0-dev.30 in /rust
2024-04-11 19:31:50 +08:00
xkeyC
ded821b29c
Merge pull request #21 from kerbcat-bot/weblate-sctoolbox-CoreApp
Translations update from 42KIT Weblate
2024-04-10 10:15:42 +08:00
cfdxkk
af00549928 Translated using Weblate (Japanese)
Currently translated at 16.9% (62 of 366 strings)

Translation: SCToolBox/CoreApp
Translate-URL: http://translate.42kit.com/projects/sctoolbox/CoreApp/ja/
2024-04-08 15:30:59 +00:00
dependabot[bot]
a4b97dc7ab
build(deps): update flutter_rust_bridge requirement in /rust
Updates the requirements on [flutter_rust_bridge](https://github.com/fzyzcjy/flutter_rust_bridge) to permit the latest version.
- [Release notes](https://github.com/fzyzcjy/flutter_rust_bridge/releases)
- [Changelog](https://github.com/fzyzcjy/flutter_rust_bridge/blob/master/CHANGELOG.md)
- [Commits](https://github.com/fzyzcjy/flutter_rust_bridge/compare/v2.0.0-dev.28...v2.0.0-dev.30)

---
updated-dependencies:
- dependency-name: flutter_rust_bridge
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-04-08 00:53:04 +00:00
xkeyC
38a0c173ef Release: 2.10.10 2024-03-31 16:01:30 +08:00
xkeyC
e5e16838eb fix: open logs 2024-03-31 15:54:07 +08:00
xkeyC
39a2a28dd1 feat: Optimize game startup 2024-03-31 15:43:59 +08:00
xkeyC
c32de21fa1 fix: Swiper 2024-03-31 15:05:06 +08:00
xkeyC
494ae6468d feat: User Agreement and Privacy Policy Dialog 2024-03-31 14:50:27 +08:00
xkeyC
ef715d569f fix: miss TECH-PREVIEW 2024-03-31 13:30:56 +08:00
xkeyC
bb48504016 fix: LocalizationUIModel _cfgFile dir 2024-03-30 15:07:32 +08:00
158 changed files with 13313 additions and 2969 deletions

3
.fvmrc Normal file
View File

@ -0,0 +1,3 @@
{
"flutter": "stable"
}

View File

@ -14,7 +14,7 @@ jobs:
uses: microsoft/setup-msbuild@v2 uses: microsoft/setup-msbuild@v2
- name: Set up Flutter - name: Set up Flutter
uses: subosito/flutter-action@v2.12.0 uses: subosito/flutter-action@v2
with: with:
channel: 'stable' channel: 'stable'
cache: true cache: true
@ -37,9 +37,9 @@ jobs:
cache-all-crates: true cache-all-crates: true
- name: Set up LLVM - name: Set up LLVM
uses: KyleMayes/install-llvm-action@v1 uses: KyleMayes/install-llvm-action@v2
with: with:
version: "17.0.2" version: "18"
- name: Flutter pub get - name: Flutter pub get
run: flutter pub get run: flutter pub get

71
.github/workflows/windows_test.yaml vendored Normal file
View File

@ -0,0 +1,71 @@
name: "Windows Nightly Build"
on:
schedule:
- cron: "19 21 * * *" # every day at midnight
workflow_dispatch:
jobs:
build:
runs-on: windows
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Set up MSbuild
uses: microsoft/setup-msbuild@v2
- name: Set up Flutter
uses: subosito/flutter-action@v2
with:
channel: 'stable'
cache: true
cache-key: 'flutter-:os:-:channel:-:version:-:arch:-:hash:' # optional, change this to force refresh cache
cache-path: '${{ runner.tool_cache }}/flutter/:channel:-:version:-:arch:' # optional, change this to specify the cache path
- run: flutter --version
- name: Set up Rust
uses: dtolnay/rust-toolchain@stable
- name: Rust Version
run: |
rustup --version
cargo --version
- name: Rust Cache
uses: Swatinem/rust-cache@v2
with:
workspaces: "rust"
cache-all-crates: true
- name: Set up LLVM
uses: KyleMayes/install-llvm-action@v2
with:
version: "18"
- name: Flutter pub get
run: flutter pub get
- name: Flutter build runner
run: dart run build_runner build --delete-conflicting-outputs
- name: Rust cargo update
run: cargo update
working-directory: rust
- name: Set up Flutter rust bridge
run: |
cargo install cargo-expand
cargo install 'flutter_rust_bridge_codegen@^2.0.0-dev.0'
- name: Flutter Rust bridge generate
run: flutter_rust_bridge_codegen generate
- name: flutter gen l10n
run: |
flutter pub global activate intl_utils
flutter pub global run intl_utils:generate
- name: Flutter build Windows
run: flutter build windows
- name: Archive build
uses: actions/upload-artifact@v4
with:
name: windows
path: build/windows/x64/runner/Release

3
.gitignore vendored
View File

@ -47,3 +47,6 @@ app.*.map.json
/rust/Cargo.lock /rust/Cargo.lock
/lib/generated/l10n_temp.json /lib/generated/l10n_temp.json
/lib/generated/l10n_temp_fix.json /lib/generated/l10n_temp_fix.json
# FVM Version Cache
.fvm/

View File

@ -1,11 +1,11 @@
# This file tracks properties of this Flutter project. # This file tracks properties of this Flutter project.
# Used by Flutter tool to assess capabilities and perform upgrades etc. # Used by Flutter tool to assess capabilities and perform upgrades etc.
# #
# This file should be version controlled. # This file should be version controlled and should not be manually edited.
version: version:
revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf revision: "a14f74ff3a1cbd521163c5f03d68113d50af93d3"
channel: stable channel: "stable"
project_type: app project_type: app
@ -13,11 +13,26 @@ project_type: app
migration: migration:
platforms: platforms:
- platform: root - platform: root
create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: android
create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: ios
create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: linux
create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: macos
create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: web
create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
- platform: windows - platform: windows
create_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf create_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
base_revision: 4d9e56e694b656610ab87fcf2efbcd226e0ed8cf base_revision: a14f74ff3a1cbd521163c5f03d68113d50af93d3
# User provided section # User provided section

View File

@ -1,6 +1,8 @@
# SC 汉化盒子 # SC汉化盒子 / SCToolBox
该工具为 星际公民玩家 提供 一键诊断,官网及工具网站汉化,游戏汉化,游戏性能优化 等功能,给您带来更愉快的游戏体验。 [简体中文](https://github.com/StarCitizenToolBox/app/blob/main/README.md) / [繁體中文](https://github.com/StarCitizenToolBox/app/blob/main/README_zh-TW.md) / [English](https://github.com/StarCitizenToolBox/app/blob/main/README_en.md)
该工具为 星际公民玩家 提供 一键诊断,官网及工具网站汉化,游戏汉化,游戏性能优化 等功能,致力于带来更愉快的游戏体验。
[![Windows Nightly Build](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml/badge.svg)](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml) [![Windows Nightly Build](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml/badge.svg)](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml)
@ -15,13 +17,14 @@
- 其他常用工具:包括 p4k分流下载清理着色器重装EAC等多种功能在内的工具箱。 - 其他常用工具:包括 p4k分流下载清理着色器重装EAC等多种功能在内的工具箱。
### 📸 屏幕截图 ### 📸 屏幕截图
![1.png](https://s2.loli.net/2023/12/06/S7qc2MmnjBeVkPE.png) ![image.png](https://s2.loli.net/2024/05/06/kX2nxsCp3y71lo4.png)
![2.png](https://s2.loli.net/2023/12/06/XuwBoWN7EhqL2Ie.png) ![image.png](https://s2.loli.net/2024/05/06/LIxt6D3WjJeXh5r.png)
![3.png](https://s2.loli.net/2023/12/06/uogbQMVe5Ufs6XG.png) ![image.png](https://s2.loli.net/2024/05/06/FDXgTIP9HaL5QiW.png)
![4.png](https://s2.loli.net/2023/12/06/y9sJqkUb1IOWj6m.png) ![image.png](https://s2.loli.net/2024/05/06/q6tSos41xCEAIju.png)
![5.png](https://s2.loli.net/2023/12/06/yf9z4NrhEOiR5FP.png) ![image.png](https://s2.loli.net/2024/05/06/JScI2sXTFea3tKY.png)
![6.png](https://s2.loli.net/2023/12/06/AakZFw97cySI3UQ.png) ![image.png](https://s2.loli.net/2024/05/06/kMXZrAunSV48YhK.png)
![image.png](https://s2.loli.net/2024/05/06/CAvKrsXmtpRh8Iw.png)
![image.png](https://s2.loli.net/2024/05/06/ZnYy7XpM69rboWP.png)
### ❤️ 鸣谢 ### ❤️ 鸣谢
![jetbrains.svg](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg) ![jetbrains.svg](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)

32
README_en.md Normal file
View File

@ -0,0 +1,32 @@
# SCToolBox
[简体中文](https://github.com/StarCitizenToolBox/app/blob/main/README.md) / [繁體中文](https://github.com/StarCitizenToolBox/app/blob/main/README_zh-TW.md) / [English](https://github.com/StarCitizenToolBox/app/blob/main/README_en.md)
This tool provides Star Citizen players with one-click diagnosis, official website and tool website localization, game localization, game performance optimization and other functions, and is committed to bringing a more enjoyable gaming experience.
[![Windows Nightly Build](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml/badge.svg)](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml)
[![](https://get.microsoft.com/images/en-us%20dark.svg)](https://apps.microsoft.com/detail/9NF3SWFWNKL1?launch=true)
### ✨ Feature
- Localization management: install the localization of the community and switch languages with one click
- One-click diagnosis: log files from hundreds of guinea pig users, which can handle common problems of Star Citizen
- Website Chineseization: Provide manual translation for the Star Citizen official website and Star Citizen tool website (thanks to the Star Citizen Chinese Encyclopedia project), and also provide [Browser Extension (Github)] (https://github.com/xkeyC/StarCitizenBoxBrowserEx).
- Performance optimization: Add more detailed performance parameter control to the Star Citizen game, which can be used to optimize performance and obtain better image quality.
- Server status indicator: The server status indicator function is added a few hours earlier than the official website launcher, and the indication is more detailed.
- Other commonly used tools: a toolbox including p4k offload downloads, cleaning shaders, reinstalling EAC and other functions.
### 📸 Screenshot
![image.png](https://s2.loli.net/2024/05/06/iHmsGd7htjE9uzy.png)
![image.png](https://s2.loli.net/2024/05/06/yCD9hXMEz8gK6Gk.png)
![image.png](https://s2.loli.net/2024/05/06/DVvyCFJBpjXWbd4.png)
![image.png](https://s2.loli.net/2024/05/06/Ig6lVB3HW4fzQaY.png)
![image.png](https://s2.loli.net/2024/05/06/Wnzfe6TNZPE4LyA.png)
![image.png](https://s2.loli.net/2024/05/06/dINhbev63tYWlnq.png)
![image.png](https://s2.loli.net/2024/05/06/BODvxVHN4RoAhpU.png)
![image.png](https://s2.loli.net/2024/05/06/psXOKoCElFfaJMV.png)
![image.png](https://s2.loli.net/2024/05/06/PCWgYFlnD156rxK.png)
### ❤️ Thanks
![jetbrains.svg](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)
Special thanks to [JetBrains](https://www.jetbrains.com/?from=SCToolbox) for providing free IDE licenses for open source projects.

View File

@ -1,24 +1,30 @@
# SC 漢化盒子 # SC 工具箱
此工具為 星際公民玩家 提供 疑難排解,官網及工具網站中文化,遊戲翻譯,遊戲效能最佳化 等功能,帶給您更愉快的遊戲體驗。 [简体中文](https://github.com/StarCitizenToolBox/app/blob/main/README.md) / [繁體中文](https://github.com/StarCitizenToolBox/app/blob/main/README_zh-TW.md)
此工具為星際公民玩家提供疑難排解、官網及工具網站中文翻譯、遊戲翻譯、效能最佳化/畫面改善等功能,帶給您更愉快的遊戲體驗。
[![Windows Nightly Build](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml/badge.svg)](https://github.com/StarCitizenToolBox/app/actions/workflows/windows_nightly.yml)
[![](https://get.microsoft.com/images/zh-tw%20dark.svg)](https://apps.microsoft.com/detail/9NF3SWFWNKL1?launch=true)
[![](https://get.microsoft.com/images/zh-cn%20dark.svg)](https://apps.microsoft.com/detail/9NF3SWFWNKL1?launch=true)
### ✨ 功能 ### ✨ 功能
- 本地化管理:一鍵安裝社群翻譯,切換語言 - 本地化社群翻譯管理:一鍵快速安裝社群翻譯與切換遊戲語言
- 疑難排解:來自上百名小白鼠使用者的日誌文件,可處理星際公民常見問題 - 疑難排解:來自上百名小白鼠使用者的日誌文件,可處理常見星際公民問題
- 網站中文:為星際公民官網,星際公民工具網站提供人工精翻 (感謝星際公民中文百科計畫),亦提供[瀏覽器擴充套件 (Github)](https://github.com/xkeyC/StarCitizenBoxBrowserEx )。 - 網站中文翻譯:為星際公民官網,星際公民工具網站提供人工精翻 (感謝星際公民中文百科計畫),亦提供[瀏覽器擴充套件 (Github)](https://github.com/xkeyC/StarCitizenBoxBrowserEx )。
- 效能最佳化:為星際公民遊戲增加更細緻的效能參數控制,可用於最佳化效能,也可用於獲得更好的畫質。 - 效能最佳化/畫面改善:為星際公民遊戲增加更細緻的效能參數控制,可用於最佳化效能,也可用於獲得更好的畫質。
- 伺服器狀態指示器:比官網啟動器早了幾個小時增加了伺服器狀態指示功能,且指示的更為細緻。 - 伺服器狀態指示器:比官網啟動器早了幾個小時增加了伺服器狀態指示功能,且指示的更為細緻。
- 其他常用工具:包括 p4k分流下載清除著色器快取重新安裝EAC等多種功能在內的工具箱。 - 其他常用工具:包括 p4k分流下載清除著色器快取重新安裝EAC等多種功能在內的工具箱。
### 📸 螢幕截圖 ### 📸 螢幕截圖
![1.png](https://s2.loli.net/2023/12/06/S7qc2MmnjBeVkPE.png) ![image.png](https://s2.loli.net/2024/05/06/FrMxJuh9AozfVc7.png)
![2.png](https://s2.loli.net/2023/12/06/XuwBoWN7EhqL2Ie.png) ![image.png](https://s2.loli.net/2024/05/06/8GLnb2Ma7ojeZIl.png)
![3.png](https://s2.loli.net/2023/12/06/uogbQMVe5Ufs6XG.png) ![image.png](https://s2.loli.net/2024/05/06/IsCUlx7FH9SfAtY.png)
![4.png](https://s2.loli.net/2023/12/06/y9sJqkUb1IOWj6m.png) ![image.png](https://s2.loli.net/2024/05/06/8ksgbSKQEFWdj15.png)
![5.png](https://s2.loli.net/2023/12/06/yf9z4NrhEOiR5FP.png) ![image.png](https://s2.loli.net/2024/05/06/IAZeq97BzKV6tax.png)
![6.png](https://s2.loli.net/2023/12/06/AakZFw97cySI3UQ.png) ![image.png](https://s2.loli.net/2024/05/06/K9hPgzCB5SbomyQ.png)
![image.png](https://s2.loli.net/2024/05/06/TlckzswguMUCjZe.png)
### ❤️ 鳴謝 ### ❤️ 鳴謝
![jetbrains.svg](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg) ![jetbrains.svg](https://resources.jetbrains.com/storage/products/company/brand/logos/jb_beam.svg)

BIN
assets/binary/unp4kc.zip Normal file

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

View File

@ -1,322 +0,0 @@
[
{
"key": "r_ssdo",
"name": "屏幕光线后处理",
"info": "调整光线后处理等级",
"type": "int",
"max": 2,
"min": 0,
"value": 1,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "r_AntialiasingMode",
"name": "抗锯齿",
"info": "0 关闭1 SMAA2 时间过滤+SMAA3 时间滤波和投影矩阵抖动的 SMAA",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_gameeffects",
"name": "特效等级",
"info": "游戏特效等级",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_texture",
"name": "纹理等级",
"info": "模型纹理细节",
"type": "int",
"max": 3,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_volumetriceffects",
"name": "体积效果",
"info": "体积云、体积光照等",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_water",
"name": "水体效果",
"info": "各种水的等级",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_objectdetail",
"name": "对象细节",
"info": "模型对象细节影响LOD等..",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_particles",
"name": "粒子细节",
"info": "",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_physics",
"name": "物理细节",
"info": "物理效果范围",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_shading",
"name": "着色器细节",
"info": "着色器相关",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_shadows",
"name": "阴影细节",
"info": "阴影效果",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "sys_spec_postprocessing",
"name": "后处理细节",
"info": "后处理着色器,动态模糊效果 等",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_Renderer",
"name": "渲染器质量",
"info": "cryengine 渲染器质量",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderDecal",
"name": "贴花质量",
"info": "LOGO、标志等",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderPostProcess",
"name": "着色器质量",
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 3,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderFX",
"name": "FX 质量",
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderGeneral",
"name": "常规质量",
"info": "整体模型质量",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderGlass",
"name": "玻璃质量",
"info": "窗、镜子等",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderHDR",
"name": "HDR质量",
"info": "HDR色差亮度层级 处理 等",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderParticle",
"name": "粒子质量",
"info": "粒子效果质量",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderTerrain",
"name": "地面质量",
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderShadow",
"name": "阴影质量",
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "q_ShaderSky",
"name": "天空质量",
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "e_ParticlesObjectCollisions",
"name": "粒子碰撞",
"info": "1 仅静态粒子 2 包括动态粒子",
"type": "int",
"max": 2,
"min": 1,
"value": 1,
"group": "图形(修改后建议清理着色器)"
},
{
"key": "r_displayinfo",
"name": "屏幕信息(展示帧率)",
"info": "在屏幕右上角展示帧率,服务器信息等",
"type": "int",
"max": 4,
"min": 0,
"value": 1,
"group": "设置"
},
{
"key": "sys_maxFps",
"name": "最大帧率",
"info": "调整游戏最高帧率0为不限制",
"type": "int",
"max": 300,
"min": 0,
"value": 0,
"group": "设置"
},
{
"key": "r_DisplaySessionInfo",
"name": "显示会话信息",
"info": "开启后在屏幕上显示一个二维码,用于反馈时让 CIG 快速定位相关信息",
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": "设置"
},
{
"key": "r_VSync",
"name": "垂直同步",
"info": "开启以防止撕裂,关闭以提高帧率",
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": "设置"
},
{
"key": "r_MotionBlur",
"name": "动态模糊",
"info": "开启以提高运动感,关闭提升观感",
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": "设置"
},
{
"key": "cl_fov",
"name": "FOV",
"info": "设置视角FOV",
"type": "int",
"max": 160,
"min": 25,
"value": 90,
"group": "设置"
},
{
"key": "ui_disableScreenFade",
"name": "UI 淡入淡出动画",
"info": "",
"type": "bool",
"max": 1,
"min": 0,
"value": 1,
"group": "设置"
},
{
"key": "customize",
"name": "自定义参数",
"info": "",
"type": "customize",
"max": 1,
"min": 0,
"value": 1,
"group": "自定义"
}
]

View File

@ -221,19 +221,8 @@ InitWebLocalization();
async function getRSILauncherToken(channelId) { async function getRSILauncherToken(channelId) {
if (!window.location.href.includes("robertsspaceindustries.com")) return; if (!window.location.href.includes("robertsspaceindustries.com")) return;
if (window.location.href.startsWith("https://robertsspaceindustries.com/connect")) { let loginBodyElement = $(".c-form.c-signIn");
$(function () { loginBodyElement.hide();
$('#email').on('input', function () {
let inputEmail = $('#email').val()
sessionStorage.setItem('inputEmail', inputEmail);
});
$('#password').on('input', function () {
let inputPassword = $('#password').val()
sessionStorage.setItem('inputPassword', inputPassword);
});
});
}
// check login // check login
let r = await fetch("api/launcher/v3/account/check", { let r = await fetch("api/launcher/v3/account/check", {
method: 'POST', headers: { method: 'POST', headers: {
@ -241,6 +230,7 @@ async function getRSILauncherToken(channelId) {
}, },
}); });
if (r.status !== 200) { if (r.status !== 200) {
loginBodyElement.show();
// wait login // wait login
window.chrome.webview.postMessage({action: 'webview_rsi_login_show_window'}); window.chrome.webview.postMessage({action: 'webview_rsi_login_show_window'});
return; return;
@ -286,11 +276,20 @@ async function getRSILauncherToken(channelId) {
if (releaseR.status !== 200) return; if (releaseR.status !== 200) return;
let releaseDataJson = (await releaseR.json())['data']; let releaseDataJson = (await releaseR.json())['data'];
console.log(releaseDataJson); console.log(releaseDataJson);
// get user avatar // get game library
let $avatarElement = $(".c-account-sidebar__profile-metas-avatar"); let libraryR = await fetch("api/launcher/v3/games/library", {
let avatarUrl = $avatarElement.css("background-image"); method: 'POST', headers: {
'x-rsi-token': $.cookie('Rsi-Token'),
},
body: releaseFormData
});
// post message let libraryData = (await libraryR.json())["data"]
// get user avatar
let avatarUrl = $(".a-avatarButton__image").attr("src");
//post message
window.chrome.webview.postMessage({ window.chrome.webview.postMessage({
action: 'webview_rsi_login_success', data: { action: 'webview_rsi_login_success', data: {
'webToken': $.cookie('Rsi-Token'), 'webToken': $.cookie('Rsi-Token'),
@ -298,25 +297,7 @@ async function getRSILauncherToken(channelId) {
'authToken': TokenData, 'authToken': TokenData,
'releaseInfo': releaseDataJson, 'releaseInfo': releaseDataJson,
"avatar": avatarUrl, "avatar": avatarUrl,
"inputEmail": sessionStorage.getItem("inputEmail"), 'libraryData': libraryData,
"inputPassword": sessionStorage.getItem("inputPassword")
}
});
}
function RSIAutoLogin(email, pwd) {
if (!window.location.href.includes("robertsspaceindustries.com")) return;
$(function () {
if (email !== "") {
$('#email').val(email)
}
if (pwd !== "") {
$('#password').val(pwd)
}
sessionStorage.setItem('inputPassword', '');
if (email !== "" && pwd !== "") {
$("#remember").prop("checked", true);
$('.c-form__submit-button-label').click();
} }
}); });
} }
@ -334,5 +315,4 @@ function SCTShowToast(message) {
document.body.removeChild(m) document.body.removeChild(m)
}, d * 1000); }, d * 1000);
}, 3500); }, 3500);
} }

View File

@ -7,7 +7,10 @@ import 'package:starcitizen_doctor/common/utils/log.dart';
class AnalyticsApi { class AnalyticsApi {
static touch(String key) async { static touch(String key) async {
if (kDebugMode || kProfileMode) return; if (kDebugMode || kProfileMode) {
dPrint("AnalyticsApi.touch === $key skip");
return;
}
dPrint("AnalyticsApi.touch === $key start"); dPrint("AnalyticsApi.touch === $key start");
try { try {
final r = await RSHttp.postData( final r = await RSHttp.postData(

View File

@ -12,11 +12,9 @@ class RSSApi {
} }
static Future<List<RssItem>> getRssText() async { static Future<List<RssItem>> getRssText() async {
final r1 = await RSHttp.getText(URLConf.rssTextUrl1);
final r1f = RssFeed.parse(r1);
final r2 = await RSHttp.getText(URLConf.rssTextUrl2); final r2 = await RSHttp.getText(URLConf.rssTextUrl2);
final r2f = RssFeed.parse(r2); final r2f = RssFeed.parse(r2);
final items = r1f.items..addAll(r2f.items); final items = r2f.items;
items.sort((a, b) { items.sort((a, b) {
final aDate = HttpDate.parse(a.pubDate ?? "").millisecondsSinceEpoch; final aDate = HttpDate.parse(a.pubDate ?? "").millisecondsSinceEpoch;
final bDate = HttpDate.parse(b.pubDate ?? "").millisecondsSinceEpoch; final bDate = HttpDate.parse(b.pubDate ?? "").millisecondsSinceEpoch;

View File

@ -23,12 +23,15 @@ import 'api/api.dart';
import 'common/helper/system_helper.dart'; import 'common/helper/system_helper.dart';
import 'common/io/rs_http.dart'; import 'common/io/rs_http.dart';
import 'common/rust/frb_generated.dart'; import 'common/rust/frb_generated.dart';
import 'common/rust/api/win32_api.dart' as win32;
import 'data/app_version_data.dart'; import 'data/app_version_data.dart';
import 'generated/no_l10n_strings.dart'; import 'generated/no_l10n_strings.dart';
import 'ui/home/downloader/home_downloader_ui.dart'; import 'ui/home/downloader/home_downloader_ui.dart';
import 'ui/home/game_doctor/game_doctor_ui.dart'; import 'ui/home/game_doctor/game_doctor_ui.dart';
import 'ui/home/localization/advanced_localization_ui.dart';
import 'ui/index_ui.dart'; import 'ui/index_ui.dart';
import 'ui/settings/upgrade_dialog.dart'; import 'ui/settings/upgrade_dialog.dart';
import 'ui/tools/unp4kc/unp4kc_ui.dart';
part 'app.g.dart'; part 'app.g.dart';
@ -43,6 +46,7 @@ class AppGlobalState with _$AppGlobalState {
AppVersionData? networkVersionData, AppVersionData? networkVersionData,
@Default(ThemeConf()) ThemeConf themeConf, @Default(ThemeConf()) ThemeConf themeConf,
Locale? appLocale, Locale? appLocale,
Box? appConfBox,
}) = _AppGlobalState; }) = _AppGlobalState;
} }
@ -74,8 +78,19 @@ GoRouter router(RouterRef ref) {
pageBuilder: (context, state) => pageBuilder: (context, state) =>
myPageBuilder(context, state, const HomePerformanceUI()), myPageBuilder(context, state, const HomePerformanceUI()),
), ),
GoRoute(
path: 'advanced_localization',
pageBuilder: (context, state) =>
myPageBuilder(context, state, const AdvancedLocalizationUI()))
], ],
), ),
GoRoute(path: '/tools', builder: (_, __) => const SizedBox(), routes: [
GoRoute(
path: 'unp4kc',
pageBuilder: (context, state) =>
myPageBuilder(context, state, const UnP4kcUI()),
),
]),
], ],
); );
} }
@ -87,6 +102,7 @@ class AppGlobalModel extends _$AppGlobalModel {
const Locale("zh", "CN"): NoL10n.langZHS, const Locale("zh", "CN"): NoL10n.langZHS,
const Locale("zh", "TW"): NoL10n.langZHT, const Locale("zh", "TW"): NoL10n.langZHT,
const Locale("en"): NoL10n.langEn, const Locale("en"): NoL10n.langEn,
const Locale("ja"): NoL10n.langJa,
}; };
@override @override
@ -99,26 +115,7 @@ class AppGlobalModel extends _$AppGlobalModel {
Future<void> initApp() async { Future<void> initApp() async {
if (_initialized) return; if (_initialized) return;
// init Data // init Data
final userProfileDir = Platform.environment["USERPROFILE"]; final applicationSupportDir = await _initAppDir();
final applicationSupportDir =
(await getApplicationSupportDirectory()).absolute.path;
String? applicationBinaryModuleDir;
final logFile = File(
"$applicationSupportDir\\logs\\${DateTime.now().millisecondsSinceEpoch}.log");
await logFile.create(recursive: true);
setDPrintFile(logFile);
if (ConstConf.isMSE && userProfileDir != null) {
applicationBinaryModuleDir =
"$userProfileDir\\AppData\\Local\\Temp\\SCToolbox\\modules";
} else {
applicationBinaryModuleDir = "$applicationSupportDir\\modules";
}
dPrint("applicationSupportDir == $applicationSupportDir");
dPrint("applicationBinaryModuleDir == $applicationBinaryModuleDir");
state = state.copyWith(
applicationSupportDir: applicationSupportDir,
applicationBinaryModuleDir: applicationBinaryModuleDir,
);
// init Rust bridge // init Rust bridge
await RustLib.init(); await RustLib.init();
@ -129,6 +126,7 @@ class AppGlobalModel extends _$AppGlobalModel {
try { try {
Hive.init("$applicationSupportDir/db"); Hive.init("$applicationSupportDir/db");
final box = await Hive.openBox("app_conf"); final box = await Hive.openBox("app_conf");
state = state.copyWith(appConfBox: box);
if (box.get("install_id", defaultValue: "") == "") { if (box.get("install_id", defaultValue: "") == "") {
await box.put("install_id", const Uuid().v4()); await box.put("install_id", const Uuid().v4());
AnalyticsApi.touch("firstLaunch"); AnalyticsApi.touch("firstLaunch");
@ -146,15 +144,19 @@ class AppGlobalModel extends _$AppGlobalModel {
} }
state = state.copyWith(deviceUUID: deviceUUID, appLocale: locale); state = state.copyWith(deviceUUID: deviceUUID, appLocale: locale);
} catch (e) { } catch (e) {
exit(1); await win32.setForegroundWindow(windowName: "SCToolBox");
dPrint("exit: db is locking ...");
exit(0);
} }
// init powershell // init powershell
try { if (Platform.isWindows) {
await SystemHelper.initPowershellPath(); try {
dPrint("---- Powershell init -----"); await SystemHelper.initPowershellPath();
}catch (e){ dPrint("---- Powershell init -----");
dPrint("powershell init failed : $e"); } catch (e) {
dPrint("powershell init failed : $e");
}
} }
// get windows info // get windows info
@ -167,18 +169,18 @@ class AppGlobalModel extends _$AppGlobalModel {
} }
// init windows // init windows
windowManager.waitUntilReadyToShow().then((_) async { windowManager.waitUntilReadyToShow().then((_) async {
await windowManager.setSize(const Size(1280, 810)); await windowManager.setTitle("SCToolBox");
await windowManager.setMinimumSize(const Size(1280, 810));
await windowManager.setSkipTaskbar(false); await windowManager.setSkipTaskbar(false);
await windowManager.show(); await windowManager.show();
await Window.initialize(); if (Platform.isWindows) {
await Window.hideWindowControls(); await Window.initialize();
if (windowsDeviceInfo?.productName.contains("Windows 11") ?? false) { await Window.hideWindowControls();
await Window.setEffect( if (windowsDeviceInfo?.productName.contains("Windows 11") ?? false) {
effect: WindowEffect.acrylic, await Window.setEffect(
); effect: WindowEffect.acrylic,
);
}
} }
}); });
@ -227,6 +229,7 @@ class AppGlobalModel extends _$AppGlobalModel {
ConstConf.appVersionDate, checkUpdateError.toString())); ConstConf.appVersionDate, checkUpdateError.toString()));
return false; return false;
} }
if (!Platform.isWindows) return false;
final lastVersion = ConstConf.isMSE final lastVersion = ConstConf.isMSE
? state.networkVersionData?.mSELastVersionCode ? state.networkVersionData?.mSELastVersionCode
: state.networkVersionData?.lastVersionCode; : state.networkVersionData?.lastVersionCode;
@ -306,10 +309,49 @@ class AppGlobalModel extends _$AppGlobalModel {
final localeCode = value.countryCode != null final localeCode = value.countryCode != null
? "${value.languageCode}_${value.countryCode ?? ""}" ? "${value.languageCode}_${value.countryCode ?? ""}"
: value.languageCode; : value.languageCode;
dPrint("changeLocale == $value localeCode=== $localeCode");
await appConfBox.put("app_locale", localeCode); await appConfBox.put("app_locale", localeCode);
state = state.copyWith(appLocale: value); state = state.copyWith(appLocale: value);
} }
} }
Future<String> _initAppDir() async {
if (Platform.isWindows) {
final userProfileDir = Platform.environment["USERPROFILE"];
final applicationSupportDir =
(await getApplicationSupportDirectory()).absolute.path;
String? applicationBinaryModuleDir;
try {
await initDPrintFile(applicationSupportDir);
} catch (e) {
dPrint("initDPrintFile Error: $e");
}
if (ConstConf.isMSE && userProfileDir != null) {
applicationBinaryModuleDir =
"$userProfileDir\\AppData\\Local\\Temp\\SCToolbox\\modules";
} else {
applicationBinaryModuleDir = "$applicationSupportDir\\modules";
}
dPrint("applicationSupportDir == $applicationSupportDir");
dPrint("applicationBinaryModuleDir == $applicationBinaryModuleDir");
state = state.copyWith(
applicationSupportDir: applicationSupportDir,
applicationBinaryModuleDir: applicationBinaryModuleDir,
);
return applicationSupportDir;
} else {
final applicationSupportDir =
(await getApplicationSupportDirectory()).absolute.path;
final applicationBinaryModuleDir = "$applicationSupportDir/modules";
dPrint("applicationSupportDir == $applicationSupportDir");
dPrint("applicationBinaryModuleDir == $applicationBinaryModuleDir");
state = state.copyWith(
applicationSupportDir: applicationSupportDir,
applicationBinaryModuleDir: applicationBinaryModuleDir,
);
return applicationSupportDir;
}
}
} }
@freezed @freezed

View File

@ -22,8 +22,11 @@ mixin _$AppGlobalState {
AppVersionData? get networkVersionData => throw _privateConstructorUsedError; AppVersionData? get networkVersionData => throw _privateConstructorUsedError;
ThemeConf get themeConf => throw _privateConstructorUsedError; ThemeConf get themeConf => throw _privateConstructorUsedError;
Locale? get appLocale => throw _privateConstructorUsedError; Locale? get appLocale => throw _privateConstructorUsedError;
Box<dynamic>? get appConfBox => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$AppGlobalStateCopyWith<AppGlobalState> get copyWith => $AppGlobalStateCopyWith<AppGlobalState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -40,7 +43,8 @@ abstract class $AppGlobalStateCopyWith<$Res> {
String? applicationBinaryModuleDir, String? applicationBinaryModuleDir,
AppVersionData? networkVersionData, AppVersionData? networkVersionData,
ThemeConf themeConf, ThemeConf themeConf,
Locale? appLocale}); Locale? appLocale,
Box<dynamic>? appConfBox});
$ThemeConfCopyWith<$Res> get themeConf; $ThemeConfCopyWith<$Res> get themeConf;
} }
@ -55,6 +59,8 @@ class _$AppGlobalStateCopyWithImpl<$Res, $Val extends AppGlobalState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -64,6 +70,7 @@ class _$AppGlobalStateCopyWithImpl<$Res, $Val extends AppGlobalState>
Object? networkVersionData = freezed, Object? networkVersionData = freezed,
Object? themeConf = null, Object? themeConf = null,
Object? appLocale = freezed, Object? appLocale = freezed,
Object? appConfBox = freezed,
}) { }) {
return _then(_value.copyWith( return _then(_value.copyWith(
deviceUUID: freezed == deviceUUID deviceUUID: freezed == deviceUUID
@ -90,9 +97,15 @@ class _$AppGlobalStateCopyWithImpl<$Res, $Val extends AppGlobalState>
? _value.appLocale ? _value.appLocale
: appLocale // ignore: cast_nullable_to_non_nullable : appLocale // ignore: cast_nullable_to_non_nullable
as Locale?, as Locale?,
appConfBox: freezed == appConfBox
? _value.appConfBox
: appConfBox // ignore: cast_nullable_to_non_nullable
as Box<dynamic>?,
) as $Val); ) as $Val);
} }
/// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
$ThemeConfCopyWith<$Res> get themeConf { $ThemeConfCopyWith<$Res> get themeConf {
@ -116,7 +129,8 @@ abstract class _$$AppGlobalStateImplCopyWith<$Res>
String? applicationBinaryModuleDir, String? applicationBinaryModuleDir,
AppVersionData? networkVersionData, AppVersionData? networkVersionData,
ThemeConf themeConf, ThemeConf themeConf,
Locale? appLocale}); Locale? appLocale,
Box<dynamic>? appConfBox});
@override @override
$ThemeConfCopyWith<$Res> get themeConf; $ThemeConfCopyWith<$Res> get themeConf;
@ -130,6 +144,8 @@ class __$$AppGlobalStateImplCopyWithImpl<$Res>
_$AppGlobalStateImpl _value, $Res Function(_$AppGlobalStateImpl) _then) _$AppGlobalStateImpl _value, $Res Function(_$AppGlobalStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -139,6 +155,7 @@ class __$$AppGlobalStateImplCopyWithImpl<$Res>
Object? networkVersionData = freezed, Object? networkVersionData = freezed,
Object? themeConf = null, Object? themeConf = null,
Object? appLocale = freezed, Object? appLocale = freezed,
Object? appConfBox = freezed,
}) { }) {
return _then(_$AppGlobalStateImpl( return _then(_$AppGlobalStateImpl(
deviceUUID: freezed == deviceUUID deviceUUID: freezed == deviceUUID
@ -165,6 +182,10 @@ class __$$AppGlobalStateImplCopyWithImpl<$Res>
? _value.appLocale ? _value.appLocale
: appLocale // ignore: cast_nullable_to_non_nullable : appLocale // ignore: cast_nullable_to_non_nullable
as Locale?, as Locale?,
appConfBox: freezed == appConfBox
? _value.appConfBox
: appConfBox // ignore: cast_nullable_to_non_nullable
as Box<dynamic>?,
)); ));
} }
} }
@ -178,7 +199,8 @@ class _$AppGlobalStateImpl implements _AppGlobalState {
this.applicationBinaryModuleDir, this.applicationBinaryModuleDir,
this.networkVersionData, this.networkVersionData,
this.themeConf = const ThemeConf(), this.themeConf = const ThemeConf(),
this.appLocale}); this.appLocale,
this.appConfBox});
@override @override
final String? deviceUUID; final String? deviceUUID;
@ -193,10 +215,12 @@ class _$AppGlobalStateImpl implements _AppGlobalState {
final ThemeConf themeConf; final ThemeConf themeConf;
@override @override
final Locale? appLocale; final Locale? appLocale;
@override
final Box<dynamic>? appConfBox;
@override @override
String toString() { String toString() {
return 'AppGlobalState(deviceUUID: $deviceUUID, applicationSupportDir: $applicationSupportDir, applicationBinaryModuleDir: $applicationBinaryModuleDir, networkVersionData: $networkVersionData, themeConf: $themeConf, appLocale: $appLocale)'; return 'AppGlobalState(deviceUUID: $deviceUUID, applicationSupportDir: $applicationSupportDir, applicationBinaryModuleDir: $applicationBinaryModuleDir, networkVersionData: $networkVersionData, themeConf: $themeConf, appLocale: $appLocale, appConfBox: $appConfBox)';
} }
@override @override
@ -217,7 +241,9 @@ class _$AppGlobalStateImpl implements _AppGlobalState {
(identical(other.themeConf, themeConf) || (identical(other.themeConf, themeConf) ||
other.themeConf == themeConf) && other.themeConf == themeConf) &&
(identical(other.appLocale, appLocale) || (identical(other.appLocale, appLocale) ||
other.appLocale == appLocale)); other.appLocale == appLocale) &&
(identical(other.appConfBox, appConfBox) ||
other.appConfBox == appConfBox));
} }
@override @override
@ -228,9 +254,12 @@ class _$AppGlobalStateImpl implements _AppGlobalState {
applicationBinaryModuleDir, applicationBinaryModuleDir,
networkVersionData, networkVersionData,
themeConf, themeConf,
appLocale); appLocale,
appConfBox);
@JsonKey(ignore: true) /// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$AppGlobalStateImplCopyWith<_$AppGlobalStateImpl> get copyWith => _$$AppGlobalStateImplCopyWith<_$AppGlobalStateImpl> get copyWith =>
@ -245,7 +274,8 @@ abstract class _AppGlobalState implements AppGlobalState {
final String? applicationBinaryModuleDir, final String? applicationBinaryModuleDir,
final AppVersionData? networkVersionData, final AppVersionData? networkVersionData,
final ThemeConf themeConf, final ThemeConf themeConf,
final Locale? appLocale}) = _$AppGlobalStateImpl; final Locale? appLocale,
final Box<dynamic>? appConfBox}) = _$AppGlobalStateImpl;
@override @override
String? get deviceUUID; String? get deviceUUID;
@ -260,7 +290,12 @@ abstract class _AppGlobalState implements AppGlobalState {
@override @override
Locale? get appLocale; Locale? get appLocale;
@override @override
@JsonKey(ignore: true) Box<dynamic>? get appConfBox;
/// Create a copy of AppGlobalState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$AppGlobalStateImplCopyWith<_$AppGlobalStateImpl> get copyWith => _$$AppGlobalStateImplCopyWith<_$AppGlobalStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -271,7 +306,9 @@ mixin _$ThemeConf {
Color get menuColor => throw _privateConstructorUsedError; Color get menuColor => throw _privateConstructorUsedError;
Color get micaColor => throw _privateConstructorUsedError; Color get micaColor => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of ThemeConf
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$ThemeConfCopyWith<ThemeConf> get copyWith => $ThemeConfCopyWith<ThemeConf> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -294,6 +331,8 @@ class _$ThemeConfCopyWithImpl<$Res, $Val extends ThemeConf>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of ThemeConf
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -337,6 +376,8 @@ class __$$ThemeConfImplCopyWithImpl<$Res>
_$ThemeConfImpl _value, $Res Function(_$ThemeConfImpl) _then) _$ThemeConfImpl _value, $Res Function(_$ThemeConfImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of ThemeConf
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -401,7 +442,9 @@ class _$ThemeConfImpl implements _ThemeConf {
int get hashCode => int get hashCode =>
Object.hash(runtimeType, backgroundColor, menuColor, micaColor); Object.hash(runtimeType, backgroundColor, menuColor, micaColor);
@JsonKey(ignore: true) /// Create a copy of ThemeConf
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$ThemeConfImplCopyWith<_$ThemeConfImpl> get copyWith => _$$ThemeConfImplCopyWith<_$ThemeConfImpl> get copyWith =>
@ -420,8 +463,11 @@ abstract class _ThemeConf implements ThemeConf {
Color get menuColor; Color get menuColor;
@override @override
Color get micaColor; Color get micaColor;
/// Create a copy of ThemeConf
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$ThemeConfImplCopyWith<_$ThemeConfImpl> get copyWith => _$$ThemeConfImplCopyWith<_$ThemeConfImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -6,7 +6,7 @@ part of 'app.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$routerHash() => r'e7b1e3a9fd74b4f00e3d71017615d7fb82bd649d'; String _$routerHash() => r'4fb9802d06347972b530f17ea7d66724a6ded997';
/// See also [router]. /// See also [router].
@ProviderFor(router) @ProviderFor(router)
@ -20,7 +20,7 @@ final routerProvider = AutoDisposeProvider<GoRouter>.internal(
); );
typedef RouterRef = AutoDisposeProviderRef<GoRouter>; typedef RouterRef = AutoDisposeProviderRef<GoRouter>;
String _$appGlobalModelHash() => r'9c114910aed546bfd469c8bbfa50cdd4a5be5028'; String _$appGlobalModelHash() => r'cf3d526a61cbadea4252c6f8e096a527d5cef50f';
/// See also [AppGlobalModel]. /// See also [AppGlobalModel].
@ProviderFor(AppGlobalModel) @ProviderFor(AppGlobalModel)

View File

@ -1,12 +1,14 @@
import 'dart:io'; import 'dart:io';
import 'package:archive/archive.dart'; import 'package:archive/archive.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
class BinaryModuleConf { class BinaryModuleConf {
static const _modules = { static const _modules = {
"aria2c": "0", "aria2c": "0",
"unp4kc": "1",
}; };
static Future extractModule(List<String> modules, String workingDir) async { static Future extractModule(List<String> modules, String workingDir) async {
@ -16,7 +18,8 @@ class BinaryModuleConf {
final version = m.value; final version = m.value;
final dir = "$workingDir\\$name"; final dir = "$workingDir\\$name";
final versionFile = File("$dir\\version"); final versionFile = File("$dir\\version");
if (await versionFile.exists() && if (kReleaseMode &&
await versionFile.exists() &&
(await versionFile.readAsString()).trim() == version) { (await versionFile.readAsString()).trim() == version) {
dPrint( dPrint(
"BinaryModuleConf.extractModule skip $name version == $version"); "BinaryModuleConf.extractModule skip $name version == $version");

View File

@ -1,8 +1,8 @@
class ConstConf { class ConstConf {
static const String appVersion = "2.10.9 Beta"; static const String appVersion = "2.12.2";
static const int appVersionCode = 44; static const int appVersionCode = 56;
static const String appVersionDate = "2024-03-26"; static const String appVersionDate = "2024-6-28";
static const gameChannels = ["LIVE", "PTU", "EPTU"]; static const gameChannels = ["LIVE", "PTU", "EPTU", "TECH-PREVIEW", "HOTFIX"];
static const isMSE = static const isMSE =
String.fromEnvironment("MSE", defaultValue: "false") == "true"; String.fromEnvironment("MSE", defaultValue: "false") == "true";
} }

View File

@ -4,8 +4,8 @@ import 'package:starcitizen_doctor/common/utils/log.dart';
class URLConf { class URLConf {
/// HOME API /// HOME API
static String gitApiHome = "https://git.sctoolbox.sccsgo.com"; static String gitApiHome = "https://git.scbox.xkeyc.cn";
static String rssApiHome = "https://rss.sctoolbox.sccsgo.com"; static String rssApiHome = "https://rss.scbox.xkeyc.cn";
static const String analyticsApiHome = "https://scbox.org"; static const String analyticsApiHome = "https://scbox.org";
static bool isUrlCheckPass = false; static bool isUrlCheckPass = false;
@ -16,6 +16,9 @@ class URLConf {
static String get gitlabLocalizationUrl => static String get gitlabLocalizationUrl =>
"$gitApiHome/SCToolBox/LocalizationData"; "$gitApiHome/SCToolBox/LocalizationData";
static String get gitApiRSILauncherEnhanceUrl =>
"$gitApiHome/SCToolBox/RSILauncherEnhance";
static String get apiRepoPath => "$gitApiHome/SCToolBox/api/raw/branch/main"; static String get apiRepoPath => "$gitApiHome/SCToolBox/api/raw/branch/main";
static String get gitlabApiPath => "$gitApiHome/api/v1/"; static String get gitlabApiPath => "$gitApiHome/api/v1/";
@ -26,8 +29,6 @@ class URLConf {
static String get rssVideoUrl => static String get rssVideoUrl =>
"$rssApiHome/bilibili/user/channel/27976358/290653"; "$rssApiHome/bilibili/user/channel/27976358/290653";
static String get rssTextUrl1 => "$rssApiHome/bilibili/user/article/40102960";
static String get rssTextUrl2 => static String get rssTextUrl2 =>
"$rssApiHome/baidu/tieba/user/%E7%81%AC%E7%81%ACG%E7%81%AC%E7%81%AC&"; "$rssApiHome/baidu/tieba/user/%E7%81%AC%E7%81%ACG%E7%81%AC%E7%81%AC&";

View File

@ -2,10 +2,12 @@ import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:starcitizen_doctor/common/conf/const_conf.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
class SCLoggerHelper { class SCLoggerHelper {
static Future<String?> getLogFilePath() async { static Future<String?> getLogFilePath() async {
if (!Platform.isWindows) return null;
Map<String, String> envVars = Platform.environment; Map<String, String> envVars = Platform.environment;
final appDataPath = envVars["appdata"]; final appDataPath = envVars["appdata"];
if (appDataPath == null) { if (appDataPath == null) {
@ -29,19 +31,16 @@ class SCLoggerHelper {
} }
static Future<List?> getLauncherLogList() async { static Future<List?> getLauncherLogList() async {
final jsonLogPath = await getLogFilePath(); if (!Platform.isWindows) return [];
if (jsonLogPath == null) return null; try {
var jsonString = utf8.decode(await File(jsonLogPath).readAsBytes()); final jsonLogPath = await getLogFilePath();
if (jsonString.endsWith("\n")) { if (jsonLogPath == null) throw "no file path";
jsonString = jsonString.substring(0, jsonString.length - 3); var jsonString = utf8.decode(await File(jsonLogPath).readAsBytes());
return jsonString.split("\n");
} catch (e) {
dPrint(e);
return [];
} }
if (jsonString.endsWith(" ")) {
jsonString = jsonString.substring(0, jsonString.length - 3);
}
if (jsonString.endsWith(",")) {
jsonString = jsonString.substring(0, jsonString.length - 3);
}
return json.decode("[$jsonString]");
} }
static Future<List<String>> getGameInstallPath(List listData, static Future<List<String>> getGameInstallPath(List listData,
@ -50,6 +49,8 @@ class SCLoggerHelper {
List<String> scInstallPaths = []; List<String> scInstallPaths = [];
checkAndAddPath(String path, bool checkExists) async { checkAndAddPath(String path, bool checkExists) async {
// \\ \
path = path.replaceAll(RegExp(r'\\+'), "\\");
if (path.isNotEmpty && !scInstallPaths.contains(path)) { if (path.isNotEmpty && !scInstallPaths.contains(path)) {
if (!checkExists) { if (!checkExists) {
dPrint("find installPath == $path"); dPrint("find installPath == $path");
@ -72,20 +73,29 @@ class SCLoggerHelper {
try { try {
for (var v in withVersion) { for (var v in withVersion) {
String pattern =
r'([a-zA-Z]:\\\\[^\\\\]*\\\\[^\\\\]*\\\\StarCitizen\\\\' + v + r')';
RegExp regExp = RegExp(pattern, caseSensitive: false);
for (var i = listData.length - 1; i > 0; i--) { for (var i = listData.length - 1; i > 0; i--) {
final m = listData[i]; final line = listData[i];
final info = m["[browser][info] "]; final matches = regExp.allMatches(line);
if (info is String) { for (var match in matches) {
String installPath = ""; await checkAndAddPath(match.group(0)!, checkExists);
if (info.contains("Installing Star Citizen $v")) { }
installPath = "${info.split(" at ")[1]}\\$v"; }
}
if (scInstallPaths.isNotEmpty) {
//
for (var fileName in List.from(scInstallPaths)) {
for (var v in withVersion) {
if (fileName.toString().endsWith(v)) {
for (var nv in withVersion) {
final nextName =
"${fileName.toString().replaceAll("\\$v", "")}\\$nv";
await checkAndAddPath(nextName, true);
}
} }
if (info.contains("Launching Star Citizen $v from")) {
installPath = info
.replaceAll("Launching Star Citizen $v from (", "")
.replaceAll(")", "");
}
await checkAndAddPath(installPath, checkExists);
} }
} }
} }
@ -94,22 +104,16 @@ class SCLoggerHelper {
if (scInstallPaths.isEmpty) rethrow; if (scInstallPaths.isEmpty) rethrow;
} }
if (scInstallPaths.isNotEmpty) { return scInstallPaths;
// }
for (var v in withVersion) {
for (var fileName in List.from(scInstallPaths)) { static String getGameChannelID(String installPath) {
if (fileName.toString().endsWith(v)) { for (var value in ConstConf.gameChannels) {
for (var nv in withVersion) { if (installPath.endsWith("\\$value")) {
final nextName = return value;
"${fileName.toString().replaceAll("\\$v", "")}\\$nv";
await checkAndAddPath(nextName, true);
}
}
}
} }
} }
return "UNKNOWN";
return scInstallPaths;
} }
static Future<List<String>?> getGameRunningLogs(String gameDir) async { static Future<List<String>?> getGameRunningLogs(String gameDir) async {
@ -171,6 +175,11 @@ class SCLoggerHelper {
return MapEntry(S.current.doctor_game_error_low_gpu_memory, return MapEntry(S.current.doctor_game_error_low_gpu_memory,
S.current.doctor_game_error_low_gpu_memory_info); S.current.doctor_game_error_low_gpu_memory_info);
} }
if (line.contains(
"try disabling with r_vulkanDisableLayers = 1 in your user.cfg")) {
return MapEntry(S.current.doctor_game_error_gpu_vulkan_crash,
S.current.doctor_game_error_gpu_vulkan_crash_info);
}
/// Unknown /// Unknown
if (line.contains("network.replicatedEntityHandle")) { if (line.contains("network.replicatedEntityHandle")) {

View File

@ -8,8 +8,8 @@ class SystemHelper {
static initPowershellPath() async { static initPowershellPath() async {
try { try {
var result = await Process.run(powershellPath, ["echo", "ping"]); var result = await Process.run(powershellPath, ["echo", "pong"]);
if (!result.stdout.toString().startsWith("ping") && if (!result.stdout.toString().startsWith("pong") &&
powershellPath == "powershell.exe") { powershellPath == "powershell.exe") {
throw "powershell check failed"; throw "powershell check failed";
} }
@ -82,11 +82,14 @@ class SystemHelper {
} }
/// RSI /// RSI
static Future<String> getRSILauncherPath() async { static Future<String> getRSILauncherPath({bool skipEXE = false}) async {
final confBox = await Hive.openBox("app_conf"); final confBox = await Hive.openBox("app_conf");
final path = confBox.get("custom_launcher_path"); final path = confBox.get("custom_launcher_path");
if (path != null && path != "") { if (path != null && path != "") {
if (await File(path).exists()) { if (await File(path).exists()) {
if (skipEXE) {
return "${path.toString().replaceAll("\\RSI Launcher.exe", "")}\\";
}
return path; return path;
} }
} }
@ -102,6 +105,9 @@ class SystemHelper {
]); ]);
if (r.stdout.toString().contains("RSI Launcher.exe")) { if (r.stdout.toString().contains("RSI Launcher.exe")) {
final start = r.stdout.toString().split("RSI Launcher.exe"); final start = r.stdout.toString().split("RSI Launcher.exe");
if (skipEXE) {
return start[0];
}
return "${start[0]}RSI Launcher.exe"; return "${start[0]}RSI Launcher.exe";
} }
} }
@ -255,15 +261,20 @@ foreach ($adapter in $adapterMemory) {
.toUpperCase(); .toUpperCase();
} }
static Future openDir(path) async { static Future openDir(path, {bool isFile = false}) async {
dPrint("SystemHelper.openDir path === $path"); dPrint("SystemHelper.openDir path === $path");
await Process.run( if (Platform.isWindows) {
SystemHelper.powershellPath, ["explorer.exe", "/select,\"\"$path\"\""]); await Process.run(SystemHelper.powershellPath,
["explorer.exe", isFile ? "/select,$path" : "\"/select,\"$path\"\""]);
}
} }
static String getHostsFilePath() { static String getHostsFilePath() {
final envVars = Platform.environment; if (Platform.isWindows) {
final systemRoot = envVars["SYSTEMROOT"]; final envVars = Platform.environment;
return "$systemRoot\\System32\\drivers\\etc\\hosts"; final systemRoot = envVars["SYSTEMROOT"];
return "$systemRoot\\System32\\drivers\\etc\\hosts";
}
return "/etc/hosts";
} }
} }

View File

@ -0,0 +1,41 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
Future<RsiLauncherAsarData> getRsiLauncherAsarData(
{required String asarPath}) =>
RustLib.instance.api
.crateApiAsarApiGetRsiLauncherAsarData(asarPath: asarPath);
class RsiLauncherAsarData {
final String asarPath;
final String mainJsPath;
final Uint8List mainJsContent;
const RsiLauncherAsarData({
required this.asarPath,
required this.mainJsPath,
required this.mainJsContent,
});
Future<void> writeMainJs({required List<int> content}) =>
RustLib.instance.api.crateApiAsarApiRsiLauncherAsarDataWriteMainJs(
that: this, content: content);
@override
int get hashCode =>
asarPath.hashCode ^ mainJsPath.hashCode ^ mainJsContent.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RsiLauncherAsarData &&
runtimeType == other.runtimeType &&
asarPath == other.asarPath &&
mainJsPath == other.mainJsPath &&
mainJsContent == other.mainJsContent;
}

View File

@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it. // This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28. // @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
@ -7,30 +7,29 @@ import '../frb_generated.dart';
import '../http_package.dart'; import '../http_package.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
Future<void> setDefaultHeader( // These functions are ignored because they are not marked as `pub`: `_my_method_to_hyper_method`
{required Map<String, String> headers, dynamic hint}) =>
RustLib.instance.api.setDefaultHeader(headers: headers, hint: hint); Future<void> setDefaultHeader({required Map<String, String> headers}) =>
RustLib.instance.api.crateApiHttpApiSetDefaultHeader(headers: headers);
Future<RustHttpResponse> fetch( Future<RustHttpResponse> fetch(
{required MyMethod method, {required MyMethod method,
required String url, required String url,
Map<String, String>? headers, Map<String, String>? headers,
Uint8List? inputData, Uint8List? inputData,
String? withIpAddress, String? withIpAddress}) =>
dynamic hint}) => RustLib.instance.api.crateApiHttpApiFetch(
RustLib.instance.api.fetch(
method: method, method: method,
url: url, url: url,
headers: headers, headers: headers,
inputData: inputData, inputData: inputData,
withIpAddress: withIpAddress, withIpAddress: withIpAddress);
hint: hint);
Future<List<String>> dnsLookupTxt({required String host, dynamic hint}) => Future<List<String>> dnsLookupTxt({required String host}) =>
RustLib.instance.api.dnsLookupTxt(host: host, hint: hint); RustLib.instance.api.crateApiHttpApiDnsLookupTxt(host: host);
Future<List<String>> dnsLookupIps({required String host, dynamic hint}) => Future<List<String>> dnsLookupIps({required String host}) =>
RustLib.instance.api.dnsLookupIps(host: host, hint: hint); RustLib.instance.api.crateApiHttpApiDnsLookupIps(host: host);
enum MyMethod { enum MyMethod {
options, options,
@ -42,4 +41,5 @@ enum MyMethod {
trace, trace,
connect, connect,
patch, patch,
;
} }

View File

@ -1,18 +0,0 @@
// This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
Stream<String> startProcess(
{required String executable,
required List<String> arguments,
required String workingDirectory,
dynamic hint}) =>
RustLib.instance.api.startProcess(
executable: executable,
arguments: arguments,
workingDirectory: workingDirectory,
hint: hint);

View File

@ -0,0 +1,54 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
// These functions are ignored because they are not marked as `pub`: `_process_output`
// These types are ignored because they are not used by any `pub` functions: `RsProcess`
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`
Stream<RsProcessStreamData> start(
{required String executable,
required List<String> arguments,
required String workingDirectory}) =>
RustLib.instance.api.crateApiRsProcessStart(
executable: executable,
arguments: arguments,
workingDirectory: workingDirectory);
Future<void> write({required int rsPid, required String data}) =>
RustLib.instance.api.crateApiRsProcessWrite(rsPid: rsPid, data: data);
class RsProcessStreamData {
final RsProcessStreamDataType dataType;
final String data;
final int rsPid;
const RsProcessStreamData({
required this.dataType,
required this.data,
required this.rsPid,
});
@override
int get hashCode => dataType.hashCode ^ data.hashCode ^ rsPid.hashCode;
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is RsProcessStreamData &&
runtimeType == other.runtimeType &&
dataType == other.dataType &&
data == other.data &&
rsPid == other.rsPid;
}
enum RsProcessStreamDataType {
output,
error,
exit,
;
}

View File

@ -0,0 +1,16 @@
// This file is automatically generated, so please do not edit it.
// @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
import '../frb_generated.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
Future<void> sendNotify(
{String? summary, String? body, String? appName, String? appId}) =>
RustLib.instance.api.crateApiWin32ApiSendNotify(
summary: summary, body: body, appName: appName, appId: appId);
Future<bool> setForegroundWindow({required String windowName}) =>
RustLib.instance.api
.crateApiWin32ApiSetForegroundWindow(windowName: windowName);

View File

@ -1,13 +1,17 @@
// This file is automatically generated, so please do not edit it. // This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28. // @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
import 'api/asar_api.dart';
import 'api/http_api.dart'; import 'api/http_api.dart';
import 'api/process_api.dart'; import 'api/rs_process.dart';
import 'api/win32_api.dart';
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'frb_generated.io.dart' if (dart.library.html) 'frb_generated.web.dart'; import 'frb_generated.dart';
import 'frb_generated.io.dart'
if (dart.library.js_interop) 'frb_generated.web.dart';
import 'http_package.dart'; import 'http_package.dart';
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart'; import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
@ -31,6 +35,16 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
); );
} }
/// Initialize flutter_rust_bridge in mock mode.
/// No libraries for FFI are loaded.
static void initMock({
required RustLibApi api,
}) {
instance.initMockImpl(
api: api,
);
}
/// Dispose flutter_rust_bridge /// Dispose flutter_rust_bridge
/// ///
/// The call to this function is optional, since flutter_rust_bridge (and everything else) /// The call to this function is optional, since flutter_rust_bridge (and everything else)
@ -53,7 +67,10 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
kDefaultExternalLibraryLoaderConfig; kDefaultExternalLibraryLoaderConfig;
@override @override
String get codegenVersion => '2.0.0-dev.28'; String get codegenVersion => '2.4.0';
@override
int get rustContentHash => 1832496273;
static const kDefaultExternalLibraryLoaderConfig = static const kDefaultExternalLibraryLoaderConfig =
ExternalLibraryLoaderConfig( ExternalLibraryLoaderConfig(
@ -64,26 +81,39 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
} }
abstract class RustLibApi extends BaseApi { abstract class RustLibApi extends BaseApi {
Future<List<String>> dnsLookupIps({required String host, dynamic hint}); Future<RsiLauncherAsarData> crateApiAsarApiGetRsiLauncherAsarData(
{required String asarPath});
Future<List<String>> dnsLookupTxt({required String host, dynamic hint}); Future<void> crateApiAsarApiRsiLauncherAsarDataWriteMainJs(
{required RsiLauncherAsarData that, required List<int> content});
Future<RustHttpResponse> fetch( Future<List<String>> crateApiHttpApiDnsLookupIps({required String host});
Future<List<String>> crateApiHttpApiDnsLookupTxt({required String host});
Future<RustHttpResponse> crateApiHttpApiFetch(
{required MyMethod method, {required MyMethod method,
required String url, required String url,
Map<String, String>? headers, Map<String, String>? headers,
Uint8List? inputData, Uint8List? inputData,
String? withIpAddress, String? withIpAddress});
dynamic hint});
Future<void> setDefaultHeader( Future<void> crateApiHttpApiSetDefaultHeader(
{required Map<String, String> headers, dynamic hint}); {required Map<String, String> headers});
Stream<String> startProcess( Stream<RsProcessStreamData> crateApiRsProcessStart(
{required String executable, {required String executable,
required List<String> arguments, required List<String> arguments,
required String workingDirectory, required String workingDirectory});
dynamic hint});
Future<void> crateApiRsProcessWrite(
{required int rsPid, required String data});
Future<void> crateApiWin32ApiSendNotify(
{String? summary, String? body, String? appName, String? appId});
Future<bool> crateApiWin32ApiSetForegroundWindow(
{required String windowName});
} }
class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
@ -95,59 +125,110 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
}); });
@override @override
Future<List<String>> dnsLookupIps({required String host, dynamic hint}) { Future<RsiLauncherAsarData> crateApiAsarApiGetRsiLauncherAsarData(
{required String asarPath}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_String(asarPath);
return wire.wire__crate__api__asar_api__get_rsi_launcher_asar_data(
port_, arg0);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_rsi_launcher_asar_data,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiAsarApiGetRsiLauncherAsarDataConstMeta,
argValues: [asarPath],
apiImpl: this,
));
}
TaskConstMeta get kCrateApiAsarApiGetRsiLauncherAsarDataConstMeta =>
const TaskConstMeta(
debugName: "get_rsi_launcher_asar_data",
argNames: ["asarPath"],
);
@override
Future<void> crateApiAsarApiRsiLauncherAsarDataWriteMainJs(
{required RsiLauncherAsarData that, required List<int> content}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_box_autoadd_rsi_launcher_asar_data(that);
var arg1 = cst_encode_list_prim_u_8_loose(content);
return wire
.wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_js(
port_, arg0, arg1);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_unit,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiAsarApiRsiLauncherAsarDataWriteMainJsConstMeta,
argValues: [that, content],
apiImpl: this,
));
}
TaskConstMeta get kCrateApiAsarApiRsiLauncherAsarDataWriteMainJsConstMeta =>
const TaskConstMeta(
debugName: "rsi_launcher_asar_data_write_main_js",
argNames: ["that", "content"],
);
@override
Future<List<String>> crateApiHttpApiDnsLookupIps({required String host}) {
return handler.executeNormal(NormalTask( return handler.executeNormal(NormalTask(
callFfi: (port_) { callFfi: (port_) {
var arg0 = cst_encode_String(host); var arg0 = cst_encode_String(host);
return wire.wire_dns_lookup_ips(port_, arg0); return wire.wire__crate__api__http_api__dns_lookup_ips(port_, arg0);
}, },
codec: DcoCodec( codec: DcoCodec(
decodeSuccessData: dco_decode_list_String, decodeSuccessData: dco_decode_list_String,
decodeErrorData: dco_decode_AnyhowException, decodeErrorData: dco_decode_AnyhowException,
), ),
constMeta: kDnsLookupIpsConstMeta, constMeta: kCrateApiHttpApiDnsLookupIpsConstMeta,
argValues: [host], argValues: [host],
apiImpl: this, apiImpl: this,
hint: hint,
)); ));
} }
TaskConstMeta get kDnsLookupIpsConstMeta => const TaskConstMeta( TaskConstMeta get kCrateApiHttpApiDnsLookupIpsConstMeta =>
const TaskConstMeta(
debugName: "dns_lookup_ips", debugName: "dns_lookup_ips",
argNames: ["host"], argNames: ["host"],
); );
@override @override
Future<List<String>> dnsLookupTxt({required String host, dynamic hint}) { Future<List<String>> crateApiHttpApiDnsLookupTxt({required String host}) {
return handler.executeNormal(NormalTask( return handler.executeNormal(NormalTask(
callFfi: (port_) { callFfi: (port_) {
var arg0 = cst_encode_String(host); var arg0 = cst_encode_String(host);
return wire.wire_dns_lookup_txt(port_, arg0); return wire.wire__crate__api__http_api__dns_lookup_txt(port_, arg0);
}, },
codec: DcoCodec( codec: DcoCodec(
decodeSuccessData: dco_decode_list_String, decodeSuccessData: dco_decode_list_String,
decodeErrorData: dco_decode_AnyhowException, decodeErrorData: dco_decode_AnyhowException,
), ),
constMeta: kDnsLookupTxtConstMeta, constMeta: kCrateApiHttpApiDnsLookupTxtConstMeta,
argValues: [host], argValues: [host],
apiImpl: this, apiImpl: this,
hint: hint,
)); ));
} }
TaskConstMeta get kDnsLookupTxtConstMeta => const TaskConstMeta( TaskConstMeta get kCrateApiHttpApiDnsLookupTxtConstMeta =>
const TaskConstMeta(
debugName: "dns_lookup_txt", debugName: "dns_lookup_txt",
argNames: ["host"], argNames: ["host"],
); );
@override @override
Future<RustHttpResponse> fetch( Future<RustHttpResponse> crateApiHttpApiFetch(
{required MyMethod method, {required MyMethod method,
required String url, required String url,
Map<String, String>? headers, Map<String, String>? headers,
Uint8List? inputData, Uint8List? inputData,
String? withIpAddress, String? withIpAddress}) {
dynamic hint}) {
return handler.executeNormal(NormalTask( return handler.executeNormal(NormalTask(
callFfi: (port_) { callFfi: (port_) {
var arg0 = cst_encode_my_method(method); var arg0 = cst_encode_my_method(method);
@ -155,75 +236,153 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
var arg2 = cst_encode_opt_Map_String_String(headers); var arg2 = cst_encode_opt_Map_String_String(headers);
var arg3 = cst_encode_opt_list_prim_u_8_strict(inputData); var arg3 = cst_encode_opt_list_prim_u_8_strict(inputData);
var arg4 = cst_encode_opt_String(withIpAddress); var arg4 = cst_encode_opt_String(withIpAddress);
return wire.wire_fetch(port_, arg0, arg1, arg2, arg3, arg4); return wire.wire__crate__api__http_api__fetch(
port_, arg0, arg1, arg2, arg3, arg4);
}, },
codec: DcoCodec( codec: DcoCodec(
decodeSuccessData: dco_decode_rust_http_response, decodeSuccessData: dco_decode_rust_http_response,
decodeErrorData: dco_decode_AnyhowException, decodeErrorData: dco_decode_AnyhowException,
), ),
constMeta: kFetchConstMeta, constMeta: kCrateApiHttpApiFetchConstMeta,
argValues: [method, url, headers, inputData, withIpAddress], argValues: [method, url, headers, inputData, withIpAddress],
apiImpl: this, apiImpl: this,
hint: hint,
)); ));
} }
TaskConstMeta get kFetchConstMeta => const TaskConstMeta( TaskConstMeta get kCrateApiHttpApiFetchConstMeta => const TaskConstMeta(
debugName: "fetch", debugName: "fetch",
argNames: ["method", "url", "headers", "inputData", "withIpAddress"], argNames: ["method", "url", "headers", "inputData", "withIpAddress"],
); );
@override @override
Future<void> setDefaultHeader( Future<void> crateApiHttpApiSetDefaultHeader(
{required Map<String, String> headers, dynamic hint}) { {required Map<String, String> headers}) {
return handler.executeNormal(NormalTask( return handler.executeNormal(NormalTask(
callFfi: (port_) { callFfi: (port_) {
var arg0 = cst_encode_Map_String_String(headers); var arg0 = cst_encode_Map_String_String(headers);
return wire.wire_set_default_header(port_, arg0); return wire.wire__crate__api__http_api__set_default_header(port_, arg0);
}, },
codec: DcoCodec( codec: DcoCodec(
decodeSuccessData: dco_decode_unit, decodeSuccessData: dco_decode_unit,
decodeErrorData: null, decodeErrorData: null,
), ),
constMeta: kSetDefaultHeaderConstMeta, constMeta: kCrateApiHttpApiSetDefaultHeaderConstMeta,
argValues: [headers], argValues: [headers],
apiImpl: this, apiImpl: this,
hint: hint,
)); ));
} }
TaskConstMeta get kSetDefaultHeaderConstMeta => const TaskConstMeta( TaskConstMeta get kCrateApiHttpApiSetDefaultHeaderConstMeta =>
const TaskConstMeta(
debugName: "set_default_header", debugName: "set_default_header",
argNames: ["headers"], argNames: ["headers"],
); );
@override @override
Stream<String> startProcess( Stream<RsProcessStreamData> crateApiRsProcessStart(
{required String executable, {required String executable,
required List<String> arguments, required List<String> arguments,
required String workingDirectory, required String workingDirectory}) {
dynamic hint}) { final streamSink = RustStreamSink<RsProcessStreamData>();
return handler.executeStream(StreamTask( unawaited(handler.executeNormal(NormalTask(
callFfi: (port_) { callFfi: (port_) {
var arg0 = cst_encode_String(executable); var arg0 = cst_encode_String(executable);
var arg1 = cst_encode_list_String(arguments); var arg1 = cst_encode_list_String(arguments);
var arg2 = cst_encode_String(workingDirectory); var arg2 = cst_encode_String(workingDirectory);
return wire.wire_start_process(port_, arg0, arg1, arg2); var arg3 = cst_encode_StreamSink_rs_process_stream_data_Dco(streamSink);
return wire.wire__crate__api__rs_process__start(
port_, arg0, arg1, arg2, arg3);
}, },
codec: DcoCodec( codec: DcoCodec(
decodeSuccessData: dco_decode_String, decodeSuccessData: dco_decode_unit,
decodeErrorData: null, decodeErrorData: null,
), ),
constMeta: kStartProcessConstMeta, constMeta: kCrateApiRsProcessStartConstMeta,
argValues: [executable, arguments, workingDirectory], argValues: [executable, arguments, workingDirectory, streamSink],
apiImpl: this,
)));
return streamSink.stream;
}
TaskConstMeta get kCrateApiRsProcessStartConstMeta => const TaskConstMeta(
debugName: "start",
argNames: ["executable", "arguments", "workingDirectory", "streamSink"],
);
@override
Future<void> crateApiRsProcessWrite(
{required int rsPid, required String data}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_u_32(rsPid);
var arg1 = cst_encode_String(data);
return wire.wire__crate__api__rs_process__write(port_, arg0, arg1);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_unit,
decodeErrorData: null,
),
constMeta: kCrateApiRsProcessWriteConstMeta,
argValues: [rsPid, data],
apiImpl: this, apiImpl: this,
hint: hint,
)); ));
} }
TaskConstMeta get kStartProcessConstMeta => const TaskConstMeta( TaskConstMeta get kCrateApiRsProcessWriteConstMeta => const TaskConstMeta(
debugName: "start_process", debugName: "write",
argNames: ["executable", "arguments", "workingDirectory"], argNames: ["rsPid", "data"],
);
@override
Future<void> crateApiWin32ApiSendNotify(
{String? summary, String? body, String? appName, String? appId}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_opt_String(summary);
var arg1 = cst_encode_opt_String(body);
var arg2 = cst_encode_opt_String(appName);
var arg3 = cst_encode_opt_String(appId);
return wire.wire__crate__api__win32_api__send_notify(
port_, arg0, arg1, arg2, arg3);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_unit,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiWin32ApiSendNotifyConstMeta,
argValues: [summary, body, appName, appId],
apiImpl: this,
));
}
TaskConstMeta get kCrateApiWin32ApiSendNotifyConstMeta => const TaskConstMeta(
debugName: "send_notify",
argNames: ["summary", "body", "appName", "appId"],
);
@override
Future<bool> crateApiWin32ApiSetForegroundWindow(
{required String windowName}) {
return handler.executeNormal(NormalTask(
callFfi: (port_) {
var arg0 = cst_encode_String(windowName);
return wire.wire__crate__api__win32_api__set_foreground_window(
port_, arg0);
},
codec: DcoCodec(
decodeSuccessData: dco_decode_bool,
decodeErrorData: dco_decode_AnyhowException,
),
constMeta: kCrateApiWin32ApiSetForegroundWindowConstMeta,
argValues: [windowName],
apiImpl: this,
));
}
TaskConstMeta get kCrateApiWin32ApiSetForegroundWindowConstMeta =>
const TaskConstMeta(
debugName: "set_foreground_window",
argNames: ["windowName"],
); );
@protected @protected
@ -239,6 +398,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
.map((e) => MapEntry(e.$1, e.$2))); .map((e) => MapEntry(e.$1, e.$2)));
} }
@protected
RustStreamSink<RsProcessStreamData>
dco_decode_StreamSink_rs_process_stream_data_Dco(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
throw UnimplementedError();
}
@protected @protected
String dco_decode_String(dynamic raw) { String dco_decode_String(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -246,7 +412,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int dco_decode_box_autoadd_u_64(dynamic raw) { bool dco_decode_bool(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw as bool;
}
@protected
RsiLauncherAsarData dco_decode_box_autoadd_rsi_launcher_asar_data(
dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return dco_decode_rsi_launcher_asar_data(raw);
}
@protected
BigInt dco_decode_box_autoadd_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
return dco_decode_u_64(raw); return dco_decode_u_64(raw);
} }
@ -263,6 +442,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return (raw as List<dynamic>).map(dco_decode_String).toList(); return (raw as List<dynamic>).map(dco_decode_String).toList();
} }
@protected
List<int> dco_decode_list_prim_u_8_loose(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return raw as List<int>;
}
@protected @protected
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) { Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -300,7 +485,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int? dco_decode_opt_box_autoadd_u_64(dynamic raw) { BigInt? dco_decode_opt_box_autoadd_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
return raw == null ? null : dco_decode_box_autoadd_u_64(raw); return raw == null ? null : dco_decode_box_autoadd_u_64(raw);
} }
@ -324,6 +509,38 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
); );
} }
@protected
RsProcessStreamData dco_decode_rs_process_stream_data(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return RsProcessStreamData(
dataType: dco_decode_rs_process_stream_data_type(arr[0]),
data: dco_decode_String(arr[1]),
rsPid: dco_decode_u_32(arr[2]),
);
}
@protected
RsProcessStreamDataType dco_decode_rs_process_stream_data_type(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return RsProcessStreamDataType.values[raw as int];
}
@protected
RsiLauncherAsarData dco_decode_rsi_launcher_asar_data(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>;
if (arr.length != 3)
throw Exception('unexpected arr length: expect 3 but see ${arr.length}');
return RsiLauncherAsarData(
asarPath: dco_decode_String(arr[0]),
mainJsPath: dco_decode_String(arr[1]),
mainJsContent: dco_decode_list_prim_u_8_strict(arr[2]),
);
}
@protected @protected
RustHttpResponse dco_decode_rust_http_response(dynamic raw) { RustHttpResponse dco_decode_rust_http_response(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
@ -348,9 +565,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int dco_decode_u_64(dynamic raw) { int dco_decode_u_32(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
return dcoDecodeI64OrU64(raw); return raw as int;
}
@protected
BigInt dco_decode_u_64(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs
return dcoDecodeU64(raw);
} }
@protected @protected
@ -380,6 +603,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2))); return Map.fromEntries(inner.map((e) => MapEntry(e.$1, e.$2)));
} }
@protected
RustStreamSink<RsProcessStreamData>
sse_decode_StreamSink_rs_process_stream_data_Dco(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
throw UnimplementedError('Unreachable ()');
}
@protected @protected
String sse_decode_String(SseDeserializer deserializer) { String sse_decode_String(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -388,7 +619,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int sse_decode_box_autoadd_u_64(SseDeserializer deserializer) { bool sse_decode_bool(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getUint8() != 0;
}
@protected
RsiLauncherAsarData sse_decode_box_autoadd_rsi_launcher_asar_data(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return (sse_decode_rsi_launcher_asar_data(deserializer));
}
@protected
BigInt sse_decode_box_autoadd_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
return (sse_decode_u_64(deserializer)); return (sse_decode_u_64(deserializer));
} }
@ -411,6 +655,13 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return ans_; return ans_;
} }
@protected
List<int> sse_decode_list_prim_u_8_loose(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var len_ = sse_decode_i_32(deserializer);
return deserializer.buffer.getUint8List(len_);
}
@protected @protected
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) { Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -469,7 +720,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer) { BigInt? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
if (sse_decode_bool(deserializer)) { if (sse_decode_bool(deserializer)) {
@ -499,6 +750,38 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return (var_field0, var_field1); return (var_field0, var_field1);
} }
@protected
RsProcessStreamData sse_decode_rs_process_stream_data(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_dataType = sse_decode_rs_process_stream_data_type(deserializer);
var var_data = sse_decode_String(deserializer);
var var_rsPid = sse_decode_u_32(deserializer);
return RsProcessStreamData(
dataType: var_dataType, data: var_data, rsPid: var_rsPid);
}
@protected
RsProcessStreamDataType sse_decode_rs_process_stream_data_type(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var inner = sse_decode_i_32(deserializer);
return RsProcessStreamDataType.values[inner];
}
@protected
RsiLauncherAsarData sse_decode_rsi_launcher_asar_data(
SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
var var_asarPath = sse_decode_String(deserializer);
var var_mainJsPath = sse_decode_String(deserializer);
var var_mainJsContent = sse_decode_list_prim_u_8_strict(deserializer);
return RsiLauncherAsarData(
asarPath: var_asarPath,
mainJsPath: var_mainJsPath,
mainJsContent: var_mainJsContent);
}
@protected @protected
RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer) { RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -526,9 +809,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
int sse_decode_u_64(SseDeserializer deserializer) { int sse_decode_u_32(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getUint64(); return deserializer.buffer.getUint32();
}
@protected
BigInt sse_decode_u_64(SseDeserializer deserializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
return deserializer.buffer.getBigUint64();
} }
@protected @protected
@ -543,9 +832,9 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
bool sse_decode_bool(SseDeserializer deserializer) { bool cst_encode_bool(bool raw) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
return deserializer.buffer.getUint8() != 0; return raw;
} }
@protected @protected
@ -566,12 +855,24 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
return cst_encode_i_32(raw.index); return cst_encode_i_32(raw.index);
} }
@protected
int cst_encode_rs_process_stream_data_type(RsProcessStreamDataType raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return cst_encode_i_32(raw.index);
}
@protected @protected
int cst_encode_u_16(int raw) { int cst_encode_u_16(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
return raw; return raw;
} }
@protected
int cst_encode_u_32(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return raw;
}
@protected @protected
int cst_encode_u_8(int raw) { int cst_encode_u_8(int raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
@ -588,7 +889,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
void sse_encode_AnyhowException( void sse_encode_AnyhowException(
AnyhowException self, SseSerializer serializer) { AnyhowException self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
throw UnimplementedError('Unreachable (('); sse_encode_String(self.message, serializer);
} }
@protected @protected
@ -599,6 +900,19 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
self.entries.map((e) => (e.key, e.value)).toList(), serializer); self.entries.map((e) => (e.key, e.value)).toList(), serializer);
} }
@protected
void sse_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(
self.setupAndSerialize(
codec: DcoCodec(
decodeSuccessData: dco_decode_rs_process_stream_data,
decodeErrorData: dco_decode_AnyhowException,
)),
serializer);
}
@protected @protected
void sse_encode_String(String self, SseSerializer serializer) { void sse_encode_String(String self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
@ -606,7 +920,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
void sse_encode_box_autoadd_u_64(int self, SseSerializer serializer) { void sse_encode_bool(bool self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putUint8(self ? 1 : 0);
}
@protected
void sse_encode_box_autoadd_rsi_launcher_asar_data(
RsiLauncherAsarData self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_rsi_launcher_asar_data(self, serializer);
}
@protected
void sse_encode_box_autoadd_u_64(BigInt self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_u_64(self, serializer); sse_encode_u_64(self, serializer);
} }
@ -626,6 +953,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
} }
@protected
void sse_encode_list_prim_u_8_loose(
List<int> self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.length, serializer);
serializer.buffer
.putUint8List(self is Uint8List ? self : Uint8List.fromList(self));
}
@protected @protected
void sse_encode_list_prim_u_8_strict( void sse_encode_list_prim_u_8_strict(
Uint8List self, SseSerializer serializer) { Uint8List self, SseSerializer serializer) {
@ -679,7 +1015,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
void sse_encode_opt_box_autoadd_u_64(int? self, SseSerializer serializer) { void sse_encode_opt_box_autoadd_u_64(BigInt? self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_bool(self != null, serializer); sse_encode_bool(self != null, serializer);
@ -707,6 +1043,31 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_String(self.$2, serializer); sse_encode_String(self.$2, serializer);
} }
@protected
void sse_encode_rs_process_stream_data(
RsProcessStreamData self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_rs_process_stream_data_type(self.dataType, serializer);
sse_encode_String(self.data, serializer);
sse_encode_u_32(self.rsPid, serializer);
}
@protected
void sse_encode_rs_process_stream_data_type(
RsProcessStreamDataType self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_i_32(self.index, serializer);
}
@protected
void sse_encode_rsi_launcher_asar_data(
RsiLauncherAsarData self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
sse_encode_String(self.asarPath, serializer);
sse_encode_String(self.mainJsPath, serializer);
sse_encode_list_prim_u_8_strict(self.mainJsContent, serializer);
}
@protected @protected
void sse_encode_rust_http_response( void sse_encode_rust_http_response(
RustHttpResponse self, SseSerializer serializer) { RustHttpResponse self, SseSerializer serializer) {
@ -727,9 +1088,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
} }
@protected @protected
void sse_encode_u_64(int self, SseSerializer serializer) { void sse_encode_u_32(int self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putUint64(self); serializer.buffer.putUint32(self);
}
@protected
void sse_encode_u_64(BigInt self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putBigUint64(self);
} }
@protected @protected
@ -742,10 +1109,4 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
void sse_encode_unit(void self, SseSerializer serializer) { void sse_encode_unit(void self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs // Codec=Sse (Serialization based), see doc to use other codecs
} }
@protected
void sse_encode_bool(bool self, SseSerializer serializer) {
// Codec=Sse (Serialization based), see doc to use other codecs
serializer.buffer.putUint8(self ? 1 : 0);
}
} }

View File

@ -1,10 +1,12 @@
// This file is automatically generated, so please do not edit it. // This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28. // @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field // ignore_for_file: unused_import, unused_element, unnecessary_import, duplicate_ignore, invalid_use_of_internal_member, annotate_overrides, non_constant_identifier_names, curly_braces_in_flow_control_structures, prefer_const_literals_to_create_immutables, unused_field
import 'api/asar_api.dart';
import 'api/http_api.dart'; import 'api/http_api.dart';
import 'api/process_api.dart'; import 'api/rs_process.dart';
import 'api/win32_api.dart';
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:ffi' as ffi; import 'dart:ffi' as ffi;
@ -26,11 +28,22 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
Map<String, String> dco_decode_Map_String_String(dynamic raw); Map<String, String> dco_decode_Map_String_String(dynamic raw);
@protected
RustStreamSink<RsProcessStreamData>
dco_decode_StreamSink_rs_process_stream_data_Dco(dynamic raw);
@protected @protected
String dco_decode_String(dynamic raw); String dco_decode_String(dynamic raw);
@protected @protected
int dco_decode_box_autoadd_u_64(dynamic raw); bool dco_decode_bool(dynamic raw);
@protected
RsiLauncherAsarData dco_decode_box_autoadd_rsi_launcher_asar_data(
dynamic raw);
@protected
BigInt dco_decode_box_autoadd_u_64(dynamic raw);
@protected @protected
int dco_decode_i_32(dynamic raw); int dco_decode_i_32(dynamic raw);
@ -38,6 +51,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> dco_decode_list_String(dynamic raw); List<String> dco_decode_list_String(dynamic raw);
@protected
List<int> dco_decode_list_prim_u_8_loose(dynamic raw);
@protected @protected
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw); Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
@ -57,7 +73,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
String? dco_decode_opt_String(dynamic raw); String? dco_decode_opt_String(dynamic raw);
@protected @protected
int? dco_decode_opt_box_autoadd_u_64(dynamic raw); BigInt? dco_decode_opt_box_autoadd_u_64(dynamic raw);
@protected @protected
Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw); Uint8List? dco_decode_opt_list_prim_u_8_strict(dynamic raw);
@ -65,6 +81,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
(String, String) dco_decode_record_string_string(dynamic raw); (String, String) dco_decode_record_string_string(dynamic raw);
@protected
RsProcessStreamData dco_decode_rs_process_stream_data(dynamic raw);
@protected
RsProcessStreamDataType dco_decode_rs_process_stream_data_type(dynamic raw);
@protected
RsiLauncherAsarData dco_decode_rsi_launcher_asar_data(dynamic raw);
@protected @protected
RustHttpResponse dco_decode_rust_http_response(dynamic raw); RustHttpResponse dco_decode_rust_http_response(dynamic raw);
@ -72,7 +97,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
int dco_decode_u_16(dynamic raw); int dco_decode_u_16(dynamic raw);
@protected @protected
int dco_decode_u_64(dynamic raw); int dco_decode_u_32(dynamic raw);
@protected
BigInt dco_decode_u_64(dynamic raw);
@protected @protected
int dco_decode_u_8(dynamic raw); int dco_decode_u_8(dynamic raw);
@ -87,11 +115,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
Map<String, String> sse_decode_Map_String_String( Map<String, String> sse_decode_Map_String_String(
SseDeserializer deserializer); SseDeserializer deserializer);
@protected
RustStreamSink<RsProcessStreamData>
sse_decode_StreamSink_rs_process_stream_data_Dco(
SseDeserializer deserializer);
@protected @protected
String sse_decode_String(SseDeserializer deserializer); String sse_decode_String(SseDeserializer deserializer);
@protected @protected
int sse_decode_box_autoadd_u_64(SseDeserializer deserializer); bool sse_decode_bool(SseDeserializer deserializer);
@protected
RsiLauncherAsarData sse_decode_box_autoadd_rsi_launcher_asar_data(
SseDeserializer deserializer);
@protected
BigInt sse_decode_box_autoadd_u_64(SseDeserializer deserializer);
@protected @protected
int sse_decode_i_32(SseDeserializer deserializer); int sse_decode_i_32(SseDeserializer deserializer);
@ -99,6 +139,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
List<String> sse_decode_list_String(SseDeserializer deserializer); List<String> sse_decode_list_String(SseDeserializer deserializer);
@protected
List<int> sse_decode_list_prim_u_8_loose(SseDeserializer deserializer);
@protected @protected
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer); Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
@ -120,7 +163,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
String? sse_decode_opt_String(SseDeserializer deserializer); String? sse_decode_opt_String(SseDeserializer deserializer);
@protected @protected
int? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer); BigInt? sse_decode_opt_box_autoadd_u_64(SseDeserializer deserializer);
@protected @protected
Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer); Uint8List? sse_decode_opt_list_prim_u_8_strict(SseDeserializer deserializer);
@ -129,6 +172,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
(String, String) sse_decode_record_string_string( (String, String) sse_decode_record_string_string(
SseDeserializer deserializer); SseDeserializer deserializer);
@protected
RsProcessStreamData sse_decode_rs_process_stream_data(
SseDeserializer deserializer);
@protected
RsProcessStreamDataType sse_decode_rs_process_stream_data_type(
SseDeserializer deserializer);
@protected
RsiLauncherAsarData sse_decode_rsi_launcher_asar_data(
SseDeserializer deserializer);
@protected @protected
RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer); RustHttpResponse sse_decode_rust_http_response(SseDeserializer deserializer);
@ -136,7 +191,10 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
int sse_decode_u_16(SseDeserializer deserializer); int sse_decode_u_16(SseDeserializer deserializer);
@protected @protected
int sse_decode_u_64(SseDeserializer deserializer); int sse_decode_u_32(SseDeserializer deserializer);
@protected
BigInt sse_decode_u_64(SseDeserializer deserializer);
@protected @protected
int sse_decode_u_8(SseDeserializer deserializer); int sse_decode_u_8(SseDeserializer deserializer);
@ -144,9 +202,6 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_decode_unit(SseDeserializer deserializer); void sse_decode_unit(SseDeserializer deserializer);
@protected
bool sse_decode_bool(SseDeserializer deserializer);
@protected @protected
ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_AnyhowException( ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_AnyhowException(
AnyhowException raw) { AnyhowException raw) {
@ -162,6 +217,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
raw.entries.map((e) => (e.key, e.value)).toList()); raw.entries.map((e) => (e.key, e.value)).toList());
} }
@protected
ffi.Pointer<wire_cst_list_prim_u_8_strict>
cst_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
return cst_encode_String(raw.setupAndSerialize(
codec: DcoCodec(
decodeSuccessData: dco_decode_rs_process_stream_data,
decodeErrorData: dco_decode_AnyhowException,
)));
}
@protected @protected
ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_String(String raw) { ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_String(String raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
@ -169,7 +236,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
} }
@protected @protected
ffi.Pointer<ffi.Uint64> cst_encode_box_autoadd_u_64(int raw) { ffi.Pointer<wire_cst_rsi_launcher_asar_data>
cst_encode_box_autoadd_rsi_launcher_asar_data(RsiLauncherAsarData raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
final ptr = wire.cst_new_box_autoadd_rsi_launcher_asar_data();
cst_api_fill_to_wire_rsi_launcher_asar_data(raw, ptr.ref);
return ptr;
}
@protected
ffi.Pointer<ffi.Uint64> cst_encode_box_autoadd_u_64(BigInt raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
return wire.cst_new_box_autoadd_u_64(cst_encode_u_64(raw)); return wire.cst_new_box_autoadd_u_64(cst_encode_u_64(raw));
} }
@ -184,6 +260,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
return ans; return ans;
} }
@protected
ffi.Pointer<wire_cst_list_prim_u_8_loose> cst_encode_list_prim_u_8_loose(
List<int> raw) {
// Codec=Cst (C-struct based), see doc to use other codecs
final ans = wire.cst_new_list_prim_u_8_loose(raw.length);
ans.ref.ptr.asTypedList(raw.length).setAll(0, raw);
return ans;
}
@protected @protected
ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_list_prim_u_8_strict( ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_encode_list_prim_u_8_strict(
Uint8List raw) { Uint8List raw) {
@ -219,7 +304,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
} }
@protected @protected
ffi.Pointer<ffi.Uint64> cst_encode_opt_box_autoadd_u_64(int? raw) { ffi.Pointer<ffi.Uint64> cst_encode_opt_box_autoadd_u_64(BigInt? raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
return raw == null ? ffi.nullptr : cst_encode_box_autoadd_u_64(raw); return raw == null ? ffi.nullptr : cst_encode_box_autoadd_u_64(raw);
} }
@ -232,9 +317,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
} }
@protected @protected
int cst_encode_u_64(int raw) { int cst_encode_u_64(BigInt raw) {
// Codec=Cst (C-struct based), see doc to use other codecs // Codec=Cst (C-struct based), see doc to use other codecs
return raw.toInt(); return raw.toSigned(64).toInt();
}
@protected
void cst_api_fill_to_wire_box_autoadd_rsi_launcher_asar_data(
RsiLauncherAsarData apiObj,
ffi.Pointer<wire_cst_rsi_launcher_asar_data> wireObj) {
cst_api_fill_to_wire_rsi_launcher_asar_data(apiObj, wireObj.ref);
} }
@protected @protected
@ -244,6 +336,23 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
wireObj.field1 = cst_encode_String(apiObj.$2); wireObj.field1 = cst_encode_String(apiObj.$2);
} }
@protected
void cst_api_fill_to_wire_rs_process_stream_data(
RsProcessStreamData apiObj, wire_cst_rs_process_stream_data wireObj) {
wireObj.data_type = cst_encode_rs_process_stream_data_type(apiObj.dataType);
wireObj.data = cst_encode_String(apiObj.data);
wireObj.rs_pid = cst_encode_u_32(apiObj.rsPid);
}
@protected
void cst_api_fill_to_wire_rsi_launcher_asar_data(
RsiLauncherAsarData apiObj, wire_cst_rsi_launcher_asar_data wireObj) {
wireObj.asar_path = cst_encode_String(apiObj.asarPath);
wireObj.main_js_path = cst_encode_String(apiObj.mainJsPath);
wireObj.main_js_content =
cst_encode_list_prim_u_8_strict(apiObj.mainJsContent);
}
@protected @protected
void cst_api_fill_to_wire_rust_http_response( void cst_api_fill_to_wire_rust_http_response(
RustHttpResponse apiObj, wire_cst_rust_http_response wireObj) { RustHttpResponse apiObj, wire_cst_rust_http_response wireObj) {
@ -257,6 +366,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
wireObj.data = cst_encode_opt_list_prim_u_8_strict(apiObj.data); wireObj.data = cst_encode_opt_list_prim_u_8_strict(apiObj.data);
} }
@protected
bool cst_encode_bool(bool raw);
@protected @protected
int cst_encode_i_32(int raw); int cst_encode_i_32(int raw);
@ -266,9 +378,15 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
int cst_encode_my_method(MyMethod raw); int cst_encode_my_method(MyMethod raw);
@protected
int cst_encode_rs_process_stream_data_type(RsProcessStreamDataType raw);
@protected @protected
int cst_encode_u_16(int raw); int cst_encode_u_16(int raw);
@protected
int cst_encode_u_32(int raw);
@protected @protected
int cst_encode_u_8(int raw); int cst_encode_u_8(int raw);
@ -283,11 +401,22 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_Map_String_String( void sse_encode_Map_String_String(
Map<String, String> self, SseSerializer serializer); Map<String, String> self, SseSerializer serializer);
@protected
void sse_encode_StreamSink_rs_process_stream_data_Dco(
RustStreamSink<RsProcessStreamData> self, SseSerializer serializer);
@protected @protected
void sse_encode_String(String self, SseSerializer serializer); void sse_encode_String(String self, SseSerializer serializer);
@protected @protected
void sse_encode_box_autoadd_u_64(int self, SseSerializer serializer); void sse_encode_bool(bool self, SseSerializer serializer);
@protected
void sse_encode_box_autoadd_rsi_launcher_asar_data(
RsiLauncherAsarData self, SseSerializer serializer);
@protected
void sse_encode_box_autoadd_u_64(BigInt self, SseSerializer serializer);
@protected @protected
void sse_encode_i_32(int self, SseSerializer serializer); void sse_encode_i_32(int self, SseSerializer serializer);
@ -295,6 +424,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
@protected @protected
void sse_encode_list_String(List<String> self, SseSerializer serializer); void sse_encode_list_String(List<String> self, SseSerializer serializer);
@protected
void sse_encode_list_prim_u_8_loose(List<int> self, SseSerializer serializer);
@protected @protected
void sse_encode_list_prim_u_8_strict( void sse_encode_list_prim_u_8_strict(
Uint8List self, SseSerializer serializer); Uint8List self, SseSerializer serializer);
@ -317,7 +449,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_opt_String(String? self, SseSerializer serializer); void sse_encode_opt_String(String? self, SseSerializer serializer);
@protected @protected
void sse_encode_opt_box_autoadd_u_64(int? self, SseSerializer serializer); void sse_encode_opt_box_autoadd_u_64(BigInt? self, SseSerializer serializer);
@protected @protected
void sse_encode_opt_list_prim_u_8_strict( void sse_encode_opt_list_prim_u_8_strict(
@ -327,6 +459,18 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_record_string_string( void sse_encode_record_string_string(
(String, String) self, SseSerializer serializer); (String, String) self, SseSerializer serializer);
@protected
void sse_encode_rs_process_stream_data(
RsProcessStreamData self, SseSerializer serializer);
@protected
void sse_encode_rs_process_stream_data_type(
RsProcessStreamDataType self, SseSerializer serializer);
@protected
void sse_encode_rsi_launcher_asar_data(
RsiLauncherAsarData self, SseSerializer serializer);
@protected @protected
void sse_encode_rust_http_response( void sse_encode_rust_http_response(
RustHttpResponse self, SseSerializer serializer); RustHttpResponse self, SseSerializer serializer);
@ -335,16 +479,16 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
void sse_encode_u_16(int self, SseSerializer serializer); void sse_encode_u_16(int self, SseSerializer serializer);
@protected @protected
void sse_encode_u_64(int self, SseSerializer serializer); void sse_encode_u_32(int self, SseSerializer serializer);
@protected
void sse_encode_u_64(BigInt self, SseSerializer serializer);
@protected @protected
void sse_encode_u_8(int self, SseSerializer serializer); void sse_encode_u_8(int self, SseSerializer serializer);
@protected @protected
void sse_encode_unit(void self, SseSerializer serializer); void sse_encode_unit(void self, SseSerializer serializer);
@protected
void sse_encode_bool(bool self, SseSerializer serializer);
} }
// Section: wire_class // Section: wire_class
@ -388,43 +532,90 @@ class RustLibWire implements BaseWire {
late final _store_dart_post_cobject = _store_dart_post_cobjectPtr late final _store_dart_post_cobject = _store_dart_post_cobjectPtr
.asFunction<void Function(DartPostCObjectFnType)>(); .asFunction<void Function(DartPostCObjectFnType)>();
void wire_dns_lookup_ips( void wire__crate__api__asar_api__get_rsi_launcher_asar_data(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> asar_path,
) {
return _wire__crate__api__asar_api__get_rsi_launcher_asar_data(
port_,
asar_path,
);
}
late final _wire__crate__api__asar_api__get_rsi_launcher_asar_dataPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire__crate__api__asar_api__get_rsi_launcher_asar_data');
late final _wire__crate__api__asar_api__get_rsi_launcher_asar_data =
_wire__crate__api__asar_api__get_rsi_launcher_asar_dataPtr.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_js(
int port_,
ffi.Pointer<wire_cst_rsi_launcher_asar_data> that,
ffi.Pointer<wire_cst_list_prim_u_8_loose> content,
) {
return _wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_js(
port_,
that,
content,
);
}
late final _wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_jsPtr =
_lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.Pointer<wire_cst_rsi_launcher_asar_data>,
ffi.Pointer<wire_cst_list_prim_u_8_loose>)>>(
'frbgen_starcitizen_doctor_wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_js');
late final _wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_js =
_wire__crate__api__asar_api__rsi_launcher_asar_data_write_main_jsPtr
.asFunction<
void Function(int, ffi.Pointer<wire_cst_rsi_launcher_asar_data>,
ffi.Pointer<wire_cst_list_prim_u_8_loose>)>();
void wire__crate__api__http_api__dns_lookup_ips(
int port_, int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> host, ffi.Pointer<wire_cst_list_prim_u_8_strict> host,
) { ) {
return _wire_dns_lookup_ips( return _wire__crate__api__http_api__dns_lookup_ips(
port_, port_,
host, host,
); );
} }
late final _wire_dns_lookup_ipsPtr = _lookup< late final _wire__crate__api__http_api__dns_lookup_ipsPtr = _lookup<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>( ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_dns_lookup_ips'); 'frbgen_starcitizen_doctor_wire__crate__api__http_api__dns_lookup_ips');
late final _wire_dns_lookup_ips = _wire_dns_lookup_ipsPtr.asFunction< late final _wire__crate__api__http_api__dns_lookup_ips =
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>(); _wire__crate__api__http_api__dns_lookup_ipsPtr.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire_dns_lookup_txt( void wire__crate__api__http_api__dns_lookup_txt(
int port_, int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> host, ffi.Pointer<wire_cst_list_prim_u_8_strict> host,
) { ) {
return _wire_dns_lookup_txt( return _wire__crate__api__http_api__dns_lookup_txt(
port_, port_,
host, host,
); );
} }
late final _wire_dns_lookup_txtPtr = _lookup< late final _wire__crate__api__http_api__dns_lookup_txtPtr = _lookup<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>( ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_dns_lookup_txt'); 'frbgen_starcitizen_doctor_wire__crate__api__http_api__dns_lookup_txt');
late final _wire_dns_lookup_txt = _wire_dns_lookup_txtPtr.asFunction< late final _wire__crate__api__http_api__dns_lookup_txt =
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>(); _wire__crate__api__http_api__dns_lookup_txtPtr.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire_fetch( void wire__crate__api__http_api__fetch(
int port_, int port_,
int method, int method,
ffi.Pointer<wire_cst_list_prim_u_8_strict> url, ffi.Pointer<wire_cst_list_prim_u_8_strict> url,
@ -432,7 +623,7 @@ class RustLibWire implements BaseWire {
ffi.Pointer<wire_cst_list_prim_u_8_strict> input_data, ffi.Pointer<wire_cst_list_prim_u_8_strict> input_data,
ffi.Pointer<wire_cst_list_prim_u_8_strict> with_ip_address, ffi.Pointer<wire_cst_list_prim_u_8_strict> with_ip_address,
) { ) {
return _wire_fetch( return _wire__crate__api__http_api__fetch(
port_, port_,
method, method,
url, url,
@ -442,7 +633,7 @@ class RustLibWire implements BaseWire {
); );
} }
late final _wire_fetchPtr = _lookup< late final _wire__crate__api__http_api__fetchPtr = _lookup<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
ffi.Int64, ffi.Int64,
@ -451,62 +642,158 @@ class RustLibWire implements BaseWire {
ffi.Pointer<wire_cst_list_record_string_string>, ffi.Pointer<wire_cst_list_record_string_string>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>, ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>( ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_fetch'); 'frbgen_starcitizen_doctor_wire__crate__api__http_api__fetch');
late final _wire_fetch = _wire_fetchPtr.asFunction< late final _wire__crate__api__http_api__fetch =
void Function( _wire__crate__api__http_api__fetchPtr.asFunction<
int, void Function(
int, int,
ffi.Pointer<wire_cst_list_prim_u_8_strict>, int,
ffi.Pointer<wire_cst_list_record_string_string>, ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>, ffi.Pointer<wire_cst_list_record_string_string>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>(); ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire_set_default_header( void wire__crate__api__http_api__set_default_header(
int port_, int port_,
ffi.Pointer<wire_cst_list_record_string_string> headers, ffi.Pointer<wire_cst_list_record_string_string> headers,
) { ) {
return _wire_set_default_header( return _wire__crate__api__http_api__set_default_header(
port_, port_,
headers, headers,
); );
} }
late final _wire_set_default_headerPtr = _lookup< late final _wire__crate__api__http_api__set_default_headerPtr = _lookup<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
ffi.Int64, ffi.Pointer<wire_cst_list_record_string_string>)>>( ffi.Int64, ffi.Pointer<wire_cst_list_record_string_string>)>>(
'frbgen_starcitizen_doctor_wire_set_default_header'); 'frbgen_starcitizen_doctor_wire__crate__api__http_api__set_default_header');
late final _wire_set_default_header = _wire_set_default_headerPtr.asFunction< late final _wire__crate__api__http_api__set_default_header =
void Function(int, ffi.Pointer<wire_cst_list_record_string_string>)>(); _wire__crate__api__http_api__set_default_headerPtr.asFunction<
void Function(
int, ffi.Pointer<wire_cst_list_record_string_string>)>();
void wire_start_process( void wire__crate__api__rs_process__start(
int port_, int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> executable, ffi.Pointer<wire_cst_list_prim_u_8_strict> executable,
ffi.Pointer<wire_cst_list_String> arguments, ffi.Pointer<wire_cst_list_String> arguments,
ffi.Pointer<wire_cst_list_prim_u_8_strict> working_directory, ffi.Pointer<wire_cst_list_prim_u_8_strict> working_directory,
ffi.Pointer<wire_cst_list_prim_u_8_strict> stream_sink,
) { ) {
return _wire_start_process( return _wire__crate__api__rs_process__start(
port_, port_,
executable, executable,
arguments, arguments,
working_directory, working_directory,
stream_sink,
); );
} }
late final _wire_start_processPtr = _lookup< late final _wire__crate__api__rs_process__startPtr = _lookup<
ffi.NativeFunction< ffi.NativeFunction<
ffi.Void Function( ffi.Void Function(
ffi.Int64, ffi.Int64,
ffi.Pointer<wire_cst_list_prim_u_8_strict>, ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_String>, ffi.Pointer<wire_cst_list_String>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>( ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire_start_process'); 'frbgen_starcitizen_doctor_wire__crate__api__rs_process__start');
late final _wire_start_process = _wire_start_processPtr.asFunction< late final _wire__crate__api__rs_process__start =
void Function( _wire__crate__api__rs_process__startPtr.asFunction<
int, void Function(
ffi.Pointer<wire_cst_list_prim_u_8_strict>, int,
ffi.Pointer<wire_cst_list_String>, ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>(); ffi.Pointer<wire_cst_list_String>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire__crate__api__rs_process__write(
int port_,
int rs_pid,
ffi.Pointer<wire_cst_list_prim_u_8_strict> data,
) {
return _wire__crate__api__rs_process__write(
port_,
rs_pid,
data,
);
}
late final _wire__crate__api__rs_process__writePtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(ffi.Int64, ffi.Uint32,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire__crate__api__rs_process__write');
late final _wire__crate__api__rs_process__write =
_wire__crate__api__rs_process__writePtr.asFunction<
void Function(
int, int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire__crate__api__win32_api__send_notify(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> summary,
ffi.Pointer<wire_cst_list_prim_u_8_strict> body,
ffi.Pointer<wire_cst_list_prim_u_8_strict> app_name,
ffi.Pointer<wire_cst_list_prim_u_8_strict> app_id,
) {
return _wire__crate__api__win32_api__send_notify(
port_,
summary,
body,
app_name,
app_id,
);
}
late final _wire__crate__api__win32_api__send_notifyPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire__crate__api__win32_api__send_notify');
late final _wire__crate__api__win32_api__send_notify =
_wire__crate__api__win32_api__send_notifyPtr.asFunction<
void Function(
int,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>,
ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
void wire__crate__api__win32_api__set_foreground_window(
int port_,
ffi.Pointer<wire_cst_list_prim_u_8_strict> window_name,
) {
return _wire__crate__api__win32_api__set_foreground_window(
port_,
window_name,
);
}
late final _wire__crate__api__win32_api__set_foreground_windowPtr = _lookup<
ffi.NativeFunction<
ffi.Void Function(
ffi.Int64, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>>(
'frbgen_starcitizen_doctor_wire__crate__api__win32_api__set_foreground_window');
late final _wire__crate__api__win32_api__set_foreground_window =
_wire__crate__api__win32_api__set_foreground_windowPtr.asFunction<
void Function(int, ffi.Pointer<wire_cst_list_prim_u_8_strict>)>();
ffi.Pointer<wire_cst_rsi_launcher_asar_data>
cst_new_box_autoadd_rsi_launcher_asar_data() {
return _cst_new_box_autoadd_rsi_launcher_asar_data();
}
late final _cst_new_box_autoadd_rsi_launcher_asar_dataPtr = _lookup<
ffi.NativeFunction<
ffi.Pointer<wire_cst_rsi_launcher_asar_data> Function()>>(
'frbgen_starcitizen_doctor_cst_new_box_autoadd_rsi_launcher_asar_data');
late final _cst_new_box_autoadd_rsi_launcher_asar_data =
_cst_new_box_autoadd_rsi_launcher_asar_dataPtr.asFunction<
ffi.Pointer<wire_cst_rsi_launcher_asar_data> Function()>();
ffi.Pointer<ffi.Uint64> cst_new_box_autoadd_u_64( ffi.Pointer<ffi.Uint64> cst_new_box_autoadd_u_64(
int value, int value,
@ -537,6 +824,21 @@ class RustLibWire implements BaseWire {
late final _cst_new_list_String = _cst_new_list_StringPtr late final _cst_new_list_String = _cst_new_list_StringPtr
.asFunction<ffi.Pointer<wire_cst_list_String> Function(int)>(); .asFunction<ffi.Pointer<wire_cst_list_String> Function(int)>();
ffi.Pointer<wire_cst_list_prim_u_8_loose> cst_new_list_prim_u_8_loose(
int len,
) {
return _cst_new_list_prim_u_8_loose(
len,
);
}
late final _cst_new_list_prim_u_8_loosePtr = _lookup<
ffi.NativeFunction<
ffi.Pointer<wire_cst_list_prim_u_8_loose> Function(ffi.Int32)>>(
'frbgen_starcitizen_doctor_cst_new_list_prim_u_8_loose');
late final _cst_new_list_prim_u_8_loose = _cst_new_list_prim_u_8_loosePtr
.asFunction<ffi.Pointer<wire_cst_list_prim_u_8_loose> Function(int)>();
ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_new_list_prim_u_8_strict( ffi.Pointer<wire_cst_list_prim_u_8_strict> cst_new_list_prim_u_8_strict(
int len, int len,
) { ) {
@ -597,6 +899,21 @@ final class wire_cst_list_prim_u_8_strict extends ffi.Struct {
external int len; external int len;
} }
final class wire_cst_rsi_launcher_asar_data extends ffi.Struct {
external ffi.Pointer<wire_cst_list_prim_u_8_strict> asar_path;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> main_js_path;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> main_js_content;
}
final class wire_cst_list_prim_u_8_loose extends ffi.Struct {
external ffi.Pointer<ffi.Uint8> ptr;
@ffi.Int32()
external int len;
}
final class wire_cst_record_string_string extends ffi.Struct { final class wire_cst_record_string_string extends ffi.Struct {
external ffi.Pointer<wire_cst_list_prim_u_8_strict> field0; external ffi.Pointer<wire_cst_list_prim_u_8_strict> field0;
@ -617,6 +934,16 @@ final class wire_cst_list_String extends ffi.Struct {
external int len; external int len;
} }
final class wire_cst_rs_process_stream_data extends ffi.Struct {
@ffi.Int32()
external int data_type;
external ffi.Pointer<wire_cst_list_prim_u_8_strict> data;
@ffi.Uint32()
external int rs_pid;
}
final class wire_cst_rust_http_response extends ffi.Struct { final class wire_cst_rust_http_response extends ffi.Struct {
@ffi.Uint16() @ffi.Uint16()
external int status_code; external int status_code;

View File

@ -1,5 +1,5 @@
// This file is automatically generated, so please do not edit it. // This file is automatically generated, so please do not edit it.
// Generated by `flutter_rust_bridge`@ 2.0.0-dev.28. // @generated by `flutter_rust_bridge`@ 2.4.0.
// ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import // ignore_for_file: invalid_use_of_internal_member, unused_import, unnecessary_import
@ -13,13 +13,14 @@ enum MyHttpVersion {
http2, http2,
http3, http3,
httpUnknown, httpUnknown,
;
} }
class RustHttpResponse { class RustHttpResponse {
final int statusCode; final int statusCode;
final Map<String, String> headers; final Map<String, String> headers;
final String url; final String url;
final int? contentLength; final BigInt? contentLength;
final MyHttpVersion version; final MyHttpVersion version;
final String remoteAddr; final String remoteAddr;
final Uint8List? data; final Uint8List? data;

View File

@ -135,3 +135,9 @@ Future<Uint8List?> widgetToPngImage(GlobalKey repaintBoundaryKey,
double roundDoubleTo(double value, double precision) => double roundDoubleTo(double value, double precision) =>
(value * precision).round() / precision; (value * precision).round() / precision;
int getMinNumber(List<int> list) {
if (list.isEmpty) return 0;
list.sort((a, b) => a.compareTo(b));
return list.first;
}

View File

@ -11,6 +11,7 @@ File? _logFile;
void dPrint(src) async { void dPrint(src) async {
if (kDebugMode) { if (kDebugMode) {
print(src); print(src);
return;
} }
await _logLock.synchronized(() async { await _logLock.synchronized(() async {
try { try {
@ -19,8 +20,22 @@ void dPrint(src) async {
}); });
} }
void setDPrintFile(File file) { Future<void> initDPrintFile(String applicationSupportDir) async {
_logFile = file; final now = DateTime.now();
final logFile =
File("$applicationSupportDir/logs/${now.millisecondsSinceEpoch}.log");
await logFile.create(recursive: true);
_logFile = logFile;
final logsDir = Directory("$applicationSupportDir/logs");
await for (final files in logsDir.list()) {
if (files is File) {
final stat = await files.stat();
if (stat.type == FileSystemEntityType.file &&
now.difference(await files.lastModified()).inDays > 7) {
await files.delete();
}
}
}
} }
File? getDPrintFile() { File? getDPrintFile() {

View File

@ -1,4 +1,5 @@
import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:hive/hive.dart';
import 'package:starcitizen_doctor/app.dart'; import 'package:starcitizen_doctor/app.dart';
extension ProviderExtension on AutoDisposeNotifier { extension ProviderExtension on AutoDisposeNotifier {
@ -6,4 +7,6 @@ extension ProviderExtension on AutoDisposeNotifier {
ref.read(appGlobalModelProvider.notifier); ref.read(appGlobalModelProvider.notifier);
AppGlobalState get appGlobalState => ref.read(appGlobalModelProvider); AppGlobalState get appGlobalState => ref.read(appGlobalModelProvider);
Box<dynamic>? get appConfBox => appGlobalState.appConfBox;
} }

View File

@ -1,77 +0,0 @@
// Copyright (c) 2020, Dart | Windows. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
// Reads and writes credentials
import 'dart:convert';
import 'dart:ffi';
import 'package:ffi/ffi.dart';
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:win32/win32.dart';
class Win32Credentials {
static void write(
{required String credentialName,
required String userName,
required String password}) {
final examplePassword = utf8.encode(password);
final blob = examplePassword.allocatePointer();
final credential = calloc<CREDENTIAL>()
..ref.Type = CRED_TYPE_GENERIC
..ref.TargetName = credentialName.toNativeUtf16()
..ref.Persist = CRED_PERSIST_LOCAL_MACHINE
..ref.UserName = userName.toNativeUtf16()
..ref.CredentialBlob = blob
..ref.CredentialBlobSize = examplePassword.length;
final result = CredWrite(credential, 0);
if (result != TRUE) {
final errorCode = GetLastError();
dPrint('Error ($result): $errorCode');
return;
}
dPrint('Success (blob size: ${credential.ref.CredentialBlobSize})');
free(blob);
free(credential);
}
static MapEntry<String, String>? read(String credentialName) {
dPrint('Reading $credentialName ...');
final credPointer = calloc<Pointer<CREDENTIAL>>();
final result = CredRead(
credentialName.toNativeUtf16(), CRED_TYPE_GENERIC, 0, credPointer);
if (result != TRUE) {
final errorCode = GetLastError();
var errorText = '$errorCode';
if (errorCode == ERROR_NOT_FOUND) {
errorText += ' Not found.';
}
dPrint('Error ($result): $errorText');
return null;
}
final cred = credPointer.value.ref;
final blob = cred.CredentialBlob.asTypedList(cred.CredentialBlobSize);
final password = utf8.decode(blob);
CredFree(credPointer.value);
free(credPointer);
return MapEntry(cred.UserName.toDartString(), password);
}
static void delete(String credentialName) {
dPrint('Deleting $credentialName');
final result =
CredDelete(credentialName.toNativeUtf16(), CRED_TYPE_GENERIC, 0);
if (result != TRUE) {
final errorCode = GetLastError();
dPrint('Error ($result): $errorCode');
return;
}
dPrint('Successfully deleted credential.');
}
}

View File

@ -0,0 +1,62 @@
class AppAdvancedLocalizationData {
AppAdvancedLocalizationData({
this.classKeys,
});
AppAdvancedLocalizationData.fromJson(dynamic json) {
if (json['class_keys'] != null) {
classKeys = [];
json['class_keys'].forEach((v) {
classKeys?.add(AppAdvancedLocalizationClassKeysData.fromJson(v));
});
}
}
List<AppAdvancedLocalizationClassKeysData>? classKeys;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
if (classKeys != null) {
map['class_keys'] = classKeys?.map((v) => v.toJson()).toList();
}
return map;
}
}
class AppAdvancedLocalizationClassKeysData {
AppAdvancedLocalizationClassKeysData({
this.id,
this.className,
this.keys,
});
AppAdvancedLocalizationClassKeysData.fromJson(dynamic json) {
id = json['id'];
className = json['class_name'];
keys = json['keys'] != null ? json['keys'].cast<String>() : [];
}
String? id;
String? className;
List<String>? keys;
Map<String, String> valuesMap = {};
AppAdvancedLocalizationClassKeysDataMode mode =
AppAdvancedLocalizationClassKeysDataMode.localization;
bool lockMod = false;
bool isWorking = false;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['class_name'] = className;
map['keys'] = keys;
return map;
}
}
enum AppAdvancedLocalizationClassKeysDataMode {
unLocalization,
localization,
mixed,
mixedNewline,
}

View File

@ -0,0 +1,60 @@
/// name : "Data\\Textures\\planets\\surface\\ground\\architecture\\city\\city_suburbs_02_displ.dds.6"
/// size : 524288
/// compressedSize : 169812
/// isDirectory : false
/// isFile : true
/// isEncrypted : false
/// isUnicodeText : false
/// dateTime : "2019-12-16T15:11:18"
/// version : 45
class AppUnp4kP4kItemData {
AppUnp4kP4kItemData({
this.name,
this.size,
this.compressedSize,
this.isDirectory,
this.isFile,
this.isEncrypted,
this.isUnicodeText,
this.dateTime,
this.version,
});
AppUnp4kP4kItemData.fromJson(dynamic json) {
name = json['name'];
size = json['size'];
compressedSize = json['compressedSize'];
isDirectory = json['isDirectory'];
isFile = json['isFile'];
isEncrypted = json['isEncrypted'];
isUnicodeText = json['isUnicodeText'];
dateTime = json['dateTime'];
version = json['version'];
}
String? name;
num? size;
num? compressedSize;
bool? isDirectory;
bool? isFile;
bool? isEncrypted;
bool? isUnicodeText;
String? dateTime;
num? version;
List<AppUnp4kP4kItemData> children = [];
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['name'] = name;
map['size'] = size;
map['compressedSize'] = compressedSize;
map['isDirectory'] = isDirectory;
map['isFile'] = isFile;
map['isEncrypted'] = isEncrypted;
map['isUnicodeText'] = isUnicodeText;
map['dateTime'] = dateTime;
map['version'] = version;
return map;
}
}

View File

@ -0,0 +1,107 @@
class RsiGameLibraryData {
RsiGameLibraryData({
this.games,
});
RsiGameLibraryData.fromJson(dynamic json) {
if (json['games'] != null) {
games = [];
json['games'].forEach((v) {
games?.add(RsiGameLibraryGamesData.fromJson(v));
});
}
}
List<RsiGameLibraryGamesData>? games;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
if (games != null) {
map['games'] = games?.map((v) => v.toJson()).toList();
}
return map;
}
}
class RsiGameLibraryGamesData {
RsiGameLibraryGamesData({
this.id,
this.name,
this.channels,
});
RsiGameLibraryGamesData.fromJson(dynamic json) {
id = json['id'];
name = json['name'];
if (json['channels'] != null) {
channels = [];
json['channels'].forEach((v) {
channels?.add(RsiGameLibraryChannelsData.fromJson(v));
});
}
}
String? id;
String? name;
List<RsiGameLibraryChannelsData>? channels;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['name'] = name;
if (channels != null) {
map['channels'] = channels?.map((v) => v.toJson()).toList();
}
return map;
}
}
class RsiGameLibraryChannelsData {
RsiGameLibraryChannelsData({
this.id,
this.name,
this.version,
this.versionLabel,
this.servicesEndpoint,
this.network,
this.platformId,
this.nid,
this.weight,
});
RsiGameLibraryChannelsData.fromJson(dynamic json) {
id = json['id'];
name = json['name'];
version = json['version'];
versionLabel = json['versionLabel'];
servicesEndpoint = json['servicesEndpoint'];
network = json['network'];
platformId = json['platformId'];
nid = json['nid'];
weight = json['weight'];
}
String? id;
String? name;
num? version;
String? versionLabel;
String? servicesEndpoint;
dynamic network;
String? platformId;
String? nid;
dynamic weight;
Map<String, dynamic> toJson() {
final map = <String, dynamic>{};
map['id'] = id;
map['name'] = name;
map['version'] = version;
map['versionLabel'] = versionLabel;
map['servicesEndpoint'] = servicesEndpoint;
map['network'] = network;
map['platformId'] = platformId;
map['nid'] = nid;
map['weight'] = weight;
return map;
}
}

View File

@ -29,7 +29,7 @@ class MessageLookup extends MessageLookupByLibrary {
static String m3(v0) => "Initialization failure: ${v0}"; static String m3(v0) => "Initialization failure: ${v0}";
static String m4(v0) => "Downloading: ${v0}%"; static String m4(v0) => "Downloading: ${v0}% ";
static String m5(v0) => "Discover the new version-> ${v0}"; static String m5(v0) => "Discover the new version-> ${v0}";
@ -51,7 +51,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Add ForcedPhysicalsectorsizeinbytes value to the registry item to simulate old devices. Hard disk partition (${v0})"; "Add ForcedPhysicalsectorsizeinbytes value to the registry item to simulate old devices. Hard disk partition (${v0})";
static String m13(v0) => static String m13(v0) =>
"No-English installation path! This may cause the game to start/install errors! (${v0}), please replace the installation path at the RSI starter."; "No-English installation path! This may cause the game to start/install errors! (${v0}), please replace the installation path at the RSI Launcher.";
static String m14(v0) => static String m14(v0) =>
"Click to fix the Live folder for you, and install it after completion. (${v0})"; "Click to fix the Live folder for you, and install it after completion. (${v0})";
@ -86,72 +86,95 @@ class MessageLookup extends MessageLookupByLibrary {
"Initialized webpage Localization resources failed! ${v0}"; "Initialized webpage Localization resources failed! ${v0}";
static String m28(v0) => static String m28(v0) =>
"After scanning, find ${v0} a valid installation directory"; "Scan completed, find ${v0} valid installation directory";
static String m29(v0) => "${v0} Day"; static String m29(v0) => "${v0} Day ";
static String m30(v0) => static String m30(v0) => "Localization version has been loaded: ${v0}";
static String m31(v0) => "Advanced Localization -> ${v0}";
static String m32(v0, v1) =>
"Localization text lines: ${v0} P4K text lines: ${v1}";
static String m33(v0) => "Preview: ${v0}";
static String m34(v0) =>
"You have a new version of the Localization you installed in ${v0}!"; "You have a new version of the Localization you installed in ${v0}!";
static String m31(v1, v2) => static String m35(v1, v2) =>
"RSI server report version number: ${v1}\n\nLocal version number: ${v2}\n\nIt is recommended to use RSI Launcher to update the game!"; "RSI server report version number: ${v1}\n\nLocal version number: ${v2}\n\nIt is recommended to use RSI Launcher to update the game!";
static String m32(v0) => "Channel: ${v0}"; static String m36(v0) => "Channel: ${v0}";
static String m33(v0) => "Custom_ ${v0}"; static String m37(v0) => "Enable (${v0}):";
static String m34(v0) => "Enable (${v0}):"; static String m38(v0) => "Install an error!\n\n ${v0}";
static String m35(v0) => "Install an error!\n\n ${v0}"; static String m39(v0) => "The installed version: ${v0}";
static String m36(v0) => "The installed version: ${v0}"; static String m40(v0) => "Update Time: ${v0}";
static String m37(v0) => "Update Time: ${v0}"; static String m41(v0) => "Version number: ${v0}";
static String m38(v0) => "Version number: ${v0}"; static String m42(v0) => "Current status: ${v0}";
static String m39(v0) => "Current status: ${v0}"; static String m43(v0, v1, v2) =>
static String m40(v0, v1, v2) =>
"${v0} minimum value: ${v1} / maximum value: ${v2}"; "${v0} minimum value: ${v1} / maximum value: ${v2}";
static String m41(v0) => "Performance Optimization -> ${v0}"; static String m44(v0) => "Performance Optimization -> ${v0}";
static String m42(v0) =>
"The cache size ${v0} MB, clean up the Localization -based file cache of the download of the box, will not affect the installed Localization";
static String m43(v0, v1, v2, v3) =>
"Enable: ${v0} Device Support: ${v1} Email: ${v2} Password: ${v3}";
static String m44(v0) =>
"Core quantity that has been set: ${v0} (This function is suitable for the box -click startup or RSI starter manager mode on the homepage, which is not enabled when it is 0)";
static String m45(v0) => static String m45(v0) =>
"Failure to clean up, please remove manually, file location: ${v0}"; "The cache size ${v0} MB, clean up the Localization -based file cache of the download of the box, will not affect the installed Localization";
static String m46(v0) => "Error: ${v0}"; static String m46(v0) =>
"Core quantity that has been set: ${v0} (This function is suitable for the box -click startup or RSI Launcher manager mode on the homepage, which is not enabled when it is 0)";
static String m47(v0) => static String m47(v0) =>
"Initialization failed, please take a screenshot report to the developer. ${v0}"; "Failure to clean up, please remove manually, file location: ${v0}";
static String m48(v0) => static String m48(v0) => "Error: ${v0}";
"If you have a problem with the NVME patch, run this tool. (It may cause game installation/update to be unavailable.)\n\nCurrent patch status: ${v0}";
static String m49(v0) => static String m49(v0) =>
"In some cases, the LOG file of the RSI promoter will be damaged, causing the problem to be scanned, and using this tool to clean up the damaged log file.\n\nCurrent log file size: ${v0} MB"; "Initialization failed, please take a screenshot report to the developer. ${v0}";
static String m50(v0) => static String m50(v0) =>
"If you have a problem with the NVME patch, run this tool. (It may cause game installation/update to be unavailable.)\n\nCurrent patch status: ${v0}";
static String m51(v0) =>
"In some cases, the LOG file of the RSI promoter will be damaged, causing the problem to be scanned, and using this tool to clean up the damaged log file.\n\nCurrent log file size: ${v0} MB";
static String m52(v0) =>
"If the game screen appears abnormal or the version is updated, you can use the tool to clean the expired color (when it is greater than 500m, it is recommended to clean it)\n\nCache size: ${v0} MB"; "If the game screen appears abnormal or the version is updated, you can use the tool to clean the expired color (when it is greater than 500m, it is recommended to clean it)\n\nCache size: ${v0} MB";
static String m51(v0, v1, v2, v3, v4) => static String m53(v0, v1, v2, v3, v4) =>
"System: ${v0}\n\nProcessor: ${v1}\n\nMemory size: ${v2} gb\n\nGraphics card information:\n${v3}\n\nHard disk information:\n${v4}"; "System: ${v0}\n\nProcessor: ${v1}\n\nMemory size: ${v2} gb\n\nGraphics card information:\n${v3}\n\nStorage information:\n${v4}\n\n";
static String m52(v0) => "Failure to handle! : ${v0}"; static String m54(v0) => "Failure to handle! : ${v0}";
static String m55(v0) => "Read the RSI Launcher information failure: ${v0}";
static String m56(v0) => "Patch status: ${v0}";
static String m57(v0) =>
"Internal version information of the RSI Launcher: ${v0}";
static String m58(v0) => "Open the file: ${v0}";
static String m59(v0, v1) => "After loading: ${v0} a file, time: ${v1} ms";
static String m60(v0) => "Read file: ${v0} ...";
static String m61(v0, v1) => "Processing files (${v0}/${v1}) ...";
static String m62(v0) => "Unknown file type\n${v0}";
static String m63(v0) => "P4k viewer -> ${v0}";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{ static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"about_action_email": "about_action_email":
MessageLookupByLibrary.simpleMessage("Email: scbox@xkeyc.com"), MessageLookupByLibrary.simpleMessage("Email: xkeyc@qq.com"),
"about_action_open_source": "about_action_open_source":
MessageLookupByLibrary.simpleMessage("Open source"), MessageLookupByLibrary.simpleMessage("Open source"),
"about_action_qq_group": "about_action_qq_group":
@ -169,11 +192,11 @@ class MessageLookup extends MessageLookupByLibrary {
"about_analytics_total_users": "about_analytics_total_users":
MessageLookupByLibrary.simpleMessage("Cumulative users"), MessageLookupByLibrary.simpleMessage("Cumulative users"),
"about_analytics_units_times": "about_analytics_units_times":
MessageLookupByLibrary.simpleMessage("Second-rate"), MessageLookupByLibrary.simpleMessage("Times"),
"about_analytics_units_user": "about_analytics_units_user":
MessageLookupByLibrary.simpleMessage("users"), MessageLookupByLibrary.simpleMessage("users"),
"about_app_description": MessageLookupByLibrary.simpleMessage( "about_app_description": MessageLookupByLibrary.simpleMessage(
"The SCToolBox is a good helper for your exploring the universe. We are committed to solving common problems in the game for citizens, and facilitate the operation of community localization, performance tuning, and commonly used website localization operations."), "Not just about localization!\n\nThe SCToolBox is your helper to explore the verse. We are committed to solving common in-game problems for citizens, in addition to facilitating localization from the community, game performance tuning, and localization of some commonly used website."),
"about_check_update": "about_check_update":
MessageLookupByLibrary.simpleMessage("Check for updates"), MessageLookupByLibrary.simpleMessage("Check for updates"),
"about_disclaimer": MessageLookupByLibrary.simpleMessage( "about_disclaimer": MessageLookupByLibrary.simpleMessage(
@ -215,6 +238,10 @@ class MessageLookup extends MessageLookupByLibrary {
"It is detection availability, which may take a little time ..."), "It is detection availability, which may take a little time ..."),
"app_splash_checking_for_updates": "app_splash_checking_for_updates":
MessageLookupByLibrary.simpleMessage("Inspection and update ..."), MessageLookupByLibrary.simpleMessage("Inspection and update ..."),
"app_splash_dialog_u_a_p_p": MessageLookupByLibrary.simpleMessage(
"User Agreement and Privacy Policy"),
"app_splash_dialog_u_a_p_p_content": MessageLookupByLibrary.simpleMessage(
"Thank you for choosing the SCToolBox box. We are committed to providing you with a safe, convenient and reliable experience. Before you start using your application, please read and agree to the following:\n\n 1. This application is an open source software under the GNU General Public License V3.0 protocol. You can use, modify, and distribute this software freely under the premise of obeying the agreement. Our source code is located at: [Github.com/StarCitizenToolBox/app](https://github.com/StarCitizenToolBox/app).\n2. The copyright of the Internet content in this application (including but not limited to localized documents, tool websites, news, videos, etc.) is created by its authors and is not part of GPL. Please use it under the corresponding authorization agreement.\n3. The official free release channels for this application are: [Microsoft App Store] (https://apps.microsoft.com/detail/9NF3SWFWNKL1) and [Official Website of Star Citizen Chinese] ), If you get from other third parties, please identify it carefully to avoid suffering from property losses.\n4. This application will send anonymous statistics to our server during use to improve software quality, and we will not collect any personal privacy information of your personal privacy.\n5. This application is supported by the community and has no direct connection with Cloud Imperium Games or other third -party commercial companies.\n6. We provide limited community support. If necessary, please go to the page to learn how to contact us."),
"app_upgrade_action_next_time": "app_upgrade_action_next_time":
MessageLookupByLibrary.simpleMessage("Next time"), MessageLookupByLibrary.simpleMessage("Next time"),
"app_upgrade_action_update_now": "app_upgrade_action_update_now":
@ -227,7 +254,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Get the new version details ..."), "Get the new version details ..."),
"app_upgrade_info_installing": "app_upgrade_info_installing":
MessageLookupByLibrary.simpleMessage("Installing:"), MessageLookupByLibrary.simpleMessage("Installing: "),
"app_upgrade_info_run_failed": MessageLookupByLibrary.simpleMessage( "app_upgrade_info_run_failed": MessageLookupByLibrary.simpleMessage(
"Failure to run, try to install manually!"), "Failure to run, try to install manually!"),
"app_upgrade_info_update_server_tip": MessageLookupByLibrary.simpleMessage( "app_upgrade_info_update_server_tip": MessageLookupByLibrary.simpleMessage(
@ -273,12 +300,12 @@ class MessageLookup extends MessageLookupByLibrary {
"The tutorial is about to jump, the tutorial comes from the Internet, please operate carefully ..."), "The tutorial is about to jump, the tutorial comes from the Internet, please operate carefully ..."),
"doctor_action_result_toast_scan_no_issue": "doctor_action_result_toast_scan_no_issue":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"After scanning, no problem is found. If you still fail, try to use the RSI starter administrator mode in the toolbox."), "After scanning, no problem is found. If you still fail, try to use the RSI Launcher administrator mode in the toolbox."),
"doctor_action_result_try_latest_windows": "doctor_action_result_try_latest_windows":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"If your hardware meets the standard, try to install the latest Windows system."), "If your hardware meets the standard, try to install the latest Windows system."),
"doctor_action_rsi_launcher_log": "doctor_action_rsi_launcher_log":
MessageLookupByLibrary.simpleMessage("RSI starter log"), MessageLookupByLibrary.simpleMessage("RSI Launcher log"),
"doctor_action_tip_checking_game_log": "doctor_action_tip_checking_game_log":
MessageLookupByLibrary.simpleMessage("Inspection: Game.log"), MessageLookupByLibrary.simpleMessage("Inspection: Game.log"),
"doctor_action_view_details": "doctor_action_view_details":
@ -300,13 +327,18 @@ class MessageLookup extends MessageLookupByLibrary {
"The game process is occupied"), "The game process is occupied"),
"doctor_game_error_game_process_error_info": "doctor_game_error_game_process_error_info":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please try to restart the starter, or restart the computer directly"), "Please try to restart the RSI Launcher, or restart the computer directly"),
"doctor_game_error_generic_info": MessageLookupByLibrary.simpleMessage( "doctor_game_error_generic_info": MessageLookupByLibrary.simpleMessage(
"The game triggers the most extensive collapse problem, please check the barrier guide guide"), "The game triggered a generic crash, please check the trouble shooting guide"),
"doctor_game_error_gpu_crash": MessageLookupByLibrary.simpleMessage( "doctor_game_error_gpu_crash": MessageLookupByLibrary.simpleMessage(
"Your graphics card crashes! Please check the barrier guide"), "Your graphics card crashes! Please check the barrier guide"),
"doctor_game_error_gpu_vulkan_crash":
MessageLookupByLibrary.simpleMessage("GPU Vulkan Crash"),
"doctor_game_error_gpu_vulkan_crash_info":
MessageLookupByLibrary.simpleMessage(
"Vulkan Crash! This may be the problem of driving version or game engine, please try to update the GPU driver or use the color cleaner function to return to DX11"),
"doctor_game_error_low_gpu_memory": "doctor_game_error_low_gpu_memory":
MessageLookupByLibrary.simpleMessage("Insufficient memory memory"), MessageLookupByLibrary.simpleMessage("Insufficient VRAM"),
"doctor_game_error_low_gpu_memory_info": "doctor_game_error_low_gpu_memory_info":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please do not run the game/application occupied by other high graphics cards in the background, or change the graphics card."), "Please do not run the game/application occupied by other high graphics cards in the background, or change the graphics card."),
@ -318,7 +350,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Insufficient permissions"), MessageLookupByLibrary.simpleMessage("Insufficient permissions"),
"doctor_game_error_permissions_error_info": "doctor_game_error_permissions_error_info":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please try to run a starter at the administrator authority, or use the box (Microsoft Store version) to start."), "Please try to run a RSI Launcher at the administrator authority, or use the box (Microsoft Store version) to start."),
"doctor_game_error_socket_error": MessageLookupByLibrary.simpleMessage( "doctor_game_error_socket_error": MessageLookupByLibrary.simpleMessage(
"Detected SOCKET abnormalities"), "Detected SOCKET abnormalities"),
"doctor_game_error_socket_error_info": MessageLookupByLibrary.simpleMessage( "doctor_game_error_socket_error_info": MessageLookupByLibrary.simpleMessage(
@ -349,7 +381,7 @@ class MessageLookup extends MessageLookupByLibrary {
"doctor_info_result_fix_suggestion": m15, "doctor_info_result_fix_suggestion": m15,
"doctor_info_result_incompatible_nvme_device": "doctor_info_result_incompatible_nvme_device":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"The new NVME device is not compatible with the RSI starter for the time being, which may cause the installation to fail"), "The new NVME device is not compatible with the RSI Launcher for the time being, which may cause the installation to fail"),
"doctor_info_result_install_easyanticheat": "doctor_info_result_install_easyanticheat":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Easyanticheat is not installed, please click to repair it for you one click. (Before the game starts normally and ends, the problem will always appear. If you retreat for other reasons, you can ignore this entry)"), "Easyanticheat is not installed, please click to repair it for you one click. (Before the game starts normally and ends, the problem will always appear. If you retreat for other reasons, you can ignore this entry)"),
@ -368,7 +400,7 @@ class MessageLookup extends MessageLookupByLibrary {
"doctor_info_result_upgrade_system": m17, "doctor_info_result_upgrade_system": m17,
"doctor_info_result_verify_files_with_rsi_launcher": "doctor_info_result_verify_files_with_rsi_launcher":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Not found the EasyAnticheat file or file incomplete in the Live folder, please use the RSI starter to check the file"), "Not found the EasyAnticheat file or file incomplete in the Live folder, please use the RSI Launcher to check the file"),
"doctor_info_scan_complete_no_issues": "doctor_info_scan_complete_no_issues":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"After scanning, no problem was found!"), "After scanning, no problem was found!"),
@ -500,9 +532,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("One-click launch"), MessageLookupByLibrary.simpleMessage("One-click launch"),
"home_action_performance_optimization": "home_action_performance_optimization":
MessageLookupByLibrary.simpleMessage("Performance optimization"), MessageLookupByLibrary.simpleMessage("Performance optimization"),
"home_action_q_auto_password_fill_prompt":
MessageLookupByLibrary.simpleMessage(
"Turn on the automatic password filling?"),
"home_action_rsi_status_arena_commander": "home_action_rsi_status_arena_commander":
MessageLookupByLibrary.simpleMessage("AC"), MessageLookupByLibrary.simpleMessage("AC"),
"home_action_rsi_status_electronic_access": "home_action_rsi_status_electronic_access":
@ -519,7 +548,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("SC Official Localization"), MessageLookupByLibrary.simpleMessage("SC Official Localization"),
"home_action_title_star_citizen_website_localization": "home_action_title_star_citizen_website_localization":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Star Citizen Website Sinicization"), "Star Citizen Website Localization"),
"home_action_uex_localization": "home_action_uex_localization":
MessageLookupByLibrary.simpleMessage("UEX Localization"), MessageLookupByLibrary.simpleMessage("UEX Localization"),
"home_announcement_details": "home_announcement_details":
@ -528,13 +557,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Countdown"), MessageLookupByLibrary.simpleMessage("Countdown"),
"home_holiday_countdown_days": m29, "home_holiday_countdown_days": m29,
"home_holiday_countdown_disclaimer": MessageLookupByLibrary.simpleMessage( "home_holiday_countdown_disclaimer": MessageLookupByLibrary.simpleMessage(
"* The above festival date is included in artificially and maintained. There may be errors. Welcome to feedback!"), "* The above festival dates are added and maintained manually. There may be errors and we welcome any feedback!"),
"home_holiday_countdown_in_progress": "home_holiday_countdown_in_progress":
MessageLookupByLibrary.simpleMessage("In progress"), MessageLookupByLibrary.simpleMessage("In progress"),
"home_info_account_security_warning": MessageLookupByLibrary.simpleMessage( "home_info_account_security_warning": MessageLookupByLibrary.simpleMessage(
"In order to ensure the security of the account, the one -click startup function has been disabled in the development version, and we will provide this feature in the Microsoft store version.\n\nThe Microsoft Store Edition is provided with a reliable distribution download and digital signature by Microsoft, which can effectively prevent software from being maliciously tampered with.\n\nTip: You can use Localization without using a box to start the game."), "In order to ensure the security of the account, the one -click startup function has been disabled in the development version, and we will provide this feature in the Microsoft store version.\n\nThe Microsoft Store Edition is provided with a reliable distribution download and digital signature by Microsoft, which can effectively prevent software from being maliciously tampered with.\n\nTip: You can use Localization without using a box to start the game."),
"home_info_auto_fill_notice": MessageLookupByLibrary.simpleMessage(
"* If the automatic filling is turned on, please pay attention to the Windows Hello pop-up"),
"home_info_one_click_launch_warning": "home_info_one_click_launch_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"One -click start -up function prompt"), "One -click start -up function prompt"),
@ -543,10 +570,92 @@ class MessageLookup extends MessageLookupByLibrary {
"This function requires an effective installation location"), "This function requires an effective installation location"),
"home_install_location": "home_install_location":
MessageLookupByLibrary.simpleMessage("Installation location:"), MessageLookupByLibrary.simpleMessage("Installation location:"),
"home_localization_action_advanced":
MessageLookupByLibrary.simpleMessage("Advanced Localization"),
"home_localization_action_install_customize":
MessageLookupByLibrary.simpleMessage("Install custom file"),
"home_localization_action_rsi_launcher_localization":
MessageLookupByLibrary.simpleMessage("RSILauncher Localization"),
"home_localization_action_rsi_launcher_no_game_path_msg":
MessageLookupByLibrary.simpleMessage(
"You are not currently installed in the game body or the game installation directory is not selected, and you can only use the promoter Chinese function. Please make sure the game is installed or adds the game installation directory in the box settings."),
"home_localization_action_select_customize_file":
MessageLookupByLibrary.simpleMessage("Click to select INI file"),
"home_localization_advanced_action_install":
MessageLookupByLibrary.simpleMessage(
"Installation of Localization"),
"home_localization_advanced_action_mod_change":
MessageLookupByLibrary.simpleMessage(
"The text is being re -generated ..."),
"home_localization_advanced_action_mod_change_localization":
MessageLookupByLibrary.simpleMessage("Localization"),
"home_localization_advanced_action_mod_change_mixed":
MessageLookupByLibrary.simpleMessage("Bilingual"),
"home_localization_advanced_action_mod_change_mixed_newline":
MessageLookupByLibrary.simpleMessage("Bilingual (newline)"),
"home_localization_advanced_action_mod_change_un_localization":
MessageLookupByLibrary.simpleMessage("Original English"),
"home_localization_advanced_action_mode":
MessageLookupByLibrary.simpleMessage("Model"),
"home_localization_advanced_json_text_location_other":
MessageLookupByLibrary.simpleMessage("Location-Other"),
"home_localization_advanced_json_text_location_used":
MessageLookupByLibrary.simpleMessage("Location-Commonly used"),
"home_localization_advanced_json_text_mission_or_logs":
MessageLookupByLibrary.simpleMessage("Mission/Log"),
"home_localization_advanced_json_text_others":
MessageLookupByLibrary.simpleMessage("Other"),
"home_localization_advanced_json_text_subtitle":
MessageLookupByLibrary.simpleMessage("Subtitle"),
"home_localization_advanced_json_text_things_other":
MessageLookupByLibrary.simpleMessage("Items-Other"),
"home_localization_advanced_json_text_things_used":
MessageLookupByLibrary.simpleMessage("Items-Commonly used"),
"home_localization_advanced_json_text_ui_or_hud_or_menu":
MessageLookupByLibrary.simpleMessage("UI/HUD/menu"),
"home_localization_advanced_json_text_un_localization":
MessageLookupByLibrary.simpleMessage("Unwaver"),
"home_localization_advanced_json_text_vehicle_other":
MessageLookupByLibrary.simpleMessage("Vehicle-Other"),
"home_localization_advanced_json_text_vehicle_used":
MessageLookupByLibrary.simpleMessage("Vehicle-Commonly used"),
"home_localization_advanced_msg_classifying":
MessageLookupByLibrary.simpleMessage("Classified ..."),
"home_localization_advanced_msg_gen_localization_install":
MessageLookupByLibrary.simpleMessage(
"Install Localization file ..."),
"home_localization_advanced_msg_gen_localization_text":
MessageLookupByLibrary.simpleMessage(
"Generate Localization file ..."),
"home_localization_advanced_msg_reading_p4k":
MessageLookupByLibrary.simpleMessage("Read p4k file ..."),
"home_localization_advanced_msg_reading_server_localization_text":
MessageLookupByLibrary.simpleMessage("Get Localization text ..."),
"home_localization_advanced_msg_version": m30,
"home_localization_advanced_title": m31,
"home_localization_advanced_title_msg": m32,
"home_localization_advanced_title_preview": m33,
"home_localization_msg_no_note": MessageLookupByLibrary.simpleMessage(
"This version does not provide a description"),
"home_localization_msg_version_advanced":
MessageLookupByLibrary.simpleMessage("(Advanced)"),
"home_localization_new_version_available": "home_localization_new_version_available":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Sinicization has a new version!"), "Localization has a new version!"),
"home_localization_new_version_installed": m30, "home_localization_new_version_installed": m34,
"home_localization_ptu_advanced_localization_tip_title":
MessageLookupByLibrary.simpleMessage(
"Recommended advanced localization"),
"home_localization_ptu_advanced_localization_tip_title_info":
MessageLookupByLibrary.simpleMessage(
"On PTU/EPTU and other test channels, the current localization text text may not be synchronized with the game, and the use of advanced localization can reduce garbled production."),
"home_localization_select_customize_file":
MessageLookupByLibrary.simpleMessage(
"Please select custom Localization file"),
"home_localization_select_customize_file_ini":
MessageLookupByLibrary.simpleMessage("Please select INI file"),
"home_localization_title_localization_tools":
MessageLookupByLibrary.simpleMessage("Localization tool"),
"home_login_action_title_box_one_click_launch": "home_login_action_title_box_one_click_launch":
MessageLookupByLibrary.simpleMessage("Box one -click start"), MessageLookupByLibrary.simpleMessage("Box one -click start"),
"home_login_action_title_need_webview2_runtime": "home_login_action_title_need_webview2_runtime":
@ -554,18 +663,12 @@ class MessageLookup extends MessageLookupByLibrary {
"Need to install WebView2 Runtime"), "Need to install WebView2 Runtime"),
"home_login_info_action_ignore": "home_login_info_action_ignore":
MessageLookupByLibrary.simpleMessage("Neglect"), MessageLookupByLibrary.simpleMessage("Neglect"),
"home_login_info_enter_pin_to_encrypt":
MessageLookupByLibrary.simpleMessage(
"Enter PIN to enable encryption"),
"home_login_info_game_version_outdated": "home_login_info_game_version_outdated":
MessageLookupByLibrary.simpleMessage("Outdated game version"), MessageLookupByLibrary.simpleMessage("Outdated game version"),
"home_login_info_one_click_launch_description": "home_login_info_one_click_launch_description":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"This feature can help you start the game more conveniently.\n\nTo ensure the security of the account, this function uses the Localization browser to retain the login status and will not save your password information (unless you enable the automatic filling function).\n\nWhen logging in to the account, please make sure your SCToolBox is downloaded from a trusted source."), "This feature can help you start the game more conveniently.\n\nTo ensure the security of the account, this function uses the Localization browser to retain the login status and will not save your password information (unless you enable the automatic filling function).\n\nWhen logging in to the account, please make sure your SCToolBox is downloaded from a trusted source."),
"home_login_info_password_encryption_notice": "home_login_info_rsi_server_report": m35,
MessageLookupByLibrary.simpleMessage(
"The box will use the PIN and Windows credentials to save your password encryption, and the password is only stored in your device.\n\nWhen you need to enter a password for the next login, you only need to authorize PIN to automatically fill in the login."),
"home_login_info_rsi_server_report": m31,
"home_login_title_launching_game": "home_login_title_launching_game":
MessageLookupByLibrary.simpleMessage("Launching game for you ..."), MessageLookupByLibrary.simpleMessage("Launching game for you ..."),
"home_login_title_welcome_back": "home_login_title_welcome_back":
@ -577,48 +680,37 @@ class MessageLookup extends MessageLookupByLibrary {
"home_title_logging_in": "home_title_logging_in":
MessageLookupByLibrary.simpleMessage("Logging in..."), MessageLookupByLibrary.simpleMessage("Logging in..."),
"lobby_invitation_to_participate": MessageLookupByLibrary.simpleMessage( "lobby_invitation_to_participate": MessageLookupByLibrary.simpleMessage(
"Sincerely invite you to participate"), "Sincerely invite you to participate "),
"lobby_online_lobby_coming_soon": MessageLookupByLibrary.simpleMessage( "lobby_online_lobby_coming_soon": MessageLookupByLibrary.simpleMessage(
"The online lobby, so stay tuned!"), "The online lobby, so stay tuned!"),
"lobby_survey": MessageLookupByLibrary.simpleMessage("Questionnaire."), "lobby_survey": MessageLookupByLibrary.simpleMessage("Questionnaire."),
"localization_action_advanced_features":
MessageLookupByLibrary.simpleMessage("Advanced Features"),
"localization_action_install": "localization_action_install":
MessageLookupByLibrary.simpleMessage("Install"), MessageLookupByLibrary.simpleMessage("Install"),
"localization_action_translation_feedback": "localization_action_translation_feedback":
MessageLookupByLibrary.simpleMessage("Localization feedback"), MessageLookupByLibrary.simpleMessage("Feedback"),
"localization_action_uninstall_translation": "localization_action_uninstall_translation":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("Uninstall"),
"Uninstallation of Localization"), "localization_info_channel": m36,
"localization_info_channel": m32,
"localization_info_community_translation": "localization_info_community_translation":
MessageLookupByLibrary.simpleMessage("Community Localization"), MessageLookupByLibrary.simpleMessage("Community Localization"),
"localization_info_corrupted_file": "localization_info_corrupted_file":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"The file is damaged, please download again"), "The file is damaged, please download again"),
"localization_info_custom_file": m33,
"localization_info_custom_file_instructions":
MessageLookupByLibrary.simpleMessage(
"To open the localized folder, put the customized name .ini file in the Customize_ini folder.\n\nAfter adding a new file, you do not display the refresh button in the upper right corner.\n\nPlease make sure to choose the correct language during installation."),
"localization_info_custom_files": "localization_info_custom_files":
MessageLookupByLibrary.simpleMessage("Custom file"), MessageLookupByLibrary.simpleMessage("Custom file"),
"localization_info_custom_text": "localization_info_enabled": m37,
MessageLookupByLibrary.simpleMessage("Custom text"),
"localization_info_enabled": m34,
"localization_info_incompatible_translation_params_warning": "localization_info_incompatible_translation_params_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"User.cfg contains incompatible Localization parameters, which may be the residual information of the previous Localization file.\n\nThis may lead to ineffective or garbled Localization, click to confirm that you are removed with one click (it will not affect other configuration)."), "User.cfg contains incompatible Localization parameters, which may be the residual information of the previous Localization file.\n\nThis may lead to ineffective or garbled Localization, click to confirm that you are removed with one click (it will not affect other configuration)."),
"localization_info_installation_error": m35, "localization_info_installation_error": m38,
"localization_info_installed": "localization_info_installed":
MessageLookupByLibrary.simpleMessage("Installed"), MessageLookupByLibrary.simpleMessage("Installed"),
"localization_info_installed_version": m36, "localization_info_installed_version": m39,
"localization_info_language": "localization_info_language":
MessageLookupByLibrary.simpleMessage("Language:"), MessageLookupByLibrary.simpleMessage("Language: "),
"localization_info_machine_translation_warning": "localization_info_machine_translation_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"You are using the game built -in text. The official text is currently a machine translation (as of 3.21.0), and it is recommended that you install community Localization below."), "You are using the game built -in text. The official text is currently a machine translation (as of 3.21.0), and it is recommended that you install community Localization below."),
"localization_info_no_custom_text":
MessageLookupByLibrary.simpleMessage("No custom text"),
"localization_info_no_translation_available": "localization_info_no_translation_available":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"This language/version is not available for Localization, so stay tuned!"), "This language/version is not available for Localization, so stay tuned!"),
@ -627,17 +719,16 @@ class MessageLookup extends MessageLookupByLibrary {
"localization_info_remove_incompatible_translation_params": "localization_info_remove_incompatible_translation_params":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Whether to remove incompatible Localization parameters"), "Whether to remove incompatible Localization parameters"),
"localization_info_translation_status": "localization_info_translation":
MessageLookupByLibrary.simpleMessage("State"), MessageLookupByLibrary.simpleMessage("Game localization"),
"localization_info_unavailable": "localization_info_unavailable":
MessageLookupByLibrary.simpleMessage("Unavailable"), MessageLookupByLibrary.simpleMessage("Unavailable"),
"localization_info_update_time": m37, "localization_info_update_time": m40,
"localization_info_version_number": m38, "localization_info_version_number": m41,
"performance_action_apply": "performance_action_apply":
MessageLookupByLibrary.simpleMessage("Application"), MessageLookupByLibrary.simpleMessage("Apply"),
"performance_action_apply_and_clear_shaders": "performance_action_apply_and_clear_shaders":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("Apply and clean up"),
"Apply and clean up the color device (recommended)"),
"performance_action_clear_shaders": "performance_action_clear_shaders":
MessageLookupByLibrary.simpleMessage("Clean the color device"), MessageLookupByLibrary.simpleMessage("Clean the color device"),
"performance_action_custom_parameters_input": "performance_action_custom_parameters_input":
@ -645,20 +736,19 @@ class MessageLookup extends MessageLookupByLibrary {
"You can enter the custom parameters that are not included in the box here. Configuration example:\n\nR_DISPLAYINFO = 0\nr_vsync = 0"), "You can enter the custom parameters that are not included in the box here. Configuration example:\n\nR_DISPLAYINFO = 0\nr_vsync = 0"),
"performance_action_high": MessageLookupByLibrary.simpleMessage("High"), "performance_action_high": MessageLookupByLibrary.simpleMessage("High"),
"performance_action_info_preset_only_changes_graphics": "performance_action_info_preset_only_changes_graphics":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("(Only graphic)"),
"(Preset only the graphic settings)"),
"performance_action_low": MessageLookupByLibrary.simpleMessage("Low"), "performance_action_low": MessageLookupByLibrary.simpleMessage("Low"),
"performance_action_medium": "performance_action_medium":
MessageLookupByLibrary.simpleMessage("Middle"), MessageLookupByLibrary.simpleMessage("Middle"),
"performance_action_preset": "performance_action_preset":
MessageLookupByLibrary.simpleMessage("Preset:"), MessageLookupByLibrary.simpleMessage("Preset:"),
"performance_action_reset_to_default": "performance_action_reset_to_default":
MessageLookupByLibrary.simpleMessage("Reset"), MessageLookupByLibrary.simpleMessage(" Reset"),
"performance_action_super": "performance_action_super":
MessageLookupByLibrary.simpleMessage("Super"), MessageLookupByLibrary.simpleMessage("Super"),
"performance_info_applied": "performance_info_applied":
MessageLookupByLibrary.simpleMessage("Applied"), MessageLookupByLibrary.simpleMessage("Applied"),
"performance_info_current_status": m39, "performance_info_current_status": m42,
"performance_info_delete_config_file": "performance_info_delete_config_file":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Delete the configuration file ..."), "Delete the configuration file ..."),
@ -673,7 +763,7 @@ class MessageLookup extends MessageLookupByLibrary {
"This function is very helpful for optimizing the bottleneck of the graphics card, but it may have a reverse effect on the CPU bottleneck. If your graphics card performance is strong, you can try to use better picture quality to obtain higher graphics card utilization."), "This function is very helpful for optimizing the bottleneck of the graphics card, but it may have a reverse effect on the CPU bottleneck. If your graphics card performance is strong, you can try to use better picture quality to obtain higher graphics card utilization."),
"performance_info_graphics": "performance_info_graphics":
MessageLookupByLibrary.simpleMessage("Graphic"), MessageLookupByLibrary.simpleMessage("Graphic"),
"performance_info_min_max_values": m40, "performance_info_min_max_values": m43,
"performance_info_not_applied": "performance_info_not_applied":
MessageLookupByLibrary.simpleMessage("Unused"), MessageLookupByLibrary.simpleMessage("Unused"),
"performance_info_shader_clearing_warning": "performance_info_shader_clearing_warning":
@ -682,22 +772,148 @@ class MessageLookup extends MessageLookupByLibrary {
"performance_info_write_out_config_file": "performance_info_write_out_config_file":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Write the configuration file"), "Write the configuration file"),
"performance_title_performance_optimization": m41, "performance_json_text_antialiasing":
MessageLookupByLibrary.simpleMessage("Anti -aliasing"),
"performance_json_text_antialiasing_info":
MessageLookupByLibrary.simpleMessage(
"0 Close, 1 SMAA, 2 time filter+SMAA, 3 time filtering and projection matrix shake SMAA"),
"performance_json_text_custom_parameters":
MessageLookupByLibrary.simpleMessage("Custom parameter"),
"performance_json_text_display_session":
MessageLookupByLibrary.simpleMessage("Display session information"),
"performance_json_text_display_session_info":
MessageLookupByLibrary.simpleMessage(
"After turning on, display a QR code on the screen to allow CIG to quickly locate related information when feedback"),
"performance_json_text_displayinfo":
MessageLookupByLibrary.simpleMessage(
"Screen information (display frame rate)"),
"performance_json_text_displayinfo_info":
MessageLookupByLibrary.simpleMessage(
"Display frame rates, server information, etc. in the upper right corner of the screen"),
"performance_json_text_fov":
MessageLookupByLibrary.simpleMessage("Set viewing angle FOV"),
"performance_json_text_game_effects":
MessageLookupByLibrary.simpleMessage("Special effect level"),
"performance_json_text_game_effects_info":
MessageLookupByLibrary.simpleMessage("Game special effect level"),
"performance_json_text_max_fps":
MessageLookupByLibrary.simpleMessage("Maximum frame rate"),
"performance_json_text_max_fps_info":
MessageLookupByLibrary.simpleMessage(
"Adjust the maximum frame rate of the game, 0 is not limited"),
"performance_json_text_motion_blur":
MessageLookupByLibrary.simpleMessage("Dynamic blur"),
"performance_json_text_motion_blur_info":
MessageLookupByLibrary.simpleMessage(
"Open to improve the sense of movement, turn off and enhance the perception"),
"performance_json_text_object_detail":
MessageLookupByLibrary.simpleMessage("Object detail"),
"performance_json_text_object_detail_info":
MessageLookupByLibrary.simpleMessage(
"Model object details, affect LOD, etc."),
"performance_json_text_particles":
MessageLookupByLibrary.simpleMessage("Particle details"),
"performance_json_text_particles_object_collisions":
MessageLookupByLibrary.simpleMessage("Particle collision"),
"performance_json_text_particles_object_collisions_info":
MessageLookupByLibrary.simpleMessage(
"1 Static particles 2 include dynamic particles"),
"performance_json_text_physics":
MessageLookupByLibrary.simpleMessage("Physical details"),
"performance_json_text_physics_info":
MessageLookupByLibrary.simpleMessage("Scope of physical effects"),
"performance_json_text_postprocessing":
MessageLookupByLibrary.simpleMessage("Post -processing details"),
"performance_json_text_postprocessing_info":
MessageLookupByLibrary.simpleMessage(
"After the color device, dynamic blur effect, etc."),
"performance_json_text_renderer":
MessageLookupByLibrary.simpleMessage("Rendering device quality"),
"performance_json_text_renderer_info":
MessageLookupByLibrary.simpleMessage("Cryengine rendereer quality"),
"performance_json_text_shader_decal":
MessageLookupByLibrary.simpleMessage("Quality"),
"performance_json_text_shader_decal_info":
MessageLookupByLibrary.simpleMessage("(LOGO, logo, etc.)"),
"performance_json_text_shader_fx":
MessageLookupByLibrary.simpleMessage("FX quality"),
"performance_json_text_shader_general":
MessageLookupByLibrary.simpleMessage("Conventional quality"),
"performance_json_text_shader_general_info":
MessageLookupByLibrary.simpleMessage("Overall model quality"),
"performance_json_text_shader_glass":
MessageLookupByLibrary.simpleMessage("Glass quality"),
"performance_json_text_shader_glass_info":
MessageLookupByLibrary.simpleMessage("Window, mirror, etc."),
"performance_json_text_shader_hdr":
MessageLookupByLibrary.simpleMessage("HDR quality"),
"performance_json_text_shader_hdr_info":
MessageLookupByLibrary.simpleMessage(
"HDR color difference, brightness level treatment, etc."),
"performance_json_text_shader_particle":
MessageLookupByLibrary.simpleMessage("Particle quality"),
"performance_json_text_shader_particle_info":
MessageLookupByLibrary.simpleMessage("Particle effect quality"),
"performance_json_text_shader_post_process":
MessageLookupByLibrary.simpleMessage("Color quality"),
"performance_json_text_shader_shadow":
MessageLookupByLibrary.simpleMessage("Shadow quality"),
"performance_json_text_shader_sky":
MessageLookupByLibrary.simpleMessage("Sky quality"),
"performance_json_text_shader_terrain":
MessageLookupByLibrary.simpleMessage("Ground quality"),
"performance_json_text_shading":
MessageLookupByLibrary.simpleMessage("Colorrhea details"),
"performance_json_text_shading_info":
MessageLookupByLibrary.simpleMessage("Coloror related"),
"performance_json_text_shadows":
MessageLookupByLibrary.simpleMessage("Shadow details"),
"performance_json_text_shadows_info":
MessageLookupByLibrary.simpleMessage("Shadow effect"),
"performance_json_text_ssdo": MessageLookupByLibrary.simpleMessage(
"Swip light after the screen light"),
"performance_json_text_ssdo_info": MessageLookupByLibrary.simpleMessage(
"After adjusting the light, processing level"),
"performance_json_text_texture":
MessageLookupByLibrary.simpleMessage("Grade"),
"performance_json_text_texture_info":
MessageLookupByLibrary.simpleMessage("Model texture details"),
"performance_json_text_title_custom":
MessageLookupByLibrary.simpleMessage("Customize"),
"performance_json_text_title_graphics":
MessageLookupByLibrary.simpleMessage("Graphic"),
"performance_json_text_ui_animation":
MessageLookupByLibrary.simpleMessage("UI fades into the animation"),
"performance_json_text_volumetric_effects":
MessageLookupByLibrary.simpleMessage("Volume effect"),
"performance_json_text_volumetric_effects_info":
MessageLookupByLibrary.simpleMessage(
"Volume cloud, volume light, etc."),
"performance_json_text_vsync":
MessageLookupByLibrary.simpleMessage("Vertical sync"),
"performance_json_text_vsync_info":
MessageLookupByLibrary.simpleMessage(
"Open to prevent tearing, turn off to increase the frame rate"),
"performance_json_text_water":
MessageLookupByLibrary.simpleMessage("Water effect"),
"performance_json_text_water_info":
MessageLookupByLibrary.simpleMessage("Grade of various water"),
"performance_title_performance_optimization": m44,
"setting_action_clear_translation_file_cache": "setting_action_clear_translation_file_cache":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Clean up the Localization file cache"), "Clean up the Localization file cache"),
"setting_action_create_desktop_shortcut": "setting_action_create_desktop_shortcut":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Create \"SC Sinicization Box\" shortcut on the desktop"), "Create \"SC Localization Box\" shortcut on the desktop"),
"setting_action_create_settings_shortcut": "setting_action_create_settings_shortcut":
MessageLookupByLibrary.simpleMessage("Create Settings Settings"), MessageLookupByLibrary.simpleMessage("Create shortcut"),
"setting_action_ignore_efficiency_cores_on_launch": "setting_action_ignore_efficiency_cores_on_launch":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"When starting the game, ignore the core of energy efficiency (suitable for Intel 12th+ processor)"), "When starting the game, ignore the core of energy efficiency (suitable for Intel 12th+ processor)"),
"setting_action_info_autofill_data_cleared": "setting_action_info_autofill_data_cleared":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Automatic filling data has been cleaned up"), "Automatic filling data has been cleaned up"),
"setting_action_info_cache_clearing_info": m42, "setting_action_info_cache_clearing_info": m45,
"setting_action_info_clear_cache_warning": "setting_action_info_clear_cache_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"This will not affect the installed Localization."), "This will not affect the installed Localization."),
@ -708,17 +924,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Confirm that resetting automatic filling?"), "Confirm that resetting automatic filling?"),
"setting_action_info_cpu_core_tip": MessageLookupByLibrary.simpleMessage( "setting_action_info_cpu_core_tip": MessageLookupByLibrary.simpleMessage(
"Tip: Input a few of your equipment with a few energy efficiency cores, please keep 0 non -large and small nuclear equipment 0\n\nThis function is suitable for the box of one -click startup or the RSI starter mode in the box on the homepage. This function is not enabled when it is 0."), "Tip: Input a few of your equipment with a few energy efficiency cores, please keep 0 non -large and small nuclear equipment 0\n\nThis function is suitable for the box of one -click startup or the RSI Launcher Admin mode in the box on the homepage. This function is not enabled when it is 0."),
"setting_action_info_delete_local_account_warning": "setting_action_info_delete_local_account_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"This will delete local account records, or it will automatically fill in the next time the game starts the game to disable automatic filling."), "This will delete local account records, or it will automatically fill in the next time the game starts the game to disable automatic filling."),
"setting_action_info_device_support_info": m43,
"setting_action_info_disabled":
MessageLookupByLibrary.simpleMessage("Disabled"),
"setting_action_info_enabled":
MessageLookupByLibrary.simpleMessage("Activated"),
"setting_action_info_encrypted_saved":
MessageLookupByLibrary.simpleMessage("Has been encrypted"),
"setting_action_info_enter_cpu_core_to_ignore": "setting_action_info_enter_cpu_core_to_ignore":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please enter the core number of CPUs to be ignored"), "Please enter the core number of CPUs to be ignored"),
@ -729,36 +938,30 @@ class MessageLookup extends MessageLookupByLibrary {
"Manually set the game installation location, it is recommended to use it only when the installation location cannot be automatically scanned"), "Manually set the game installation location, it is recommended to use it only when the installation location cannot be automatically scanned"),
"setting_action_info_manual_launcher_location_setting": "setting_action_info_manual_launcher_location_setting":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Set the position of the starter manually, it is recommended to use it only when the installation position cannot be automatically scanned automatically"), "Set the position of the RSI Launcher manually, it is recommended to use it only when the installation position cannot be automatically scanned automatically"),
"setting_action_info_microsoft_version_limitation": "setting_action_info_microsoft_version_limitation":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Due to Microsoft\'s version restrictions, manually drag the SCToolBox to the desktop in the next window to create a shortcut."), "Due to Microsoft\'s version restrictions, manually drag the SCToolBox to the desktop in the next window to create a shortcut."),
"setting_action_info_mirror_server_info": "setting_action_info_mirror_server_info":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Use a mirror server to accelerate access to tool websites such as DPS UEX. If you access abnormal access, please turn off the function. To protect the security of the account, the RSI official website will not be accelerated in any case."), "Use a mirror server to accelerate access to tool websites such as DPS UEX. If you access abnormal access, please turn off the function. To protect the security of the account, the RSI official website will not be accelerated in any case."),
"setting_action_info_not_saved":
MessageLookupByLibrary.simpleMessage("Not preserved"),
"setting_action_info_not_support":
MessageLookupByLibrary.simpleMessage("Not support"),
"setting_action_info_select_game_install_location": "setting_action_info_select_game_install_location":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please select the game installation position (StarCitizen.exe)"), "Please select the game installation position (StarCitizen.exe)"),
"setting_action_info_select_rsi_launcher_location": "setting_action_info_select_rsi_launcher_location":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please select the RSI starter position (RSI LAUNCHER.EXE)"), "Please select the RSI Launcher position (RSI LAUNCHER.EXE)"),
"setting_action_info_setting_success": MessageLookupByLibrary.simpleMessage( "setting_action_info_setting_success": MessageLookupByLibrary.simpleMessage(
"Successfully set, click refresh on the corresponding page to scan the new path"), "Successfully set, click refresh on the corresponding page to scan the new path"),
"setting_action_info_shortcut_created": "setting_action_info_shortcut_created":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"After the creation, please return to the desktop to view"), "After the creation, please return to the desktop to view"),
"setting_action_info_support":
MessageLookupByLibrary.simpleMessage("Support"),
"setting_action_info_view_log_file": MessageLookupByLibrary.simpleMessage( "setting_action_info_view_log_file": MessageLookupByLibrary.simpleMessage(
"Check the log file of the SCToolBox to locate the bug of the box"), "Check the log file of the SCToolBox to locate the bug of the box"),
"setting_action_reset_auto_password_fill": "setting_action_reset_auto_password_fill":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Reset automatic password filling"), "Reset automatic password filling"),
"setting_action_set_core_count": m44, "setting_action_set_core_count": m46,
"setting_action_set_game_file": MessageLookupByLibrary.simpleMessage( "setting_action_set_game_file": MessageLookupByLibrary.simpleMessage(
"Set the game file (StarCitizen.exe)"), "Set the game file (StarCitizen.exe)"),
"setting_action_set_launcher_file": "setting_action_set_launcher_file":
@ -786,13 +989,13 @@ class MessageLookup extends MessageLookupByLibrary {
"Hosts acceleration (experimental)"), "Hosts acceleration (experimental)"),
"tools_action_info_cleanup_complete": MessageLookupByLibrary.simpleMessage( "tools_action_info_cleanup_complete": MessageLookupByLibrary.simpleMessage(
"After cleaning up, complete the installation / game startup operation once."), "After cleaning up, complete the installation / game startup operation once."),
"tools_action_info_cleanup_failed": m45, "tools_action_info_cleanup_failed": m47,
"tools_action_info_config_file_not_exist": "tools_action_info_config_file_not_exist":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"The configuration file does not exist, please try to run the game once"), "The configuration file does not exist, please try to run the game once"),
"tools_action_info_eac_file_removed": MessageLookupByLibrary.simpleMessage( "tools_action_info_eac_file_removed": MessageLookupByLibrary.simpleMessage(
"Remove the EAC file for you, and then open the RSI startup for you. Please go to Settings-> Verify to reinstall EAC."), "Remove the EAC file for you, and then open the RSI startup for you. Please go to Settings-> Verify to reinstall EAC."),
"tools_action_info_error_occurred": m46, "tools_action_info_error_occurred": m48,
"tools_action_info_fix_success_restart": "tools_action_info_fix_success_restart":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"If the repair is successful, please try to restart the computer and continue to install the game! If the registry modification operation causes compatibility problems with other software, please use the NVMe registry in the tool to clean up."), "If the repair is successful, please try to restart the computer and continue to install the game! If the registry modification operation causes compatibility problems with other software, please use the NVMe registry in the tool to clean up."),
@ -802,10 +1005,10 @@ class MessageLookup extends MessageLookupByLibrary {
"tools_action_info_hosts_acceleration_experimental_tip": "tools_action_info_hosts_acceleration_experimental_tip":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Write the IP information into the hosts file to solve problems such as DNS pollution in some regions that cannot log in to the official website.\nThis function is undergoing the first stage of testing. Please report it in time when you encounter problems."), "Write the IP information into the hosts file to solve problems such as DNS pollution in some regions that cannot log in to the official website.\nThis function is undergoing the first stage of testing. Please report it in time when you encounter problems."),
"tools_action_info_init_failed": m47, "tools_action_info_init_failed": m49,
"tools_action_info_log_file_not_exist": "tools_action_info_log_file_not_exist":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"The log file does not exist, please try to start a game startup or game installation, and exit the starter. If the problem cannot be solved, try to update the launcher to the latest version!"), "The log file does not exist, please try to start a game startup or game installation, and exit the RSI Launcher. If the problem cannot be solved, try to update the launcher to the latest version!"),
"tools_action_info_log_file_parse_failed": "tools_action_info_log_file_parse_failed":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Analysis of LOG files failed!\nTry to use RSI Launcher Log repair tool!"), "Analysis of LOG files failed!\nTry to use RSI Launcher Log repair tool!"),
@ -813,7 +1016,7 @@ class MessageLookup extends MessageLookupByLibrary {
"Manually write the NVM patch, this function is used only when you know what you do"), "Manually write the NVM patch, this function is used only when you know what you do"),
"tools_action_info_not_installed": "tools_action_info_not_installed":
MessageLookupByLibrary.simpleMessage("Not Installed"), MessageLookupByLibrary.simpleMessage("Not Installed"),
"tools_action_info_nvme_patch_issue": m48, "tools_action_info_nvme_patch_issue": m50,
"tools_action_info_one_key_close_lens_shake": "tools_action_info_one_key_close_lens_shake":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Close the game endoscope shaking to facilitate photography operations.\n\n @Lapernum offers parameter information."), "Close the game endoscope shaking to facilitate photography operations.\n\n @Lapernum offers parameter information."),
@ -825,7 +1028,7 @@ class MessageLookup extends MessageLookupByLibrary {
"The diversion download service provided by citizenwiki.cn can be used to download or fix P4K.\nLimited resources, please do not abuse."), "The diversion download service provided by citizenwiki.cn can be used to download or fix P4K.\nLimited resources, please do not abuse."),
"tools_action_info_p4k_file_description": "tools_action_info_p4k_file_description":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"P4K is the core game file of interstellar citizens, as high as 100GB+. The offline download provided by the box is to help some P4K files download super slow users or to repair the P4K file that the official launch cannot be repaired.\n\nNext, you will pop up the window and ask you to save the position (you can choose the Star Citizens Folder or you can choose elsewhere). After downloading, please make sure that the P4K folder is located in the LIVE folder, and then use the Star Citizen starter to check it."), "P4K is the core game file of interstellar citizens, as high as 100GB+. The offline download provided by the box is to help some P4K files download super slow users or to repair the P4K file that the official launch cannot be repaired.\n\nNext, you will pop up the window and ask you to save the position (you can choose the Star Citizens Folder or you can choose elsewhere). After downloading, please make sure that the P4K folder is located in the LIVE folder, and then use the RSI Launcher to check it."),
"tools_action_info_reinstall_eac": MessageLookupByLibrary.simpleMessage( "tools_action_info_reinstall_eac": MessageLookupByLibrary.simpleMessage(
"If you encounter EAC errors and are invalid automatically, try using this feature to reinstall EAC."), "If you encounter EAC errors and are invalid automatically, try using this feature to reinstall EAC."),
"tools_action_info_removed_restart_effective": "tools_action_info_removed_restart_effective":
@ -836,21 +1039,21 @@ class MessageLookup extends MessageLookupByLibrary {
"Restoring the lens shaking effect.\n\n@Lapernum offers parameter information."), "Restoring the lens shaking effect.\n\n@Lapernum offers parameter information."),
"tools_action_info_rsi_launcher_directory_not_found": "tools_action_info_rsi_launcher_directory_not_found":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"If the RSI starter directory is not found, please try manually."), "If the RSI Launcher directory is not found, please try manually."),
"tools_action_info_rsi_launcher_log_issue": m49, "tools_action_info_rsi_launcher_log_issue": m51,
"tools_action_info_rsi_launcher_not_found": "tools_action_info_rsi_launcher_not_found":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"If the RSI label is not found, try to reinstall it or add it manually in the settings."), "If the RSI label is not found, try to reinstall it or add it manually in the settings."),
"tools_action_info_rsi_launcher_running_warning": "tools_action_info_rsi_launcher_running_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"The RSI starter is running! Please turn off the label first and then use this feature!"), "The RSI Launcher is running! Please turn off the label first and then use this feature!"),
"tools_action_info_run_rsi_as_admin": MessageLookupByLibrary.simpleMessage( "tools_action_info_run_rsi_as_admin": MessageLookupByLibrary.simpleMessage(
"Run RSI startups as an administrator may solve some problems.\n\nIf the energy efficiency core shielding parameters are set, it will also be applied here."), "Run RSI startups as an administrator may solve some problems.\n\nIf the energy efficiency core shielding parameters are set, it will also be applied here."),
"tools_action_info_shader_cache_issue": m50, "tools_action_info_shader_cache_issue": m52,
"tools_action_info_star_citizen_not_found": "tools_action_info_star_citizen_not_found":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"If the interstellar game installation location is not found, please complete the game startup operation at least once or add it manually in the settings."), "If the interstellar game installation location is not found, please complete the game startup operation at least once or add it manually in the settings."),
"tools_action_info_system_info_content": m51, "tools_action_info_system_info_content": m53,
"tools_action_info_system_info_title": "tools_action_info_system_info_title":
MessageLookupByLibrary.simpleMessage("System message"), MessageLookupByLibrary.simpleMessage("System message"),
"tools_action_info_valid_game_directory_needed": "tools_action_info_valid_game_directory_needed":
@ -866,16 +1069,22 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"P4k diversion download / repair"), "P4k diversion download / repair"),
"tools_action_reinstall_easyanticheat": "tools_action_reinstall_easyanticheat":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage("Reinstall EasyAnticheat"),
"Reinstall EasyAnticheat\'s anti -cheating"),
"tools_action_remove_nvme_registry_patch": "tools_action_remove_nvme_registry_patch":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Remove the NVMe registry patch"), "Remove the NVMe registry patch"),
"tools_action_rsi_launcher_admin_mode": "tools_action_rsi_launcher_admin_mode":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"RSI Launcher administrator mode"), "RSI Launcher administrator mode"),
"tools_action_rsi_launcher_enhance_info":
MessageLookupByLibrary.simpleMessage(
"Enhanced launcher Localization、 download thread"),
"tools_action_rsi_launcher_log_fix": "tools_action_rsi_launcher_log_fix":
MessageLookupByLibrary.simpleMessage("RSI LAUNCHER LOG repair"), MessageLookupByLibrary.simpleMessage("RSI LAUNCHER LOG repair"),
"tools_action_unp4k":
MessageLookupByLibrary.simpleMessage("P4K viewer"),
"tools_action_unp4k_info": MessageLookupByLibrary.simpleMessage(
"Package Star Citizen P4K File"),
"tools_action_view_system_info": "tools_action_view_system_info":
MessageLookupByLibrary.simpleMessage("View system information"), MessageLookupByLibrary.simpleMessage("View system information"),
"tools_action_write_nvme_registry_patch": "tools_action_write_nvme_registry_patch":
@ -898,26 +1107,90 @@ class MessageLookup extends MessageLookupByLibrary {
"RSI customer service station"), "RSI customer service station"),
"tools_hosts_info_rsi_official_website": "tools_hosts_info_rsi_official_website":
MessageLookupByLibrary.simpleMessage("RSI official website"), MessageLookupByLibrary.simpleMessage("RSI official website"),
"tools_hosts_info_rsi_zendesk": MessageLookupByLibrary.simpleMessage(
"RSI ZENDESK Customer Service Station"),
"tools_hosts_info_site": MessageLookupByLibrary.simpleMessage("Site"), "tools_hosts_info_site": MessageLookupByLibrary.simpleMessage("Site"),
"tools_hosts_info_status": "tools_hosts_info_status":
MessageLookupByLibrary.simpleMessage("State"), MessageLookupByLibrary.simpleMessage("Status"),
"tools_hosts_info_writing_hosts": "tools_hosts_info_writing_hosts":
MessageLookupByLibrary.simpleMessage("I am writing Hosts ..."), MessageLookupByLibrary.simpleMessage("I am writing Hosts ..."),
"tools_info_game_install_location": "tools_info_game_install_location":
MessageLookupByLibrary.simpleMessage("Game installation location:"), MessageLookupByLibrary.simpleMessage(
"tools_info_processing_failed": m52, "Game installation location: "),
"tools_info_processing_failed": m54,
"tools_info_rsi_launcher_location": "tools_info_rsi_launcher_location":
MessageLookupByLibrary.simpleMessage("RSI starter position:"), MessageLookupByLibrary.simpleMessage("RSI Launcher position:"),
"tools_info_scanning": "tools_info_scanning":
MessageLookupByLibrary.simpleMessage("Scanning..."), MessageLookupByLibrary.simpleMessage("Scanning..."),
"webview_localization_device_windows_hello_toast": "tools_rsi_launcher_enhance_action_expand":
MessageLookupByLibrary.simpleMessage("Expand additional features"),
"tools_rsi_launcher_enhance_action_fold":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please complete the Windows Hello verification to fill in the password"), "Put up the additional function"),
"webview_localization_enter_device_pin": "tools_rsi_launcher_enhance_action_install":
MessageLookupByLibrary.simpleMessage("Installation enhanced patch"),
"tools_rsi_launcher_enhance_init_msg1":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"Please enter the device PIN to automatically log in to the RSI account"), "Read the RSI Launcher information ..."),
"tools_rsi_launcher_enhance_init_msg2":
MessageLookupByLibrary.simpleMessage(
"Obtaining enhanced data from the Internet ..."),
"tools_rsi_launcher_enhance_msg_error":
MessageLookupByLibrary.simpleMessage(
"Obtaining enhanced data failure may be the network problem or the current version does not support"),
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error":
MessageLookupByLibrary.simpleMessage(
"Reading the Launcher information failed!"),
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args":
m55,
"tools_rsi_launcher_enhance_msg_error_launcher_notfound":
MessageLookupByLibrary.simpleMessage("No RSI promoter was found"),
"tools_rsi_launcher_enhance_msg_patch_status": m56,
"tools_rsi_launcher_enhance_msg_uninstall":
MessageLookupByLibrary.simpleMessage(
"* If you need to uninstall the enhanced patch, cover the installation RSI promoter."),
"tools_rsi_launcher_enhance_msg_version": m57,
"tools_rsi_launcher_enhance_note_msg": MessageLookupByLibrary.simpleMessage(
"RSI Launcher enhancement is a community function. It will unpack \"RSI LAUNCHER\" on your computer and add additional enhancement functions. What functions are determined by you.\n\nAt present, the official (CIG) only permits us to perform multi -language operations. The launch of the booter download enhancement is an extra function we think of it. Violation of the CIG user protocol (https://robertsspaceindustries.com/eula) may cause serious consequences such as accounts. Whether or not you are determined by yourself, we are not responsible for the possible consequences (game damage, account ban, etc.).\n\nFor the modified content of the Launcher, we are open from: https://github.com/starcitizentoolbox/rsilauncherenhance. If necessary, you can check it yourself.\n\nIf you need to cancel this enhanced patch for any reason, cover the installation of the official RSI Launcher directly."),
"tools_rsi_launcher_enhance_note_title":
MessageLookupByLibrary.simpleMessage(
"Instructions for the use of RSI Launcher enhancement"),
"tools_rsi_launcher_enhance_subtitle_download_booster":
MessageLookupByLibrary.simpleMessage(
"When downloading the game, you can use more threads to increase the download speed."),
"tools_rsi_launcher_enhance_subtitle_localization":
MessageLookupByLibrary.simpleMessage(
"Add multi -language support to the RSI Launcher."),
"tools_rsi_launcher_enhance_title":
MessageLookupByLibrary.simpleMessage("RSI Launcher enhancement"),
"tools_rsi_launcher_enhance_title_download_booster":
MessageLookupByLibrary.simpleMessage(
"RSI Launcher download enhancement"),
"tools_rsi_launcher_enhance_title_localization":
MessageLookupByLibrary.simpleMessage("RSI startup localization"),
"tools_rsi_launcher_enhance_working_msg1":
MessageLookupByLibrary.simpleMessage("Generate patch ..."),
"tools_rsi_launcher_enhance_working_msg2":
MessageLookupByLibrary.simpleMessage(
"Installation patch takes a little time, depending on your computer performance ..."),
"tools_unp4k_missing_runtime":
MessageLookupByLibrary.simpleMessage("Lack of runtime"),
"tools_unp4k_missing_runtime_action_install":
MessageLookupByLibrary.simpleMessage("Install the runtime"),
"tools_unp4k_missing_runtime_info": MessageLookupByLibrary.simpleMessage(
"Use this function to install the .NET8 runtime, please click the button below to download and install it. After the installation is successful, reopen this page to continue to use."),
"tools_unp4k_msg_init":
MessageLookupByLibrary.simpleMessage("Initialization ..."),
"tools_unp4k_msg_open_file": m58,
"tools_unp4k_msg_read_completed": m59,
"tools_unp4k_msg_read_file": m60,
"tools_unp4k_msg_reading":
MessageLookupByLibrary.simpleMessage("Reading P4K file ..."),
"tools_unp4k_msg_reading2":
MessageLookupByLibrary.simpleMessage("Treatment files ..."),
"tools_unp4k_msg_reading3": m61,
"tools_unp4k_msg_unknown_file_type": m62,
"tools_unp4k_title": m63,
"tools_unp4k_view_file":
MessageLookupByLibrary.simpleMessage("Click the file to preview"),
"webview_localization_finished_invitations": "webview_localization_finished_invitations":
MessageLookupByLibrary.simpleMessage("Completed invitations"), MessageLookupByLibrary.simpleMessage("Completed invitations"),
"webview_localization_name_member": "webview_localization_name_member":

View File

@ -22,10 +22,123 @@ class MessageLookup extends MessageLookupByLibrary {
static String m2(v0, v1) => "SCToolBox V ${v0} ${v1}"; static String m2(v0, v1) => "SCToolBox V ${v0} ${v1}";
static String m19(v0, v1) => "ダウンロード: ${v0}/s アップロード:${v1}/s";
static String m20(v0) => "ダウンロード済み:${v0}";
static String m21(v0) => "ダウンロード... (${v0}%)";
static String m22(v0) => "ステータス:${v0}";
static String m23(v1) => "サイズ合計:${v1}";
static String m24(v0) => "アップロード済み:${v0}";
static String m25(v2) => "検証中...${v2}";
static String m35(v1, v2) =>
"RSI サーバレポートのバージョン:${v1} \n\nローカルのバージョン:${v2} \n\nRSI Launcher を使ってゲームをアップデートしてください!";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{ static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"about_action_email":
MessageLookupByLibrary.simpleMessage("メール: xkeyc@qq.com"),
"about_action_open_source":
MessageLookupByLibrary.simpleMessage("オープンソース"),
"about_analytics_install_translation":
MessageLookupByLibrary.simpleMessage("日本語化インストール"),
"about_analytics_launch": MessageLookupByLibrary.simpleMessage("起動"),
"about_analytics_launch_game":
MessageLookupByLibrary.simpleMessage("ゲームを起動"),
"about_analytics_p4k_redirection":
MessageLookupByLibrary.simpleMessage("P4Kダウンロード"),
"about_analytics_total_users":
MessageLookupByLibrary.simpleMessage("利用者数"),
"about_analytics_units_times":
MessageLookupByLibrary.simpleMessage(""),
"about_analytics_units_user": MessageLookupByLibrary.simpleMessage(""),
"about_check_update": MessageLookupByLibrary.simpleMessage("更新チェック"),
"about_disclaimer": MessageLookupByLibrary.simpleMessage(
"これは Star Citizen の非公式ツールです、Cloud Imperium Games LLC の所有ではない。 本ソフトウェアのホストまたは使用者によって作成されていないすべての情報は、それぞれの所有者に帰属します。 \nStar Citizen®、Roberts Space Industries®、Cloud Imperium® は Cloud Imperium Rights LLC のトレードマーク。"),
"about_info_latest_version":
MessageLookupByLibrary.simpleMessage("すでに最新バージョンだ!"),
"about_online_feedback":
MessageLookupByLibrary.simpleMessage("フィードバック"),
"action_close": MessageLookupByLibrary.simpleMessage("クローズ"),
"action_open_folder": MessageLookupByLibrary.simpleMessage("フォルダを開く"),
"app_index_version_info": m2, "app_index_version_info": m2,
"app_language_code": MessageLookupByLibrary.simpleMessage("ja"), "app_language_code": MessageLookupByLibrary.simpleMessage("ja"),
"app_language_name": MessageLookupByLibrary.simpleMessage("日本語") "app_language_name": MessageLookupByLibrary.simpleMessage("日本語"),
"downloader_action_cancel_all":
MessageLookupByLibrary.simpleMessage("すべてキャンセル"),
"downloader_action_cancel_download":
MessageLookupByLibrary.simpleMessage("ダウンロードをキャンセル"),
"downloader_action_confirm_cancel_all_tasks":
MessageLookupByLibrary.simpleMessage("すべてのタスクのキャンセルを確認する?"),
"downloader_action_confirm_cancel_download":
MessageLookupByLibrary.simpleMessage("ダウンロードのキャンセルを確認しますか?"),
"downloader_action_continue_download":
MessageLookupByLibrary.simpleMessage("ダウンロードを続ける"),
"downloader_action_options":
MessageLookupByLibrary.simpleMessage("オプション"),
"downloader_action_pause_all":
MessageLookupByLibrary.simpleMessage("すべて一時停止"),
"downloader_action_pause_download":
MessageLookupByLibrary.simpleMessage("ダウンロードの一時停止"),
"downloader_action_resume_all":
MessageLookupByLibrary.simpleMessage("すべて復元"),
"downloader_info_deleted": MessageLookupByLibrary.simpleMessage("削除済み"),
"downloader_info_download_completed":
MessageLookupByLibrary.simpleMessage("ダウンロード完了"),
"downloader_info_download_failed":
MessageLookupByLibrary.simpleMessage("ダウンロード失敗"),
"downloader_info_download_upload_speed": m19,
"downloader_info_downloaded": m20,
"downloader_info_downloading": m21,
"downloader_info_downloading_status":
MessageLookupByLibrary.simpleMessage("ダウンロード中..."),
"downloader_info_manual_file_deletion_note":
MessageLookupByLibrary.simpleMessage(
"ダウンロードしたファイルが不要になった場合は、手動で削除する必要があります。"),
"downloader_info_no_download_tasks":
MessageLookupByLibrary.simpleMessage("ダウンロードタスクなし"),
"downloader_info_paused": MessageLookupByLibrary.simpleMessage("一時停止中"),
"downloader_info_status": m22,
"downloader_info_total_size": m23,
"downloader_info_uploaded": m24,
"downloader_info_verifying": m25,
"downloader_info_waiting": MessageLookupByLibrary.simpleMessage("待機中"),
"downloader_speed_limit_settings":
MessageLookupByLibrary.simpleMessage("速度制限設定"),
"downloader_title_downloading":
MessageLookupByLibrary.simpleMessage("ダウンロード中"),
"downloader_title_ended": MessageLookupByLibrary.simpleMessage("終了"),
"home_action_login_rsi_account":
MessageLookupByLibrary.simpleMessage("RSI アカウントログイン"),
"home_action_one_click_launch":
MessageLookupByLibrary.simpleMessage("ワンクリック起動"),
"home_holiday_countdown":
MessageLookupByLibrary.simpleMessage("祝日カウントダウン"),
"home_holiday_countdown_disclaimer":
MessageLookupByLibrary.simpleMessage(
"* 上記の祝日は手作業で収集・管理されているため、誤りがある可能性があります、フィードバックは歓迎する!!"),
"home_login_action_title_box_one_click_launch":
MessageLookupByLibrary.simpleMessage("ボックスワンクリック起動"),
"home_login_action_title_need_webview2_runtime":
MessageLookupByLibrary.simpleMessage("WebView2 Runtime のインストールが必要"),
"home_login_info_action_ignore":
MessageLookupByLibrary.simpleMessage("無視する"),
"home_login_info_game_version_outdated":
MessageLookupByLibrary.simpleMessage("ゲームバージョンが古すぎる"),
"home_login_info_one_click_launch_description":
MessageLookupByLibrary.simpleMessage(
"この機能は、ゲームをより便利に起動するのに役立ちます。\n\nアカウントのセキュリティを確保するため、この機能はローカライズブラウザを使用してログイン状態を保持し、パスワード情報を保存しません(自動入力オンの場合を除く)。\n\nこの機能を使用してアカウントにログインする際は、SCToolBox が信頼できるソースからダウンロードされていることを確認してください。"),
"home_login_info_rsi_server_report": m35,
"home_login_title_launching_game":
MessageLookupByLibrary.simpleMessage("ゲーム起動中..."),
"home_login_title_welcome_back":
MessageLookupByLibrary.simpleMessage("お帰りなさい!"),
"home_title_logging_in":
MessageLookupByLibrary.simpleMessage("ログイン中...")
}; };
} }

View File

@ -83,63 +83,84 @@ class MessageLookup extends MessageLookupByLibrary {
static String m29(v0) => "${v0}"; static String m29(v0) => "${v0}";
static String m30(v0) => "您在 ${v0} 安装的汉化有新版本啦!"; static String m30(v0) => "已加载汉化版本:${v0}";
static String m31(v1, v2) => static String m31(v0) => "高级汉化 -> ${v0}";
static String m32(v0, v1) => "汉化文本行数:${v0} P4K文本行数${v1}";
static String m33(v0) => "预览:${v0}";
static String m34(v0) => "您在 ${v0} 安装的汉化有新版本啦!";
static String m35(v1, v2) =>
"RSI 服务器报告版本号:${v1} \n\n本地版本号:${v2} \n\n建议使用 RSI Launcher 更新游戏!"; "RSI 服务器报告版本号:${v1} \n\n本地版本号:${v2} \n\n建议使用 RSI Launcher 更新游戏!";
static String m32(v0) => "通道:${v0}"; static String m36(v0) => "通道:${v0}";
static String m33(v0) => "自定义_${v0}"; static String m37(v0) => "启用(${v0}";
static String m34(v0) => "启用(${v0}"; static String m38(v0) => "安装出错!\n\n ${v0}";
static String m35(v0) => "安装出错!\n\n ${v0}"; static String m39(v0) => "已安装版本:${v0}";
static String m36(v0) => "已安装版本${v0}"; static String m40(v0) => "更新时间${v0}";
static String m37(v0) => "更新时间${v0}"; static String m41(v0) => "版本号${v0}";
static String m38(v0) => "版本号${v0}"; static String m42(v0) => "当前状态${v0}";
static String m39(v0) => "当前状态:${v0}"; static String m43(v0, v1, v2) => "${v0} 最小值: ${v1} / 最大值: ${v2}";
static String m40(v0, v1, v2) => "${v0} 最小值: ${v1} / 最大值: ${v2}"; static String m44(v0) => "性能优化 -> ${v0}";
static String m41(v0) => "性能优化 -> ${v0}"; static String m45(v0) => "缓存大小 ${v0}MB清理盒子下载的汉化文件缓存不会影响已安装的汉化";
static String m42(v0) => "缓存大小 ${v0}MB清理盒子下载的汉化文件缓存不会影响已安装的汉化"; static String m46(v0) =>
static String m43(v0, v1, v2, v3) =>
"启用:${v0} 设备支持:${v1} 邮箱:${v2} 密码:${v3}";
static String m44(v0) =>
"已设置的核心数量:${v0} (此功能适用于首页的盒子一键启动 或 工具中的RSI启动器管理员模式当为 0 时不启用此功能 "; "已设置的核心数量:${v0} (此功能适用于首页的盒子一键启动 或 工具中的RSI启动器管理员模式当为 0 时不启用此功能 ";
static String m45(v0) => "清理失败,请手动移除,文件位置:${v0}"; static String m47(v0) => "清理失败,请手动移除,文件位置:${v0}";
static String m46(v0) => "出现错误:${v0}"; static String m48(v0) => "出现错误:${v0}";
static String m47(v0) => "初始化失败,请截图报告给开发者。${v0}"; static String m49(v0) => "初始化失败,请截图报告给开发者。${v0}";
static String m48(v0) =>
"若您使用 nvme 补丁出现问题,请运行此工具。(可能导致游戏 安装/更新 不可用。)\n\n当前补丁状态:${v0}";
static String m49(v0) =>
"在某些情况下 RSI启动器 的 log 文件会损坏,导致无法完成问题扫描,使用此工具清理损坏的 log 文件。\n\n当前日志文件大小:${v0} MB";
static String m50(v0) => static String m50(v0) =>
"若您使用 nvme 补丁出现问题,请运行此工具。(可能导致游戏 安装/更新 不可用。)\n\n当前补丁状态:${v0}";
static String m51(v0) =>
"在某些情况下 RSI启动器 的 log 文件会损坏,导致无法完成问题扫描,使用此工具清理损坏的 log 文件。\n\n当前日志文件大小:${v0} MB";
static String m52(v0) =>
"若游戏画面出现异常或版本更新后可使用本工具清理过期的着色器当大于500M时建议清理 \n\n缓存大小:${v0} MB"; "若游戏画面出现异常或版本更新后可使用本工具清理过期的着色器当大于500M时建议清理 \n\n缓存大小:${v0} MB";
static String m51(v0, v1, v2, v3, v4) => static String m53(v0, v1, v2, v3, v4) =>
"系统:${v0}\n\n处理器:${v1}\n\n内存大小:${v2}GB\n\n显卡信息:\n${v3}\n\n硬盘信息:\n${v4}\n\n"; "系统:${v0}\n\n处理器:${v1}\n\n内存大小:${v2}GB\n\n显卡信息:\n${v3}\n\n硬盘信息:\n${v4}\n\n";
static String m52(v0) => "处理失败!:${v0}"; static String m54(v0) => "处理失败!:${v0}";
static String m55(v0) => "读取启动器信息失败:${v0}";
static String m56(v0) => "补丁状态:${v0}";
static String m57(v0) => "启动器内部版本信息:${v0}";
static String m58(v0) => "打开文件:${v0}";
static String m59(v0, v1) => "加载完毕:${v0} 个文件,用时:${v1} ms";
static String m60(v0) => "读取文件:${v0} ...";
static String m61(v0, v1) => "正在处理文件 (${v0}/${v1}) ...";
static String m62(v0) => "未知文件类型\n${v0}";
static String m63(v0) => "P4K 查看器 -> ${v0}";
final messages = _notInlinedMessages(_notInlinedMessages); final messages = _notInlinedMessages(_notInlinedMessages);
static Map<String, Function> _notInlinedMessages(_) => <String, Function>{ static Map<String, Function> _notInlinedMessages(_) => <String, Function>{
"about_action_email": "about_action_email":
MessageLookupByLibrary.simpleMessage("邮箱: scbox@xkeyc.com"), MessageLookupByLibrary.simpleMessage("邮箱: xkeyc@qq.com"),
"about_action_open_source": MessageLookupByLibrary.simpleMessage("开源"), "about_action_open_source": MessageLookupByLibrary.simpleMessage("开源"),
"about_action_qq_group": "about_action_qq_group":
MessageLookupByLibrary.simpleMessage("QQ群: 940696487"), MessageLookupByLibrary.simpleMessage("QQ群: 940696487"),
@ -193,6 +214,10 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("正在检测可用性,这可能需要一点时间..."), MessageLookupByLibrary.simpleMessage("正在检测可用性,这可能需要一点时间..."),
"app_splash_checking_for_updates": "app_splash_checking_for_updates":
MessageLookupByLibrary.simpleMessage("正在检查更新..."), MessageLookupByLibrary.simpleMessage("正在检查更新..."),
"app_splash_dialog_u_a_p_p":
MessageLookupByLibrary.simpleMessage("用户协议与隐私政策"),
"app_splash_dialog_u_a_p_p_content": MessageLookupByLibrary.simpleMessage(
"感谢您选择 SC汉化盒子 ,我们致力于为您提供 安全、便捷、可靠的使用体验,在您开始使用应用前,请先阅读并同意以下内容:\n\n 1. 本应用 为 GNU 通用公共许可证 v3.0 协议下的开源软件,您可以在遵守协议的前提下自由使用、修改、分发本软件。我们的源代码位于:[Github.com/StarCitizenToolBox/app](https://github.com/StarCitizenToolBox/app)。 \n2. 本应用中的互联网内容(包括但不限于 本地化文件、工具网站、新闻、视频 等)版权由其作者创作所有,不属于 GPL 的一部分,请在遵守对应的授权协议下使用。\n3. 本应用的官方免费发布渠道为:[微软应用商店](https://apps.microsoft.com/detail/9NF3SWFWNKL1) 与 [星际公民汉化组官网](https://www.starcitizenzw.com/) ,若您从其他第三方处获得,请仔细甄别,以免遭受财产损失。\n4. 本应用在使用过程中会向我们的服务器发送匿名的统计数据,用于改进软件质量,我们不会收集您的任何个人隐私信息。 \n5. 本应用由社区提供支持,与 Cloud Imperium Games 或 其他第三方商业公司 无直接关联。\n6. 我们提供有限的社区支持,如有需要,请前往关于页面了解如何联系我们。"),
"app_upgrade_action_next_time": "app_upgrade_action_next_time":
MessageLookupByLibrary.simpleMessage("下次吧"), MessageLookupByLibrary.simpleMessage("下次吧"),
"app_upgrade_action_update_now": "app_upgrade_action_update_now":
@ -272,6 +297,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("游戏触发了最为广泛的崩溃问题,请查看排障指南"), MessageLookupByLibrary.simpleMessage("游戏触发了最为广泛的崩溃问题,请查看排障指南"),
"doctor_game_error_gpu_crash": "doctor_game_error_gpu_crash":
MessageLookupByLibrary.simpleMessage("您的显卡崩溃啦!请查看排障指南"), MessageLookupByLibrary.simpleMessage("您的显卡崩溃啦!请查看排障指南"),
"doctor_game_error_gpu_vulkan_crash":
MessageLookupByLibrary.simpleMessage("GPU Vulkan 崩溃"),
"doctor_game_error_gpu_vulkan_crash_info":
MessageLookupByLibrary.simpleMessage(
"Vulkan 崩溃!这可能是驱动版本或游戏引擎问题,请尝试更新 GPU 驱动 或 使用清理着色器功能为您回退到 DX11"),
"doctor_game_error_low_gpu_memory": "doctor_game_error_low_gpu_memory":
MessageLookupByLibrary.simpleMessage("可用显存不足"), MessageLookupByLibrary.simpleMessage("可用显存不足"),
"doctor_game_error_low_gpu_memory_info": "doctor_game_error_low_gpu_memory_info":
@ -447,8 +477,6 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("一键启动"), MessageLookupByLibrary.simpleMessage("一键启动"),
"home_action_performance_optimization": "home_action_performance_optimization":
MessageLookupByLibrary.simpleMessage("性能优化"), MessageLookupByLibrary.simpleMessage("性能优化"),
"home_action_q_auto_password_fill_prompt":
MessageLookupByLibrary.simpleMessage("是否开启自动密码填充?"),
"home_action_rsi_status_arena_commander": "home_action_rsi_status_arena_commander":
MessageLookupByLibrary.simpleMessage("竞技场指挥官"), MessageLookupByLibrary.simpleMessage("竞技场指挥官"),
"home_action_rsi_status_electronic_access": "home_action_rsi_status_electronic_access":
@ -478,33 +506,102 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("正在进行中"), MessageLookupByLibrary.simpleMessage("正在进行中"),
"home_info_account_security_warning": MessageLookupByLibrary.simpleMessage( "home_info_account_security_warning": MessageLookupByLibrary.simpleMessage(
"为确保账户安全,一键启动功能已在开发版中禁用,我们将在微软商店版本中提供此功能。\n\n微软商店版由微软提供可靠的分发下载与数字签名,可有效防止软件被恶意篡改。\n\n提示:您无需使用盒子启动游戏也可使用汉化。"), "为确保账户安全,一键启动功能已在开发版中禁用,我们将在微软商店版本中提供此功能。\n\n微软商店版由微软提供可靠的分发下载与数字签名,可有效防止软件被恶意篡改。\n\n提示:您无需使用盒子启动游戏也可使用汉化。"),
"home_info_auto_fill_notice": MessageLookupByLibrary.simpleMessage(
"* 若开启了自动填充,请留意弹出的 Windows Hello 窗口"),
"home_info_one_click_launch_warning": "home_info_one_click_launch_warning":
MessageLookupByLibrary.simpleMessage("一键启动功能提示"), MessageLookupByLibrary.simpleMessage("一键启动功能提示"),
"home_info_valid_installation_required": "home_info_valid_installation_required":
MessageLookupByLibrary.simpleMessage("该功能需要一个有效的安装位置"), MessageLookupByLibrary.simpleMessage("该功能需要一个有效的安装位置"),
"home_install_location": MessageLookupByLibrary.simpleMessage("安装位置:"), "home_install_location": MessageLookupByLibrary.simpleMessage("安装位置:"),
"home_localization_action_advanced":
MessageLookupByLibrary.simpleMessage("高级汉化"),
"home_localization_action_install_customize":
MessageLookupByLibrary.simpleMessage("安装自定义文件"),
"home_localization_action_rsi_launcher_localization":
MessageLookupByLibrary.simpleMessage("RSI 启动器汉化"),
"home_localization_action_rsi_launcher_no_game_path_msg":
MessageLookupByLibrary.simpleMessage(
"您当前未安装游戏本体或未选择游戏安装目录,只可使用启动器汉化功能。请确保游戏安装完毕或在盒子设置中添加游戏安装目录后重试。"),
"home_localization_action_select_customize_file":
MessageLookupByLibrary.simpleMessage("点击选择 ini 文件"),
"home_localization_advanced_action_install":
MessageLookupByLibrary.simpleMessage("安装汉化"),
"home_localization_advanced_action_mod_change":
MessageLookupByLibrary.simpleMessage("正在重新生成文本..."),
"home_localization_advanced_action_mod_change_localization":
MessageLookupByLibrary.simpleMessage("汉化"),
"home_localization_advanced_action_mod_change_mixed":
MessageLookupByLibrary.simpleMessage("双语"),
"home_localization_advanced_action_mod_change_mixed_newline":
MessageLookupByLibrary.simpleMessage("双语(换行)"),
"home_localization_advanced_action_mod_change_un_localization":
MessageLookupByLibrary.simpleMessage("英文原文"),
"home_localization_advanced_action_mode":
MessageLookupByLibrary.simpleMessage("模式"),
"home_localization_advanced_json_text_location_other":
MessageLookupByLibrary.simpleMessage("地点-其他"),
"home_localization_advanced_json_text_location_used":
MessageLookupByLibrary.simpleMessage("地点-常用"),
"home_localization_advanced_json_text_mission_or_logs":
MessageLookupByLibrary.simpleMessage("任务/日志"),
"home_localization_advanced_json_text_others":
MessageLookupByLibrary.simpleMessage("其他"),
"home_localization_advanced_json_text_subtitle":
MessageLookupByLibrary.simpleMessage("字幕"),
"home_localization_advanced_json_text_things_other":
MessageLookupByLibrary.simpleMessage("物品-其他"),
"home_localization_advanced_json_text_things_used":
MessageLookupByLibrary.simpleMessage("物品-常用"),
"home_localization_advanced_json_text_ui_or_hud_or_menu":
MessageLookupByLibrary.simpleMessage("UI/HUD/菜单"),
"home_localization_advanced_json_text_un_localization":
MessageLookupByLibrary.simpleMessage("未汉化"),
"home_localization_advanced_json_text_vehicle_other":
MessageLookupByLibrary.simpleMessage("载具-其他"),
"home_localization_advanced_json_text_vehicle_used":
MessageLookupByLibrary.simpleMessage("载具-常用"),
"home_localization_advanced_msg_classifying":
MessageLookupByLibrary.simpleMessage("正在分类 ..."),
"home_localization_advanced_msg_gen_localization_install":
MessageLookupByLibrary.simpleMessage("安装汉化文件..."),
"home_localization_advanced_msg_gen_localization_text":
MessageLookupByLibrary.simpleMessage("生成汉化文件..."),
"home_localization_advanced_msg_reading_p4k":
MessageLookupByLibrary.simpleMessage("读取 p4k 文件 ..."),
"home_localization_advanced_msg_reading_server_localization_text":
MessageLookupByLibrary.simpleMessage("获取汉化文本 ..."),
"home_localization_advanced_msg_version": m30,
"home_localization_advanced_title": m31,
"home_localization_advanced_title_msg": m32,
"home_localization_advanced_title_preview": m33,
"home_localization_msg_no_note":
MessageLookupByLibrary.simpleMessage("该版本没有提供描述"),
"home_localization_msg_version_advanced":
MessageLookupByLibrary.simpleMessage(" (高级汉化)"),
"home_localization_new_version_available": "home_localization_new_version_available":
MessageLookupByLibrary.simpleMessage("汉化有新版本!"), MessageLookupByLibrary.simpleMessage("汉化有新版本!"),
"home_localization_new_version_installed": m30, "home_localization_new_version_installed": m34,
"home_localization_ptu_advanced_localization_tip_title":
MessageLookupByLibrary.simpleMessage("推荐使用高级汉化"),
"home_localization_ptu_advanced_localization_tip_title_info":
MessageLookupByLibrary.simpleMessage(
"在 PTU/EPTU 等测试频道 ,当前汉化文本可能与游戏不同步,使用高级汉化可以减少乱码产生。"),
"home_localization_select_customize_file":
MessageLookupByLibrary.simpleMessage("请选择自定义汉化文件"),
"home_localization_select_customize_file_ini":
MessageLookupByLibrary.simpleMessage("请选择 ini 文件"),
"home_localization_title_localization_tools":
MessageLookupByLibrary.simpleMessage("汉化工具"),
"home_login_action_title_box_one_click_launch": "home_login_action_title_box_one_click_launch":
MessageLookupByLibrary.simpleMessage("盒子一键启动"), MessageLookupByLibrary.simpleMessage("盒子一键启动"),
"home_login_action_title_need_webview2_runtime": "home_login_action_title_need_webview2_runtime":
MessageLookupByLibrary.simpleMessage("需要安装 WebView2 Runtime"), MessageLookupByLibrary.simpleMessage("需要安装 WebView2 Runtime"),
"home_login_info_action_ignore": "home_login_info_action_ignore":
MessageLookupByLibrary.simpleMessage("忽略"), MessageLookupByLibrary.simpleMessage("忽略"),
"home_login_info_enter_pin_to_encrypt":
MessageLookupByLibrary.simpleMessage("输入PIN以启用加密"),
"home_login_info_game_version_outdated": "home_login_info_game_version_outdated":
MessageLookupByLibrary.simpleMessage("游戏版本过期"), MessageLookupByLibrary.simpleMessage("游戏版本过期"),
"home_login_info_one_click_launch_description": "home_login_info_one_click_launch_description":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"本功能可以帮您更加便利的启动游戏。\n\n为确保账户安全 ,本功能使用汉化浏览器保留登录状态,且不会保存您的密码信息(除非你启用了自动填充功能)。\n\n使用此功能登录账号时请确保您的 SC汉化盒子 是从可信任的来源下载。"), "本功能可以帮您更加便利的启动游戏。\n\n为确保账户安全 ,本功能使用汉化浏览器保留登录状态,且不会保存您的密码信息(除非你启用了自动填充功能)。\n\n使用此功能登录账号时请确保您的 SC汉化盒子 是从可信任的来源下载。"),
"home_login_info_password_encryption_notice": "home_login_info_rsi_server_report": m35,
MessageLookupByLibrary.simpleMessage(
"盒子将使用 PIN 与 Windows 凭据加密保存您的密码,密码只存储在您的设备中。\n\n当下次登录需要输入密码时您只需授权PIN即可自动填充登录。"),
"home_login_info_rsi_server_report": m31,
"home_login_title_launching_game": "home_login_title_launching_game":
MessageLookupByLibrary.simpleMessage("正在为您启动游戏..."), MessageLookupByLibrary.simpleMessage("正在为您启动游戏..."),
"home_login_title_welcome_back": "home_login_title_welcome_back":
@ -518,53 +615,43 @@ class MessageLookup extends MessageLookupByLibrary {
"lobby_online_lobby_coming_soon": "lobby_online_lobby_coming_soon":
MessageLookupByLibrary.simpleMessage("联机大厅,敬请期待 "), MessageLookupByLibrary.simpleMessage("联机大厅,敬请期待 "),
"lobby_survey": MessageLookupByLibrary.simpleMessage("问卷调查。"), "lobby_survey": MessageLookupByLibrary.simpleMessage("问卷调查。"),
"localization_action_advanced_features":
MessageLookupByLibrary.simpleMessage("高级功能"),
"localization_action_install": "localization_action_install":
MessageLookupByLibrary.simpleMessage("安装"), MessageLookupByLibrary.simpleMessage("安装"),
"localization_action_translation_feedback": "localization_action_translation_feedback":
MessageLookupByLibrary.simpleMessage("汉化反馈"), MessageLookupByLibrary.simpleMessage("汉化反馈"),
"localization_action_uninstall_translation": "localization_action_uninstall_translation":
MessageLookupByLibrary.simpleMessage("卸载汉化"), MessageLookupByLibrary.simpleMessage("卸载汉化"),
"localization_info_channel": m32, "localization_info_channel": m36,
"localization_info_community_translation": "localization_info_community_translation":
MessageLookupByLibrary.simpleMessage("社区汉化"), MessageLookupByLibrary.simpleMessage("社区汉化"),
"localization_info_corrupted_file": "localization_info_corrupted_file":
MessageLookupByLibrary.simpleMessage("文件受损,请重新下载"), MessageLookupByLibrary.simpleMessage("文件受损,请重新下载"),
"localization_info_custom_file": m33,
"localization_info_custom_file_instructions":
MessageLookupByLibrary.simpleMessage(
"即将打开本地化文件夹,请将自定义的 任意名称.ini 文件放入 Customize_ini 文件夹。\n\n添加新文件后未显示请使用右上角刷新按钮。\n\n安装时请确保选择了正确的语言。"),
"localization_info_custom_files": "localization_info_custom_files":
MessageLookupByLibrary.simpleMessage("自定义文件"), MessageLookupByLibrary.simpleMessage("自定义文件"),
"localization_info_custom_text": "localization_info_enabled": m37,
MessageLookupByLibrary.simpleMessage("自定义文本"),
"localization_info_enabled": m34,
"localization_info_incompatible_translation_params_warning": "localization_info_incompatible_translation_params_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"USER.cfg 包含不兼容的汉化参数,这可能是以前的汉化文件的残留信息。\n\n这将可能导致汉化无效或乱码,点击确认为您一键移除(不会影响其他配置)。"), "USER.cfg 包含不兼容的汉化参数,这可能是以前的汉化文件的残留信息。\n\n这将可能导致汉化无效或乱码,点击确认为您一键移除(不会影响其他配置)。"),
"localization_info_installation_error": m35, "localization_info_installation_error": m38,
"localization_info_installed": "localization_info_installed":
MessageLookupByLibrary.simpleMessage("已安装"), MessageLookupByLibrary.simpleMessage("已安装"),
"localization_info_installed_version": m36, "localization_info_installed_version": m39,
"localization_info_language": "localization_info_language":
MessageLookupByLibrary.simpleMessage("语言: "), MessageLookupByLibrary.simpleMessage("语言: "),
"localization_info_machine_translation_warning": "localization_info_machine_translation_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"您正在使用游戏内置文本官方文本目前为机器翻译截至3.21.0),建议您在下方安装社区汉化。"), "您正在使用游戏内置文本官方文本目前为机器翻译截至3.21.0),建议您在下方安装社区汉化。"),
"localization_info_no_custom_text":
MessageLookupByLibrary.simpleMessage("暂无自定义文本"),
"localization_info_no_translation_available": "localization_info_no_translation_available":
MessageLookupByLibrary.simpleMessage("该语言/版本 暂无可用汉化,敬请期待!"), MessageLookupByLibrary.simpleMessage("该语言/版本 暂无可用汉化,敬请期待!"),
"localization_info_note": MessageLookupByLibrary.simpleMessage("备注:"), "localization_info_note": MessageLookupByLibrary.simpleMessage("备注:"),
"localization_info_remove_incompatible_translation_params": "localization_info_remove_incompatible_translation_params":
MessageLookupByLibrary.simpleMessage("是否移除不兼容的汉化参数"), MessageLookupByLibrary.simpleMessage("是否移除不兼容的汉化参数"),
"localization_info_translation_status": "localization_info_translation":
MessageLookupByLibrary.simpleMessage("汉化状态"), MessageLookupByLibrary.simpleMessage("游戏汉化"),
"localization_info_unavailable": "localization_info_unavailable":
MessageLookupByLibrary.simpleMessage("不可用"), MessageLookupByLibrary.simpleMessage("不可用"),
"localization_info_update_time": m37, "localization_info_update_time": m40,
"localization_info_version_number": m38, "localization_info_version_number": m41,
"performance_action_apply": MessageLookupByLibrary.simpleMessage("应用"), "performance_action_apply": MessageLookupByLibrary.simpleMessage("应用"),
"performance_action_apply_and_clear_shaders": "performance_action_apply_and_clear_shaders":
MessageLookupByLibrary.simpleMessage("应用并清理着色器(推荐)"), MessageLookupByLibrary.simpleMessage("应用并清理着色器(推荐)"),
@ -584,7 +671,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage(" 恢复默认 "), MessageLookupByLibrary.simpleMessage(" 恢复默认 "),
"performance_action_super": MessageLookupByLibrary.simpleMessage("超级"), "performance_action_super": MessageLookupByLibrary.simpleMessage("超级"),
"performance_info_applied": MessageLookupByLibrary.simpleMessage("已应用"), "performance_info_applied": MessageLookupByLibrary.simpleMessage("已应用"),
"performance_info_current_status": m39, "performance_info_current_status": m42,
"performance_info_delete_config_file": "performance_info_delete_config_file":
MessageLookupByLibrary.simpleMessage("删除配置文件..."), MessageLookupByLibrary.simpleMessage("删除配置文件..."),
"performance_info_done": MessageLookupByLibrary.simpleMessage("完成..."), "performance_info_done": MessageLookupByLibrary.simpleMessage("完成..."),
@ -596,7 +683,7 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"该功能对优化显卡瓶颈有很大帮助,但对 CPU 瓶颈可能起反效果,如果您显卡性能强劲,可以尝试使用更好的画质来获得更高的显卡利用率。"), "该功能对优化显卡瓶颈有很大帮助,但对 CPU 瓶颈可能起反效果,如果您显卡性能强劲,可以尝试使用更好的画质来获得更高的显卡利用率。"),
"performance_info_graphics": MessageLookupByLibrary.simpleMessage("图形"), "performance_info_graphics": MessageLookupByLibrary.simpleMessage("图形"),
"performance_info_min_max_values": m40, "performance_info_min_max_values": m43,
"performance_info_not_applied": "performance_info_not_applied":
MessageLookupByLibrary.simpleMessage("未应用"), MessageLookupByLibrary.simpleMessage("未应用"),
"performance_info_shader_clearing_warning": "performance_info_shader_clearing_warning":
@ -604,7 +691,123 @@ class MessageLookup extends MessageLookupByLibrary {
"清理着色器后首次进入游戏可能会出现卡顿,请耐心等待游戏初始化完毕。"), "清理着色器后首次进入游戏可能会出现卡顿,请耐心等待游戏初始化完毕。"),
"performance_info_write_out_config_file": "performance_info_write_out_config_file":
MessageLookupByLibrary.simpleMessage("写出配置文件"), MessageLookupByLibrary.simpleMessage("写出配置文件"),
"performance_title_performance_optimization": m41, "performance_json_text_antialiasing":
MessageLookupByLibrary.simpleMessage("抗锯齿"),
"performance_json_text_antialiasing_info":
MessageLookupByLibrary.simpleMessage(
"0 关闭1 SMAA2 时间过滤+SMAA3 时间滤波和投影矩阵抖动的 SMAA"),
"performance_json_text_custom_parameters":
MessageLookupByLibrary.simpleMessage("自定义参数"),
"performance_json_text_display_session":
MessageLookupByLibrary.simpleMessage("显示会话信息"),
"performance_json_text_display_session_info":
MessageLookupByLibrary.simpleMessage(
"开启后在屏幕上显示一个二维码,用于反馈时让 CIG 快速定位相关信息"),
"performance_json_text_displayinfo":
MessageLookupByLibrary.simpleMessage("屏幕信息(展示帧率)"),
"performance_json_text_displayinfo_info":
MessageLookupByLibrary.simpleMessage("在屏幕右上角展示帧率,服务器信息等"),
"performance_json_text_fov":
MessageLookupByLibrary.simpleMessage("设置视角FOV"),
"performance_json_text_game_effects":
MessageLookupByLibrary.simpleMessage("特效等级"),
"performance_json_text_game_effects_info":
MessageLookupByLibrary.simpleMessage("游戏特效等级"),
"performance_json_text_max_fps":
MessageLookupByLibrary.simpleMessage("最大帧率"),
"performance_json_text_max_fps_info":
MessageLookupByLibrary.simpleMessage("调整游戏最高帧率0为不限制"),
"performance_json_text_motion_blur":
MessageLookupByLibrary.simpleMessage("动态模糊"),
"performance_json_text_motion_blur_info":
MessageLookupByLibrary.simpleMessage("开启以提高运动感,关闭提升观感"),
"performance_json_text_object_detail":
MessageLookupByLibrary.simpleMessage("对象细节"),
"performance_json_text_object_detail_info":
MessageLookupByLibrary.simpleMessage("模型对象细节影响LOD等.."),
"performance_json_text_particles":
MessageLookupByLibrary.simpleMessage("粒子细节"),
"performance_json_text_particles_object_collisions":
MessageLookupByLibrary.simpleMessage("粒子碰撞"),
"performance_json_text_particles_object_collisions_info":
MessageLookupByLibrary.simpleMessage("1 仅静态粒子 2 包括动态粒子"),
"performance_json_text_physics":
MessageLookupByLibrary.simpleMessage("物理细节"),
"performance_json_text_physics_info":
MessageLookupByLibrary.simpleMessage("物理效果范围"),
"performance_json_text_postprocessing":
MessageLookupByLibrary.simpleMessage("后处理细节"),
"performance_json_text_postprocessing_info":
MessageLookupByLibrary.simpleMessage("后处理着色器,动态模糊效果 等"),
"performance_json_text_renderer":
MessageLookupByLibrary.simpleMessage("渲染器质量"),
"performance_json_text_renderer_info":
MessageLookupByLibrary.simpleMessage("cryengine 渲染器质量"),
"performance_json_text_shader_decal":
MessageLookupByLibrary.simpleMessage("贴花质量"),
"performance_json_text_shader_decal_info":
MessageLookupByLibrary.simpleMessage("LOGO、标志等"),
"performance_json_text_shader_fx":
MessageLookupByLibrary.simpleMessage("FX 质量"),
"performance_json_text_shader_general":
MessageLookupByLibrary.simpleMessage("常规质量"),
"performance_json_text_shader_general_info":
MessageLookupByLibrary.simpleMessage("整体模型质量"),
"performance_json_text_shader_glass":
MessageLookupByLibrary.simpleMessage("玻璃质量"),
"performance_json_text_shader_glass_info":
MessageLookupByLibrary.simpleMessage("窗、镜子等"),
"performance_json_text_shader_hdr":
MessageLookupByLibrary.simpleMessage("HDR质量"),
"performance_json_text_shader_hdr_info":
MessageLookupByLibrary.simpleMessage("HDR色差亮度层级 处理 等"),
"performance_json_text_shader_particle":
MessageLookupByLibrary.simpleMessage("粒子质量"),
"performance_json_text_shader_particle_info":
MessageLookupByLibrary.simpleMessage("粒子效果质量"),
"performance_json_text_shader_post_process":
MessageLookupByLibrary.simpleMessage("着色器质量"),
"performance_json_text_shader_shadow":
MessageLookupByLibrary.simpleMessage("阴影质量"),
"performance_json_text_shader_sky":
MessageLookupByLibrary.simpleMessage("天空质量"),
"performance_json_text_shader_terrain":
MessageLookupByLibrary.simpleMessage("地面质量"),
"performance_json_text_shading":
MessageLookupByLibrary.simpleMessage("着色器细节"),
"performance_json_text_shading_info":
MessageLookupByLibrary.simpleMessage("着色器相关"),
"performance_json_text_shadows":
MessageLookupByLibrary.simpleMessage("阴影细节"),
"performance_json_text_shadows_info":
MessageLookupByLibrary.simpleMessage("阴影效果"),
"performance_json_text_ssdo":
MessageLookupByLibrary.simpleMessage("屏幕光线后处理"),
"performance_json_text_ssdo_info":
MessageLookupByLibrary.simpleMessage("调整光线后处理等级"),
"performance_json_text_texture":
MessageLookupByLibrary.simpleMessage("纹理等级"),
"performance_json_text_texture_info":
MessageLookupByLibrary.simpleMessage("模型纹理细节"),
"performance_json_text_title_custom":
MessageLookupByLibrary.simpleMessage("自定义"),
"performance_json_text_title_graphics":
MessageLookupByLibrary.simpleMessage("图形(修改后建议清理着色器)"),
"performance_json_text_ui_animation":
MessageLookupByLibrary.simpleMessage("UI 淡入淡出动画"),
"performance_json_text_volumetric_effects":
MessageLookupByLibrary.simpleMessage("体积效果"),
"performance_json_text_volumetric_effects_info":
MessageLookupByLibrary.simpleMessage("体积云、体积光照等"),
"performance_json_text_vsync":
MessageLookupByLibrary.simpleMessage("垂直同步"),
"performance_json_text_vsync_info":
MessageLookupByLibrary.simpleMessage("开启以防止撕裂,关闭以提高帧率"),
"performance_json_text_water":
MessageLookupByLibrary.simpleMessage("水体效果"),
"performance_json_text_water_info":
MessageLookupByLibrary.simpleMessage("各种水的等级"),
"performance_title_performance_optimization": m44,
"setting_action_clear_translation_file_cache": "setting_action_clear_translation_file_cache":
MessageLookupByLibrary.simpleMessage("清理汉化文件缓存"), MessageLookupByLibrary.simpleMessage("清理汉化文件缓存"),
"setting_action_create_desktop_shortcut": "setting_action_create_desktop_shortcut":
@ -616,7 +819,7 @@ class MessageLookup extends MessageLookupByLibrary {
"启动游戏时忽略能效核心( 适用于Intel 12th+ 处理器 "), "启动游戏时忽略能效核心( 适用于Intel 12th+ 处理器 "),
"setting_action_info_autofill_data_cleared": "setting_action_info_autofill_data_cleared":
MessageLookupByLibrary.simpleMessage("已清理自动填充数据"), MessageLookupByLibrary.simpleMessage("已清理自动填充数据"),
"setting_action_info_cache_clearing_info": m42, "setting_action_info_cache_clearing_info": m45,
"setting_action_info_clear_cache_warning": "setting_action_info_clear_cache_warning":
MessageLookupByLibrary.simpleMessage("这不会影响已安装的汉化。"), MessageLookupByLibrary.simpleMessage("这不会影响已安装的汉化。"),
"setting_action_info_confirm_clear_cache": "setting_action_info_confirm_clear_cache":
@ -628,13 +831,6 @@ class MessageLookup extends MessageLookupByLibrary {
"setting_action_info_delete_local_account_warning": "setting_action_info_delete_local_account_warning":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"这将会删除本地的账号记录,或在下次启动游戏时将自动填充选择 ‘否’ 以禁用自动填充。"), "这将会删除本地的账号记录,或在下次启动游戏时将自动填充选择 ‘否’ 以禁用自动填充。"),
"setting_action_info_device_support_info": m43,
"setting_action_info_disabled":
MessageLookupByLibrary.simpleMessage("已禁用"),
"setting_action_info_enabled":
MessageLookupByLibrary.simpleMessage("已启用"),
"setting_action_info_encrypted_saved":
MessageLookupByLibrary.simpleMessage("已加密保存"),
"setting_action_info_enter_cpu_core_to_ignore": "setting_action_info_enter_cpu_core_to_ignore":
MessageLookupByLibrary.simpleMessage("请输入要忽略的 CPU 核心数"), MessageLookupByLibrary.simpleMessage("请输入要忽略的 CPU 核心数"),
"setting_action_info_file_error": "setting_action_info_file_error":
@ -650,10 +846,6 @@ class MessageLookup extends MessageLookupByLibrary {
"setting_action_info_mirror_server_info": "setting_action_info_mirror_server_info":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"使用镜像服务器加速访问 Dps Uex 等工具网站,若访问异常请关闭该功能。 为保护账户安全任何情况下都不会加速RSI官网。"), "使用镜像服务器加速访问 Dps Uex 等工具网站,若访问异常请关闭该功能。 为保护账户安全任何情况下都不会加速RSI官网。"),
"setting_action_info_not_saved":
MessageLookupByLibrary.simpleMessage("未保存"),
"setting_action_info_not_support":
MessageLookupByLibrary.simpleMessage("不支持"),
"setting_action_info_select_game_install_location": "setting_action_info_select_game_install_location":
MessageLookupByLibrary.simpleMessage("请选择游戏安装位置StarCitizen.exe"), MessageLookupByLibrary.simpleMessage("请选择游戏安装位置StarCitizen.exe"),
"setting_action_info_select_rsi_launcher_location": "setting_action_info_select_rsi_launcher_location":
@ -663,13 +855,11 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("设置成功,在对应页面点击刷新即可扫描出新路径"), MessageLookupByLibrary.simpleMessage("设置成功,在对应页面点击刷新即可扫描出新路径"),
"setting_action_info_shortcut_created": "setting_action_info_shortcut_created":
MessageLookupByLibrary.simpleMessage("创建完毕,请返回桌面查看"), MessageLookupByLibrary.simpleMessage("创建完毕,请返回桌面查看"),
"setting_action_info_support":
MessageLookupByLibrary.simpleMessage("支持"),
"setting_action_info_view_log_file": "setting_action_info_view_log_file":
MessageLookupByLibrary.simpleMessage("查看汉化盒子的 log 文件,以定位盒子的 bug"), MessageLookupByLibrary.simpleMessage("查看汉化盒子的 log 文件,以定位盒子的 bug"),
"setting_action_reset_auto_password_fill": "setting_action_reset_auto_password_fill":
MessageLookupByLibrary.simpleMessage("重置自动密码填充"), MessageLookupByLibrary.simpleMessage("重置自动密码填充"),
"setting_action_set_core_count": m44, "setting_action_set_core_count": m46,
"setting_action_set_game_file": "setting_action_set_game_file":
MessageLookupByLibrary.simpleMessage("设置游戏文件 StarCitizen.exe"), MessageLookupByLibrary.simpleMessage("设置游戏文件 StarCitizen.exe"),
"setting_action_set_launcher_file": "setting_action_set_launcher_file":
@ -691,13 +881,13 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("Hosts 加速(实验性)"), MessageLookupByLibrary.simpleMessage("Hosts 加速(实验性)"),
"tools_action_info_cleanup_complete": "tools_action_info_cleanup_complete":
MessageLookupByLibrary.simpleMessage("清理完毕,请完成一次安装 / 游戏启动 操作。"), MessageLookupByLibrary.simpleMessage("清理完毕,请完成一次安装 / 游戏启动 操作。"),
"tools_action_info_cleanup_failed": m45, "tools_action_info_cleanup_failed": m47,
"tools_action_info_config_file_not_exist": "tools_action_info_config_file_not_exist":
MessageLookupByLibrary.simpleMessage("配置文件不存在,请尝试运行一次游戏"), MessageLookupByLibrary.simpleMessage("配置文件不存在,请尝试运行一次游戏"),
"tools_action_info_eac_file_removed": "tools_action_info_eac_file_removed":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"已为您移除 EAC 文件,接下来将为您打开 RSI 启动器,请您前往 SETTINGS -> VERIFY 重装 EAC。"), "已为您移除 EAC 文件,接下来将为您打开 RSI 启动器,请您前往 SETTINGS -> VERIFY 重装 EAC。"),
"tools_action_info_error_occurred": m46, "tools_action_info_error_occurred": m48,
"tools_action_info_fix_success_restart": "tools_action_info_fix_success_restart":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"修复成功,请尝试重启电脑后继续安装游戏! 若注册表修改操作导致其他软件出现兼容问题,请使用 工具 中的 NVME 注册表清理。"), "修复成功,请尝试重启电脑后继续安装游戏! 若注册表修改操作导致其他软件出现兼容问题,请使用 工具 中的 NVME 注册表清理。"),
@ -706,7 +896,7 @@ class MessageLookup extends MessageLookupByLibrary {
"tools_action_info_hosts_acceleration_experimental_tip": "tools_action_info_hosts_acceleration_experimental_tip":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"将 IP 信息写入 Hosts 文件,解决部分地区的 DNS 污染导致无法登录官网等问题。\n该功能正在进行第一阶段测试,遇到问题请及时反馈。"), "将 IP 信息写入 Hosts 文件,解决部分地区的 DNS 污染导致无法登录官网等问题。\n该功能正在进行第一阶段测试,遇到问题请及时反馈。"),
"tools_action_info_init_failed": m47, "tools_action_info_init_failed": m49,
"tools_action_info_log_file_not_exist": "tools_action_info_log_file_not_exist":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"日志文件不存在,请尝试进行一次游戏启动或游戏安装,并退出启动器,若无法解决问题,请尝试将启动器更新至最新版本!"), "日志文件不存在,请尝试进行一次游戏启动或游戏安装,并退出启动器,若无法解决问题,请尝试将启动器更新至最新版本!"),
@ -718,7 +908,7 @@ class MessageLookup extends MessageLookupByLibrary {
"手动写入NVM补丁该功能仅在您知道自己在作什么的情况下使用"), "手动写入NVM补丁该功能仅在您知道自己在作什么的情况下使用"),
"tools_action_info_not_installed": "tools_action_info_not_installed":
MessageLookupByLibrary.simpleMessage("未安装"), MessageLookupByLibrary.simpleMessage("未安装"),
"tools_action_info_nvme_patch_issue": m48, "tools_action_info_nvme_patch_issue": m50,
"tools_action_info_one_key_close_lens_shake": "tools_action_info_one_key_close_lens_shake":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"一键关闭游戏内镜头晃动以便于摄影操作。\n\n @拉邦那 Lapernum 提供参数信息。"), "一键关闭游戏内镜头晃动以便于摄影操作。\n\n @拉邦那 Lapernum 提供参数信息。"),
@ -740,7 +930,7 @@ class MessageLookup extends MessageLookupByLibrary {
"还原镜头摇晃效果。\n\n@拉邦那 Lapernum 提供参数信息。"), "还原镜头摇晃效果。\n\n@拉邦那 Lapernum 提供参数信息。"),
"tools_action_info_rsi_launcher_directory_not_found": "tools_action_info_rsi_launcher_directory_not_found":
MessageLookupByLibrary.simpleMessage("未找到 RSI 启动器目录,请您尝试手动操作。"), MessageLookupByLibrary.simpleMessage("未找到 RSI 启动器目录,请您尝试手动操作。"),
"tools_action_info_rsi_launcher_log_issue": m49, "tools_action_info_rsi_launcher_log_issue": m51,
"tools_action_info_rsi_launcher_not_found": "tools_action_info_rsi_launcher_not_found":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"未找到 RSI 启动器,请尝试重新安装,或在设置中手动添加。"), "未找到 RSI 启动器,请尝试重新安装,或在设置中手动添加。"),
@ -749,11 +939,11 @@ class MessageLookup extends MessageLookupByLibrary {
"tools_action_info_run_rsi_as_admin": "tools_action_info_run_rsi_as_admin":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"以管理员身份运行RSI启动器可能会解决一些问题。\n\n若设置了能效核心屏蔽参数,也会在此应用。"), "以管理员身份运行RSI启动器可能会解决一些问题。\n\n若设置了能效核心屏蔽参数,也会在此应用。"),
"tools_action_info_shader_cache_issue": m50, "tools_action_info_shader_cache_issue": m52,
"tools_action_info_star_citizen_not_found": "tools_action_info_star_citizen_not_found":
MessageLookupByLibrary.simpleMessage( MessageLookupByLibrary.simpleMessage(
"未找到星际公民游戏安装位置,请至少完成一次游戏启动操作 或在设置中手动添加。"), "未找到星际公民游戏安装位置,请至少完成一次游戏启动操作 或在设置中手动添加。"),
"tools_action_info_system_info_content": m51, "tools_action_info_system_info_content": m53,
"tools_action_info_system_info_title": "tools_action_info_system_info_title":
MessageLookupByLibrary.simpleMessage("系统信息"), MessageLookupByLibrary.simpleMessage("系统信息"),
"tools_action_info_valid_game_directory_needed": "tools_action_info_valid_game_directory_needed":
@ -771,8 +961,13 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("移除 nvme 注册表补丁"), MessageLookupByLibrary.simpleMessage("移除 nvme 注册表补丁"),
"tools_action_rsi_launcher_admin_mode": "tools_action_rsi_launcher_admin_mode":
MessageLookupByLibrary.simpleMessage("RSI Launcher 管理员模式"), MessageLookupByLibrary.simpleMessage("RSI Launcher 管理员模式"),
"tools_action_rsi_launcher_enhance_info":
MessageLookupByLibrary.simpleMessage("启动器汉化,下载线程增强"),
"tools_action_rsi_launcher_log_fix": "tools_action_rsi_launcher_log_fix":
MessageLookupByLibrary.simpleMessage("RSI Launcher Log 修复"), MessageLookupByLibrary.simpleMessage("RSI Launcher Log 修复"),
"tools_action_unp4k": MessageLookupByLibrary.simpleMessage("P4K 查看器"),
"tools_action_unp4k_info":
MessageLookupByLibrary.simpleMessage("解包星际公民 p4k 文件"),
"tools_action_view_system_info": "tools_action_view_system_info":
MessageLookupByLibrary.simpleMessage("查看系统信息"), MessageLookupByLibrary.simpleMessage("查看系统信息"),
"tools_action_write_nvme_registry_patch": "tools_action_write_nvme_registry_patch":
@ -792,22 +987,77 @@ class MessageLookup extends MessageLookupByLibrary {
MessageLookupByLibrary.simpleMessage("RSI 客服站"), MessageLookupByLibrary.simpleMessage("RSI 客服站"),
"tools_hosts_info_rsi_official_website": "tools_hosts_info_rsi_official_website":
MessageLookupByLibrary.simpleMessage("RSI 官网"), MessageLookupByLibrary.simpleMessage("RSI 官网"),
"tools_hosts_info_rsi_zendesk":
MessageLookupByLibrary.simpleMessage("RSI Zendesk 客服站"),
"tools_hosts_info_site": MessageLookupByLibrary.simpleMessage("站点"), "tools_hosts_info_site": MessageLookupByLibrary.simpleMessage("站点"),
"tools_hosts_info_status": MessageLookupByLibrary.simpleMessage("状态"), "tools_hosts_info_status": MessageLookupByLibrary.simpleMessage("状态"),
"tools_hosts_info_writing_hosts": "tools_hosts_info_writing_hosts":
MessageLookupByLibrary.simpleMessage("正在写入 Hosts ..."), MessageLookupByLibrary.simpleMessage("正在写入 Hosts ..."),
"tools_info_game_install_location": "tools_info_game_install_location":
MessageLookupByLibrary.simpleMessage("游戏安装位置: "), MessageLookupByLibrary.simpleMessage("游戏安装位置: "),
"tools_info_processing_failed": m52, "tools_info_processing_failed": m54,
"tools_info_rsi_launcher_location": "tools_info_rsi_launcher_location":
MessageLookupByLibrary.simpleMessage("RSI启动器位置"), MessageLookupByLibrary.simpleMessage("RSI启动器位置"),
"tools_info_scanning": MessageLookupByLibrary.simpleMessage("正在扫描..."), "tools_info_scanning": MessageLookupByLibrary.simpleMessage("正在扫描..."),
"webview_localization_device_windows_hello_toast": "tools_rsi_launcher_enhance_action_expand":
MessageLookupByLibrary.simpleMessage("请完成 Windows Hello 验证以填充密码"), MessageLookupByLibrary.simpleMessage("展开额外功能"),
"webview_localization_enter_device_pin": "tools_rsi_launcher_enhance_action_fold":
MessageLookupByLibrary.simpleMessage("请输入设备PIN以自动登录RSI账户"), MessageLookupByLibrary.simpleMessage("收起额外功能"),
"tools_rsi_launcher_enhance_action_install":
MessageLookupByLibrary.simpleMessage("安装增强补丁"),
"tools_rsi_launcher_enhance_init_msg1":
MessageLookupByLibrary.simpleMessage("读取启动器信息..."),
"tools_rsi_launcher_enhance_init_msg2":
MessageLookupByLibrary.simpleMessage("正在从网络获取增强数据..."),
"tools_rsi_launcher_enhance_msg_error":
MessageLookupByLibrary.simpleMessage("获取增强数据失败,可能是网络问题或当前版本不支持"),
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error":
MessageLookupByLibrary.simpleMessage("读取启动器信息失败!"),
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args":
m55,
"tools_rsi_launcher_enhance_msg_error_launcher_notfound":
MessageLookupByLibrary.simpleMessage("未找到 RSI 启动器"),
"tools_rsi_launcher_enhance_msg_patch_status": m56,
"tools_rsi_launcher_enhance_msg_uninstall":
MessageLookupByLibrary.simpleMessage("* 如需卸载增强补丁,请覆盖安装 RSI 启动器。"),
"tools_rsi_launcher_enhance_msg_version": m57,
"tools_rsi_launcher_enhance_note_msg": MessageLookupByLibrary.simpleMessage(
"RSI 启动器增强是一项社区功能,它会在您的电脑上解包 \"RSI Launcher\" 并加入额外的增强功能,具体使用哪些功能由您决定。\n\n目前官方CIG仅许可我们进行多语言操作启动器下载增强是我们认为有用的额外功能违反cig用户协议https://robertsspaceindustries.com/eula可能导致账号被封禁等严重后果是否启用由您自己决定我们不对可能产生的后果游戏损坏账号封禁等承担任何责任。\n\n对于启动器的修改内容我们开源于https://github.com/StarCitizenToolBox/RSILauncherEnhance如有需要您可自行查阅。\n\n如果您因为任何原因需要取消此增强补丁,请直接覆盖安装官方启动器。"),
"tools_rsi_launcher_enhance_note_title":
MessageLookupByLibrary.simpleMessage("RSI 启动器增强使用须知"),
"tools_rsi_launcher_enhance_subtitle_download_booster":
MessageLookupByLibrary.simpleMessage(
"下载游戏时可使用更多线程以提升下载速度,启用后请在启动器设置修改线程数。"),
"tools_rsi_launcher_enhance_subtitle_localization":
MessageLookupByLibrary.simpleMessage("为 RSI 启动器增加多语言支持。"),
"tools_rsi_launcher_enhance_title":
MessageLookupByLibrary.simpleMessage("RSI 启动器增强"),
"tools_rsi_launcher_enhance_title_download_booster":
MessageLookupByLibrary.simpleMessage("RSI 启动器下载增强"),
"tools_rsi_launcher_enhance_title_localization":
MessageLookupByLibrary.simpleMessage("RSI 启动器本地化"),
"tools_rsi_launcher_enhance_working_msg1":
MessageLookupByLibrary.simpleMessage("生成补丁 ..."),
"tools_rsi_launcher_enhance_working_msg2":
MessageLookupByLibrary.simpleMessage("安装补丁,这需要一点时间,取决于您的计算机性能 ..."),
"tools_unp4k_missing_runtime":
MessageLookupByLibrary.simpleMessage("缺少运行库"),
"tools_unp4k_missing_runtime_action_install":
MessageLookupByLibrary.simpleMessage("安装运行库"),
"tools_unp4k_missing_runtime_info":
MessageLookupByLibrary.simpleMessage(
"使用此功能需安装 .NET8 运行库,请点击下方按钮下载安装,安装成功后重新打开此页面即可继续使用。"),
"tools_unp4k_msg_init": MessageLookupByLibrary.simpleMessage("初始化中..."),
"tools_unp4k_msg_open_file": m58,
"tools_unp4k_msg_read_completed": m59,
"tools_unp4k_msg_read_file": m60,
"tools_unp4k_msg_reading":
MessageLookupByLibrary.simpleMessage("正在读取P4K 文件 ..."),
"tools_unp4k_msg_reading2":
MessageLookupByLibrary.simpleMessage("正在处理文件 ..."),
"tools_unp4k_msg_reading3": m61,
"tools_unp4k_msg_unknown_file_type": m62,
"tools_unp4k_title": m63,
"tools_unp4k_view_file":
MessageLookupByLibrary.simpleMessage("单击文件以预览"),
"webview_localization_finished_invitations": "webview_localization_finished_invitations":
MessageLookupByLibrary.simpleMessage("已完成的邀请"), MessageLookupByLibrary.simpleMessage("已完成的邀请"),
"webview_localization_name_member": "webview_localization_name_member":

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -2,4 +2,6 @@ class NoL10n {
static const String langZHS = '简体中文'; static const String langZHS = '简体中文';
static const String langZHT = '繁體中文'; static const String langZHT = '繁體中文';
static const String langEn = 'English'; static const String langEn = 'English';
static const String langJa = '日本語';
static const String langFR = 'Français';
} }

View File

@ -1,5 +1,6 @@
{ {
"@@locale": "en", "@@locale": "en",
"@@auto_translate_locale": "en",
"app_language_name": "English", "app_language_name": "English",
"@app_language_name": {}, "@app_language_name": {},
"app_language_code": "en", "app_language_code": "en",
@ -10,13 +11,13 @@
"@app_shortcut_name": {}, "@app_shortcut_name": {},
"about_check_update": "Check for updates", "about_check_update": "Check for updates",
"@about_check_update": {}, "@about_check_update": {},
"about_app_description": "The SCToolBox is a good helper for your exploring the universe. We are committed to solving common problems in the game for citizens, and facilitate the operation of community localization, performance tuning, and commonly used website localization operations.", "about_app_description": "Not just about localization!\n\nThe SCToolBox is your helper to explore the verse. We are committed to solving common in-game problems for citizens, in addition to facilitating localization from the community, game performance tuning, and localization of some commonly used website.",
"@about_app_description": {}, "@about_app_description": {},
"about_online_feedback": "Online feedback", "about_online_feedback": "Online feedback",
"@about_online_feedback": {}, "@about_online_feedback": {},
"about_action_qq_group": "QQ group: 940696487", "about_action_qq_group": "QQ group: 940696487",
"@about_action_qq_group": {}, "@about_action_qq_group": {},
"about_action_email": "Email: scbox@xkeyc.com", "about_action_email": "Email: xkeyc@qq.com",
"@about_action_email": {}, "@about_action_email": {},
"about_action_open_source": "Open source", "about_action_open_source": "Open source",
"@about_action_open_source": {}, "@about_action_open_source": {},
@ -36,32 +37,24 @@
"@about_analytics_p4k_redirection": {}, "@about_analytics_p4k_redirection": {},
"about_analytics_units_user": "users", "about_analytics_units_user": "users",
"@about_analytics_units_user": {}, "@about_analytics_units_user": {},
"about_analytics_units_times": "Second-rate", "about_analytics_units_times": "Times",
"@about_analytics_units_times": {}, "@about_analytics_units_times": {},
"about_info_latest_version": "It is already the latest version!", "about_info_latest_version": "It is already the latest version!",
"@about_info_latest_version": {}, "@about_info_latest_version": {},
"home_holiday_countdown": "Countdown", "home_holiday_countdown": "Countdown",
"@home_holiday_countdown": {}, "@home_holiday_countdown": {},
"home_holiday_countdown_disclaimer": "* The above festival date is included in artificially and maintained. There may be errors. Welcome to feedback!", "home_holiday_countdown_disclaimer": "* The above festival dates are added and maintained manually. There may be errors and we welcome any feedback!",
"@home_holiday_countdown_disclaimer": {}, "@home_holiday_countdown_disclaimer": {},
"home_action_one_click_launch": "One-click launch", "home_action_one_click_launch": "One-click launch",
"@home_action_one_click_launch": {}, "@home_action_one_click_launch": {},
"home_title_logging_in": "Logging in...", "home_title_logging_in": "Logging in...",
"@home_title_logging_in": {}, "@home_title_logging_in": {},
"home_info_auto_fill_notice": "* If the automatic filling is turned on, please pay attention to the Windows Hello pop-up",
"@home_info_auto_fill_notice": {},
"home_login_title_welcome_back": "Welcome back!", "home_login_title_welcome_back": "Welcome back!",
"@home_login_title_welcome_back": {}, "@home_login_title_welcome_back": {},
"home_login_title_launching_game": "Launching game for you ...", "home_login_title_launching_game": "Launching game for you ...",
"@home_login_title_launching_game": {}, "@home_login_title_launching_game": {},
"home_action_login_rsi_account": "Log in to RSI account", "home_action_login_rsi_account": "Log in to RSI account",
"@home_action_login_rsi_account": {}, "@home_action_login_rsi_account": {},
"home_action_q_auto_password_fill_prompt": "Turn on the automatic password filling?",
"@home_action_q_auto_password_fill_prompt": {},
"home_login_info_password_encryption_notice": "The box will use the PIN and Windows credentials to save your password encryption, and the password is only stored in your device.\n\nWhen you need to enter a password for the next login, you only need to authorize PIN to automatically fill in the login.",
"@home_login_info_password_encryption_notice": {},
"home_login_info_enter_pin_to_encrypt": "Enter PIN to enable encryption",
"@home_login_info_enter_pin_to_encrypt": {},
"home_login_info_game_version_outdated": "Outdated game version", "home_login_info_game_version_outdated": "Outdated game version",
"@home_login_info_game_version_outdated": {}, "@home_login_info_game_version_outdated": {},
"home_login_info_rsi_server_report": "RSI server report version number: {v1}\n\nLocal version number: {v2}\n\nIt is recommended to use RSI Launcher to update the game!", "home_login_info_rsi_server_report": "RSI server report version number: {v1}\n\nLocal version number: {v2}\n\nIt is recommended to use RSI Launcher to update the game!",
@ -144,7 +137,7 @@
"@downloader_input_info_p2p_upload_note": {}, "@downloader_input_info_p2p_upload_note": {},
"doctor_title_one_click_diagnosis": "One -click diagnosis-> {v0}", "doctor_title_one_click_diagnosis": "One -click diagnosis-> {v0}",
"@doctor_title_one_click_diagnosis": {}, "@doctor_title_one_click_diagnosis": {},
"doctor_action_rsi_launcher_log": "RSI starter log", "doctor_action_rsi_launcher_log": "RSI Launcher log",
"@doctor_action_rsi_launcher_log": {}, "@doctor_action_rsi_launcher_log": {},
"doctor_action_game_run_log": "Game running log", "doctor_action_game_run_log": "Game running log",
"@doctor_action_game_run_log": {}, "@doctor_action_game_run_log": {},
@ -166,13 +159,13 @@
"@doctor_info_result_missing_live_folder": {}, "@doctor_info_result_missing_live_folder": {},
"doctor_info_result_create_live_folder": "Click to fix the Live folder for you, and install it after completion. ({v0})", "doctor_info_result_create_live_folder": "Click to fix the Live folder for you, and install it after completion. ({v0})",
"@doctor_info_result_create_live_folder": {}, "@doctor_info_result_create_live_folder": {},
"doctor_info_result_incompatible_nvme_device": "The new NVME device is not compatible with the RSI starter for the time being, which may cause the installation to fail", "doctor_info_result_incompatible_nvme_device": "The new NVME device is not compatible with the RSI Launcher for the time being, which may cause the installation to fail",
"@doctor_info_result_incompatible_nvme_device": {}, "@doctor_info_result_incompatible_nvme_device": {},
"doctor_info_result_add_registry_value": "Add ForcedPhysicalsectorsizeinbytes value to the registry item to simulate old devices. Hard disk partition ({v0})", "doctor_info_result_add_registry_value": "Add ForcedPhysicalsectorsizeinbytes value to the registry item to simulate old devices. Hard disk partition ({v0})",
"@doctor_info_result_add_registry_value": {}, "@doctor_info_result_add_registry_value": {},
"doctor_info_result_missing_easyanticheat_files": "Easyanticheat file loss", "doctor_info_result_missing_easyanticheat_files": "Easyanticheat file loss",
"@doctor_info_result_missing_easyanticheat_files": {}, "@doctor_info_result_missing_easyanticheat_files": {},
"doctor_info_result_verify_files_with_rsi_launcher": "Not found the EasyAnticheat file or file incomplete in the Live folder, please use the RSI starter to check the file", "doctor_info_result_verify_files_with_rsi_launcher": "Not found the EasyAnticheat file or file incomplete in the Live folder, please use the RSI Launcher to check the file",
"@doctor_info_result_verify_files_with_rsi_launcher": {}, "@doctor_info_result_verify_files_with_rsi_launcher": {},
"doctor_info_result_easyanticheat_not_installed": "Easyanticheat is not installed or not withdrawn normally", "doctor_info_result_easyanticheat_not_installed": "Easyanticheat is not installed or not withdrawn normally",
"@doctor_info_result_easyanticheat_not_installed": {}, "@doctor_info_result_easyanticheat_not_installed": {},
@ -184,7 +177,7 @@
"@doctor_info_result_chinese_username_error": {}, "@doctor_info_result_chinese_username_error": {},
"doctor_info_result_chinese_install_path": "No-English installation path!", "doctor_info_result_chinese_install_path": "No-English installation path!",
"@doctor_info_result_chinese_install_path": {}, "@doctor_info_result_chinese_install_path": {},
"doctor_info_result_chinese_install_path_error": "No-English installation path! This may cause the game to start/install errors! ({v0}), please replace the installation path at the RSI starter.", "doctor_info_result_chinese_install_path_error": "No-English installation path! This may cause the game to start/install errors! ({v0}), please replace the installation path at the RSI Launcher.",
"@doctor_info_result_chinese_install_path_error": {}, "@doctor_info_result_chinese_install_path_error": {},
"doctor_info_result_low_physical_memory": "Paralying memory is too low", "doctor_info_result_low_physical_memory": "Paralying memory is too low",
"@doctor_info_result_low_physical_memory": {}, "@doctor_info_result_low_physical_memory": {},
@ -222,7 +215,7 @@
"@doctor_action_result_analysis_no_issue": {}, "@doctor_action_result_analysis_no_issue": {},
"doctor_action_result_analysis_issues_found": "After the analysis, I found that {v0} questions", "doctor_action_result_analysis_issues_found": "After the analysis, I found that {v0} questions",
"@doctor_action_result_analysis_issues_found": {}, "@doctor_action_result_analysis_issues_found": {},
"doctor_action_result_toast_scan_no_issue": "After scanning, no problem is found. If you still fail, try to use the RSI starter administrator mode in the toolbox.", "doctor_action_result_toast_scan_no_issue": "After scanning, no problem is found. If you still fail, try to use the RSI Launcher administrator mode in the toolbox.",
"@doctor_action_result_toast_scan_no_issue": {}, "@doctor_action_result_toast_scan_no_issue": {},
"doctor_action_tip_checking_game_log": "Inspection: Game.log", "doctor_action_tip_checking_game_log": "Inspection: Game.log",
"@doctor_action_tip_checking_game_log": {}, "@doctor_action_tip_checking_game_log": {},
@ -290,11 +283,11 @@
"@home_action_info_valid_install_location_required": {}, "@home_action_info_valid_install_location_required": {},
"home_action_info_scanning": "Scanning ...", "home_action_info_scanning": "Scanning ...",
"@home_action_info_scanning": {}, "@home_action_info_scanning": {},
"home_action_info_scan_complete_valid_directories_found": "After scanning, find {v0} a valid installation directory", "home_action_info_scan_complete_valid_directories_found": "Scan completed, find {v0} valid installation directory",
"@home_action_info_scan_complete_valid_directories_found": {}, "@home_action_info_scan_complete_valid_directories_found": {},
"home_action_info_log_file_parse_fail": "Analysis of LOG files failed!", "home_action_info_log_file_parse_fail": "Analysis of LOG files failed!",
"@home_action_info_log_file_parse_fail": {}, "@home_action_info_log_file_parse_fail": {},
"home_action_title_star_citizen_website_localization": "Star Citizen Website Sinicization", "home_action_title_star_citizen_website_localization": "Star Citizen Website Localization",
"@home_action_title_star_citizen_website_localization": {}, "@home_action_title_star_citizen_website_localization": {},
"home_action_info_web_localization_plugin_disclaimer": "This plug -in function is for general browsing, not responsible for any problems related to this function! Please pay attention to confirming the original content of the website before the account operation!\n\n\nWhen logging in to the account, please make sure your SCToolBox is downloaded from a trusted source.", "home_action_info_web_localization_plugin_disclaimer": "This plug -in function is for general browsing, not responsible for any problems related to this function! Please pay attention to confirming the original content of the website before the account operation!\n\n\nWhen logging in to the account, please make sure your SCToolBox is downloaded from a trusted source.",
"@home_action_info_web_localization_plugin_disclaimer": {}, "@home_action_info_web_localization_plugin_disclaimer": {},
@ -304,7 +297,7 @@
"@home_action_info_initialization_failed": {}, "@home_action_info_initialization_failed": {},
"home_title_app_name": "SCToolBox", "home_title_app_name": "SCToolBox",
"@home_title_app_name": {}, "@home_title_app_name": {},
"home_localization_new_version_available": "Sinicization has a new version!", "home_localization_new_version_available": "Localization has a new version!",
"@home_localization_new_version_available": {}, "@home_localization_new_version_available": {},
"home_localization_new_version_installed": "You have a new version of the Localization you installed in {v0}!", "home_localization_new_version_installed": "You have a new version of the Localization you installed in {v0}!",
"@home_localization_new_version_installed": {}, "@home_localization_new_version_installed": {},
@ -330,15 +323,15 @@
"@home_action_info_warning": {}, "@home_action_info_warning": {},
"localization_info_machine_translation_warning": "You are using the game built -in text. The official text is currently a machine translation (as of 3.21.0), and it is recommended that you install community Localization below.", "localization_info_machine_translation_warning": "You are using the game built -in text. The official text is currently a machine translation (as of 3.21.0), and it is recommended that you install community Localization below.",
"@localization_info_machine_translation_warning": {}, "@localization_info_machine_translation_warning": {},
"localization_info_translation_status": "State", "localization_info_translation": "Game localization",
"@localization_info_translation_status": {}, "@localization_info_translation": {},
"localization_info_enabled": "Enable ({v0}):", "localization_info_enabled": "Enable ({v0}):",
"@localization_info_enabled": {}, "@localization_info_enabled": {},
"localization_info_installed_version": "The installed version: {v0}", "localization_info_installed_version": "The installed version: {v0}",
"@localization_info_installed_version": {}, "@localization_info_installed_version": {},
"localization_action_translation_feedback": "Localization feedback", "localization_action_translation_feedback": "Feedback",
"@localization_action_translation_feedback": {}, "@localization_action_translation_feedback": {},
"localization_action_uninstall_translation": "Uninstallation of Localization", "localization_action_uninstall_translation": "Uninstall",
"@localization_action_uninstall_translation": {}, "@localization_action_uninstall_translation": {},
"localization_info_note": "Remark:", "localization_info_note": "Remark:",
"@localization_info_note": {}, "@localization_info_note": {},
@ -346,12 +339,6 @@
"@localization_info_community_translation": {}, "@localization_info_community_translation": {},
"localization_info_no_translation_available": "This language/version is not available for Localization, so stay tuned!", "localization_info_no_translation_available": "This language/version is not available for Localization, so stay tuned!",
"@localization_info_no_translation_available": {}, "@localization_info_no_translation_available": {},
"localization_action_advanced_features": "Advanced Features",
"@localization_action_advanced_features": {},
"localization_info_custom_text": "Custom text",
"@localization_info_custom_text": {},
"localization_info_no_custom_text": "No custom text",
"@localization_info_no_custom_text": {},
"localization_action_install": "Install", "localization_action_install": "Install",
"@localization_action_install": {}, "@localization_action_install": {},
"localization_info_version_number": "Version number: {v0}", "localization_info_version_number": "Version number: {v0}",
@ -364,16 +351,12 @@
"@localization_info_installed": {}, "@localization_info_installed": {},
"localization_info_unavailable": "Unavailable", "localization_info_unavailable": "Unavailable",
"@localization_info_unavailable": {}, "@localization_info_unavailable": {},
"localization_info_language": "Language:", "localization_info_language": "Language: ",
"@localization_info_language": {}, "@localization_info_language": {},
"localization_info_remove_incompatible_translation_params": "Whether to remove incompatible Localization parameters", "localization_info_remove_incompatible_translation_params": "Whether to remove incompatible Localization parameters",
"@localization_info_remove_incompatible_translation_params": {}, "@localization_info_remove_incompatible_translation_params": {},
"localization_info_incompatible_translation_params_warning": "User.cfg contains incompatible Localization parameters, which may be the residual information of the previous Localization file.\n\nThis may lead to ineffective or garbled Localization, click to confirm that you are removed with one click (it will not affect other configuration).", "localization_info_incompatible_translation_params_warning": "User.cfg contains incompatible Localization parameters, which may be the residual information of the previous Localization file.\n\nThis may lead to ineffective or garbled Localization, click to confirm that you are removed with one click (it will not affect other configuration).",
"@localization_info_incompatible_translation_params_warning": {}, "@localization_info_incompatible_translation_params_warning": {},
"localization_info_custom_file": "Custom_ {v0}",
"@localization_info_custom_file": {},
"localization_info_custom_file_instructions": "To open the localized folder, put the customized name .ini file in the Customize_ini folder.\n\nAfter adding a new file, you do not display the refresh button in the upper right corner.\n\nPlease make sure to choose the correct language during installation.",
"@localization_info_custom_file_instructions": {},
"localization_info_corrupted_file": "The file is damaged, please download again", "localization_info_corrupted_file": "The file is damaged, please download again",
"@localization_info_corrupted_file": {}, "@localization_info_corrupted_file": {},
"localization_info_installation_error": "Install an error!\n\n {v0}", "localization_info_installation_error": "Install an error!\n\n {v0}",
@ -400,13 +383,13 @@
"@performance_action_high": {}, "@performance_action_high": {},
"performance_action_super": "Super", "performance_action_super": "Super",
"@performance_action_super": {}, "@performance_action_super": {},
"performance_action_info_preset_only_changes_graphics": "(Preset only the graphic settings)", "performance_action_info_preset_only_changes_graphics": "(Only graphic)",
"@performance_action_info_preset_only_changes_graphics": {}, "@performance_action_info_preset_only_changes_graphics": {},
"performance_action_reset_to_default": "Reset", "performance_action_reset_to_default": " Reset",
"@performance_action_reset_to_default": {}, "@performance_action_reset_to_default": {},
"performance_action_apply": "Application", "performance_action_apply": "Apply",
"@performance_action_apply": {}, "@performance_action_apply": {},
"performance_action_apply_and_clear_shaders": "Apply and clean up the color device (recommended)", "performance_action_apply_and_clear_shaders": "Apply and clean up",
"@performance_action_apply_and_clear_shaders": {}, "@performance_action_apply_and_clear_shaders": {},
"performance_title_performance_optimization": "Performance Optimization -> {v0}", "performance_title_performance_optimization": "Performance Optimization -> {v0}",
"@performance_title_performance_optimization": {}, "@performance_title_performance_optimization": {},
@ -440,37 +423,23 @@
"@app_index_menu_about": {}, "@app_index_menu_about": {},
"lobby_online_lobby_coming_soon": "The online lobby, so stay tuned!", "lobby_online_lobby_coming_soon": "The online lobby, so stay tuned!",
"@lobby_online_lobby_coming_soon": {}, "@lobby_online_lobby_coming_soon": {},
"lobby_invitation_to_participate": "Sincerely invite you to participate", "lobby_invitation_to_participate": "Sincerely invite you to participate ",
"@lobby_invitation_to_participate": {}, "@lobby_invitation_to_participate": {},
"lobby_survey": "Questionnaire.", "lobby_survey": "Questionnaire.",
"@lobby_survey": {}, "@lobby_survey": {},
"setting_action_create_settings_shortcut": "Create Settings Settings", "setting_action_create_settings_shortcut": "Create shortcut",
"@setting_action_create_settings_shortcut": {}, "@setting_action_create_settings_shortcut": {},
"setting_action_create_desktop_shortcut": "Create \"SC Sinicization Box\" shortcut on the desktop", "setting_action_create_desktop_shortcut": "Create \"SC Localization Box\" shortcut on the desktop",
"@setting_action_create_desktop_shortcut": {}, "@setting_action_create_desktop_shortcut": {},
"setting_action_reset_auto_password_fill": "Reset automatic password filling", "setting_action_reset_auto_password_fill": "Reset automatic password filling",
"@setting_action_reset_auto_password_fill": {}, "@setting_action_reset_auto_password_fill": {},
"setting_action_info_device_support_info": "Enable: {v0} Device Support: {v1} Email: {v2} Password: {v3}",
"@setting_action_info_device_support_info": {},
"setting_action_info_enabled": "Activated",
"@setting_action_info_enabled": {},
"setting_action_info_disabled": "Disabled",
"@setting_action_info_disabled": {},
"setting_action_info_support": "Support",
"@setting_action_info_support": {},
"setting_action_info_not_support": "Not support",
"@setting_action_info_not_support": {},
"setting_action_info_encrypted_saved": "Has been encrypted",
"@setting_action_info_encrypted_saved": {},
"setting_action_info_not_saved": "Not preserved",
"@setting_action_info_not_saved": {},
"setting_action_ignore_efficiency_cores_on_launch": "When starting the game, ignore the core of energy efficiency (suitable for Intel 12th+ processor)", "setting_action_ignore_efficiency_cores_on_launch": "When starting the game, ignore the core of energy efficiency (suitable for Intel 12th+ processor)",
"@setting_action_ignore_efficiency_cores_on_launch": {}, "@setting_action_ignore_efficiency_cores_on_launch": {},
"setting_action_set_core_count": "Core quantity that has been set: {v0} (This function is suitable for the box -click startup or RSI starter manager mode on the homepage, which is not enabled when it is 0)", "setting_action_set_core_count": "Core quantity that has been set: {v0} (This function is suitable for the box -click startup or RSI Launcher manager mode on the homepage, which is not enabled when it is 0)",
"@setting_action_set_core_count": {}, "@setting_action_set_core_count": {},
"setting_action_set_launcher_file": "Set the promoter file (RSI Launcher.exe)", "setting_action_set_launcher_file": "Set the promoter file (RSI Launcher.exe)",
"@setting_action_set_launcher_file": {}, "@setting_action_set_launcher_file": {},
"setting_action_info_manual_launcher_location_setting": "Set the position of the starter manually, it is recommended to use it only when the installation position cannot be automatically scanned automatically", "setting_action_info_manual_launcher_location_setting": "Set the position of the RSI Launcher manually, it is recommended to use it only when the installation position cannot be automatically scanned automatically",
"@setting_action_info_manual_launcher_location_setting": {}, "@setting_action_info_manual_launcher_location_setting": {},
"setting_action_set_game_file": "Set the game file (StarCitizen.exe)", "setting_action_set_game_file": "Set the game file (StarCitizen.exe)",
"@setting_action_set_game_file": {}, "@setting_action_set_game_file": {},
@ -496,9 +465,9 @@
"@setting_action_info_autofill_data_cleared": {}, "@setting_action_info_autofill_data_cleared": {},
"setting_action_info_enter_cpu_core_to_ignore": "Please enter the core number of CPUs to be ignored", "setting_action_info_enter_cpu_core_to_ignore": "Please enter the core number of CPUs to be ignored",
"@setting_action_info_enter_cpu_core_to_ignore": {}, "@setting_action_info_enter_cpu_core_to_ignore": {},
"setting_action_info_cpu_core_tip": "Tip: Input a few of your equipment with a few energy efficiency cores, please keep 0 non -large and small nuclear equipment 0\n\nThis function is suitable for the box of one -click startup or the RSI starter mode in the box on the homepage. This function is not enabled when it is 0.", "setting_action_info_cpu_core_tip": "Tip: Input a few of your equipment with a few energy efficiency cores, please keep 0 non -large and small nuclear equipment 0\n\nThis function is suitable for the box of one -click startup or the RSI Launcher Admin mode in the box on the homepage. This function is not enabled when it is 0.",
"@setting_action_info_cpu_core_tip": {}, "@setting_action_info_cpu_core_tip": {},
"setting_action_info_select_rsi_launcher_location": "Please select the RSI starter position (RSI LAUNCHER.EXE)", "setting_action_info_select_rsi_launcher_location": "Please select the RSI Launcher position (RSI LAUNCHER.EXE)",
"@setting_action_info_select_rsi_launcher_location": {}, "@setting_action_info_select_rsi_launcher_location": {},
"setting_action_info_setting_success": "Successfully set, click refresh on the corresponding page to scan the new path", "setting_action_info_setting_success": "Successfully set, click refresh on the corresponding page to scan the new path",
"@setting_action_info_setting_success": {}, "@setting_action_info_setting_success": {},
@ -520,9 +489,9 @@
"@app_upgrade_info_getting_new_version_details": {}, "@app_upgrade_info_getting_new_version_details": {},
"app_upgrade_info_update_server_tip": "Tip: The current diversion server is updated, and the download speed may decline, but it will help us perform cost control. If you download the exception, please click here to jump and manually install it.", "app_upgrade_info_update_server_tip": "Tip: The current diversion server is updated, and the download speed may decline, but it will help us perform cost control. If you download the exception, please click here to jump and manually install it.",
"@app_upgrade_info_update_server_tip": {}, "@app_upgrade_info_update_server_tip": {},
"app_upgrade_info_installing": "Installing:", "app_upgrade_info_installing": "Installing: ",
"@app_upgrade_info_installing": {}, "@app_upgrade_info_installing": {},
"app_upgrade_info_downloading": "Downloading: {v0}%", "app_upgrade_info_downloading": "Downloading: {v0}% ",
"@app_upgrade_info_downloading": {}, "@app_upgrade_info_downloading": {},
"app_upgrade_action_update_now": "Update immediately", "app_upgrade_action_update_now": "Update immediately",
"@app_upgrade_action_update_now": {}, "@app_upgrade_action_update_now": {},
@ -540,8 +509,6 @@
"@app_splash_almost_done": {}, "@app_splash_almost_done": {},
"tools_hosts_info_rsi_official_website": "RSI official website", "tools_hosts_info_rsi_official_website": "RSI official website",
"@tools_hosts_info_rsi_official_website": {}, "@tools_hosts_info_rsi_official_website": {},
"tools_hosts_info_rsi_zendesk": "RSI ZENDESK Customer Service Station",
"@tools_hosts_info_rsi_zendesk": {},
"tools_hosts_info_rsi_customer_service": "RSI customer service station", "tools_hosts_info_rsi_customer_service": "RSI customer service station",
"@tools_hosts_info_rsi_customer_service": {}, "@tools_hosts_info_rsi_customer_service": {},
"tools_hosts_info_dns_query_and_test": "Inquiring about DNS and testing accessibility, please wait patiently ...", "tools_hosts_info_dns_query_and_test": "Inquiring about DNS and testing accessibility, please wait patiently ...",
@ -554,7 +521,7 @@
"@tools_hosts_info_hosts_acceleration": {}, "@tools_hosts_info_hosts_acceleration": {},
"tools_hosts_info_open_hosts_file": "Open the hosts file", "tools_hosts_info_open_hosts_file": "Open the hosts file",
"@tools_hosts_info_open_hosts_file": {}, "@tools_hosts_info_open_hosts_file": {},
"tools_hosts_info_status": "State", "tools_hosts_info_status": "Status",
"@tools_hosts_info_status": {}, "@tools_hosts_info_status": {},
"tools_hosts_info_site": "Site", "tools_hosts_info_site": "Site",
"@tools_hosts_info_site": {}, "@tools_hosts_info_site": {},
@ -566,9 +533,9 @@
"@tools_info_scanning": {}, "@tools_info_scanning": {},
"tools_info_processing_failed": "Failure to handle! : {v0}", "tools_info_processing_failed": "Failure to handle! : {v0}",
"@tools_info_processing_failed": {}, "@tools_info_processing_failed": {},
"tools_info_game_install_location": "Game installation location:", "tools_info_game_install_location": "Game installation location: ",
"@tools_info_game_install_location": {}, "@tools_info_game_install_location": {},
"tools_info_rsi_launcher_location": "RSI starter position:", "tools_info_rsi_launcher_location": "RSI Launcher position:",
"@tools_info_rsi_launcher_location": {}, "@tools_info_rsi_launcher_location": {},
"tools_action_view_system_info": "View system information", "tools_action_view_system_info": "View system information",
"@tools_action_view_system_info": {}, "@tools_action_view_system_info": {},
@ -582,7 +549,7 @@
"@tools_action_hosts_acceleration_experimental": {}, "@tools_action_hosts_acceleration_experimental": {},
"tools_action_info_hosts_acceleration_experimental_tip": "Write the IP information into the hosts file to solve problems such as DNS pollution in some regions that cannot log in to the official website.\nThis function is undergoing the first stage of testing. Please report it in time when you encounter problems.", "tools_action_info_hosts_acceleration_experimental_tip": "Write the IP information into the hosts file to solve problems such as DNS pollution in some regions that cannot log in to the official website.\nThis function is undergoing the first stage of testing. Please report it in time when you encounter problems.",
"@tools_action_info_hosts_acceleration_experimental_tip": {}, "@tools_action_info_hosts_acceleration_experimental_tip": {},
"tools_action_reinstall_easyanticheat": "Reinstall EasyAnticheat's anti -cheating", "tools_action_reinstall_easyanticheat": "Reinstall EasyAnticheat",
"@tools_action_reinstall_easyanticheat": {}, "@tools_action_reinstall_easyanticheat": {},
"tools_action_info_reinstall_eac": "If you encounter EAC errors and are invalid automatically, try using this feature to reinstall EAC.", "tools_action_info_reinstall_eac": "If you encounter EAC errors and are invalid automatically, try using this feature to reinstall EAC.",
"@tools_action_info_reinstall_eac": {}, "@tools_action_info_reinstall_eac": {},
@ -634,11 +601,11 @@
"@tools_action_info_eac_file_removed": {}, "@tools_action_info_eac_file_removed": {},
"tools_action_info_error_occurred": "Error: {v0}", "tools_action_info_error_occurred": "Error: {v0}",
"@tools_action_info_error_occurred": {}, "@tools_action_info_error_occurred": {},
"tools_action_info_system_info_content": "System: {v0}\n\nProcessor: {v1}\n\nMemory size: {v2} gb\n\nGraphics card information:\n{v3}\n\nHard disk information:\n{v4}", "tools_action_info_system_info_content": "System: {v0}\n\nProcessor: {v1}\n\nMemory size: {v2} gb\n\nGraphics card information:\n{v3}\n\nStorage information:\n{v4}\n\n",
"@tools_action_info_system_info_content": {}, "@tools_action_info_system_info_content": {},
"tools_action_info_rsi_launcher_directory_not_found": "If the RSI starter directory is not found, please try manually.", "tools_action_info_rsi_launcher_directory_not_found": "If the RSI Launcher directory is not found, please try manually.",
"@tools_action_info_rsi_launcher_directory_not_found": {}, "@tools_action_info_rsi_launcher_directory_not_found": {},
"tools_action_info_log_file_not_exist": "The log file does not exist, please try to start a game startup or game installation, and exit the starter. If the problem cannot be solved, try to update the launcher to the latest version!", "tools_action_info_log_file_not_exist": "The log file does not exist, please try to start a game startup or game installation, and exit the RSI Launcher. If the problem cannot be solved, try to update the launcher to the latest version!",
"@tools_action_info_log_file_not_exist": {}, "@tools_action_info_log_file_not_exist": {},
"tools_action_info_cleanup_complete": "After cleaning up, complete the installation / game startup operation once.", "tools_action_info_cleanup_complete": "After cleaning up, complete the installation / game startup operation once.",
"@tools_action_info_cleanup_complete": {}, "@tools_action_info_cleanup_complete": {},
@ -646,9 +613,9 @@
"@tools_action_info_cleanup_failed": {}, "@tools_action_info_cleanup_failed": {},
"tools_action_info_system_info_title": "System message", "tools_action_info_system_info_title": "System message",
"@tools_action_info_system_info_title": {}, "@tools_action_info_system_info_title": {},
"tools_action_info_rsi_launcher_running_warning": "The RSI starter is running! Please turn off the label first and then use this feature!", "tools_action_info_rsi_launcher_running_warning": "The RSI Launcher is running! Please turn off the label first and then use this feature!",
"@tools_action_info_rsi_launcher_running_warning": {}, "@tools_action_info_rsi_launcher_running_warning": {},
"tools_action_info_p4k_file_description": "P4K is the core game file of interstellar citizens, as high as 100GB+. The offline download provided by the box is to help some P4K files download super slow users or to repair the P4K file that the official launch cannot be repaired.\n\nNext, you will pop up the window and ask you to save the position (you can choose the Star Citizens Folder or you can choose elsewhere). After downloading, please make sure that the P4K folder is located in the LIVE folder, and then use the Star Citizen starter to check it.", "tools_action_info_p4k_file_description": "P4K is the core game file of interstellar citizens, as high as 100GB+. The offline download provided by the box is to help some P4K files download super slow users or to repair the P4K file that the official launch cannot be repaired.\n\nNext, you will pop up the window and ask you to save the position (you can choose the Star Citizens Folder or you can choose elsewhere). After downloading, please make sure that the P4K folder is located in the LIVE folder, and then use the RSI Launcher to check it.",
"@tools_action_info_p4k_file_description": {}, "@tools_action_info_p4k_file_description": {},
"tools_action_info_p4k_download_in_progress": "There is already a P4K download task in progress, please go to the download manager to view!", "tools_action_info_p4k_download_in_progress": "There is already a P4K download task in progress, please go to the download manager to view!",
"@tools_action_info_p4k_download_in_progress": {}, "@tools_action_info_p4k_download_in_progress": {},
@ -666,10 +633,6 @@
"@webview_localization_finished_invitations": {}, "@webview_localization_finished_invitations": {},
"app_init_failed_with_reason": "Initialization failure: {v0}", "app_init_failed_with_reason": "Initialization failure: {v0}",
"@app_init_failed_with_reason": {}, "@app_init_failed_with_reason": {},
"webview_localization_enter_device_pin": "Please enter the device PIN to automatically log in to the RSI account",
"@webview_localization_enter_device_pin": {},
"webview_localization_device_windows_hello_toast": "Please complete the Windows Hello verification to fill in the password",
"@webview_localization_device_windows_hello_toast": {},
"settings_app_language": "Language", "settings_app_language": "Language",
"@settings_app_language": {}, "@settings_app_language": {},
"settings_app_language_auto": "Automatic", "settings_app_language_auto": "Automatic",
@ -682,7 +645,7 @@
"@doctor_game_error_low_memory": {}, "@doctor_game_error_low_memory": {},
"doctor_game_error_low_memory_info": "Please try to increase virtual memory (under 1080P, physical available+virtual memory need> 64g)", "doctor_game_error_low_memory_info": "Please try to increase virtual memory (under 1080P, physical available+virtual memory need> 64g)",
"@doctor_game_error_low_memory_info": {}, "@doctor_game_error_low_memory_info": {},
"doctor_game_error_generic_info": "The game triggers the most extensive collapse problem, please check the barrier guide guide", "doctor_game_error_generic_info": "The game triggered a generic crash, please check the trouble shooting guide",
"@doctor_game_error_generic_info": {}, "@doctor_game_error_generic_info": {},
"doctor_game_error_gpu_crash": "Your graphics card crashes! Please check the barrier guide", "doctor_game_error_gpu_crash": "Your graphics card crashes! Please check the barrier guide",
"@doctor_game_error_gpu_crash": {}, "@doctor_game_error_gpu_crash": {},
@ -692,11 +655,11 @@
"@doctor_game_error_socket_error_info": {}, "@doctor_game_error_socket_error_info": {},
"doctor_game_error_permissions_error": "Insufficient permissions", "doctor_game_error_permissions_error": "Insufficient permissions",
"@doctor_game_error_permissions_error": {}, "@doctor_game_error_permissions_error": {},
"doctor_game_error_permissions_error_info": "Please try to run a starter at the administrator authority, or use the box (Microsoft Store version) to start.", "doctor_game_error_permissions_error_info": "Please try to run a RSI Launcher at the administrator authority, or use the box (Microsoft Store version) to start.",
"@doctor_game_error_permissions_error_info": {}, "@doctor_game_error_permissions_error_info": {},
"doctor_game_error_game_process_error": "The game process is occupied", "doctor_game_error_game_process_error": "The game process is occupied",
"@doctor_game_error_game_process_error": {}, "@doctor_game_error_game_process_error": {},
"doctor_game_error_game_process_error_info": "Please try to restart the starter, or restart the computer directly", "doctor_game_error_game_process_error_info": "Please try to restart the RSI Launcher, or restart the computer directly",
"@doctor_game_error_game_process_error_info": {}, "@doctor_game_error_game_process_error_info": {},
"doctor_game_error_game_damaged_file": "Game program file damage", "doctor_game_error_game_damaged_file": "Game program file damage",
"@doctor_game_error_game_damaged_file": {}, "@doctor_game_error_game_damaged_file": {},
@ -706,7 +669,7 @@
"@doctor_game_error_game_damaged_p4k_file": {}, "@doctor_game_error_game_damaged_p4k_file": {},
"doctor_game_error_game_damaged_p4k_file_info": "Please try to delete the data.p4k file and check or use the box to divert in the promoter.", "doctor_game_error_game_damaged_p4k_file_info": "Please try to delete the data.p4k file and check or use the box to divert in the promoter.",
"@doctor_game_error_game_damaged_p4k_file_info": {}, "@doctor_game_error_game_damaged_p4k_file_info": {},
"doctor_game_error_low_gpu_memory": "Insufficient memory memory", "doctor_game_error_low_gpu_memory": "Insufficient VRAM",
"@doctor_game_error_low_gpu_memory": {}, "@doctor_game_error_low_gpu_memory": {},
"doctor_game_error_low_gpu_memory_info": "Please do not run the game/application occupied by other high graphics cards in the background, or change the graphics card.", "doctor_game_error_low_gpu_memory_info": "Please do not run the game/application occupied by other high graphics cards in the background, or change the graphics card.",
"@doctor_game_error_low_gpu_memory_info": {}, "@doctor_game_error_low_gpu_memory_info": {},
@ -722,10 +685,281 @@
"@app_common_tip_cancel": {}, "@app_common_tip_cancel": {},
"settings_app_language_switch_info": "Switch application Display language", "settings_app_language_switch_info": "Switch application Display language",
"@settings_app_language_switch_info": {}, "@settings_app_language_switch_info": {},
"home_holiday_countdown_days": "{v0} Day", "home_holiday_countdown_days": "{v0} Day ",
"@home_holiday_countdown_days": {}, "@home_holiday_countdown_days": {},
"home_holiday_countdown_in_progress": "In progress", "home_holiday_countdown_in_progress": "In progress",
"@home_holiday_countdown_in_progress": {}, "@home_holiday_countdown_in_progress": {},
"app_common_loading_images": "Loading image ...", "app_common_loading_images": "Loading image ...",
"@app_common_loading_images": {} "@app_common_loading_images": {},
"app_splash_dialog_u_a_p_p": "User Agreement and Privacy Policy",
"@app_splash_dialog_u_a_p_p": {},
"app_splash_dialog_u_a_p_p_content": "Thank you for choosing the SCToolBox box. We are committed to providing you with a safe, convenient and reliable experience. Before you start using your application, please read and agree to the following:\n\n 1. This application is an open source software under the GNU General Public License V3.0 protocol. You can use, modify, and distribute this software freely under the premise of obeying the agreement. Our source code is located at: [Github.com/StarCitizenToolBox/app](https://github.com/StarCitizenToolBox/app).\n2. The copyright of the Internet content in this application (including but not limited to localized documents, tool websites, news, videos, etc.) is created by its authors and is not part of GPL. Please use it under the corresponding authorization agreement.\n3. The official free release channels for this application are: [Microsoft App Store] (https://apps.microsoft.com/detail/9NF3SWFWNKL1) and [Official Website of Star Citizen Chinese] ), If you get from other third parties, please identify it carefully to avoid suffering from property losses.\n4. This application will send anonymous statistics to our server during use to improve software quality, and we will not collect any personal privacy information of your personal privacy.\n5. This application is supported by the community and has no direct connection with Cloud Imperium Games or other third -party commercial companies.\n6. We provide limited community support. If necessary, please go to the page to learn how to contact us.",
"@app_splash_dialog_u_a_p_p_content": {},
"tools_unp4k_msg_init": "Initialization ...",
"@tools_unp4k_msg_init": {},
"tools_unp4k_msg_reading": "Reading P4K file ...",
"@tools_unp4k_msg_reading": {},
"tools_unp4k_msg_reading2": "Treatment files ...",
"@tools_unp4k_msg_reading2": {},
"tools_unp4k_msg_reading3": "Processing files ({v0}/{v1}) ...",
"@tools_unp4k_msg_reading3": {},
"tools_unp4k_msg_read_completed": "After loading: {v0} a file, time: {v1} ms",
"@tools_unp4k_msg_read_completed": {},
"tools_unp4k_msg_open_file": "Open the file: {v0}",
"@tools_unp4k_msg_open_file": {},
"tools_unp4k_msg_read_file": "Read file: {v0} ...",
"@tools_unp4k_msg_read_file": {},
"home_localization_advanced_title": "Advanced Localization -> {v0}",
"@home_localization_advanced_title": {},
"home_localization_advanced_msg_version": "Localization version has been loaded: {v0}",
"@home_localization_advanced_msg_version": {},
"home_localization_advanced_title_msg": "Localization text lines: {v0} P4K text lines: {v1}",
"@home_localization_advanced_title_msg": {},
"home_localization_advanced_action_install": "Installation of Localization",
"@home_localization_advanced_action_install": {},
"home_localization_advanced_action_mod_change": "The text is being re -generated ...",
"@home_localization_advanced_action_mod_change": {},
"home_localization_advanced_action_mode": "Model",
"@home_localization_advanced_action_mode": {},
"home_localization_advanced_title_preview": "Preview: {v0}",
"@home_localization_advanced_title_preview": {},
"home_localization_advanced_json_text_location_other": "Location-Other",
"@home_localization_advanced_json_text_location_other": {},
"home_localization_advanced_json_text_location_used": "Location-Commonly used",
"@home_localization_advanced_json_text_location_used": {},
"home_localization_advanced_json_text_things_other": "Items-Other",
"@home_localization_advanced_json_text_things_other": {},
"home_localization_advanced_json_text_things_used": "Items-Commonly used",
"@home_localization_advanced_json_text_things_used": {},
"home_localization_advanced_json_text_vehicle_other": "Vehicle-Other",
"@home_localization_advanced_json_text_vehicle_other": {},
"home_localization_advanced_json_text_vehicle_used": "Vehicle-Commonly used",
"@home_localization_advanced_json_text_vehicle_used": {},
"home_localization_advanced_json_text_mission_or_logs": "Mission/Log",
"@home_localization_advanced_json_text_mission_or_logs": {},
"home_localization_advanced_json_text_subtitle": "Subtitle",
"@home_localization_advanced_json_text_subtitle": {},
"home_localization_advanced_json_text_ui_or_hud_or_menu": "UI/HUD/menu",
"@home_localization_advanced_json_text_ui_or_hud_or_menu": {},
"home_localization_advanced_json_text_un_localization": "Unwaver",
"@home_localization_advanced_json_text_un_localization": {},
"home_localization_advanced_json_text_others": "Other",
"@home_localization_advanced_json_text_others": {},
"home_localization_advanced_action_mod_change_localization": "Localization",
"@home_localization_advanced_action_mod_change_localization": {},
"home_localization_advanced_action_mod_change_un_localization": "Original English",
"@home_localization_advanced_action_mod_change_un_localization": {},
"home_localization_advanced_action_mod_change_mixed": "Bilingual",
"@home_localization_advanced_action_mod_change_mixed": {},
"home_localization_advanced_action_mod_change_mixed_newline": "Bilingual (newline)",
"@home_localization_advanced_action_mod_change_mixed_newline": {},
"home_localization_advanced_msg_classifying": "Classified ...",
"@home_localization_advanced_msg_classifying": {},
"home_localization_advanced_msg_reading_p4k": "Read p4k file ...",
"@home_localization_advanced_msg_reading_p4k": {},
"home_localization_advanced_msg_reading_server_localization_text": "Get Localization text ...",
"@home_localization_advanced_msg_reading_server_localization_text": {},
"home_localization_advanced_msg_gen_localization_text": "Generate Localization file ...",
"@home_localization_advanced_msg_gen_localization_text": {},
"home_localization_advanced_msg_gen_localization_install": "Install Localization file ...",
"@home_localization_advanced_msg_gen_localization_install": {},
"home_localization_msg_version_advanced": "(Advanced)",
"@home_localization_msg_version_advanced": {},
"home_localization_msg_no_note": "This version does not provide a description",
"@home_localization_msg_no_note": {},
"home_localization_action_rsi_launcher_localization": "RSILauncher Localization",
"@home_localization_action_rsi_launcher_localization": {},
"home_localization_action_advanced": "Advanced Localization",
"@home_localization_action_advanced": {},
"home_localization_action_install_customize": "Install custom file",
"@home_localization_action_install_customize": {},
"home_localization_title_localization_tools": "Localization tool",
"@home_localization_title_localization_tools": {},
"performance_json_text_ssdo": "Swip light after the screen light",
"@performance_json_text_ssdo": {},
"performance_json_text_ssdo_info": "After adjusting the light, processing level",
"@performance_json_text_ssdo_info": {},
"performance_json_text_title_graphics": "Graphic",
"@performance_json_text_title_graphics": {},
"performance_json_text_antialiasing": "Anti -aliasing",
"@performance_json_text_antialiasing": {},
"performance_json_text_antialiasing_info": "0 Close, 1 SMAA, 2 time filter+SMAA, 3 time filtering and projection matrix shake SMAA",
"@performance_json_text_antialiasing_info": {},
"performance_json_text_game_effects": "Special effect level",
"@performance_json_text_game_effects": {},
"performance_json_text_game_effects_info": "Game special effect level",
"@performance_json_text_game_effects_info": {},
"performance_json_text_texture": "Grade",
"@performance_json_text_texture": {},
"performance_json_text_texture_info": "Model texture details",
"@performance_json_text_texture_info": {},
"performance_json_text_volumetric_effects": "Volume effect",
"@performance_json_text_volumetric_effects": {},
"performance_json_text_volumetric_effects_info": "Volume cloud, volume light, etc.",
"@performance_json_text_volumetric_effects_info": {},
"performance_json_text_water": "Water effect",
"@performance_json_text_water": {},
"performance_json_text_water_info": "Grade of various water",
"@performance_json_text_water_info": {},
"performance_json_text_object_detail": "Object detail",
"@performance_json_text_object_detail": {},
"performance_json_text_object_detail_info": "Model object details, affect LOD, etc.",
"@performance_json_text_object_detail_info": {},
"performance_json_text_particles": "Particle details",
"@performance_json_text_particles": {},
"performance_json_text_physics": "Physical details",
"@performance_json_text_physics": {},
"performance_json_text_physics_info": "Scope of physical effects",
"@performance_json_text_physics_info": {},
"performance_json_text_shading": "Colorrhea details",
"@performance_json_text_shading": {},
"performance_json_text_shading_info": "Coloror related",
"@performance_json_text_shading_info": {},
"performance_json_text_shadows": "Shadow details",
"@performance_json_text_shadows": {},
"performance_json_text_shadows_info": "Shadow effect",
"@performance_json_text_shadows_info": {},
"performance_json_text_postprocessing": "Post -processing details",
"@performance_json_text_postprocessing": {},
"performance_json_text_postprocessing_info": "After the color device, dynamic blur effect, etc.",
"@performance_json_text_postprocessing_info": {},
"performance_json_text_renderer": "Rendering device quality",
"@performance_json_text_renderer": {},
"performance_json_text_renderer_info": "Cryengine rendereer quality",
"@performance_json_text_renderer_info": {},
"performance_json_text_shader_decal": "Quality",
"@performance_json_text_shader_decal": {},
"performance_json_text_shader_decal_info": "(LOGO, logo, etc.)",
"@performance_json_text_shader_decal_info": {},
"performance_json_text_shader_post_process": "Color quality",
"@performance_json_text_shader_post_process": {},
"performance_json_text_shader_fx": "FX quality",
"@performance_json_text_shader_fx": {},
"performance_json_text_shader_general": "Conventional quality",
"@performance_json_text_shader_general": {},
"performance_json_text_shader_general_info": "Overall model quality",
"@performance_json_text_shader_general_info": {},
"performance_json_text_shader_glass": "Glass quality",
"@performance_json_text_shader_glass": {},
"performance_json_text_shader_glass_info": "Window, mirror, etc.",
"@performance_json_text_shader_glass_info": {},
"performance_json_text_shader_hdr": "HDR quality",
"@performance_json_text_shader_hdr": {},
"performance_json_text_shader_hdr_info": "HDR color difference, brightness level treatment, etc.",
"@performance_json_text_shader_hdr_info": {},
"performance_json_text_shader_particle": "Particle quality",
"@performance_json_text_shader_particle": {},
"performance_json_text_shader_particle_info": "Particle effect quality",
"@performance_json_text_shader_particle_info": {},
"performance_json_text_shader_terrain": "Ground quality",
"@performance_json_text_shader_terrain": {},
"performance_json_text_shader_shadow": "Shadow quality",
"@performance_json_text_shader_shadow": {},
"performance_json_text_shader_sky": "Sky quality",
"@performance_json_text_shader_sky": {},
"performance_json_text_particles_object_collisions": "Particle collision",
"@performance_json_text_particles_object_collisions": {},
"performance_json_text_particles_object_collisions_info": "1 Static particles 2 include dynamic particles",
"@performance_json_text_particles_object_collisions_info": {},
"performance_json_text_displayinfo": "Screen information (display frame rate)",
"@performance_json_text_displayinfo": {},
"performance_json_text_displayinfo_info": "Display frame rates, server information, etc. in the upper right corner of the screen",
"@performance_json_text_displayinfo_info": {},
"performance_json_text_max_fps": "Maximum frame rate",
"@performance_json_text_max_fps": {},
"performance_json_text_max_fps_info": "Adjust the maximum frame rate of the game, 0 is not limited",
"@performance_json_text_max_fps_info": {},
"performance_json_text_display_session": "Display session information",
"@performance_json_text_display_session": {},
"performance_json_text_display_session_info": "After turning on, display a QR code on the screen to allow CIG to quickly locate related information when feedback",
"@performance_json_text_display_session_info": {},
"performance_json_text_vsync": "Vertical sync",
"@performance_json_text_vsync": {},
"performance_json_text_vsync_info": "Open to prevent tearing, turn off to increase the frame rate",
"@performance_json_text_vsync_info": {},
"performance_json_text_motion_blur": "Dynamic blur",
"@performance_json_text_motion_blur": {},
"performance_json_text_motion_blur_info": "Open to improve the sense of movement, turn off and enhance the perception",
"@performance_json_text_motion_blur_info": {},
"performance_json_text_fov": "Set viewing angle FOV",
"@performance_json_text_fov": {},
"performance_json_text_ui_animation": "UI fades into the animation",
"@performance_json_text_ui_animation": {},
"performance_json_text_custom_parameters": "Custom parameter",
"@performance_json_text_custom_parameters": {},
"performance_json_text_title_custom": "Customize",
"@performance_json_text_title_custom": {},
"tools_rsi_launcher_enhance_init_msg1": "Read the RSI Launcher information ...",
"@tools_rsi_launcher_enhance_init_msg1": {},
"tools_rsi_launcher_enhance_init_msg2": "Obtaining enhanced data from the Internet ...",
"@tools_rsi_launcher_enhance_init_msg2": {},
"tools_rsi_launcher_enhance_working_msg1": "Generate patch ...",
"@tools_rsi_launcher_enhance_working_msg1": {},
"tools_rsi_launcher_enhance_working_msg2": "Installation patch takes a little time, depending on your computer performance ...",
"@tools_rsi_launcher_enhance_working_msg2": {},
"tools_rsi_launcher_enhance_title": "RSI Launcher enhancement",
"@tools_rsi_launcher_enhance_title": {},
"tools_rsi_launcher_enhance_msg_version": "Internal version information of the RSI Launcher: {v0}",
"@tools_rsi_launcher_enhance_msg_version": {},
"tools_rsi_launcher_enhance_msg_patch_status": "Patch status: {v0}",
"@tools_rsi_launcher_enhance_msg_patch_status": {},
"tools_rsi_launcher_enhance_msg_error": "Obtaining enhanced data failure may be the network problem or the current version does not support",
"@tools_rsi_launcher_enhance_msg_error": {},
"tools_rsi_launcher_enhance_title_localization": "RSI startup localization",
"@tools_rsi_launcher_enhance_title_localization": {},
"tools_rsi_launcher_enhance_subtitle_localization": "Add multi -language support to the RSI Launcher.",
"@tools_rsi_launcher_enhance_subtitle_localization": {},
"tools_rsi_launcher_enhance_title_download_booster": "RSI Launcher download enhancement",
"@tools_rsi_launcher_enhance_title_download_booster": {},
"tools_rsi_launcher_enhance_subtitle_download_booster": "When downloading the game, you can use more threads to increase the download speed.",
"@tools_rsi_launcher_enhance_subtitle_download_booster": {},
"tools_rsi_launcher_enhance_action_install": "Installation enhanced patch",
"@tools_rsi_launcher_enhance_action_install": {},
"tools_rsi_launcher_enhance_msg_uninstall": "* If you need to uninstall the enhanced patch, cover the installation RSI promoter.",
"@tools_rsi_launcher_enhance_msg_uninstall": {},
"tools_rsi_launcher_enhance_msg_error_launcher_notfound": "No RSI promoter was found",
"@tools_rsi_launcher_enhance_msg_error_launcher_notfound": {},
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error": "Reading the Launcher information failed!",
"@tools_rsi_launcher_enhance_msg_error_get_launcher_info_error": {},
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args": "Read the RSI Launcher information failure: {v0}",
"@tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args": {},
"tools_action_rsi_launcher_enhance_info": "Enhanced launcher Localization、 download thread",
"@tools_action_rsi_launcher_enhance_info": {},
"tools_rsi_launcher_enhance_note_title": "Instructions for the use of RSI Launcher enhancement",
"@tools_rsi_launcher_enhance_note_title": {},
"tools_rsi_launcher_enhance_note_msg": "RSI Launcher enhancement is a community function. It will unpack \"RSI LAUNCHER\" on your computer and add additional enhancement functions. What functions are determined by you.\n\nAt present, the official (CIG) only permits us to perform multi -language operations. The launch of the booter download enhancement is an extra function we think of it. Violation of the CIG user protocol (https://robertsspaceindustries.com/eula) may cause serious consequences such as accounts. Whether or not you are determined by yourself, we are not responsible for the possible consequences (game damage, account ban, etc.).\n\nFor the modified content of the Launcher, we are open from: https://github.com/starcitizentoolbox/rsilauncherenhance. If necessary, you can check it yourself.\n\nIf you need to cancel this enhanced patch for any reason, cover the installation of the official RSI Launcher directly.",
"@tools_rsi_launcher_enhance_note_msg": {},
"tools_action_unp4k": "P4K viewer",
"@tools_action_unp4k": {},
"tools_action_unp4k_info": "Package Star Citizen P4K File",
"@tools_action_unp4k_info": {},
"tools_unp4k_title": "P4k viewer -> {v0}",
"@tools_unp4k_title": {},
"tools_unp4k_view_file": "Click the file to preview",
"@tools_unp4k_view_file": {},
"tools_unp4k_msg_unknown_file_type": "Unknown file type\n{v0}",
"@tools_unp4k_msg_unknown_file_type": {},
"home_localization_select_customize_file_ini": "Please select INI file",
"@home_localization_select_customize_file_ini": {},
"home_localization_select_customize_file": "Please select custom Localization file",
"@home_localization_select_customize_file": {},
"home_localization_action_select_customize_file": "Click to select INI file",
"@home_localization_action_select_customize_file": {},
"home_localization_ptu_advanced_localization_tip_title": "Recommended advanced localization",
"@home_localization_ptu_advanced_localization_tip_title": {},
"home_localization_ptu_advanced_localization_tip_title_info": "On PTU/EPTU and other test channels, the current localization text text may not be synchronized with the game, and the use of advanced localization can reduce garbled production.",
"@home_localization_ptu_advanced_localization_tip_title_info": {},
"tools_rsi_launcher_enhance_action_fold": "Put up the additional function",
"@tools_rsi_launcher_enhance_action_fold": {},
"tools_rsi_launcher_enhance_action_expand": "Expand additional features",
"@tools_rsi_launcher_enhance_action_expand": {},
"tools_unp4k_missing_runtime": "Lack of runtime",
"@tools_unp4k_missing_runtime": {},
"tools_unp4k_missing_runtime_info": "Use this function to install the .NET8 runtime, please click the button below to download and install it. After the installation is successful, reopen this page to continue to use.",
"@tools_unp4k_missing_runtime_info": {},
"tools_unp4k_missing_runtime_action_install": "Install the runtime",
"@tools_unp4k_missing_runtime_action_install": {},
"home_localization_action_rsi_launcher_no_game_path_msg": "You are not currently installed in the game body or the game installation directory is not selected, and you can only use the promoter Chinese function. Please make sure the game is installed or adds the game installation directory in the box settings.",
"doctor_game_error_gpu_vulkan_crash": "GPU Vulkan Crash",
"doctor_game_error_gpu_vulkan_crash_info": "Vulkan Crash! This may be the problem of driving version or game engine, please try to update the GPU driver or use the color cleaner function to return to DX11"
} }

View File

@ -1,9 +1,120 @@
{ {
"@@locale": "ja", "@@locale": "ja",
"@auto_translate_locale": "ja", "@@auto_translate_locale": "ja",
"app_language_name": "日本語", "app_language_name": "日本語",
"@app_language_name": {}, "@app_language_name": {},
"app_language_code": "ja", "app_language_code": "ja",
"@app_language_code": {}, "@app_language_code": {},
"app_index_version_info": "SCToolBox V {v0} {v1}" "app_index_version_info": "SCToolBox V {v0} {v1}",
"@app_index_version_info": {},
"about_check_update": "更新チェック",
"@about_check_update": {},
"about_online_feedback": "フィードバック",
"@about_online_feedback": {},
"about_action_email": "メール: xkeyc@qq.com",
"@about_action_email": {},
"about_action_open_source": "オープンソース",
"@about_action_open_source": {},
"about_disclaimer": "これは Star Citizen の非公式ツールです、Cloud Imperium Games LLC の所有ではない。 本ソフトウェアのホストまたは使用者によって作成されていないすべての情報は、それぞれの所有者に帰属します。 \nStar Citizen®、Roberts Space Industries®、Cloud Imperium® は Cloud Imperium Rights LLC のトレードマーク。",
"@about_disclaimer": {},
"about_analytics_launch": "起動",
"@about_analytics_launch": {},
"about_analytics_launch_game": "ゲームを起動",
"@about_analytics_launch_game": {},
"about_analytics_install_translation": "日本語化インストール",
"@about_analytics_install_translation": {},
"about_analytics_p4k_redirection": "P4Kダウンロード",
"@about_analytics_p4k_redirection": {},
"about_analytics_total_users": "利用者数",
"@about_analytics_total_users": {},
"about_analytics_units_user": "人",
"@about_analytics_units_user": {},
"about_analytics_units_times": "回",
"@about_analytics_units_times": {},
"about_info_latest_version": "すでに最新バージョンだ!",
"@about_info_latest_version": {},
"home_holiday_countdown": "祝日カウントダウン",
"@home_holiday_countdown": {},
"home_holiday_countdown_disclaimer": "* 上記の祝日は手作業で収集・管理されているため、誤りがある可能性があります、フィードバックは歓迎する!!",
"@home_holiday_countdown_disclaimer": {},
"home_action_one_click_launch": "ワンクリック起動",
"@home_action_one_click_launch": {},
"home_title_logging_in": "ログイン中...",
"@home_title_logging_in": {},
"home_login_title_welcome_back": "お帰りなさい!",
"@home_login_title_welcome_back": {},
"home_login_title_launching_game": "ゲーム起動中...",
"@home_login_title_launching_game": {},
"home_action_login_rsi_account": "RSI アカウントログイン",
"@home_action_login_rsi_account": {},
"home_login_info_game_version_outdated": "ゲームバージョンが古すぎる",
"@home_login_info_game_version_outdated": {},
"home_login_info_rsi_server_report": "RSI サーバレポートのバージョン:{v1} \n\nローカルのバージョン{v2} \n\nRSI Launcher を使ってゲームをアップデートしてください!",
"@home_login_info_rsi_server_report": {},
"home_login_info_action_ignore": "無視する",
"@home_login_info_action_ignore": {},
"home_login_action_title_box_one_click_launch": "ボックスワンクリック起動",
"@home_login_action_title_box_one_click_launch": {},
"home_login_action_title_need_webview2_runtime": "WebView2 Runtime のインストールが必要",
"@home_login_action_title_need_webview2_runtime": {},
"action_close": "クローズ",
"@action_close": {},
"downloader_speed_limit_settings": "速度制限設定",
"@downloader_speed_limit_settings": {},
"downloader_action_pause_all": "すべて一時停止",
"@downloader_action_pause_all": {},
"downloader_action_resume_all": "すべて復元",
"@downloader_action_resume_all": {},
"downloader_action_cancel_all": "すべてキャンセル",
"@downloader_action_cancel_all": {},
"downloader_info_no_download_tasks": "ダウンロードタスクなし",
"@downloader_info_no_download_tasks": {},
"downloader_info_total_size": "サイズ合計:{v1}",
"@downloader_info_total_size": {},
"downloader_info_uploaded": "アップロード済み:{v0}",
"@downloader_info_uploaded": {},
"downloader_info_verifying": "検証中...{v2}",
"@downloader_info_verifying": {},
"downloader_info_downloading": "ダウンロード... ({v0}%)",
"@downloader_info_downloading": {},
"downloader_info_status": "ステータス:{v0}",
"@downloader_info_status": {},
"downloader_info_downloaded": "ダウンロード済み:{v0}",
"@downloader_info_downloaded": {},
"downloader_action_options": "オプション",
"@downloader_action_options": {},
"downloader_action_continue_download": "ダウンロードを続ける",
"@downloader_action_continue_download": {},
"downloader_action_pause_download": "ダウンロードの一時停止",
"@downloader_action_pause_download": {},
"downloader_action_cancel_download": "ダウンロードをキャンセル",
"@downloader_action_cancel_download": {},
"action_open_folder": "フォルダを開く",
"@action_open_folder": {},
"downloader_info_download_upload_speed": "ダウンロード: {v0}/s アップロード:{v1}/s",
"@downloader_info_download_upload_speed": {},
"downloader_info_waiting": "待機中",
"@downloader_info_waiting": {},
"downloader_info_downloading_status": "ダウンロード中...",
"@downloader_info_downloading_status": {},
"downloader_info_paused": "一時停止中",
"@downloader_info_paused": {},
"downloader_info_download_failed": "ダウンロード失敗",
"@downloader_info_download_failed": {},
"downloader_info_download_completed": "ダウンロード完了",
"@downloader_info_download_completed": {},
"downloader_info_deleted": "削除済み",
"@downloader_info_deleted": {},
"downloader_title_downloading": "ダウンロード中",
"@downloader_title_downloading": {},
"downloader_title_ended": "終了",
"@downloader_title_ended": {},
"downloader_action_confirm_cancel_all_tasks": "すべてのタスクのキャンセルを確認する?",
"@downloader_action_confirm_cancel_all_tasks": {},
"downloader_action_confirm_cancel_download": "ダウンロードのキャンセルを確認しますか?",
"@downloader_action_confirm_cancel_download": {},
"home_login_info_one_click_launch_description": "この機能は、ゲームをより便利に起動するのに役立ちます。\n\nアカウントのセキュリティを確保するため、この機能はローカライズブラウザを使用してログイン状態を保持し、パスワード情報を保存しません自動入力オンの場合を除く。\n\nこの機能を使用してアカウントにログインする際は、SCToolBox が信頼できるソースからダウンロードされていることを確認してください。",
"@home_login_info_one_click_launch_description": {},
"downloader_info_manual_file_deletion_note": "ダウンロードしたファイルが不要になった場合は、手動で削除する必要があります。",
"@downloader_info_manual_file_deletion_note": {}
} }

View File

@ -1,6 +1,6 @@
{ {
"@@locale": "zh_CN", "@@locale": "zh_CN",
"@auto_translate_locale": "zh-cn", "@@auto_translate_locale": "zh-cn",
"app_language_name": "简体中文", "app_language_name": "简体中文",
"@app_language_name": {}, "@app_language_name": {},
"app_language_code": "zh_CN", "app_language_code": "zh_CN",
@ -16,7 +16,7 @@
"@about_online_feedback": {}, "@about_online_feedback": {},
"about_action_qq_group": "QQ群: 940696487", "about_action_qq_group": "QQ群: 940696487",
"@about_action_qq_group": {}, "@about_action_qq_group": {},
"about_action_email": "邮箱: scbox@xkeyc.com", "about_action_email": "邮箱: xkeyc@qq.com",
"@about_action_email": {}, "@about_action_email": {},
"about_action_open_source": "开源", "about_action_open_source": "开源",
"@about_action_open_source": {}, "@about_action_open_source": {},
@ -48,20 +48,12 @@
"@home_action_one_click_launch": {}, "@home_action_one_click_launch": {},
"home_title_logging_in": "登录中...", "home_title_logging_in": "登录中...",
"@home_title_logging_in": {}, "@home_title_logging_in": {},
"home_info_auto_fill_notice": "* 若开启了自动填充,请留意弹出的 Windows Hello 窗口",
"@home_info_auto_fill_notice": {},
"home_login_title_welcome_back": "欢迎回来!", "home_login_title_welcome_back": "欢迎回来!",
"@home_login_title_welcome_back": {}, "@home_login_title_welcome_back": {},
"home_login_title_launching_game": "正在为您启动游戏...", "home_login_title_launching_game": "正在为您启动游戏...",
"@home_login_title_launching_game": {}, "@home_login_title_launching_game": {},
"home_action_login_rsi_account": "登录 RSI 账户", "home_action_login_rsi_account": "登录 RSI 账户",
"@home_action_login_rsi_account": {}, "@home_action_login_rsi_account": {},
"home_action_q_auto_password_fill_prompt": "是否开启自动密码填充?",
"@home_action_q_auto_password_fill_prompt": {},
"home_login_info_password_encryption_notice": "盒子将使用 PIN 与 Windows 凭据加密保存您的密码,密码只存储在您的设备中。\n\n当下次登录需要输入密码时您只需授权PIN即可自动填充登录。",
"@home_login_info_password_encryption_notice": {},
"home_login_info_enter_pin_to_encrypt": "输入PIN以启用加密",
"@home_login_info_enter_pin_to_encrypt": {},
"home_login_info_game_version_outdated": "游戏版本过期", "home_login_info_game_version_outdated": "游戏版本过期",
"@home_login_info_game_version_outdated": {}, "@home_login_info_game_version_outdated": {},
"home_login_info_rsi_server_report": "RSI 服务器报告版本号:{v1} \n\n本地版本号{v2} \n\n建议使用 RSI Launcher 更新游戏!", "home_login_info_rsi_server_report": "RSI 服务器报告版本号:{v1} \n\n本地版本号{v2} \n\n建议使用 RSI Launcher 更新游戏!",
@ -330,8 +322,8 @@
"@home_action_info_warning": {}, "@home_action_info_warning": {},
"localization_info_machine_translation_warning": "您正在使用游戏内置文本官方文本目前为机器翻译截至3.21.0),建议您在下方安装社区汉化。", "localization_info_machine_translation_warning": "您正在使用游戏内置文本官方文本目前为机器翻译截至3.21.0),建议您在下方安装社区汉化。",
"@localization_info_machine_translation_warning": {}, "@localization_info_machine_translation_warning": {},
"localization_info_translation_status": "汉化状态", "localization_info_translation": "游戏汉化",
"@localization_info_translation_status": {}, "@localization_info_translation": {},
"localization_info_enabled": "启用({v0}", "localization_info_enabled": "启用({v0}",
"@localization_info_enabled": {}, "@localization_info_enabled": {},
"localization_info_installed_version": "已安装版本:{v0}", "localization_info_installed_version": "已安装版本:{v0}",
@ -346,12 +338,6 @@
"@localization_info_community_translation": {}, "@localization_info_community_translation": {},
"localization_info_no_translation_available": "该语言/版本 暂无可用汉化,敬请期待!", "localization_info_no_translation_available": "该语言/版本 暂无可用汉化,敬请期待!",
"@localization_info_no_translation_available": {}, "@localization_info_no_translation_available": {},
"localization_action_advanced_features": "高级功能",
"@localization_action_advanced_features": {},
"localization_info_custom_text": "自定义文本",
"@localization_info_custom_text": {},
"localization_info_no_custom_text": "暂无自定义文本",
"@localization_info_no_custom_text": {},
"localization_action_install": "安装", "localization_action_install": "安装",
"@localization_action_install": {}, "@localization_action_install": {},
"localization_info_version_number": "版本号:{v0}", "localization_info_version_number": "版本号:{v0}",
@ -370,10 +356,6 @@
"@localization_info_remove_incompatible_translation_params": {}, "@localization_info_remove_incompatible_translation_params": {},
"localization_info_incompatible_translation_params_warning": "USER.cfg 包含不兼容的汉化参数,这可能是以前的汉化文件的残留信息。\n\n这将可能导致汉化无效或乱码点击确认为您一键移除不会影响其他配置。", "localization_info_incompatible_translation_params_warning": "USER.cfg 包含不兼容的汉化参数,这可能是以前的汉化文件的残留信息。\n\n这将可能导致汉化无效或乱码点击确认为您一键移除不会影响其他配置。",
"@localization_info_incompatible_translation_params_warning": {}, "@localization_info_incompatible_translation_params_warning": {},
"localization_info_custom_file": "自定义_{v0}",
"@localization_info_custom_file": {},
"localization_info_custom_file_instructions": "即将打开本地化文件夹,请将自定义的 任意名称.ini 文件放入 Customize_ini 文件夹。\n\n添加新文件后未显示请使用右上角刷新按钮。\n\n安装时请确保选择了正确的语言。",
"@localization_info_custom_file_instructions": {},
"localization_info_corrupted_file": "文件受损,请重新下载", "localization_info_corrupted_file": "文件受损,请重新下载",
"@localization_info_corrupted_file": {}, "@localization_info_corrupted_file": {},
"localization_info_installation_error": "安装出错!\n\n {v0}", "localization_info_installation_error": "安装出错!\n\n {v0}",
@ -450,20 +432,6 @@
"@setting_action_create_desktop_shortcut": {}, "@setting_action_create_desktop_shortcut": {},
"setting_action_reset_auto_password_fill": "重置自动密码填充", "setting_action_reset_auto_password_fill": "重置自动密码填充",
"@setting_action_reset_auto_password_fill": {}, "@setting_action_reset_auto_password_fill": {},
"setting_action_info_device_support_info": "启用:{v0} 设备支持:{v1} 邮箱:{v2} 密码:{v3}",
"@setting_action_info_device_support_info": {},
"setting_action_info_enabled": "已启用",
"@setting_action_info_enabled": {},
"setting_action_info_disabled": "已禁用",
"@setting_action_info_disabled": {},
"setting_action_info_support": "支持",
"@setting_action_info_support": {},
"setting_action_info_not_support": "不支持",
"@setting_action_info_not_support": {},
"setting_action_info_encrypted_saved": "已加密保存",
"@setting_action_info_encrypted_saved": {},
"setting_action_info_not_saved": "未保存",
"@setting_action_info_not_saved": {},
"setting_action_ignore_efficiency_cores_on_launch": "启动游戏时忽略能效核心( 适用于Intel 12th+ 处理器 ", "setting_action_ignore_efficiency_cores_on_launch": "启动游戏时忽略能效核心( 适用于Intel 12th+ 处理器 ",
"@setting_action_ignore_efficiency_cores_on_launch": {}, "@setting_action_ignore_efficiency_cores_on_launch": {},
"setting_action_set_core_count": "已设置的核心数量:{v0} (此功能适用于首页的盒子一键启动 或 工具中的RSI启动器管理员模式当为 0 时不启用此功能 ", "setting_action_set_core_count": "已设置的核心数量:{v0} (此功能适用于首页的盒子一键启动 或 工具中的RSI启动器管理员模式当为 0 时不启用此功能 ",
@ -540,8 +508,6 @@
"@app_splash_almost_done": {}, "@app_splash_almost_done": {},
"tools_hosts_info_rsi_official_website": "RSI 官网", "tools_hosts_info_rsi_official_website": "RSI 官网",
"@tools_hosts_info_rsi_official_website": {}, "@tools_hosts_info_rsi_official_website": {},
"tools_hosts_info_rsi_zendesk": "RSI Zendesk 客服站",
"@tools_hosts_info_rsi_zendesk": {},
"tools_hosts_info_rsi_customer_service": "RSI 客服站", "tools_hosts_info_rsi_customer_service": "RSI 客服站",
"@tools_hosts_info_rsi_customer_service": {}, "@tools_hosts_info_rsi_customer_service": {},
"tools_hosts_info_dns_query_and_test": "正在查询 DNS 并测试可访问性 请耐心等待...", "tools_hosts_info_dns_query_and_test": "正在查询 DNS 并测试可访问性 请耐心等待...",
@ -666,10 +632,6 @@
"@webview_localization_finished_invitations": {}, "@webview_localization_finished_invitations": {},
"app_init_failed_with_reason": "初始化失败:{v0}", "app_init_failed_with_reason": "初始化失败:{v0}",
"@app_init_failed_with_reason": {}, "@app_init_failed_with_reason": {},
"webview_localization_enter_device_pin": "请输入设备PIN以自动登录RSI账户",
"@webview_localization_enter_device_pin": {},
"webview_localization_device_windows_hello_toast": "请完成 Windows Hello 验证以填充密码",
"@webview_localization_device_windows_hello_toast": {},
"settings_app_language": "语言", "settings_app_language": "语言",
"settings_app_language_auto": "自动", "settings_app_language_auto": "自动",
"app_common_network_error": "网络异常!\n这可能是您的网络环境存在DNS污染请尝试更换DNS。\n或服务器正在维护或遭受攻击稍后再试。 \n进入离线模式... \n\n请谨慎在离线模式中使用。 \n当前版本构建日期{v0}\n QQ群940696487 \n错误信息{v1}", "app_common_network_error": "网络异常!\n这可能是您的网络环境存在DNS污染请尝试更换DNS。\n或服务器正在维护或遭受攻击稍后再试。 \n进入离线模式... \n\n请谨慎在离线模式中使用。 \n当前版本构建日期{v0}\n QQ群940696487 \n错误信息{v1}",
@ -690,6 +652,8 @@
"doctor_game_error_game_damaged_p4k_file_info": "请尝试删除 Data.p4k 文件 并在启动器校验 或 使用盒子分流。", "doctor_game_error_game_damaged_p4k_file_info": "请尝试删除 Data.p4k 文件 并在启动器校验 或 使用盒子分流。",
"doctor_game_error_low_gpu_memory": "可用显存不足", "doctor_game_error_low_gpu_memory": "可用显存不足",
"doctor_game_error_low_gpu_memory_info": "请不要在后台运行其他高显卡占用的 游戏/应用,或更换显卡。", "doctor_game_error_low_gpu_memory_info": "请不要在后台运行其他高显卡占用的 游戏/应用,或更换显卡。",
"doctor_game_error_gpu_vulkan_crash": "GPU Vulkan 崩溃",
"doctor_game_error_gpu_vulkan_crash_info": "Vulkan 崩溃!这可能是驱动版本或游戏引擎问题,请尝试更新 GPU 驱动 或 使用清理着色器功能为您回退到 DX11",
"app_common_error_info": "出现错误: {v0}", "app_common_error_info": "出现错误: {v0}",
"app_common_tip": "提示", "app_common_tip": "提示",
"app_common_tip_i_know": "我知道了", "app_common_tip_i_know": "我知道了",
@ -698,5 +662,140 @@
"settings_app_language_switch_info": "切换应用显示语言", "settings_app_language_switch_info": "切换应用显示语言",
"home_holiday_countdown_days": "{v0}天 ", "home_holiday_countdown_days": "{v0}天 ",
"home_holiday_countdown_in_progress": "正在进行中", "home_holiday_countdown_in_progress": "正在进行中",
"app_common_loading_images": "加载图片..." "app_common_loading_images": "加载图片...",
"app_splash_dialog_u_a_p_p": "用户协议与隐私政策",
"app_splash_dialog_u_a_p_p_content": "感谢您选择 SC汉化盒子 ,我们致力于为您提供 安全、便捷、可靠的使用体验,在您开始使用应用前,请先阅读并同意以下内容:\n\n 1. 本应用 为 GNU 通用公共许可证 v3.0 协议下的开源软件,您可以在遵守协议的前提下自由使用、修改、分发本软件。我们的源代码位于:[Github.com/StarCitizenToolBox/app](https://github.com/StarCitizenToolBox/app)。 \n2. 本应用中的互联网内容(包括但不限于 本地化文件、工具网站、新闻、视频 等)版权由其作者创作所有,不属于 GPL 的一部分,请在遵守对应的授权协议下使用。\n3. 本应用的官方免费发布渠道为:[微软应用商店](https://apps.microsoft.com/detail/9NF3SWFWNKL1) 与 [星际公民汉化组官网](https://www.starcitizenzw.com/) ,若您从其他第三方处获得,请仔细甄别,以免遭受财产损失。\n4. 本应用在使用过程中会向我们的服务器发送匿名的统计数据,用于改进软件质量,我们不会收集您的任何个人隐私信息。 \n5. 本应用由社区提供支持,与 Cloud Imperium Games 或 其他第三方商业公司 无直接关联。\n6. 我们提供有限的社区支持,如有需要,请前往关于页面了解如何联系我们。",
"tools_unp4k_msg_init": "初始化中...",
"tools_unp4k_msg_reading": "正在读取P4K 文件 ...",
"tools_unp4k_msg_reading2": "正在处理文件 ...",
"tools_unp4k_msg_reading3": "正在处理文件 ({v0}/{v1}) ...",
"tools_unp4k_msg_read_completed": "加载完毕:{v0} 个文件,用时:{v1} ms",
"tools_unp4k_msg_open_file": "打开文件:{v0}",
"tools_unp4k_msg_read_file": "读取文件:{v0} ...",
"home_localization_advanced_title": "高级汉化 -> {v0}",
"home_localization_advanced_msg_version": "已加载汉化版本:{v0}",
"home_localization_advanced_title_msg": "汉化文本行数:{v0} P4K文本行数{v1}",
"home_localization_advanced_action_install": "安装汉化",
"home_localization_advanced_action_mod_change": "正在重新生成文本...",
"home_localization_advanced_action_mode": "模式",
"home_localization_advanced_title_preview": "预览:{v0}",
"home_localization_advanced_json_text_location_other": "地点-其他",
"home_localization_advanced_json_text_location_used": "地点-常用",
"home_localization_advanced_json_text_things_other": "物品-其他",
"home_localization_advanced_json_text_things_used": "物品-常用",
"home_localization_advanced_json_text_vehicle_other": "载具-其他",
"home_localization_advanced_json_text_vehicle_used": "载具-常用",
"home_localization_advanced_json_text_mission_or_logs": "任务/日志",
"home_localization_advanced_json_text_subtitle": "字幕",
"home_localization_advanced_json_text_ui_or_hud_or_menu": "UI/HUD/菜单",
"home_localization_advanced_json_text_un_localization": "未汉化",
"home_localization_advanced_json_text_others": "其他",
"home_localization_advanced_action_mod_change_localization": "汉化",
"home_localization_advanced_action_mod_change_un_localization": "英文原文",
"home_localization_advanced_action_mod_change_mixed": "双语",
"home_localization_advanced_action_mod_change_mixed_newline": "双语(换行)",
"home_localization_advanced_msg_classifying": "正在分类 ...",
"home_localization_advanced_msg_reading_p4k": "读取 p4k 文件 ...",
"home_localization_advanced_msg_reading_server_localization_text": "获取汉化文本 ...",
"home_localization_advanced_msg_gen_localization_text": "生成汉化文件...",
"home_localization_advanced_msg_gen_localization_install": "安装汉化文件...",
"home_localization_msg_version_advanced": " (高级汉化)",
"home_localization_msg_no_note": "该版本没有提供描述",
"home_localization_action_rsi_launcher_localization": "RSI 启动器汉化",
"home_localization_action_rsi_launcher_no_game_path_msg": "您当前未安装游戏本体或未选择游戏安装目录,只可使用启动器汉化功能。请确保游戏安装完毕或在盒子设置中添加游戏安装目录后重试。",
"home_localization_action_advanced": "高级汉化",
"home_localization_action_install_customize": "安装自定义文件",
"home_localization_title_localization_tools": "汉化工具",
"performance_json_text_ssdo": "屏幕光线后处理",
"performance_json_text_ssdo_info": "调整光线后处理等级",
"performance_json_text_title_graphics": "图形(修改后建议清理着色器)",
"performance_json_text_antialiasing": "抗锯齿",
"performance_json_text_antialiasing_info": "0 关闭1 SMAA2 时间过滤+SMAA3 时间滤波和投影矩阵抖动的 SMAA",
"performance_json_text_game_effects": "特效等级",
"performance_json_text_game_effects_info": "游戏特效等级",
"performance_json_text_texture": "纹理等级",
"performance_json_text_texture_info": "模型纹理细节",
"performance_json_text_volumetric_effects": "体积效果",
"performance_json_text_volumetric_effects_info": "体积云、体积光照等",
"performance_json_text_water": "水体效果",
"performance_json_text_water_info": "各种水的等级",
"performance_json_text_object_detail": "对象细节",
"performance_json_text_object_detail_info": "模型对象细节影响LOD等..",
"performance_json_text_particles": "粒子细节",
"performance_json_text_physics": "物理细节",
"performance_json_text_physics_info": "物理效果范围",
"performance_json_text_shading": "着色器细节",
"performance_json_text_shading_info": "着色器相关",
"performance_json_text_shadows": "阴影细节",
"performance_json_text_shadows_info": "阴影效果",
"performance_json_text_postprocessing": "后处理细节",
"performance_json_text_postprocessing_info": "后处理着色器,动态模糊效果 等",
"performance_json_text_renderer": "渲染器质量",
"performance_json_text_renderer_info": "cryengine 渲染器质量",
"performance_json_text_shader_decal": "贴花质量",
"performance_json_text_shader_decal_info": "LOGO、标志等",
"performance_json_text_shader_post_process": "着色器质量",
"performance_json_text_shader_fx": "FX 质量",
"performance_json_text_shader_general": "常规质量",
"performance_json_text_shader_general_info": "整体模型质量",
"performance_json_text_shader_glass": "玻璃质量",
"performance_json_text_shader_glass_info": "窗、镜子等",
"performance_json_text_shader_hdr": "HDR质量",
"performance_json_text_shader_hdr_info": "HDR色差亮度层级 处理 等",
"performance_json_text_shader_particle": "粒子质量",
"performance_json_text_shader_particle_info": "粒子效果质量",
"performance_json_text_shader_terrain": "地面质量",
"performance_json_text_shader_shadow": "阴影质量",
"performance_json_text_shader_sky": "天空质量",
"performance_json_text_particles_object_collisions": "粒子碰撞",
"performance_json_text_particles_object_collisions_info": "1 仅静态粒子 2 包括动态粒子",
"performance_json_text_displayinfo": "屏幕信息(展示帧率)",
"performance_json_text_displayinfo_info": "在屏幕右上角展示帧率,服务器信息等",
"performance_json_text_max_fps": "最大帧率",
"performance_json_text_max_fps_info": "调整游戏最高帧率0为不限制",
"performance_json_text_display_session": "显示会话信息",
"performance_json_text_display_session_info": "开启后在屏幕上显示一个二维码,用于反馈时让 CIG 快速定位相关信息",
"performance_json_text_vsync": "垂直同步",
"performance_json_text_vsync_info": "开启以防止撕裂,关闭以提高帧率",
"performance_json_text_motion_blur": "动态模糊",
"performance_json_text_motion_blur_info": "开启以提高运动感,关闭提升观感",
"performance_json_text_fov": "设置视角FOV",
"performance_json_text_ui_animation": "UI 淡入淡出动画",
"performance_json_text_custom_parameters": "自定义参数",
"performance_json_text_title_custom": "自定义",
"tools_rsi_launcher_enhance_init_msg1": "读取启动器信息...",
"tools_rsi_launcher_enhance_init_msg2": "正在从网络获取增强数据...",
"tools_rsi_launcher_enhance_working_msg1": "生成补丁 ...",
"tools_rsi_launcher_enhance_working_msg2": "安装补丁,这需要一点时间,取决于您的计算机性能 ...",
"tools_rsi_launcher_enhance_title": "RSI 启动器增强",
"tools_rsi_launcher_enhance_msg_version": "启动器内部版本信息:{v0}",
"tools_rsi_launcher_enhance_msg_patch_status": "补丁状态:{v0}",
"tools_rsi_launcher_enhance_msg_error": "获取增强数据失败,可能是网络问题或当前版本不支持",
"tools_rsi_launcher_enhance_title_localization": "RSI 启动器本地化",
"tools_rsi_launcher_enhance_subtitle_localization": "为 RSI 启动器增加多语言支持。",
"tools_rsi_launcher_enhance_title_download_booster": "RSI 启动器下载增强",
"tools_rsi_launcher_enhance_subtitle_download_booster": "下载游戏时可使用更多线程以提升下载速度,启用后请在启动器设置修改线程数。",
"tools_rsi_launcher_enhance_action_install": "安装增强补丁",
"tools_rsi_launcher_enhance_msg_uninstall": "* 如需卸载增强补丁,请覆盖安装 RSI 启动器。",
"tools_rsi_launcher_enhance_msg_error_launcher_notfound": "未找到 RSI 启动器",
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error": "读取启动器信息失败!",
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args": "读取启动器信息失败:{v0}",
"tools_action_rsi_launcher_enhance_info": "启动器汉化,下载线程增强",
"tools_rsi_launcher_enhance_note_title": "RSI 启动器增强使用须知",
"tools_rsi_launcher_enhance_note_msg": "RSI 启动器增强是一项社区功能,它会在您的电脑上解包 \"RSI Launcher\" 并加入额外的增强功能,具体使用哪些功能由您决定。\n\n目前官方CIG仅许可我们进行多语言操作启动器下载增强是我们认为有用的额外功能违反cig用户协议https://robertsspaceindustries.com/eula可能导致账号被封禁等严重后果是否启用由您自己决定我们不对可能产生的后果游戏损坏账号封禁等承担任何责任。\n\n对于启动器的修改内容我们开源于https://github.com/StarCitizenToolBox/RSILauncherEnhance如有需要您可自行查阅。\n\n如果您因为任何原因需要取消此增强补丁请直接覆盖安装官方启动器。",
"tools_action_unp4k": "P4K 查看器",
"tools_action_unp4k_info": "解包星际公民 p4k 文件",
"tools_unp4k_title": "P4K 查看器 -> {v0}",
"tools_unp4k_view_file": "单击文件以预览",
"tools_unp4k_msg_unknown_file_type": "未知文件类型\n{v0}",
"home_localization_select_customize_file_ini": "请选择 ini 文件",
"home_localization_select_customize_file": "请选择自定义汉化文件",
"home_localization_action_select_customize_file": "点击选择 ini 文件",
"home_localization_ptu_advanced_localization_tip_title": "推荐使用高级汉化",
"home_localization_ptu_advanced_localization_tip_title_info": "在 PTU/EPTU 等测试频道 ,当前汉化文本可能与游戏不同步,使用高级汉化可以减少乱码产生。",
"tools_rsi_launcher_enhance_action_fold": "收起额外功能",
"tools_rsi_launcher_enhance_action_expand": "展开额外功能",
"tools_unp4k_missing_runtime": "缺少运行库",
"tools_unp4k_missing_runtime_info": "使用此功能需安装 .NET8 运行库,请点击下方按钮下载安装,安装成功后重新打开此页面即可继续使用。",
"tools_unp4k_missing_runtime_action_install": "安装运行库"
} }

View File

@ -1,36 +1,36 @@
{ {
"@@locale": "zh_TW", "@@locale": "zh_TW",
"@@auto_translate_locale": "zh-tw",
"app_language_name": "繁體中文", "app_language_name": "繁體中文",
"@app_language_name": {}, "@app_language_name": {},
"app_language_code": "zh_TW", "app_language_code": "zh_TW",
"@app_language_code": {}, "app_index_version_info": "SC工具箱 V{v0} {v1}",
"app_index_version_info": "SC漢化盒子 V{v0} {v1}",
"@app_index_version_info": {}, "@app_index_version_info": {},
"app_shortcut_name": "SC漢化盒子DEV.lnk", "app_shortcut_name": "SC工具箱DEV.lnk",
"@app_shortcut_name": {}, "@app_shortcut_name": {},
"about_check_update": "檢查更新", "about_check_update": "檢查更新",
"@about_check_update": {}, "@about_check_update": {},
"about_app_description": "不僅僅是漢化!\n\nSC漢化盒子是你探索宇宙的好幫手,我們致力於為各位公民解決遊戲中的常見問題,並為社群翻譯、性能調整、常用網站翻譯 等操作提供便利。", "about_app_description": "這個工具能做的不僅僅是翻譯!\n\nSC工具箱是你探索宇宙的好幫手,我們致力於為各位公民解決遊戲中的常見問題,並為社群翻譯、性能改善、常用網站翻譯 等操作提供便利。",
"@about_app_description": {}, "@about_app_description": {},
"about_online_feedback": "線上反饋", "about_online_feedback": "意見反饋",
"@about_online_feedback": {}, "@about_online_feedback": {},
"about_action_qq_group": "QQ群: 940696487", "about_action_qq_group": "QQ群",
"@about_action_qq_group": {}, "@about_action_qq_group": {},
"about_action_email": "郵箱: scbox@xkeyc.com", "about_action_email": "電子信箱",
"@about_action_email": {}, "@about_action_email": {},
"about_action_open_source": "開源", "about_action_open_source": "專案開源 (Github)",
"@about_action_open_source": {}, "@about_action_open_source": {},
"about_disclaimer": "這是一個非官方的星際公民工具,不隸屬於 Cloud Imperium 公司集團。 本軟體中非由其主機或用戶創作的所有內容均為其各自所有者的財產。 \nStar Citizen®、Roberts Space Industries® 和 Cloud Imperium® 是 Cloud Imperium Rights LLC 的註冊商標。", "about_disclaimer": "SC工具箱非官方的星際公民工具,不隸屬於 Cloud Imperium 公司集團。 本軟體中非由其主機或使用者創作的所有內容均為其各自所有者的財產。 \nStar Citizen®、Roberts Space Industries® 和 Cloud Imperium® 是 Cloud Imperium Rights LLC 的註冊商標。",
"@about_disclaimer": {}, "@about_disclaimer": {},
"about_analytics_launch": "啟動", "about_analytics_launch": "啟動",
"@about_analytics_launch": {}, "@about_analytics_launch": {},
"about_analytics_launch_game": "啟動遊戲", "about_analytics_launch_game": "啟動遊戲",
"@about_analytics_launch_game": {}, "@about_analytics_launch_game": {},
"about_analytics_total_users": "累計用戶", "about_analytics_total_users": "使用者總計",
"@about_analytics_total_users": {}, "@about_analytics_total_users": {},
"about_analytics_install_translation": "翻譯安裝", "about_analytics_install_translation": "翻譯安裝",
"@about_analytics_install_translation": {}, "@about_analytics_install_translation": {},
"about_analytics_performance_optimization": "性能調整", "about_analytics_performance_optimization": "畫面與性能改善",
"@about_analytics_performance_optimization": {}, "@about_analytics_performance_optimization": {},
"about_analytics_p4k_redirection": "P4K分流", "about_analytics_p4k_redirection": "P4K分流",
"@about_analytics_p4k_redirection": {}, "@about_analytics_p4k_redirection": {},
@ -38,53 +38,45 @@
"@about_analytics_units_user": {}, "@about_analytics_units_user": {},
"about_analytics_units_times": "次", "about_analytics_units_times": "次",
"@about_analytics_units_times": {}, "@about_analytics_units_times": {},
"about_info_latest_version": "已經是最新版本!", "about_info_latest_version": "已經更新至最新版本",
"@about_info_latest_version": {}, "@about_info_latest_version": {},
"home_holiday_countdown": "節日倒計時", "home_holiday_countdown": "遊戲節慶倒數計時",
"@home_holiday_countdown": {}, "@home_holiday_countdown": {},
"home_holiday_countdown_disclaimer": "* 以上節日日期由人工收錄、維護,可能存在錯誤,歡迎反饋!", "home_holiday_countdown_disclaimer": "* 以上節慶日期由人工收錄與維護,可能存在部分偏誤,歡迎進行反饋!",
"@home_holiday_countdown_disclaimer": {}, "@home_holiday_countdown_disclaimer": {},
"home_action_one_click_launch": "快速啟動", "home_action_one_click_launch": "快速啟動",
"@home_action_one_click_launch": {}, "@home_action_one_click_launch": {},
"home_title_logging_in": "登入...", "home_title_logging_in": "正在登入...",
"@home_title_logging_in": {}, "@home_title_logging_in": {},
"home_info_auto_fill_notice": "* 若開啟了自動輸入,請留意彈出的 Windows Hello 窗口",
"@home_info_auto_fill_notice": {},
"home_login_title_welcome_back": "歡迎回來!", "home_login_title_welcome_back": "歡迎回來!",
"@home_login_title_welcome_back": {}, "@home_login_title_welcome_back": {},
"home_login_title_launching_game": "正在為您啟動遊戲...", "home_login_title_launching_game": "正在為您啟動遊戲...",
"@home_login_title_launching_game": {}, "@home_login_title_launching_game": {},
"home_action_login_rsi_account": "登入 RSI 帳戶", "home_action_login_rsi_account": "登入 RSI 帳戶",
"@home_action_login_rsi_account": {}, "@home_action_login_rsi_account": {},
"home_action_q_auto_password_fill_prompt": "是否開啟自動密碼輸入?", "home_login_info_game_version_outdated": "遊戲版本過舊",
"@home_action_q_auto_password_fill_prompt": {},
"home_login_info_password_encryption_notice": "盒子將使用 PIN 與 Windows 憑據加密保存您的密碼,密碼只儲存在您的裝置中。\n\n當下次登入需要輸入密碼時您只需授權PIN即可自動輸入登入。",
"@home_login_info_password_encryption_notice": {},
"home_login_info_enter_pin_to_encrypt": "輸入PIN以啟用加密",
"@home_login_info_enter_pin_to_encrypt": {},
"home_login_info_game_version_outdated": "遊戲版本過期",
"@home_login_info_game_version_outdated": {}, "@home_login_info_game_version_outdated": {},
"home_login_info_rsi_server_report": "RSI 伺服器報告版本號:{v1} \n\n本版本號:{v2} \n\n建議使用 RSI Launcher 更新遊戲!", "home_login_info_rsi_server_report": "RSI 伺服器報告版本號:{v1} \n\n本機版本號{v2} \n\n建議使用 RSI Launcher 更新遊戲!",
"@home_login_info_rsi_server_report": {}, "@home_login_info_rsi_server_report": {},
"home_login_info_action_ignore": "忽略", "home_login_info_action_ignore": "忽略",
"@home_login_info_action_ignore": {}, "@home_login_info_action_ignore": {},
"home_login_action_title_box_one_click_launch": "盒子快速啟動", "home_login_action_title_box_one_click_launch": "工具箱快速啟動",
"@home_login_action_title_box_one_click_launch": {}, "@home_login_action_title_box_one_click_launch": {},
"home_login_info_one_click_launch_description": "此功能可以幫您更加便利的啟動遊戲。\n\n為確保帳戶安全 ,此功能使用漢化瀏覽器保留登入狀態,且不會保存您的密碼資訊(除非你啟用了自動輸入功能)。\n\n使用此功能登入帳號時請確保您的 SC漢化盒子 是從可信任的來源下載。", "home_login_info_one_click_launch_description": "本功能可以幫您更加便利的啟動遊戲。\n\n為確保帳戶安全 ,本功能使用中文翻譯瀏覽器保留登入狀態,且不會儲存您的密碼資訊(除非你啟用了自動輸入功能)。\n\n使用此功能登入帳號時請確保您的 SC工具箱 是從可信任的來源下載。",
"@home_login_info_one_click_launch_description": {}, "@home_login_info_one_click_launch_description": {},
"home_login_action_title_need_webview2_runtime": "需要安裝 WebView2 Runtime", "home_login_action_title_need_webview2_runtime": "需要安裝 WebView2 Runtime",
"@home_login_action_title_need_webview2_runtime": {}, "@home_login_action_title_need_webview2_runtime": {},
"action_close": "關閉", "action_close": "關閉",
"@action_close": {}, "@action_close": {},
"downloader_speed_limit_settings": "限速設置", "downloader_speed_limit_settings": "下載設定",
"@downloader_speed_limit_settings": {}, "@downloader_speed_limit_settings": {},
"downloader_action_pause_all": "全部暫停", "downloader_action_pause_all": "全部暫停",
"@downloader_action_pause_all": {}, "@downloader_action_pause_all": {},
"downloader_action_resume_all": "恢復全部", "downloader_action_resume_all": "全部繼續",
"@downloader_action_resume_all": {}, "@downloader_action_resume_all": {},
"downloader_action_cancel_all": "全部取消", "downloader_action_cancel_all": "全部取消",
"@downloader_action_cancel_all": {}, "@downloader_action_cancel_all": {},
"downloader_info_no_download_tasks": "尚無下載佇列", "downloader_info_no_download_tasks": "無下載任務",
"@downloader_info_no_download_tasks": {}, "@downloader_info_no_download_tasks": {},
"downloader_info_total_size": "總大小:{v1}", "downloader_info_total_size": "總大小:{v1}",
"@downloader_info_total_size": {}, "@downloader_info_total_size": {},
@ -106,7 +98,7 @@
"@downloader_action_pause_download": {}, "@downloader_action_pause_download": {},
"downloader_action_cancel_download": "取消下載", "downloader_action_cancel_download": "取消下載",
"@downloader_action_cancel_download": {}, "@downloader_action_cancel_download": {},
"action_open_folder": "打開文件夾", "action_open_folder": "打開資料夾",
"@action_open_folder": {}, "@action_open_folder": {},
"downloader_info_download_upload_speed": "下載: {v0}/s 上傳:{v1}/s", "downloader_info_download_upload_speed": "下載: {v0}/s 上傳:{v1}/s",
"@downloader_info_download_upload_speed": {}, "@downloader_info_download_upload_speed": {},
@ -126,13 +118,13 @@
"@downloader_title_downloading": {}, "@downloader_title_downloading": {},
"downloader_title_ended": "已結束", "downloader_title_ended": "已結束",
"@downloader_title_ended": {}, "@downloader_title_ended": {},
"downloader_action_confirm_cancel_all_tasks": "確認取消全部佇列", "downloader_action_confirm_cancel_all_tasks": "確認取消全部任務",
"@downloader_action_confirm_cancel_all_tasks": {}, "@downloader_action_confirm_cancel_all_tasks": {},
"downloader_info_manual_file_deletion_note": "如果文件不再需要,你可能需要手動刪除下載文件。", "downloader_info_manual_file_deletion_note": "如果文件不再需要,你可能需要手動刪除下載文件。",
"@downloader_info_manual_file_deletion_note": {}, "@downloader_info_manual_file_deletion_note": {},
"downloader_action_confirm_cancel_download": "確認取消下載?", "downloader_action_confirm_cancel_download": "確認取消下載?",
"@downloader_action_confirm_cancel_download": {}, "@downloader_action_confirm_cancel_download": {},
"downloader_info_p2p_network_note": "SC 漢化盒子使用 p2p 網路來加速文件下載,如果您流量有限,可在此處將上傳速率設置為 1(byte)。", "downloader_info_p2p_network_note": "SC 工具箱使用 p2p 網路來加速文件下載,如果您流量有限,可在此處將上傳頻寬設定為 1(byte)。",
"@downloader_info_p2p_network_note": {}, "@downloader_info_p2p_network_note": {},
"downloader_info_download_unit_input_prompt": "請輸入下載單位1、100k、10m 0或留空為不限速。", "downloader_info_download_unit_input_prompt": "請輸入下載單位1、100k、10m 0或留空為不限速。",
"@downloader_info_download_unit_input_prompt": {}, "@downloader_info_download_unit_input_prompt": {},
@ -140,13 +132,13 @@
"@downloader_input_upload_speed_limit": {}, "@downloader_input_upload_speed_limit": {},
"downloader_input_download_speed_limit": "下載限制:", "downloader_input_download_speed_limit": "下載限制:",
"@downloader_input_download_speed_limit": {}, "@downloader_input_download_speed_limit": {},
"downloader_input_info_p2p_upload_note": "* P2P 上傳僅在下載文件時進行,下載完成後會關閉 p2p 連接。如您想參與製作種子文件,請通過關於頁面聯繫我們。", "downloader_input_info_p2p_upload_note": "* P2P 上傳僅在下載文件時進行,下載完成後會關閉 p2p 連接。如您想參與製作種子文件,請透過關於頁面聯絡我們。",
"@downloader_input_info_p2p_upload_note": {}, "@downloader_input_info_p2p_upload_note": {},
"doctor_title_one_click_diagnosis": "疑難排解 -> {v0}", "doctor_title_one_click_diagnosis": "疑難排解 -> {v0}",
"@doctor_title_one_click_diagnosis": {}, "@doctor_title_one_click_diagnosis": {},
"doctor_action_rsi_launcher_log": "RSI啟動器log", "doctor_action_rsi_launcher_log": "RSI啟動器log",
"@doctor_action_rsi_launcher_log": {}, "@doctor_action_rsi_launcher_log": {},
"doctor_action_game_run_log": "遊戲行log", "doctor_action_game_run_log": "遊戲行log",
"@doctor_action_game_run_log": {}, "@doctor_action_game_run_log": {},
"doctor_info_scan_complete_no_issues": "掃描完畢,沒有找到問題!", "doctor_info_scan_complete_no_issues": "掃描完畢,沒有找到問題!",
"@doctor_info_scan_complete_no_issues": {}, "@doctor_info_scan_complete_no_issues": {},
@ -154,33 +146,33 @@
"@doctor_info_processing": {}, "@doctor_info_processing": {},
"doctor_info_game_rescue_service_note": "您即將前往由 深空治療中心QQ群號536454632 提供的遊戲異常救援服務,主要解決遊戲安裝失敗與頻繁閃退,如遊戲玩法問題,請勿加群。", "doctor_info_game_rescue_service_note": "您即將前往由 深空治療中心QQ群號536454632 提供的遊戲異常救援服務,主要解決遊戲安裝失敗與頻繁閃退,如遊戲玩法問題,請勿加群。",
"@doctor_info_game_rescue_service_note": {}, "@doctor_info_game_rescue_service_note": {},
"doctor_info_need_help": "需要幫助? 點擊加尋求免費人工支援!", "doctor_info_need_help": "需要幫助? 點擊加群尋求免費人工支援!",
"@doctor_info_need_help": {}, "@doctor_info_need_help": {},
"doctor_info_tool_check_result_note": "注意:工具檢測結果僅供參考,若您不理解以下操作,請提供截圖給有經驗的玩家!", "doctor_info_tool_check_result_note": "注意:工具檢測結果僅供參考,若您不理解以下操作,請提供截圖給有經驗的玩家!",
"@doctor_info_tool_check_result_note": {}, "@doctor_info_tool_check_result_note": {},
"doctor_info_result_unsupported_os": "不支援的操作系統,遊戲可能無法運行", "doctor_info_result_unsupported_os": "不支援的作業系統,遊戲可能無法執行",
"@doctor_info_result_unsupported_os": {}, "@doctor_info_result_unsupported_os": {},
"doctor_info_result_upgrade_system": "請更新您的系統 ({v0})", "doctor_info_result_upgrade_system": "請更新您的系統 ({v0})",
"@doctor_info_result_upgrade_system": {}, "@doctor_info_result_upgrade_system": {},
"doctor_info_result_missing_live_folder": "安裝目錄缺少LIVE文件夾,可能導致安裝失敗", "doctor_info_result_missing_live_folder": "安裝目錄缺少LIVE資料夾,可能導致安裝失敗",
"@doctor_info_result_missing_live_folder": {}, "@doctor_info_result_missing_live_folder": {},
"doctor_info_result_create_live_folder": "點擊修復為您建立 LIVE 文件夾,完成後重試安裝。({v0})", "doctor_info_result_create_live_folder": "點擊修復為您新增 LIVE 資料夾,完成後重試安裝。({v0})",
"@doctor_info_result_create_live_folder": {}, "@doctor_info_result_create_live_folder": {},
"doctor_info_result_incompatible_nvme_device": "新型 NVME 裝置,與 RSI 啟動器暫不容,可能導致安裝失敗", "doctor_info_result_incompatible_nvme_device": "新型 NVME 裝置,與 RSI 啟動器暫不容,可能導致安裝失敗",
"@doctor_info_result_incompatible_nvme_device": {}, "@doctor_info_result_incompatible_nvme_device": {},
"doctor_info_result_add_registry_value": "為註冊表項添加 ForcedPhysicalSectorSizeInBytes 值 模擬舊裝置。硬碟分區({v0})", "doctor_info_result_add_registry_value": "為登錄鍵值添加 ForcedPhysicalSectorSizeInBytes 值 模擬舊裝置。硬碟分區({v0})",
"@doctor_info_result_add_registry_value": {}, "@doctor_info_result_add_registry_value": {},
"doctor_info_result_missing_easyanticheat_files": "EasyAntiCheat 文件遺失", "doctor_info_result_missing_easyanticheat_files": "EasyAntiCheat 檔案遺失",
"@doctor_info_result_missing_easyanticheat_files": {}, "@doctor_info_result_missing_easyanticheat_files": {},
"doctor_info_result_verify_files_with_rsi_launcher": "未在 LIVE 文件夾找到 EasyAntiCheat 文件 或 文件不完整,請使用 RSI 啟動器校驗文件", "doctor_info_result_verify_files_with_rsi_launcher": "未在 LIVE 資料夾找到 EasyAntiCheat 文件 或 文件不完整,請使用 RSI 啟動器校驗文件",
"@doctor_info_result_verify_files_with_rsi_launcher": {}, "@doctor_info_result_verify_files_with_rsi_launcher": {},
"doctor_info_result_easyanticheat_not_installed": "EasyAntiCheat 未安裝 或 未正常退出", "doctor_info_result_easyanticheat_not_installed": "EasyAntiCheat 未安裝 或 未正常退出",
"@doctor_info_result_easyanticheat_not_installed": {}, "@doctor_info_result_easyanticheat_not_installed": {},
"doctor_info_result_install_easyanticheat": "EasyAntiCheat 未安裝,請點擊修復為您一鍵安裝。(在遊戲正常啟動並結束前,該問題會一直出現,若您因為其他原因遊戲閃退,可忽略此條目)", "doctor_info_result_install_easyanticheat": "EasyAntiCheat 未安裝,請點擊修復為您快速安裝。(在遊戲正常啟動並結束前,該問題會一直出現,若您因為其他原因遊戲閃退,可忽略此條目)",
"@doctor_info_result_install_easyanticheat": {}, "@doctor_info_result_install_easyanticheat": {},
"doctor_info_result_chinese_username": "中文用戶名", "doctor_info_result_chinese_username": "中文使用者名稱",
"@doctor_info_result_chinese_username": {}, "@doctor_info_result_chinese_username": {},
"doctor_info_result_chinese_username_error": "中文用戶名可能會導致遊戲啟動/安裝錯誤! 點擊修復按鈕查看修改教學!", "doctor_info_result_chinese_username_error": "中文使用者名稱可能會導致遊戲啟動/安裝錯誤! 點擊修復按鈕查看修改教學!",
"@doctor_info_result_chinese_username_error": {}, "@doctor_info_result_chinese_username_error": {},
"doctor_info_result_chinese_install_path": "中文安裝路徑!", "doctor_info_result_chinese_install_path": "中文安裝路徑!",
"@doctor_info_result_chinese_install_path": {}, "@doctor_info_result_chinese_install_path": {},
@ -188,11 +180,11 @@
"@doctor_info_result_chinese_install_path_error": {}, "@doctor_info_result_chinese_install_path_error": {},
"doctor_info_result_low_physical_memory": "物理記憶體過低", "doctor_info_result_low_physical_memory": "物理記憶體過低",
"@doctor_info_result_low_physical_memory": {}, "@doctor_info_result_low_physical_memory": {},
"doctor_info_result_memory_requirement": "您至少需要 16GB 的物理記憶體Memory才可運行此遊戲。(當前大小:{v0}", "doctor_info_result_memory_requirement": "您至少需要 16GB 的物理記憶體Memory才可執行此遊戲。(目前大小:{v0}",
"@doctor_info_result_memory_requirement": {}, "@doctor_info_result_memory_requirement": {},
"doctor_info_result_fix_suggestion": "修復建議: {v0}", "doctor_info_result_fix_suggestion": "修復建議: {v0}",
"@doctor_info_result_fix_suggestion": {}, "@doctor_info_result_fix_suggestion": {},
"doctor_info_result_no_solution": "暫無解決方法,請截圖饋", "doctor_info_result_no_solution": "暫無解決方法,請截圖饋",
"@doctor_info_result_no_solution": {}, "@doctor_info_result_no_solution": {},
"doctor_info_action_fix": "修復", "doctor_info_action_fix": "修復",
"@doctor_info_action_fix": {}, "@doctor_info_action_fix": {},
@ -200,19 +192,19 @@
"@doctor_action_view_solution": {}, "@doctor_action_view_solution": {},
"doctor_tip_title_select_game_directory": "請在首頁選擇遊戲安裝目錄。", "doctor_tip_title_select_game_directory": "請在首頁選擇遊戲安裝目錄。",
"@doctor_tip_title_select_game_directory": {}, "@doctor_tip_title_select_game_directory": {},
"doctor_action_result_try_latest_windows": "若您的硬體已經達標,請嘗試安裝最新的 Windows 系統。", "doctor_action_result_try_latest_windows": "若您的硬體達標,請嘗試安裝最新的 Windows 系統。",
"@doctor_action_result_try_latest_windows": {}, "@doctor_action_result_try_latest_windows": {},
"doctor_action_result_create_folder_success": "建立資料夾成功,請嘗試繼續下載遊戲!", "doctor_action_result_create_folder_success": "建立資料夾成功,請嘗試繼續下載遊戲!",
"@doctor_action_result_create_folder_success": {}, "@doctor_action_result_create_folder_success": {},
"doctor_action_result_create_folder_fail": "建立資料夾失敗,請嘗試手動建立。\n目錄{v0} \n錯誤{v1}", "doctor_action_result_create_folder_fail": "建立資料夾失敗,請嘗試手動建立。\n目錄{v0} \n錯誤{v1}",
"@doctor_action_result_create_folder_fail": {}, "@doctor_action_result_create_folder_fail": {},
"doctor_action_result_fix_success": "修復成功,請嘗試重啟後繼續安裝遊戲! 若註冊表修改操作導致其他軟體出現相容性問題,請使用 工具 中的 NVME 註冊表清理。", "doctor_action_result_fix_success": "修復成功,請嘗試重啟後繼續安裝遊戲! 若登錄檔修改操作導致其他軟體出現相容問題,請使用 工具 中的 NVME 登錄檔清理。",
"@doctor_action_result_fix_success": {}, "@doctor_action_result_fix_success": {},
"doctor_action_result_fix_fail": "修復失敗,{v0}", "doctor_action_result_fix_fail": "修復失敗,{v0}",
"@doctor_action_result_fix_fail": {}, "@doctor_action_result_fix_fail": {},
"doctor_action_result_game_start_success": "修復成功,請嘗試啟動遊戲。(若問題無法解決,請使用工具箱的 《重裝 EAC》", "doctor_action_result_game_start_success": "修復成功,請嘗試啟動遊戲。(若問題無法解決,請使用工具箱的 《重裝 EAC》",
"@doctor_action_result_game_start_success": {}, "@doctor_action_result_game_start_success": {},
"doctor_action_result_redirect_warning": "即將跳轉,教學來自網路,請謹慎操作...", "doctor_action_result_redirect_warning": "即將前往,教學來自網路,請謹慎操作...",
"@doctor_action_result_redirect_warning": {}, "@doctor_action_result_redirect_warning": {},
"doctor_action_result_issue_not_supported": "該問題暫不支援自動處理,請提供截圖尋求幫助", "doctor_action_result_issue_not_supported": "該問題暫不支援自動處理,請提供截圖尋求幫助",
"@doctor_action_result_issue_not_supported": {}, "@doctor_action_result_issue_not_supported": {},
@ -226,19 +218,19 @@
"@doctor_action_result_toast_scan_no_issue": {}, "@doctor_action_result_toast_scan_no_issue": {},
"doctor_action_tip_checking_game_log": "正在檢查Game.log", "doctor_action_tip_checking_game_log": "正在檢查Game.log",
"@doctor_action_tip_checking_game_log": {}, "@doctor_action_tip_checking_game_log": {},
"doctor_action_info_game_abnormal_exit": "遊戲異常退出:{v0}", "doctor_action_info_game_abnormal_exit": "遊戲錯誤退出:{v0}",
"@doctor_action_info_game_abnormal_exit": {}, "@doctor_action_info_game_abnormal_exit": {},
"doctor_action_info_game_abnormal_exit_unknown": "遊戲異常退出:未知異常", "doctor_action_info_game_abnormal_exit_unknown": "遊戲錯誤退出:未知錯誤",
"@doctor_action_info_game_abnormal_exit_unknown": {}, "@doctor_action_info_game_abnormal_exit_unknown": {},
"doctor_action_info_info_feedback": "info:{v0},請點擊右下角加入群組反饋。", "doctor_action_info_info_feedback": "info:{v0},請點擊右下角加群回饋。",
"@doctor_action_info_info_feedback": {}, "@doctor_action_info_info_feedback": {},
"doctor_action_info_checking_eac": "正在檢查EAC", "doctor_action_info_checking_eac": "正在檢查EAC",
"@doctor_action_info_checking_eac": {}, "@doctor_action_info_checking_eac": {},
"doctor_action_info_checking_runtime": "正在檢查:行環境", "doctor_action_info_checking_runtime": "正在檢查:行環境",
"@doctor_action_info_checking_runtime": {}, "@doctor_action_info_checking_runtime": {},
"doctor_action_result_info_unsupported_os": "不支援的作系統:{v0}", "doctor_action_result_info_unsupported_os": "不支援的作系統:{v0}",
"@doctor_action_result_info_unsupported_os": {}, "@doctor_action_result_info_unsupported_os": {},
"doctor_action_info_checking_install_info": "正在檢查:安裝信息", "doctor_action_info_checking_install_info": "正在檢查:安裝資訊",
"@doctor_action_info_checking_install_info": {}, "@doctor_action_info_checking_install_info": {},
"doctor_action_view_details": "查看詳情", "doctor_action_view_details": "查看詳情",
"@doctor_action_view_details": {}, "@doctor_action_view_details": {},
@ -246,37 +238,37 @@
"@home_install_location": {}, "@home_install_location": {},
"home_not_installed_or_failed": "未安裝 或 安裝失敗", "home_not_installed_or_failed": "未安裝 或 安裝失敗",
"@home_not_installed_or_failed": {}, "@home_not_installed_or_failed": {},
"home_action_star_citizen_website_localization": "星際公民官網 (中文)", "home_action_star_citizen_website_localization": "星際公民官網",
"@home_action_star_citizen_website_localization": {}, "@home_action_star_citizen_website_localization": {},
"home_action_info_roberts_space_industries_origin": "羅伯茨航天工業公司,萬物的起源", "home_action_info_roberts_space_industries_origin": "羅伯茨航天工業公司,萬物的起源",
"@home_action_info_roberts_space_industries_origin": {}, "@home_action_info_roberts_space_industries_origin": {},
"home_action_uex_localization": "UEX (中文)", "home_action_uex_localization": "UEX",
"@home_action_uex_localization": {}, "@home_action_uex_localization": {},
"home_action_info_mining_refining_trade_calculator": "採礦、精煉、貿易計算器、價格、載具資訊", "home_action_info_mining_refining_trade_calculator": "採礦、精煉、貿易計算器、價格、載具資訊",
"@home_action_info_mining_refining_trade_calculator": {}, "@home_action_info_mining_refining_trade_calculator": {},
"home_action_dps_calculator_localization": "DPS計算器 (中文)", "home_action_dps_calculator_localization": "DPS計算器",
"@home_action_dps_calculator_localization": {}, "@home_action_dps_calculator_localization": {},
"home_action_info_ship_upgrade_damage_value_query": "線上改裝,查詢傷害數值和配件購買地點", "home_action_info_ship_upgrade_damage_value_query": "在線上進行改裝、查詢傷害數值和配件購買地點",
"@home_action_info_ship_upgrade_damage_value_query": {}, "@home_action_info_ship_upgrade_damage_value_query": {},
"home_action_external_browser_extension": "瀏覽器擴充套件:", "home_action_external_browser_extension": "瀏覽器擴充套件:",
"@home_action_external_browser_extension": {}, "@home_action_external_browser_extension": {},
"home_action_one_click_diagnosis": "疑難排解", "home_action_one_click_diagnosis": "疑難排解",
"@home_action_one_click_diagnosis": {}, "@home_action_one_click_diagnosis": {},
"home_action_info_one_click_diagnosis_star_citizen": "快速診斷星際公民常見問題", "home_action_info_one_click_diagnosis_star_citizen": "快速解決星際公民的常見問題",
"@home_action_info_one_click_diagnosis_star_citizen": {}, "@home_action_info_one_click_diagnosis_star_citizen": {},
"home_action_localization_management": "翻譯管理", "home_action_localization_management": "翻譯管理",
"@home_action_localization_management": {}, "@home_action_localization_management": {},
"home_action_info_quick_install_localization_resources": "快速安裝翻譯資源", "home_action_info_quick_install_localization_resources": "快速安裝翻譯文件",
"@home_action_info_quick_install_localization_resources": {}, "@home_action_info_quick_install_localization_resources": {},
"home_action_performance_optimization": "性能調整", "home_action_performance_optimization": "畫面調整",
"@home_action_performance_optimization": {}, "@home_action_performance_optimization": {},
"home_action_info_engine_config_optimization": "調整引擎配置文件,改善遊戲性能", "home_action_info_engine_config_optimization": "調整引擎配置檔案,改善遊戲性能",
"@home_action_info_engine_config_optimization": {}, "@home_action_info_engine_config_optimization": {},
"home_action_rsi_status_platform": "平台", "home_action_rsi_status_platform": "平台",
"@home_action_rsi_status_platform": {}, "@home_action_rsi_status_platform": {},
"home_action_rsi_status_persistent_universe": "恆久宇宙", "home_action_rsi_status_persistent_universe": "恆久宇宙",
"@home_action_rsi_status_persistent_universe": {}, "@home_action_rsi_status_persistent_universe": {},
"home_action_rsi_status_electronic_access": "電子瀏覽", "home_action_rsi_status_electronic_access": "電子訪問",
"@home_action_rsi_status_electronic_access": {}, "@home_action_rsi_status_electronic_access": {},
"home_action_rsi_status_arena_commander": "競技場指揮官", "home_action_rsi_status_arena_commander": "競技場指揮官",
"@home_action_rsi_status_arena_commander": {}, "@home_action_rsi_status_arena_commander": {},
@ -286,7 +278,7 @@
"@home_action_rsi_status_status": {}, "@home_action_rsi_status_status": {},
"home_announcement_details": "公告詳情", "home_announcement_details": "公告詳情",
"@home_announcement_details": {}, "@home_announcement_details": {},
"home_action_info_valid_install_location_required": "該功能需要一個有效的安裝位置\n\n如果您的遊戲未下載完成請等待下載完畢後使用此功能。\n\n如果您的遊戲已下載完畢但未識別請啟動一次遊戲後重新打開盒子 或 在設置選項中手動設置安裝位置。", "home_action_info_valid_install_location_required": "該功能需要一個有效的安裝位置\n\n如果您的遊戲未下載完成請等待下載完畢後使用此功能。\n\n如果您的遊戲已下載完畢但未識別請啟動一次遊戲後重新打開工具箱 或 在設定選項中手動設定安裝位置。",
"@home_action_info_valid_install_location_required": {}, "@home_action_info_valid_install_location_required": {},
"home_action_info_scanning": "正在掃描 ...", "home_action_info_scanning": "正在掃描 ...",
"@home_action_info_scanning": {}, "@home_action_info_scanning": {},
@ -294,49 +286,49 @@
"@home_action_info_scan_complete_valid_directories_found": {}, "@home_action_info_scan_complete_valid_directories_found": {},
"home_action_info_log_file_parse_fail": "解析 log 文件失敗!", "home_action_info_log_file_parse_fail": "解析 log 文件失敗!",
"@home_action_info_log_file_parse_fail": {}, "@home_action_info_log_file_parse_fail": {},
"home_action_title_star_citizen_website_localization": "星際公民網站漢化", "home_action_title_star_citizen_website_localization": "星際公民網站翻譯",
"@home_action_title_star_citizen_website_localization": {}, "@home_action_title_star_citizen_website_localization": {},
"home_action_info_web_localization_plugin_disclaimer": "本插功能僅供大致瀏覽使用,不對任何有關本功能產生的問題負責!在涉及賬號操作前請注意確認網站的原本內容!\n\n\n使用此功能登錄賬號時請確保您的 SC漢化盒子 是從可信任的來源下載。", "home_action_info_web_localization_plugin_disclaimer": "本插功能僅供大致瀏覽使用,不對任何有關本功能產生的問題負責!在涉及帳號操作前請注意確認網站的原本內容!\n\n\n使用此功能登入帳號時請確保您的 SC工具箱 是從可信任的來源下載。",
"@home_action_info_web_localization_plugin_disclaimer": {}, "@home_action_info_web_localization_plugin_disclaimer": {},
"home_action_info_initializing_resources": "正在初始化翻譯資源...", "home_action_info_initializing_resources": "正在初始化翻譯文件...",
"@home_action_info_initializing_resources": {}, "@home_action_info_initializing_resources": {},
"home_action_info_initialization_failed": "初始化網頁翻譯資源失敗!{v0}", "home_action_info_initialization_failed": "初始化網頁翻譯文件失敗!{v0}",
"@home_action_info_initialization_failed": {}, "@home_action_info_initialization_failed": {},
"home_title_app_name": "SC漢化盒子", "home_title_app_name": "SC工具箱",
"@home_title_app_name": {}, "@home_title_app_name": {},
"home_localization_new_version_available": "翻譯有新版本", "home_localization_new_version_available": "社群翻譯有新版本",
"@home_localization_new_version_available": {}, "@home_localization_new_version_available": {},
"home_localization_new_version_installed": "您在 {v0} 安裝的翻譯有新版本啦!", "home_localization_new_version_installed": "您在 {v0} 安裝的社群翻譯有新版本",
"@home_localization_new_version_installed": {}, "@home_localization_new_version_installed": {},
"home_info_valid_installation_required": "該功能需要一個有效的安裝位置", "home_info_valid_installation_required": "該功能需要一個有效的安裝位置",
"@home_info_valid_installation_required": {}, "@home_info_valid_installation_required": {},
"home_info_one_click_launch_warning": "一鍵啟動功能提示", "home_info_one_click_launch_warning": "快速啟動功能提示",
"@home_info_one_click_launch_warning": {}, "@home_info_one_click_launch_warning": {},
"home_info_account_security_warning": "為確保帳戶安全,快速啟動功能已在開發版中禁用,我們將在 Microsoft Store 版本中提供此功能。\n\nMicrosoft Store 版由微軟提供可靠的分發下載與數字簽名,可有效防止軟件被惡意篡改。\n\n提示您無需使用盒子啟動遊戲也可使用翻譯。", "home_info_account_security_warning": "為確保帳戶安全,快速啟動功能已在Dev版本中禁用我們將在Microsoft Store版本中提供此功能。\n\nMicrosoft Store版由Microsoft提供可靠的分發下載與數位簽章可有效防止軟體被惡意篡改。\n\n提示您無需使用工具箱啟動遊戲也可使用社群翻譯。",
"@home_info_account_security_warning": {}, "@home_info_account_security_warning": {},
"home_action_install_microsoft_store_version": "安裝 Microsoft Store 版本", "home_action_install_microsoft_store_version": "安裝Microsoft Store版本",
"@home_action_install_microsoft_store_version": {}, "@home_action_install_microsoft_store_version": {},
"home_action_cancel": "取消", "home_action_cancel": "取消",
"@home_action_cancel": {}, "@home_action_cancel": {},
"home_action_info_abnormal_game_exit": "遊戲非正常退出\nexitCode={v0}\nstdout={v1}\nstderr={v2}\n\n診斷信息{v3} \n{v4}", "home_action_info_abnormal_game_exit": "遊戲非正常退出\nexitCode={v0}\nstdout={v1}\nstderr={v2}\n\n診斷資訊{v3} \n{v4}",
"@home_action_info_abnormal_game_exit": {}, "@home_action_info_abnormal_game_exit": {},
"home_action_info_unknown_error": "未知錯誤,請通過疑難排解加入群組反饋。", "home_action_info_unknown_error": "未知錯誤,請透過疑難排解加入群組反應。",
"@home_action_info_unknown_error": {}, "@home_action_info_unknown_error": {},
"home_action_info_check_web_link": "請查看彈出的網頁連結獲得詳細信息。", "home_action_info_check_web_link": "請查看彈出式網頁連結獲得詳細資訊。",
"@home_action_info_check_web_link": {}, "@home_action_info_check_web_link": {},
"home_action_info_game_built_in": "遊戲內建", "home_action_info_game_built_in": "內建翻譯文件",
"@home_action_info_game_built_in": {}, "@home_action_info_game_built_in": {},
"home_action_info_warning": "警告", "home_action_info_warning": "翻譯警告",
"@home_action_info_warning": {}, "@home_action_info_warning": {},
"localization_info_machine_translation_warning": "您正在使用遊戲內建文本官方文本目前為機器翻譯截至3.21.0),建議您在下方安裝社群翻譯。", "localization_info_machine_translation_warning": "您目前正在使用遊戲內建翻譯文件,官方內建文件截止至 3.21.0 都是機器翻譯,建議安裝下方提供的社群翻譯或是來自其他來源的社群翻譯文件。",
"@localization_info_machine_translation_warning": {}, "@localization_info_machine_translation_warning": {},
"localization_info_translation_status": "翻譯狀態", "localization_info_translation": "遊戲翻譯",
"@localization_info_translation_status": {}, "@localization_info_translation": {},
"localization_info_enabled": "啟用({v0}", "localization_info_enabled": "啟用({v0}",
"@localization_info_enabled": {}, "@localization_info_enabled": {},
"localization_info_installed_version": "已安裝版本{v0}", "localization_info_installed_version": "已安裝:{v0}",
"@localization_info_installed_version": {}, "@localization_info_installed_version": {},
"localization_action_translation_feedback": "翻譯反饋", "localization_action_translation_feedback": "意見反饋",
"@localization_action_translation_feedback": {}, "@localization_action_translation_feedback": {},
"localization_action_uninstall_translation": "解除安裝", "localization_action_uninstall_translation": "解除安裝",
"@localization_action_uninstall_translation": {}, "@localization_action_uninstall_translation": {},
@ -344,47 +336,37 @@
"@localization_info_note": {}, "@localization_info_note": {},
"localization_info_community_translation": "社群翻譯", "localization_info_community_translation": "社群翻譯",
"@localization_info_community_translation": {}, "@localization_info_community_translation": {},
"localization_info_no_translation_available": "該語言/版本 暫時沒有可用翻譯,敬請期待!", "localization_info_no_translation_available": "該語言/版本可能因為較新而暫時沒有可安裝的社群翻譯,可以使用進階功能安裝其他來源的社群翻譯",
"@localization_info_no_translation_available": {}, "@localization_info_no_translation_available": {},
"localization_action_advanced_features": "進階功能",
"@localization_action_advanced_features": {},
"localization_info_custom_text": "自訂翻譯文件",
"@localization_info_custom_text": {},
"localization_info_no_custom_text": "暫無自訂翻譯文件",
"@localization_info_no_custom_text": {},
"localization_action_install": "安裝", "localization_action_install": "安裝",
"@localization_action_install": {}, "@localization_action_install": {},
"localization_info_version_number": "版本{v0}", "localization_info_version_number": "版本:{v0}",
"@localization_info_version_number": {}, "@localization_info_version_number": {},
"localization_info_channel": "通道:{v0}", "localization_info_channel": "遊戲通道:{v0}",
"@localization_info_channel": {}, "@localization_info_channel": {},
"localization_info_update_time": "更新時間:{v0}", "localization_info_update_time": "更新時間:{v0}",
"@localization_info_update_time": {}, "@localization_info_update_time": {},
"localization_info_installed": "已安裝", "localization_info_installed": "已安裝",
"@localization_info_installed": {}, "@localization_info_installed": {},
"localization_info_unavailable": "不可用", "localization_info_unavailable": "無法使用",
"@localization_info_unavailable": {}, "@localization_info_unavailable": {},
"localization_info_language": "語言: ", "localization_info_language": "語言: ",
"@localization_info_language": {}, "@localization_info_language": {},
"localization_info_remove_incompatible_translation_params": "是否移除不相容的翻譯參數", "localization_info_remove_incompatible_translation_params": "是否移除不相容的翻譯參數",
"@localization_info_remove_incompatible_translation_params": {}, "@localization_info_remove_incompatible_translation_params": {},
"localization_info_incompatible_translation_params_warning": "USER.cfg 包含不相容的翻譯參數,這可能是以前的翻譯文件的殘留信息。\n\n這將可能導致翻譯無效或亂碼點擊確認為您一鍵刪除(不會影響其他配置)。", "localization_info_incompatible_translation_params_warning": "USER.cfg 包含不相容的翻譯參數,這可能是以前的翻譯文件的殘留信息。\n\n這將可能導致翻譯無效或亂碼點擊確認進行快速刪除(不會影響其他配置)。",
"@localization_info_incompatible_translation_params_warning": {}, "@localization_info_incompatible_translation_params_warning": {},
"localization_info_custom_file": "自訂_{v0}", "localization_info_corrupted_file": "文件已損毀,請重新下載",
"@localization_info_custom_file": {},
"localization_info_custom_file_instructions": "即將打開本地化資料夾,請將自訂的 任意名稱.ini 文件放入 Customize_ini 資料夾。\n\n新增新文件後未顯示請使用右上角刷新按鈕。\n\n安裝時請確保選擇了正確的語言。",
"@localization_info_custom_file_instructions": {},
"localization_info_corrupted_file": "文件受損,請重新下載",
"@localization_info_corrupted_file": {}, "@localization_info_corrupted_file": {},
"localization_info_installation_error": "安裝錯!\n\n {v0}", "localization_info_installation_error": "安裝錯誤!\n\n {v0}",
"@localization_info_installation_error": {}, "@localization_info_installation_error": {},
"localization_info_custom_files": "自訂文件", "localization_info_custom_files": "自訂文件",
"@localization_info_custom_files": {}, "@localization_info_custom_files": {},
"performance_info_graphic_optimization_hint": "畫面改善提示", "performance_info_graphic_optimization_hint": "畫面改善提示",
"@performance_info_graphic_optimization_hint": {}, "@performance_info_graphic_optimization_hint": {},
"performance_info_graphic_optimization_warning": "該功能對改善顯卡瓶頸有很大幫助,但對 CPU 瓶頸可能起反效果,如果您顯卡性能強勁,可以嘗試設定更高的畫質來獲得更高的顯卡使用率。", "performance_info_graphic_optimization_warning": "此功能對改善因 GPU 造成的瓶頸,但對於因 CPU 造成瓶頸的裝置可能引發負面效果,如果您 GPU 性能強勁,可以嘗試更改為更高的畫質來獲得更高的 GPU 使用率並改善畫面表現。",
"@performance_info_graphic_optimization_warning": {}, "@performance_info_graphic_optimization_warning": {},
"performance_info_current_status": "前狀態:{v0}", "performance_info_current_status": "前狀態:{v0}",
"@performance_info_current_status": {}, "@performance_info_current_status": {},
"performance_info_applied": "已套用", "performance_info_applied": "已套用",
"@performance_info_applied": {}, "@performance_info_applied": {},
@ -398,35 +380,35 @@
"@performance_action_medium": {}, "@performance_action_medium": {},
"performance_action_high": "高", "performance_action_high": "高",
"@performance_action_high": {}, "@performance_action_high": {},
"performance_action_super": "高", "performance_action_super": "高",
"@performance_action_super": {}, "@performance_action_super": {},
"performance_action_info_preset_only_changes_graphics": "(預設只修改圖形設", "performance_action_info_preset_only_changes_graphics": "(預設只修改圖形設",
"@performance_action_info_preset_only_changes_graphics": {}, "@performance_action_info_preset_only_changes_graphics": {},
"performance_action_reset_to_default": " 復預設 ", "performance_action_reset_to_default": " 復預設 ",
"@performance_action_reset_to_default": {}, "@performance_action_reset_to_default": {},
"performance_action_apply": "套用", "performance_action_apply": "套用設定",
"@performance_action_apply": {}, "@performance_action_apply": {},
"performance_action_apply_and_clear_shaders": "套用並清除著色器快取(推薦", "performance_action_apply_and_clear_shaders": "套用設定並清除著色器快取(建議",
"@performance_action_apply_and_clear_shaders": {}, "@performance_action_apply_and_clear_shaders": {},
"performance_title_performance_optimization": "性能調整 -> {v0}", "performance_title_performance_optimization": "畫面調整 -> {v0}",
"@performance_title_performance_optimization": {}, "@performance_title_performance_optimization": {},
"performance_action_custom_parameters_input": "您可以在這裡輸入未收錄進盒子的自訂參數。配置範例:\n\nr_displayinfo=0\nr_VSync=0", "performance_action_custom_parameters_input": "您可以在這裡輸入未收錄進工具箱的自訂參數。配置範例:\n\nr_displayinfo=0\nr_VSync=0",
"@performance_action_custom_parameters_input": {}, "@performance_action_custom_parameters_input": {},
"performance_info_min_max_values": "{v0} 最小值: {v1} / 最大值: {v2}", "performance_info_min_max_values": "{v0} 最小值: {v1} / 最大值: {v2}",
"@performance_info_min_max_values": {}, "@performance_info_min_max_values": {},
"performance_info_graphics": "圖形", "performance_info_graphics": "圖形",
"@performance_info_graphics": {}, "@performance_info_graphics": {},
"performance_info_delete_config_file": "刪除配置文件...", "performance_info_delete_config_file": "刪除配置檔案...",
"@performance_info_delete_config_file": {}, "@performance_info_delete_config_file": {},
"performance_action_clear_shaders": "清除著色器快取", "performance_action_clear_shaders": "清理著色器",
"@performance_action_clear_shaders": {}, "@performance_action_clear_shaders": {},
"performance_info_done": "完成...", "performance_info_done": "完成...",
"@performance_info_done": {}, "@performance_info_done": {},
"performance_info_shader_clearing_warning": "清除著色器快取後首次進入遊戲可能會出現卡頓,請耐心等待遊戲初始化完畢。", "performance_info_shader_clearing_warning": "清理著色器後首次進入遊戲可能會出現卡頓,請耐心等待著色器載入完畢。",
"@performance_info_shader_clearing_warning": {}, "@performance_info_shader_clearing_warning": {},
"performance_info_generate_config_file": "生成配置文件", "performance_info_generate_config_file": "生成配置檔案",
"@performance_info_generate_config_file": {}, "@performance_info_generate_config_file": {},
"performance_info_write_out_config_file": "寫出配置文件", "performance_info_write_out_config_file": "寫出配置檔案",
"@performance_info_write_out_config_file": {}, "@performance_info_write_out_config_file": {},
"app_index_menu_home": "首頁", "app_index_menu_home": "首頁",
"@app_index_menu_home": {}, "@app_index_menu_home": {},
@ -438,7 +420,7 @@
"@app_index_menu_settings": {}, "@app_index_menu_settings": {},
"app_index_menu_about": "關於", "app_index_menu_about": "關於",
"@app_index_menu_about": {}, "@app_index_menu_about": {},
"lobby_online_lobby_coming_soon": "聯機大廳,敬請期待 ", "lobby_online_lobby_coming_soon": "多人大廳,敬請期待 ",
"@lobby_online_lobby_coming_soon": {}, "@lobby_online_lobby_coming_soon": {},
"lobby_invitation_to_participate": "誠邀您參與 ", "lobby_invitation_to_participate": "誠邀您參與 ",
"@lobby_invitation_to_participate": {}, "@lobby_invitation_to_participate": {},
@ -446,79 +428,65 @@
"@lobby_survey": {}, "@lobby_survey": {},
"setting_action_create_settings_shortcut": "新增桌面捷徑", "setting_action_create_settings_shortcut": "新增桌面捷徑",
"@setting_action_create_settings_shortcut": {}, "@setting_action_create_settings_shortcut": {},
"setting_action_create_desktop_shortcut": "在桌面新增《SC漢化盒子》捷徑", "setting_action_create_desktop_shortcut": "在桌面新增《SC工具箱》捷徑",
"@setting_action_create_desktop_shortcut": {}, "@setting_action_create_desktop_shortcut": {},
"setting_action_reset_auto_password_fill": "重自動密碼輸入", "setting_action_reset_auto_password_fill": "重自動密碼輸入",
"@setting_action_reset_auto_password_fill": {}, "@setting_action_reset_auto_password_fill": {},
"setting_action_info_device_support_info": "啟用:{v0} 設備支援:{v1} 郵箱:{v2} 密碼:{v3}", "setting_action_ignore_efficiency_cores_on_launch": "啟動遊戲時忽略 E-Core (適用於Intel 12代以上的處理器)",
"@setting_action_info_device_support_info": {},
"setting_action_info_enabled": "已啟用",
"@setting_action_info_enabled": {},
"setting_action_info_disabled": "已停用",
"@setting_action_info_disabled": {},
"setting_action_info_support": "支援",
"@setting_action_info_support": {},
"setting_action_info_not_support": "不支援",
"@setting_action_info_not_support": {},
"setting_action_info_encrypted_saved": "已加密保存",
"@setting_action_info_encrypted_saved": {},
"setting_action_info_not_saved": "未保存",
"@setting_action_info_not_saved": {},
"setting_action_ignore_efficiency_cores_on_launch": "啟動遊戲時忽略 E-Core (適用於Intel 12th+ 處理器)",
"@setting_action_ignore_efficiency_cores_on_launch": {}, "@setting_action_ignore_efficiency_cores_on_launch": {},
"setting_action_set_core_count": "已設置的核心數量:{v0} (此功能適用於首頁的盒子快速啟動 或 工具中的RSI啟動器管理員模式當為 0 時不啟用此功能 ", "setting_action_set_core_count": "已設定的核心數量:{v0} (此功能適用於首頁的工具箱快速啟動 或 工具中的RSI啟動器管理員模式當為 0 時不啟用此功能 ",
"@setting_action_set_core_count": {}, "@setting_action_set_core_count": {},
"setting_action_set_launcher_file": "更啟動器文件RSI Launcher.exe", "setting_action_set_launcher_file": "變更啟動器文件RSI Launcher.exe",
"@setting_action_set_launcher_file": {}, "@setting_action_set_launcher_file": {},
"setting_action_info_manual_launcher_location_setting": "手動選擇啟動器位置,建議在無法自動掃描安裝位置時使用", "setting_action_info_manual_launcher_location_setting": "手動選擇啟動器位置,建議僅在無法自動掃描安裝位置時使用",
"@setting_action_info_manual_launcher_location_setting": {}, "@setting_action_info_manual_launcher_location_setting": {},
"setting_action_set_game_file": "更遊戲文件 StarCitizen.exe", "setting_action_set_game_file": "變更遊戲文件 StarCitizen.exe",
"@setting_action_set_game_file": {}, "@setting_action_set_game_file": {},
"setting_action_info_manual_game_location_setting": "手動選擇遊戲安裝位置,建議在無法自動掃描安裝位置時使用", "setting_action_info_manual_game_location_setting": "手動選擇遊戲安裝位置,建議僅在無法自動掃描安裝位置時使用",
"@setting_action_info_manual_game_location_setting": {}, "@setting_action_info_manual_game_location_setting": {},
"setting_action_clear_translation_file_cache": "清文件快取", "setting_action_clear_translation_file_cache": "清理翻譯文件快取",
"@setting_action_clear_translation_file_cache": {}, "@setting_action_clear_translation_file_cache": {},
"setting_action_info_cache_clearing_info": "快取大小 {v0}MB除盒子下載的翻譯文件快取,不會影響已安裝的翻譯", "setting_action_info_cache_clearing_info": "快取大小 {v0}MB清理工具箱下載的翻譯文件快取不會影響已安裝的社群翻譯",
"@setting_action_info_cache_clearing_info": {}, "@setting_action_info_cache_clearing_info": {},
"setting_action_tool_site_access_acceleration": "網站加速", "setting_action_tool_site_access_acceleration": "網站加速",
"@setting_action_tool_site_access_acceleration": {}, "@setting_action_tool_site_access_acceleration": {},
"setting_action_info_mirror_server_info": "使用鏡像伺服器加速瀏覽 DPS、UEX 等工具網站,若出現異常請關閉此功能。(RSI 官方網站除外)", "setting_action_info_mirror_server_info": "使用鏡像伺服器加速訪問 DPS、UEX 等工具網站,若出現錯誤請關閉此功能。 (RSI 官方網站除外)",
"@setting_action_info_mirror_server_info": {}, "@setting_action_info_mirror_server_info": {},
"setting_action_view_log": "查看log", "setting_action_view_log": "查看log",
"@setting_action_view_log": {}, "@setting_action_view_log": {},
"setting_action_info_view_log_file": "查看漢化盒子的 log 文件,用於定位盒子的 Bug", "setting_action_info_view_log_file": "查看工具箱的 log 文件,用於定位工具箱的 bug",
"@setting_action_info_view_log_file": {}, "@setting_action_info_view_log_file": {},
"setting_action_info_confirm_reset_autofill": "確認重自動輸入?", "setting_action_info_confirm_reset_autofill": "確認重自動輸入?",
"@setting_action_info_confirm_reset_autofill": {}, "@setting_action_info_confirm_reset_autofill": {},
"setting_action_info_delete_local_account_warning": "這將會刪除本地的帳號記錄,或在下次啟動遊戲時將自動輸入選擇 ‘否’ 以停用自動輸入。", "setting_action_info_delete_local_account_warning": "這將會刪除本機的帳號記錄,或在下次啟動遊戲時將自動輸入選擇 ‘否’ 以禁用自動輸入。",
"@setting_action_info_delete_local_account_warning": {}, "@setting_action_info_delete_local_account_warning": {},
"setting_action_info_autofill_data_cleared": "已清除自動輸入紀錄", "setting_action_info_autofill_data_cleared": "已清理自動輸入資料",
"@setting_action_info_autofill_data_cleared": {}, "@setting_action_info_autofill_data_cleared": {},
"setting_action_info_enter_cpu_core_to_ignore": "請輸入要忽略的 CPU 核心數", "setting_action_info_enter_cpu_core_to_ignore": "請輸入要忽略的 CPU 核心數",
"@setting_action_info_enter_cpu_core_to_ignore": {}, "@setting_action_info_enter_cpu_core_to_ignore": {},
"setting_action_info_cpu_core_tip": "Tip您的處理器擁有幾個 E-Core 就輸入多少,非大小核處理器請保持 0\n\n此功能適用於首頁的盒子快速啟動 或 工具中的 RSI啟動器管理員模式當為 0 時不啟用此功能。", "setting_action_info_cpu_core_tip": "Tip您的裝置擁有幾個 E-Core 就輸入幾個,非大小核裝置請保持 0\n\n此功能適用於首頁的工具箱快速啟動 或 工具中的 RSI啟動器管理員模式當為 0 時不啟用此功能。",
"@setting_action_info_cpu_core_tip": {}, "@setting_action_info_cpu_core_tip": {},
"setting_action_info_select_rsi_launcher_location": "請選擇RSI啟動器位置RSI Launcher.exe", "setting_action_info_select_rsi_launcher_location": "請選擇RSI啟動器位置RSI Launcher.exe",
"@setting_action_info_select_rsi_launcher_location": {}, "@setting_action_info_select_rsi_launcher_location": {},
"setting_action_info_setting_success": "設成功,在對應頁面點擊重新整理即可掃描出新路徑", "setting_action_info_setting_success": "設成功,在對應頁面點擊重新整理即可掃描出新路徑",
"@setting_action_info_setting_success": {}, "@setting_action_info_setting_success": {},
"setting_action_info_file_error": "文件錯誤!", "setting_action_info_file_error": "文件錯誤!",
"@setting_action_info_file_error": {}, "@setting_action_info_file_error": {},
"setting_action_info_select_game_install_location": "請選擇遊戲安裝位置StarCitizen.exe", "setting_action_info_select_game_install_location": "請選擇遊戲安裝位置StarCitizen.exe",
"@setting_action_info_select_game_install_location": {}, "@setting_action_info_select_game_install_location": {},
"setting_action_info_confirm_clear_cache": "確認清翻譯快取?", "setting_action_info_confirm_clear_cache": "確認清翻譯快取?",
"@setting_action_info_confirm_clear_cache": {}, "@setting_action_info_confirm_clear_cache": {},
"setting_action_info_clear_cache_warning": "這不會影響已安裝的翻譯。", "setting_action_info_clear_cache_warning": "這不會影響已安裝的社群翻譯。",
"@setting_action_info_clear_cache_warning": {}, "@setting_action_info_clear_cache_warning": {},
"setting_action_info_microsoft_version_limitation": "因微軟版功能限制,請在接下來打開的視窗中 手動將《SC漢化盒子》拖動到桌面即可新增桌面捷徑。", "setting_action_info_microsoft_version_limitation": "因Microsoft Store版本功能限制請在接下來打開的視窗中 手動將《SC工具箱》拖動到桌面即可建立捷徑。",
"@setting_action_info_microsoft_version_limitation": {}, "@setting_action_info_microsoft_version_limitation": {},
"setting_action_info_shortcut_created": "新增完畢,請返回桌面查看", "setting_action_info_shortcut_created": "建立完畢,請返回桌面查看",
"@setting_action_info_shortcut_created": {}, "@setting_action_info_shortcut_created": {},
"app_upgrade_title_new_version_found": "發現新版本 -> {v0}", "app_upgrade_title_new_version_found": "發現新版本 -> {v0}",
"@app_upgrade_title_new_version_found": {}, "@app_upgrade_title_new_version_found": {},
"app_upgrade_info_getting_new_version_details": "正在取得新版本詳情...", "app_upgrade_info_getting_new_version_details": "正在取得新版本詳情...",
"@app_upgrade_info_getting_new_version_details": {}, "@app_upgrade_info_getting_new_version_details": {},
"app_upgrade_info_update_server_tip": "提示:前正在使用分流伺服器進行更新,可能會出現下載速度下降,但有助於我們進行成本控制,若下載異常請點擊這裡跳轉手動安裝。", "app_upgrade_info_update_server_tip": "提示:前正在使用分流伺服器進行更新,可能會出現下載速度下降,但有助於我們進行成本控制,若下載錯誤請點擊這裡前往手動安裝。",
"@app_upgrade_info_update_server_tip": {}, "@app_upgrade_info_update_server_tip": {},
"app_upgrade_info_installing": "正在安裝: ", "app_upgrade_info_installing": "正在安裝: ",
"@app_upgrade_info_installing": {}, "@app_upgrade_info_installing": {},
@ -526,25 +494,23 @@
"@app_upgrade_info_downloading": {}, "@app_upgrade_info_downloading": {},
"app_upgrade_action_update_now": "立即更新", "app_upgrade_action_update_now": "立即更新",
"@app_upgrade_action_update_now": {}, "@app_upgrade_action_update_now": {},
"app_upgrade_action_next_time": "下次吧", "app_upgrade_action_next_time": "稍後提醒",
"@app_upgrade_action_next_time": {}, "@app_upgrade_action_next_time": {},
"app_upgrade_info_download_failed": "下載失敗,請嘗試手動安裝!", "app_upgrade_info_download_failed": "下載失敗,請嘗試手動安裝!",
"@app_upgrade_info_download_failed": {}, "@app_upgrade_info_download_failed": {},
"app_upgrade_info_run_failed": "執行失敗,請嘗試手動安裝!", "app_upgrade_info_run_failed": "執行失敗,請嘗試手動安裝!",
"@app_upgrade_info_run_failed": {}, "@app_upgrade_info_run_failed": {},
"app_splash_checking_availability": "正在檢可用性,這可能需要一點時間...", "app_splash_checking_availability": "正在檢可用性,這可能需要一點時間...",
"@app_splash_checking_availability": {}, "@app_splash_checking_availability": {},
"app_splash_checking_for_updates": "正在檢查更新...", "app_splash_checking_for_updates": "正在檢查更新...",
"@app_splash_checking_for_updates": {}, "@app_splash_checking_for_updates": {},
"app_splash_almost_done": "即將完成…", "app_splash_almost_done": "即將完成…",
"@app_splash_almost_done": {}, "@app_splash_almost_done": {},
"tools_hosts_info_rsi_official_website": "RSI 官網", "tools_hosts_info_rsi_official_website": "RSI 官",
"@tools_hosts_info_rsi_official_website": {}, "@tools_hosts_info_rsi_official_website": {},
"tools_hosts_info_rsi_zendesk": "RSI Zendesk 客服站",
"@tools_hosts_info_rsi_zendesk": {},
"tools_hosts_info_rsi_customer_service": "RSI 客服站", "tools_hosts_info_rsi_customer_service": "RSI 客服站",
"@tools_hosts_info_rsi_customer_service": {}, "@tools_hosts_info_rsi_customer_service": {},
"tools_hosts_info_dns_query_and_test": "正在查詢 DNS 並測試可訪問性 請耐心等待...", "tools_hosts_info_dns_query_and_test": "正在查詢 DNS 並測試可瀏覽性 請耐心等待...",
"@tools_hosts_info_dns_query_and_test": {}, "@tools_hosts_info_dns_query_and_test": {},
"tools_hosts_info_writing_hosts": "正在寫入 Hosts ...", "tools_hosts_info_writing_hosts": "正在寫入 Hosts ...",
"@tools_hosts_info_writing_hosts": {}, "@tools_hosts_info_writing_hosts": {},
@ -560,7 +526,7 @@
"@tools_hosts_info_site": {}, "@tools_hosts_info_site": {},
"tools_hosts_info_enable": "是否啟用", "tools_hosts_info_enable": "是否啟用",
"@tools_hosts_info_enable": {}, "@tools_hosts_info_enable": {},
"tools_hosts_action_one_click_acceleration": "一鍵加速", "tools_hosts_action_one_click_acceleration": "快速加速",
"@tools_hosts_action_one_click_acceleration": {}, "@tools_hosts_action_one_click_acceleration": {},
"tools_info_scanning": "正在掃描...", "tools_info_scanning": "正在掃描...",
"@tools_info_scanning": {}, "@tools_info_scanning": {},
@ -570,63 +536,63 @@
"@tools_info_game_install_location": {}, "@tools_info_game_install_location": {},
"tools_info_rsi_launcher_location": "RSI啟動器位置", "tools_info_rsi_launcher_location": "RSI啟動器位置",
"@tools_info_rsi_launcher_location": {}, "@tools_info_rsi_launcher_location": {},
"tools_action_view_system_info": "查看系統信息", "tools_action_view_system_info": "系統資訊",
"@tools_action_view_system_info": {}, "@tools_action_view_system_info": {},
"tools_action_info_view_critical_system_info": "查看系統關鍵資訊,用於快速診斷 \n\n耗時操作,請耐心等待。", "tools_action_info_view_critical_system_info": "查看系統關鍵資訊,用於快速診斷 \n\n此功能較為耗時,請耐心等待。",
"@tools_action_info_view_critical_system_info": {}, "@tools_action_info_view_critical_system_info": {},
"tools_action_p4k_download_repair": "P4K 分流下載 / 修復", "tools_action_p4k_download_repair": "P4K 分流下載 / 修復",
"@tools_action_p4k_download_repair": {}, "@tools_action_p4k_download_repair": {},
"tools_action_info_p4k_download_repair_tip": "使用星際公民中文百科提供的分流下載服務,可用於下載或修復 p4k。 \n資源有限請勿濫用。", "tools_action_info_p4k_download_repair_tip": "使用星際公民中文百科提供的分流下載服務,可用於下載或修復 p4k。 \n資源有限請勿濫用。",
"@tools_action_info_p4k_download_repair_tip": {}, "@tools_action_info_p4k_download_repair_tip": {},
"tools_action_hosts_acceleration_experimental": "Hosts 加速(實驗性", "tools_action_hosts_acceleration_experimental": "Hosts 加速(Beta",
"@tools_action_hosts_acceleration_experimental": {}, "@tools_action_hosts_acceleration_experimental": {},
"tools_action_info_hosts_acceleration_experimental_tip": "將 IP 信息寫入 Hosts 文件,解決部分地區的 DNS 汙染導致無法登錄官網等問題。\n該功能正在進行第一階段測試遇到問題請及時反饋。", "tools_action_info_hosts_acceleration_experimental_tip": "將 IP 資訊寫入 Hosts 文件,解決部分地區的 DNS 汙染導致無法登入官網等問題。\n該功能正在進行第一階段測試遇到問題請及時回饋。",
"@tools_action_info_hosts_acceleration_experimental_tip": {}, "@tools_action_info_hosts_acceleration_experimental_tip": {},
"tools_action_reinstall_easyanticheat": "重新安裝 EasyAntiCheat 反作弊", "tools_action_reinstall_easyanticheat": "重新安裝 EAC",
"@tools_action_reinstall_easyanticheat": {}, "@tools_action_reinstall_easyanticheat": {},
"tools_action_info_reinstall_eac": "若您遇到 EAC 錯誤,且自動修復無效,請嘗試使用此功能重新安裝 EAC。", "tools_action_info_reinstall_eac": "若您遇到 EAC 錯誤,且自動修復無效,請嘗試使用此功能重裝 EAC。",
"@tools_action_info_reinstall_eac": {}, "@tools_action_info_reinstall_eac": {},
"tools_action_rsi_launcher_admin_mode": "RSI Launcher 管理員模式", "tools_action_rsi_launcher_admin_mode": "管理員模式",
"@tools_action_rsi_launcher_admin_mode": {}, "@tools_action_rsi_launcher_admin_mode": {},
"tools_action_info_run_rsi_as_admin": "以管理員身份執行RSI啟動器可能會解決一些問題。\n\n若設置了能效核心忽略參數,也會在此套用。", "tools_action_info_run_rsi_as_admin": "以管理員身份執行RSI啟動器可能會解決一些問題。\n\n若設定了 E-Core 核心忽略參數,也會在此套用。",
"@tools_action_info_run_rsi_as_admin": {}, "@tools_action_info_run_rsi_as_admin": {},
"tools_action_info_init_failed": "初始化失敗,請截圖報給開發者。{v0}", "tools_action_info_init_failed": "初始化失敗,請截圖報給開發者。{v0}",
"@tools_action_info_init_failed": {}, "@tools_action_info_init_failed": {},
"tools_action_rsi_launcher_log_fix": "RSI Launcher Log 修復", "tools_action_rsi_launcher_log_fix": "啟動器日誌修復",
"@tools_action_rsi_launcher_log_fix": {}, "@tools_action_rsi_launcher_log_fix": {},
"tools_action_info_rsi_launcher_log_issue": "在某些情況下 RSI啟動器 的 log 文件會損壞,導致無法完成問題掃描,使用此工具清除損壞的 log 文件。\n\n當前日誌文件大小:{v0} MB", "tools_action_info_rsi_launcher_log_issue": "在某些情況下 RSI啟動器 的 log 文件會損壞,導致無法完成問題掃描,使用此工具清理損壞的 log 文件。\n\n目前日誌檔案大小:{v0} MB",
"@tools_action_info_rsi_launcher_log_issue": {}, "@tools_action_info_rsi_launcher_log_issue": {},
"tools_action_remove_nvme_registry_patch": "移除 nvme 註冊表補丁", "tools_action_remove_nvme_registry_patch": "移除 nvme 登錄檔補丁",
"@tools_action_remove_nvme_registry_patch": {}, "@tools_action_remove_nvme_registry_patch": {},
"tools_action_info_nvme_patch_issue": "若您使用 nvme 補丁出現問題,請執行此工具。(可能導致遊戲 安裝/更新 不可用。)\n\n當前補丁狀態:{v0}", "tools_action_info_nvme_patch_issue": "若您使用 nvme 補丁出現問題,請執行此工具。(可能導致遊戲 安裝/更新 無法使用。)\n\n目前補丁狀態:{v0}",
"@tools_action_info_nvme_patch_issue": {}, "@tools_action_info_nvme_patch_issue": {},
"tools_action_info_not_installed": "未安裝", "tools_action_info_not_installed": "未安裝",
"@tools_action_info_not_installed": {}, "@tools_action_info_not_installed": {},
"tools_action_info_removed_restart_effective": "已移除,重啟電腦生效", "tools_action_info_removed_restart_effective": "已移除登錄檔補丁,重動後電腦生效",
"@tools_action_info_removed_restart_effective": {}, "@tools_action_info_removed_restart_effective": {},
"tools_action_write_nvme_registry_patch": "寫入 nvme 註冊表補丁", "tools_action_write_nvme_registry_patch": "寫入 nvme 登錄檔補丁",
"@tools_action_write_nvme_registry_patch": {}, "@tools_action_write_nvme_registry_patch": {},
"tools_action_info_manual_nvme_patch": "手動寫入NVME補丁該功能僅在您知道自己在做什麼的情況下使用", "tools_action_info_manual_nvme_patch": "此功能將手動寫入NVME補丁該功能僅在您知道自己在做什麼的情況下使用",
"@tools_action_info_manual_nvme_patch": {}, "@tools_action_info_manual_nvme_patch": {},
"tools_action_info_fix_success_restart": "修復成功,請嘗試重啟電腦後繼續安裝遊戲! 若註冊表修改操作導致其他軟體出現相容問題,請使用 工具 中的 NVME 註冊表清理。", "tools_action_info_fix_success_restart": "修復成功,請嘗試重新啟動電腦後繼續安裝遊戲! 若登錄檔修改操作導致其他軟體出現相容問題,請使用 工具 中的 NVME 登錄檔清理。",
"@tools_action_info_fix_success_restart": {}, "@tools_action_info_fix_success_restart": {},
"tools_action_clear_shader_cache": "除著色器快取", "tools_action_clear_shader_cache": "除著色器快取",
"@tools_action_clear_shader_cache": {}, "@tools_action_clear_shader_cache": {},
"tools_action_info_shader_cache_issue": "若遊戲畫面出現異常或版本更新後可使用本工具清除過期的著色器快取當大於500M時建議清理 \n\n快取大小{v0} MB", "tools_action_info_shader_cache_issue": "若遊戲畫面出現異常或版本更新後可使用此工具清除著色器快取 \n\n建議清理快取大於 500 MB\n快取大小{v0} MB",
"@tools_action_info_shader_cache_issue": {}, "@tools_action_info_shader_cache_issue": {},
"tools_action_close_photography_mode": "關閉攝影模式", "tools_action_close_photography_mode": "攝影模式",
"@tools_action_close_photography_mode": {}, "@tools_action_close_photography_mode": {},
"tools_action_open_photography_mode": "開啟攝影模式", "tools_action_open_photography_mode": "攝影模式",
"@tools_action_open_photography_mode": {}, "@tools_action_open_photography_mode": {},
"tools_action_info_restore_lens_shake": "還原鏡頭搖晃效果。\n\n@拉邦那 Lapernum 提供參數信息。", "tools_action_info_restore_lens_shake": "已開啟攝影模式,再次點擊來關閉並還原鏡頭晃動效果。\n\n@拉邦那 Lapernum 提供參數資訊。",
"@tools_action_info_restore_lens_shake": {}, "@tools_action_info_restore_lens_shake": {},
"tools_action_info_one_key_close_lens_shake": "一鍵關閉遊戲內鏡頭晃動以便於攝影操作。\n\n @拉邦那 Lapernum 提供參數信息。", "tools_action_info_one_key_close_lens_shake": "關閉遊戲內鏡頭晃動效果以便進行攝影。\n\n @拉邦那 Lapernum 提供參數資訊。",
"@tools_action_info_one_key_close_lens_shake": {}, "@tools_action_info_one_key_close_lens_shake": {},
"tools_action_info_log_file_parse_failed": "解析 log 文件失敗!\n請嘗試使用 RSI Launcher log 修復 工具!", "tools_action_info_log_file_parse_failed": "解析 log 文件失敗!\n請嘗試使用 啟動器日誌修復 工具!",
"@tools_action_info_log_file_parse_failed": {}, "@tools_action_info_log_file_parse_failed": {},
"tools_action_info_rsi_launcher_not_found": "未找到 RSI 啟動器,請嘗試重新安裝,或在設置中手動添加。", "tools_action_info_rsi_launcher_not_found": "未找到 RSI 啟動器,請嘗試重新安裝,或在設定中手動新增。",
"@tools_action_info_rsi_launcher_not_found": {}, "@tools_action_info_rsi_launcher_not_found": {},
"tools_action_info_star_citizen_not_found": "未找到星際公民遊戲安裝位置,請至少完成一次遊戲啟動操作 或在設中手動新增。", "tools_action_info_star_citizen_not_found": "未找到星際公民遊戲安裝位置,請至少完成一次遊戲啟動操作 或在設中手動新增。",
"@tools_action_info_star_citizen_not_found": {}, "@tools_action_info_star_citizen_not_found": {},
"tools_action_info_valid_game_directory_needed": "該功能需要一個有效的遊戲安裝目錄", "tools_action_info_valid_game_directory_needed": "該功能需要一個有效的遊戲安裝目錄",
"@tools_action_info_valid_game_directory_needed": {}, "@tools_action_info_valid_game_directory_needed": {},
@ -634,27 +600,27 @@
"@tools_action_info_eac_file_removed": {}, "@tools_action_info_eac_file_removed": {},
"tools_action_info_error_occurred": "出現錯誤:{v0}", "tools_action_info_error_occurred": "出現錯誤:{v0}",
"@tools_action_info_error_occurred": {}, "@tools_action_info_error_occurred": {},
"tools_action_info_system_info_content": "系統:{v0}\n\n處理器{v1}\n\n記憶體大小{v2}GB\n\n顯示卡資訊\n{v3}\n\n硬碟資訊\n{v4}\n\n", "tools_action_info_system_info_content": "系統:{v0}\n\n處理器{v1}\n\n記憶體{v2}GB\n\n顯示卡\n{v3}\n\n硬碟\n{v4}\n\n",
"@tools_action_info_system_info_content": {}, "@tools_action_info_system_info_content": {},
"tools_action_info_rsi_launcher_directory_not_found": "未找到 RSI 啟動器目錄,請您嘗試手動操作。", "tools_action_info_rsi_launcher_directory_not_found": "未找到 RSI 啟動器目錄,請您嘗試手動操作。",
"@tools_action_info_rsi_launcher_directory_not_found": {}, "@tools_action_info_rsi_launcher_directory_not_found": {},
"tools_action_info_log_file_not_exist": "日誌文件不存在,請嘗試進行一次遊戲啟動或遊戲安裝,並退出啟動器,若無法解決問題,請嘗試將啟動器更新至最新版本!", "tools_action_info_log_file_not_exist": "日誌檔案不存在,請嘗試進行一次遊戲啟動或遊戲安裝,並退出啟動器,若無法解決問題,請嘗試將啟動器更新至最新版本!",
"@tools_action_info_log_file_not_exist": {}, "@tools_action_info_log_file_not_exist": {},
"tools_action_info_cleanup_complete": "清理完畢,請完成一次安裝 / 遊戲啟動 操作。", "tools_action_info_cleanup_complete": "清理完畢,請完成一次安裝 / 遊戲啟動 操作。",
"@tools_action_info_cleanup_complete": {}, "@tools_action_info_cleanup_complete": {},
"tools_action_info_cleanup_failed": "清理失敗,請手動移除,文件位置:{v0}", "tools_action_info_cleanup_failed": "清理失敗,請手動移除,檔案位置:{v0}",
"@tools_action_info_cleanup_failed": {}, "@tools_action_info_cleanup_failed": {},
"tools_action_info_system_info_title": "系統資訊", "tools_action_info_system_info_title": "系統資訊",
"@tools_action_info_system_info_title": {}, "@tools_action_info_system_info_title": {},
"tools_action_info_rsi_launcher_running_warning": "RSI啟動器正在行!請先關閉啟動器再使用此功能!", "tools_action_info_rsi_launcher_running_warning": "RSI啟動器正在行!請先關閉啟動器再使用此功能!",
"@tools_action_info_rsi_launcher_running_warning": {}, "@tools_action_info_rsi_launcher_running_warning": {},
"tools_action_info_p4k_file_description": "P4k 是星際公民的核心遊戲文件,高達 100GB+盒子提供的離線下載是為了幫助一些p4k文件下載超慢的用戶 或用於修復官方啟動器無法修復的 p4k 文件。\n\n接下來會彈窗詢問您保存位置可以選擇星際公民文件夾也可以選擇別處下載完成後請確保 P4K 文件夾位於 LIVE 文件夾內,之後使用星際公民啟動器校驗更新即可。", "tools_action_info_p4k_file_description": "P4k 是星際公民的核心遊戲文件,高達 100GB+工具箱提供的離線下載是為了幫助一些p4k文件下載慢到不行的使用者 或用於修復官方啟動器無法修復的 p4k 文件。\n\n接下來會跳出視窗詢問您儲存位置可以選擇星際公民資料夾也可以選擇別處下載完成後請確保 P4K 資料夾位於 LIVE 資料夾內,之後使用星際公民啟動器校驗更新即可。",
"@tools_action_info_p4k_file_description": {}, "@tools_action_info_p4k_file_description": {},
"tools_action_info_p4k_download_in_progress": "已經有一個p4k下載任務正在進行中請前往下載管理器查看", "tools_action_info_p4k_download_in_progress": "已經有一個p4k下載任務正在進行中請前往下載管理器查看",
"@tools_action_info_p4k_download_in_progress": {}, "@tools_action_info_p4k_download_in_progress": {},
"tools_action_info_function_under_maintenance": "功能維護中,請稍後重試!", "tools_action_info_function_under_maintenance": "功能維護中,請稍後重試!",
"@tools_action_info_function_under_maintenance": {}, "@tools_action_info_function_under_maintenance": {},
"tools_action_info_config_file_not_exist": "配置文件不存在,請嘗試運行一次遊戲", "tools_action_info_config_file_not_exist": "配置檔案不存在,請嘗試執行一次遊戲",
"@tools_action_info_config_file_not_exist": {}, "@tools_action_info_config_file_not_exist": {},
"webview_localization_name_member": "名成員", "webview_localization_name_member": "名成員",
"@webview_localization_name_member": {}, "@webview_localization_name_member": {},
@ -666,66 +632,170 @@
"@webview_localization_finished_invitations": {}, "@webview_localization_finished_invitations": {},
"app_init_failed_with_reason": "初始化失敗:{v0}", "app_init_failed_with_reason": "初始化失敗:{v0}",
"@app_init_failed_with_reason": {}, "@app_init_failed_with_reason": {},
"webview_localization_enter_device_pin": "請輸入裝置PIN以自動登入RSI帳戶",
"@webview_localization_enter_device_pin": {},
"webview_localization_device_windows_hello_toast": "請完成 Windows Hello 驗證以輸入密碼",
"@webview_localization_device_windows_hello_toast": {},
"settings_app_language": "語言", "settings_app_language": "語言",
"@settings_app_language": {},
"settings_app_language_auto": "自動", "settings_app_language_auto": "自動",
"@settings_app_language_auto": {}, "app_common_network_error": "網路異常!\n這可能是您的網路環境存在DNS汙染請嘗試更換DNS。\n或伺服器正在維護或遭受攻擊稍後再試。 \n進入離線模式... \n\n請謹慎在離線模式中使用。 \n目前版本構建日期{v0}\n QQ群940696487 \n錯誤資訊{v1}",
"app_common_network_error": "網路錯誤!\n這可能是您的網路環境存在DNS汙染請嘗試更換DNS。\n或伺服器正在維護或遭受攻擊稍後再試。 \n進入離線模式... \n\n請謹慎在離線模式中使用。 \n當前版本構建日期{v0}\n QQ群940696487 \n錯誤資訊{v1}", "app_common_upgrade_info_error": "獲取更新資訊失敗,請稍後重試。",
"@app_common_network_error": {},
"app_common_upgrade_info_error": "取得更新資訊失敗,請稍後重試。",
"@app_common_upgrade_info_error": {},
"doctor_game_error_low_memory": "可用記憶體不足", "doctor_game_error_low_memory": "可用記憶體不足",
"@doctor_game_error_low_memory": {}, "doctor_game_error_low_memory_info": "請嘗試增加虛擬記憶體( 1080p 下, 物理可用+虛擬記憶體需 > 64G ",
"doctor_game_error_low_memory_info": "請嘗試增加虛擬記憶體 (1080p 下, 物理可用+虛擬記憶體需 > 64G)",
"@doctor_game_error_low_memory_info": {},
"doctor_game_error_generic_info": "遊戲觸發了最為廣泛的崩潰問題,請查看除錯指南", "doctor_game_error_generic_info": "遊戲觸發了最為廣泛的崩潰問題,請查看除錯指南",
"@doctor_game_error_generic_info": {}, "doctor_game_error_gpu_crash": "您的顯示卡已崩潰,請查看除錯指南",
"doctor_game_error_gpu_crash": "您的顯卡崩潰啦!請查看除錯指南",
"@doctor_game_error_gpu_crash": {},
"doctor_game_error_socket_error": "檢測到 socket 異常", "doctor_game_error_socket_error": "檢測到 socket 異常",
"@doctor_game_error_socket_error": {},
"doctor_game_error_socket_error_info": "如使用 X黑盒 加速器,請嘗試更換加速模式", "doctor_game_error_socket_error_info": "如使用 X黑盒 加速器,請嘗試更換加速模式",
"@doctor_game_error_socket_error_info": {},
"doctor_game_error_permissions_error": "權限不足", "doctor_game_error_permissions_error": "權限不足",
"@doctor_game_error_permissions_error": {}, "doctor_game_error_permissions_error_info": "請嘗試以管理員權限執行啟動器或使用工具箱Microsoft Store版啟動。",
"doctor_game_error_permissions_error_info": "請嘗試以管理員權限運行啟動器或使用盒子Microsoft Store 版)啟動。", "doctor_game_error_game_process_error": "遊戲行程被占用",
"@doctor_game_error_permissions_error_info": {},
"doctor_game_error_game_process_error": "遊戲進程被佔用",
"@doctor_game_error_game_process_error": {},
"doctor_game_error_game_process_error_info": "請嘗試重啟啟動器,或直接重啟電腦", "doctor_game_error_game_process_error_info": "請嘗試重啟啟動器,或直接重啟電腦",
"@doctor_game_error_game_process_error_info": {}, "doctor_game_error_game_damaged_file": "遊戲程式文件損壞",
"doctor_game_error_game_damaged_file": "遊戲程序文件損壞",
"@doctor_game_error_game_damaged_file": {},
"doctor_game_error_game_damaged_file_info": "請嘗試刪除 Bin64 資料夾 並在啟動器校驗。", "doctor_game_error_game_damaged_file_info": "請嘗試刪除 Bin64 資料夾 並在啟動器校驗。",
"@doctor_game_error_game_damaged_file_info": {},
"doctor_game_error_game_damaged_p4k_file": "P4K文件損壞", "doctor_game_error_game_damaged_p4k_file": "P4K文件損壞",
"@doctor_game_error_game_damaged_p4k_file": {}, "doctor_game_error_game_damaged_p4k_file_info": "請嘗試刪除 Data.p4k 文件 並在啟動器校驗 或 使用工具箱分流。",
"doctor_game_error_game_damaged_p4k_file_info": "請嘗試刪除 Data.p4k 文件 並在啟動器校驗 或 使用盒子分流。",
"@doctor_game_error_game_damaged_p4k_file_info": {},
"doctor_game_error_low_gpu_memory": "可用 VRAM 不足", "doctor_game_error_low_gpu_memory": "可用 VRAM 不足",
"@doctor_game_error_low_gpu_memory": {}, "doctor_game_error_low_gpu_memory_info": "請勿在背景執行其他高GPU占用的 遊戲/應用程式,或更換顯示卡。",
"doctor_game_error_low_gpu_memory_info": "請不要在背景執行其他高顯卡占用的 遊戲/應用程式,或更換顯示卡。",
"@doctor_game_error_low_gpu_memory_info": {},
"app_common_error_info": "出現錯誤: {v0}", "app_common_error_info": "出現錯誤: {v0}",
"@app_common_error_info": {},
"app_common_tip": "提示", "app_common_tip": "提示",
"@app_common_tip": {}, "app_common_tip_i_know": "了解",
"app_common_tip_i_know": "我知道了",
"@app_common_tip_i_know": {},
"app_common_tip_confirm": "確認", "app_common_tip_confirm": "確認",
"@app_common_tip_confirm": {},
"app_common_tip_cancel": "取消", "app_common_tip_cancel": "取消",
"@app_common_tip_cancel": {}, "settings_app_language_switch_info": "切換應用程式的顯示語言",
"settings_app_language_switch_info": "切換應用程式語言",
"@settings_app_language_switch_info": {},
"home_holiday_countdown_days": "{v0}天 ", "home_holiday_countdown_days": "{v0}天 ",
"@home_holiday_countdown_days": {},
"home_holiday_countdown_in_progress": "正在進行中", "home_holiday_countdown_in_progress": "正在進行中",
"@home_holiday_countdown_in_progress": {},
"app_common_loading_images": "載入圖片...", "app_common_loading_images": "載入圖片...",
"@app_common_loading_images": {} "app_splash_dialog_u_a_p_p": "使用者協議與隱私政策",
"app_splash_dialog_u_a_p_p_content": "感謝使用 SC工具箱 ,我們致力於為您提供 安全、便捷、可靠的使用體驗,在您開始使用此應用程式前,請先閱讀並同意以下內容:\n\n 1. 本應用程式 為 GNU 通用公共許可證 v3.0 協議下的開源軟體,您可以在遵守協議的前提下自由使用、修改、分發本軟體。我們的源代碼位於:[Github.com/StarCitizenToolBox/app](https://github.com/StarCitizenToolBox/app)。\n2. 本應用程式中的網路內容(包括但不限於 本地化文件、工具網站、新聞、影片 等)版權由其作者創作所有,不屬於 GPL 的一部分,請在遵守對應的授權協議下使用。\n3. 本應用程式的官方免費發布渠道為:[Microsoft Store](https://apps.microsoft.com/detail/9NF3SWFWNKL1) 與[星際公民翻譯組官方網站](https://www.starcitizenzw.com/ ) ,若您從其他第三方處獲得,請仔細甄別,以免遭受財產損失。\n4. 本應用程式在使用過程中會向我們的伺服器發送匿名的統計數據,用於改進軟體服務品質,我們不會收集您的任何個人隱私資訊。\n5. 本應用程式由社群提供支援,與 Cloud Imperium Games 或 其他第三方商業公司 無直接關聯。\n6. 我們提供有限的社群支援,如有需要,請前往關於頁面了解如何聯絡我們。",
"tools_unp4k_msg_init": "初始化中...",
"tools_unp4k_msg_reading": "正在讀取P4K 文件 ...",
"tools_unp4k_msg_reading2": "正在處理文件 ...",
"tools_unp4k_msg_reading3": "正在處理文件 ({v0}/{v1}) ...",
"tools_unp4k_msg_read_completed": "載入完畢:{v0} 個文件,用時:{v1} ms",
"tools_unp4k_msg_open_file": "打開文件:{v0}",
"tools_unp4k_msg_read_file": "讀取文件:{v0} ...",
"home_localization_advanced_title": "進階翻譯 -> {v0}",
"home_localization_advanced_msg_version": "已載入翻譯版本:{v0}",
"home_localization_advanced_title_msg": "翻譯文字行數:{v0} P4K文字行數{v1}",
"home_localization_advanced_action_install": "安裝翻譯",
"home_localization_advanced_action_mod_change": "正在重新生成文字...",
"home_localization_advanced_action_mode": "模式",
"home_localization_advanced_title_preview": "預覽:{v0}",
"home_localization_advanced_json_text_location_other": "地點-其他",
"home_localization_advanced_json_text_location_used": "地點-常用",
"home_localization_advanced_json_text_things_other": "物品-其他",
"home_localization_advanced_json_text_things_used": "物品-常用",
"home_localization_advanced_json_text_vehicle_other": "載具-其他",
"home_localization_advanced_json_text_vehicle_used": "載具-常用",
"home_localization_advanced_json_text_mission_or_logs": "任務/日誌",
"home_localization_advanced_json_text_subtitle": "字幕",
"home_localization_advanced_json_text_ui_or_hud_or_menu": "UI/HUD/選單",
"home_localization_advanced_json_text_un_localization": "未翻譯",
"home_localization_advanced_json_text_others": "其他",
"home_localization_advanced_action_mod_change_localization": "翻譯",
"home_localization_advanced_action_mod_change_un_localization": "英文原文",
"home_localization_advanced_action_mod_change_mixed": "雙語",
"home_localization_advanced_action_mod_change_mixed_newline": "雙語(換行)",
"home_localization_advanced_msg_classifying": "正在分類 ...",
"home_localization_advanced_msg_reading_p4k": "讀取 p4k 文件 ...",
"home_localization_advanced_msg_reading_server_localization_text": "獲取翻譯文字 ...",
"home_localization_advanced_msg_gen_localization_text": "生成翻譯文件...",
"home_localization_advanced_msg_gen_localization_install": "安裝翻譯文件...",
"home_localization_msg_version_advanced": " (進階翻譯)",
"home_localization_msg_no_note": "該版本沒有提供描述",
"home_localization_action_rsi_launcher_localization": "RSI 啟動器翻譯",
"home_localization_action_advanced": "進階翻譯",
"home_localization_action_install_customize": "安裝自訂文件",
"home_localization_title_localization_tools": "翻譯工具",
"performance_json_text_ssdo": "螢幕光線後處理",
"performance_json_text_ssdo_info": "調整光線後處理等級",
"performance_json_text_title_graphics": "圖形(修改後建議刪除著色器快取)",
"performance_json_text_antialiasing": "反鋸齒",
"performance_json_text_antialiasing_info": "0 關閉1 SMAA2 時間過濾+SMAA3 時間濾波和投影矩陣抖動的 SMAA",
"performance_json_text_game_effects": "特效等級",
"performance_json_text_game_effects_info": "遊戲特效等級",
"performance_json_text_texture": "紋理等級",
"performance_json_text_texture_info": "模型紋理細節",
"performance_json_text_volumetric_effects": "體積效果",
"performance_json_text_volumetric_effects_info": "體積雲、體積光照等",
"performance_json_text_water": "水體效果",
"performance_json_text_water_info": "各種水的等級",
"performance_json_text_object_detail": "物件細節",
"performance_json_text_object_detail_info": "模型物件細節影響LOD等..",
"performance_json_text_particles": "粒子細節",
"performance_json_text_physics": "物理細節",
"performance_json_text_physics_info": "物理效果範圍",
"performance_json_text_shading": "著色器細節",
"performance_json_text_shading_info": "著色器相關",
"performance_json_text_shadows": "陰影細節",
"performance_json_text_shadows_info": "陰影效果",
"performance_json_text_postprocessing": "後處理細節",
"performance_json_text_postprocessing_info": "後處理著色器,動態模糊效果 等",
"performance_json_text_renderer": "繪製器品質",
"performance_json_text_renderer_info": "cryengine 繪製器品質",
"performance_json_text_shader_decal": "貼花品質",
"performance_json_text_shader_decal_info": "LOGO、標誌等",
"performance_json_text_shader_post_process": "著色器品質",
"performance_json_text_shader_fx": "FX 品質",
"performance_json_text_shader_general": "一般品質",
"performance_json_text_shader_general_info": "整體模型品質",
"performance_json_text_shader_glass": "玻璃品質",
"performance_json_text_shader_glass_info": "窗、鏡子等",
"performance_json_text_shader_hdr": "HDR品質",
"performance_json_text_shader_hdr_info": "HDR色差亮度層級 處理 等",
"performance_json_text_shader_particle": "粒子品質",
"performance_json_text_shader_particle_info": "粒子效果品質",
"performance_json_text_shader_terrain": "地面品質",
"performance_json_text_shader_shadow": "陰影品質",
"performance_json_text_shader_sky": "天空品質",
"performance_json_text_particles_object_collisions": "粒子碰撞",
"performance_json_text_particles_object_collisions_info": "1 僅靜態粒子 2 包括動態粒子",
"performance_json_text_displayinfo": "螢幕資訊(顯示幀率)",
"performance_json_text_displayinfo_info": "在螢幕右上角展示幀率,伺服器資訊等",
"performance_json_text_max_fps": "最大幀率",
"performance_json_text_max_fps_info": "調整遊戲最高幀率0為不限制",
"performance_json_text_display_session": "顯示工作階段資訊",
"performance_json_text_display_session_info": "開啟後在螢幕上顯示一個二維碼,用於回饋時讓 CIG 快速定位相關資訊",
"performance_json_text_vsync": "垂直同步",
"performance_json_text_vsync_info": "開啟以防止撕裂,關閉以提高幀率",
"performance_json_text_motion_blur": "動態模糊",
"performance_json_text_motion_blur_info": "開啟以提高運動感,關閉提升觀感",
"performance_json_text_fov": "設定視角FOV",
"performance_json_text_ui_animation": "UI 淡入淡出動畫",
"performance_json_text_custom_parameters": "自訂參數",
"performance_json_text_title_custom": "自訂",
"tools_rsi_launcher_enhance_init_msg1": "讀取啟動器資訊...",
"tools_rsi_launcher_enhance_init_msg2": "正在從網路取得增強資料...",
"tools_rsi_launcher_enhance_working_msg1": "生成補丁 ...",
"tools_rsi_launcher_enhance_working_msg2": "安裝補丁,這需要一點時間,取決於您的電腦性能 ...",
"tools_rsi_launcher_enhance_title": "RSI 啟動器增強",
"tools_rsi_launcher_enhance_msg_version": "啟動器內部版本資訊:{v0}",
"tools_rsi_launcher_enhance_msg_patch_status": "補丁狀態:{v0}",
"tools_rsi_launcher_enhance_msg_error": "增強資料取得失敗,可能是網路問題或目前版本不支援",
"tools_rsi_launcher_enhance_title_localization": "RSI 啟動器本地化",
"tools_rsi_launcher_enhance_subtitle_localization": "為 RSI 啟動器增加多語言支援。",
"tools_rsi_launcher_enhance_title_download_booster": "RSI 啟動器下載增強",
"tools_rsi_launcher_enhance_subtitle_download_booster": "下載遊戲時可使用更多執行緒以提升下載速度,啟用後請在啟動器設定修改執行緒數。",
"tools_rsi_launcher_enhance_action_install": "安裝增強補丁",
"tools_rsi_launcher_enhance_msg_uninstall": "* 如需移除增強補丁,請覆蓋安裝 RSI 啟動器。",
"tools_rsi_launcher_enhance_msg_error_launcher_notfound": "未找到 RSI 啟動器",
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error": "讀取啟動器資訊失敗!",
"tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args": "讀取啟動器資訊失敗:{v0}",
"tools_action_rsi_launcher_enhance_info": "啟動器翻譯,下載執行緒增強",
"tools_rsi_launcher_enhance_note_title": "RSI 啟動器增強使用須知",
"tools_rsi_launcher_enhance_note_msg": "RSI 啟動器增強是一項社群功能,它會在您的電腦上解包 \"RSI Launcher\" 並加入額外的增強功能,具體使用哪些功能由您決定。\n\n目前官方CIG僅許可我們進行多語言操作啟動器下載增強是我們認為有用的額外功能違反cig使用者協議https://robertsspaceindustries.com/eula可能導致帳號被封禁等嚴重後果是否啟用由您自己決定我們不對可能產生的後果遊戲損壞帳號封禁等承擔任何責任。\n\n對於啟動器的修改內容我們開源於https://github.com/StarCitizenToolBox/RSILauncherEnhance如有需要您可自行查閱。\n\n如果您因為任何原因需要取消此增強補丁請直接覆蓋安裝官方啟動器。",
"tools_action_unp4k": "P4K 查看器",
"tools_action_unp4k_info": "解包星際公民 p4k 文件",
"tools_unp4k_title": "P4K 查看器 -> {v0}",
"tools_unp4k_view_file": "單擊文件以預覽",
"tools_unp4k_msg_unknown_file_type": "未知文件類型\n{v0}",
"home_localization_action_rsi_launcher_no_game_path_msg": "您當前未安裝遊戲本體或未選擇遊戲安裝目錄,只可使用啟動器翻譯功能。請確保遊戲安裝完畢或在工具箱設置中添加遊戲安裝目錄後重試。",
"home_localization_select_customize_file_ini": "請選擇 ini 文件",
"home_localization_select_customize_file": "請選擇自定義翻譯文件",
"home_localization_action_select_customize_file": "點擊選擇 ini 文件",
"home_localization_ptu_advanced_localization_tip_title": "推薦使用高級翻譯",
"home_localization_ptu_advanced_localization_tip_title_info": "在 PTU/EPTU 等測試頻道 ,當前翻譯文本可能與遊戲不同步,使用高級翻譯可以減少亂碼產生。",
"tools_rsi_launcher_enhance_action_fold": "收起額外功能",
"tools_rsi_launcher_enhance_action_expand": "展開額外功能",
"tools_unp4k_missing_runtime": "缺少運行庫",
"tools_unp4k_missing_runtime_info": "使用此功能需安裝 .NET8 運行庫,請點擊下方按鈕下載安裝,安裝成功後重新打開此頁面即可繼續使用。",
"tools_unp4k_missing_runtime_action_install": "安裝運行庫",
"doctor_game_error_gpu_vulkan_crash": "GPU Vulkan 崩潰",
"doctor_game_error_gpu_vulkan_crash_info": "Vulkan 崩潰!這可能是驅動版本或遊戲引擎問題,請嘗試更新 GPU 驅動 或 使用清理著色器功能為您回退到 DX11"
} }

View File

@ -1,3 +1,4 @@
import 'dart:io';
import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
@ -26,6 +27,8 @@ _initWindow() async {
TitleBarStyle.hidden, TitleBarStyle.hidden,
windowButtonVisibility: false, windowButtonVisibility: false,
); );
await windowManager.setSize(const Size(1280, 810));
await windowManager.setMinimumSize(const Size(1280, 810));
await windowManager.center(animate: true); await windowManager.center(animate: true);
} }
@ -65,7 +68,7 @@ class App extends HookConsumerWidget {
micaBackgroundColor: appState.themeConf.micaColor, micaBackgroundColor: appState.themeConf.micaColor,
buttonTheme: ButtonThemeData( buttonTheme: ButtonThemeData(
defaultButtonStyle: ButtonStyle( defaultButtonStyle: ButtonStyle(
shape: ButtonState.all(RoundedRectangleBorder( shape: WidgetStateProperty.all(RoundedRectangleBorder(
borderRadius: BorderRadius.circular(4), borderRadius: BorderRadius.circular(4),
side: BorderSide(color: Colors.white.withOpacity(.01)))), side: BorderSide(color: Colors.white.withOpacity(.01)))),
))), ))),
@ -86,6 +89,7 @@ Widget _defaultWebviewTitleBar(BuildContext context) {
child: Row( child: Row(
crossAxisAlignment: CrossAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
if (Platform.isMacOS) const SizedBox(width: 96),
IconButton( IconButton(
onPressed: !state.canGoBack ? null : controller.back, onPressed: !state.canGoBack ? null : controller.back,
icon: const Icon(FluentIcons.chevron_left), icon: const Icon(FluentIcons.chevron_left),

View File

@ -1,8 +1,6 @@
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/common/conf/binary_conf.dart'; import 'package:starcitizen_doctor/common/conf/binary_conf.dart';
import 'package:starcitizen_doctor/common/rust/api/process_api.dart'
as rs_process;
import 'dart:io'; import 'dart:io';
import 'dart:math'; import 'dart:math';
import 'package:aria2/aria2.dart'; import 'package:aria2/aria2.dart';
@ -10,6 +8,8 @@ import 'package:flutter/foundation.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:starcitizen_doctor/api/api.dart'; import 'package:starcitizen_doctor/api/api.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/rust/api/rs_process.dart'
as rs_process;
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart'; import 'package:starcitizen_doctor/common/utils/provider.dart';
@ -98,12 +98,12 @@ class Aria2cModel extends _$Aria2cModel {
dPrint("trackerList === $trackerList"); dPrint("trackerList === $trackerList");
dPrint("Aria2cManager .----- aria2c start $port------"); dPrint("Aria2cManager .----- aria2c start $port------");
final stream = rs_process.startProcess( final stream = rs_process.start(
executable: exePath, executable: exePath,
arguments: [ arguments: [
"-V", "-V",
"-c", "-c",
"-x 10", "-x 16",
"--dir=${state.aria2cDir}\\downloads", "--dir=${state.aria2cDir}\\downloads",
"--disable-ipv6", "--disable-ipv6",
"--enable-rpc", "--enable-rpc",
@ -122,16 +122,20 @@ class Aria2cModel extends _$Aria2cModel {
stream.listen((event) { stream.listen((event) {
dPrint("Aria2cManager.rs_process event === $event"); dPrint("Aria2cManager.rs_process event === $event");
if (event.startsWith("output:")) { switch (event.dataType) {
if (event.contains("IPv4 RPC: listening on TCP port")) { case rs_process.RsProcessStreamDataType.output:
_onLaunch(port, pwd, trackerList); if (event.data.contains("IPv4 RPC: listening on TCP port")) {
} _onLaunch(port, pwd, trackerList);
} else if (event.startsWith("error:")) { }
state = state.copyWith(aria2c: null); break;
launchError = event; case rs_process.RsProcessStreamDataType.error:
} else if (event.startsWith("exit:")) { launchError = event.data;
state = state.copyWith(aria2c: null); state = state.copyWith(aria2c: null);
launchError = event; break;
case rs_process.RsProcessStreamDataType.exit:
launchError = event.data;
state = state.copyWith(aria2c: null);
break;
} }
}); });

View File

@ -20,7 +20,9 @@ mixin _$Aria2cModelState {
Aria2c? get aria2c => throw _privateConstructorUsedError; Aria2c? get aria2c => throw _privateConstructorUsedError;
Aria2GlobalStat? get aria2globalStat => throw _privateConstructorUsedError; Aria2GlobalStat? get aria2globalStat => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of Aria2cModelState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$Aria2cModelStateCopyWith<Aria2cModelState> get copyWith => $Aria2cModelStateCopyWith<Aria2cModelState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -45,6 +47,8 @@ class _$Aria2cModelStateCopyWithImpl<$Res, $Val extends Aria2cModelState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of Aria2cModelState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -89,6 +93,8 @@ class __$$Aria2cModelStateImplCopyWithImpl<$Res>
$Res Function(_$Aria2cModelStateImpl) _then) $Res Function(_$Aria2cModelStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of Aria2cModelState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -151,15 +157,17 @@ class _$Aria2cModelStateImpl
(identical(other.aria2cDir, aria2cDir) || (identical(other.aria2cDir, aria2cDir) ||
other.aria2cDir == aria2cDir) && other.aria2cDir == aria2cDir) &&
(identical(other.aria2c, aria2c) || other.aria2c == aria2c) && (identical(other.aria2c, aria2c) || other.aria2c == aria2c) &&
const DeepCollectionEquality() (identical(other.aria2globalStat, aria2globalStat) ||
.equals(other.aria2globalStat, aria2globalStat)); other.aria2globalStat == aria2globalStat));
} }
@override @override
int get hashCode => Object.hash(runtimeType, aria2cDir, aria2c, int get hashCode =>
const DeepCollectionEquality().hash(aria2globalStat)); Object.hash(runtimeType, aria2cDir, aria2c, aria2globalStat);
@JsonKey(ignore: true) /// Create a copy of Aria2cModelState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$Aria2cModelStateImplCopyWith<_$Aria2cModelStateImpl> get copyWith => _$$Aria2cModelStateImplCopyWith<_$Aria2cModelStateImpl> get copyWith =>
@ -179,8 +187,11 @@ abstract class _Aria2cModelState implements Aria2cModelState {
Aria2c? get aria2c; Aria2c? get aria2c;
@override @override
Aria2GlobalStat? get aria2globalStat; Aria2GlobalStat? get aria2globalStat;
/// Create a copy of Aria2cModelState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$Aria2cModelStateImplCopyWith<_$Aria2cModelStateImpl> get copyWith => _$$Aria2cModelStateImplCopyWith<_$Aria2cModelStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -6,7 +6,7 @@ part of 'aria2c.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$aria2cModelHash() => r'6685f6a716016113487de190a61f71196094526e'; String _$aria2cModelHash() => r'55dea5bd2e1c81fec0ef8ef1a10f41179775d7ee';
/// See also [Aria2cModel]. /// See also [Aria2cModel].
@ProviderFor(Aria2cModel) @ProviderFor(Aria2cModel)

278
lib/provider/unp4kc.dart Normal file
View File

@ -0,0 +1,278 @@
import 'dart:convert';
import 'dart:io';
import 'package:file/memory.dart';
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:path_provider/path_provider.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/conf/binary_conf.dart';
import 'package:starcitizen_doctor/common/helper/log_helper.dart';
import 'package:starcitizen_doctor/common/rust/api/rs_process.dart';
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/data/app_unp4k_p4k_item_data.dart';
import 'package:starcitizen_doctor/ui/tools/tools_ui_model.dart';
import 'package:starcitizen_doctor/common/rust/api/rs_process.dart'
as rs_process;
part 'unp4kc.freezed.dart';
part 'unp4kc.g.dart';
@freezed
class Unp4kcState with _$Unp4kcState {
const factory Unp4kcState({
required bool startUp,
Map<String, AppUnp4kP4kItemData>? files,
MemoryFileSystem? fs,
required String curPath,
String? endMessage,
MapEntry<String, String>? tempOpenFile,
@Default("") String errorMessage,
}) = _Unp4kcState;
}
@riverpod
class Unp4kCModel extends _$Unp4kCModel {
int? _rsPid;
@override
Unp4kcState build() {
state = Unp4kcState(
startUp: false,
curPath: '\\',
endMessage: S.current.tools_unp4k_msg_init);
_init();
return state;
}
ToolsUIState get _toolsState => ref.read(toolsUIModelProvider);
String getGamePath() => _toolsState.scInstalledPath;
bool _hasUnp4kRunTimeError = false;
void _init() async {
final execDir = "${appGlobalState.applicationBinaryModuleDir}\\unp4kc";
await BinaryModuleConf.extractModule(
["unp4kc"], appGlobalState.applicationBinaryModuleDir!);
final exec = "$execDir\\unp4kc.exe";
final stream = rs_process.start(
executable: exec, arguments: [], workingDirectory: execDir);
stream.listen((event) async {
switch (event.dataType) {
case RsProcessStreamDataType.output:
_rsPid = event.rsPid;
try {
final eventJson = await compute(json.decode, event.data);
_handleMessage(eventJson, event.rsPid);
} catch (e) {
dPrint("[unp4kc] json error: $e");
}
break;
case RsProcessStreamDataType.error:
dPrint("[unp4kc] stderr: ${event.data}");
if (state.errorMessage.isEmpty) {
state = state.copyWith(errorMessage: event.data);
} else {
state = state.copyWith(
errorMessage: "${state.errorMessage}\n${event.data}");
}
if (!_hasUnp4kRunTimeError) {
if (checkRunTimeError(state.errorMessage)) {
_hasUnp4kRunTimeError = true;
AnalyticsApi.touch("unp4k_no_runtime");
}
}
break;
case RsProcessStreamDataType.exit:
dPrint("[unp4kc] exit: ${event.data}");
break;
}
});
ref.onDispose(() {
state = state.copyWith(fs: null);
if (_rsPid != null) {
Process.killPid(_rsPid!);
dPrint("[unp4kc] kill ...");
}
});
}
DateTime? _loadStartTime;
void _handleMessage(Map<String, dynamic> eventJson, int rsPid) async {
final action = eventJson["action"];
final data = eventJson["data"];
final gamePath = getGamePath();
final gameP4kPath = "$gamePath\\Data.p4k";
switch (action.toString().trim()) {
case "info: startup":
rs_process.write(rsPid: rsPid, data: "$gameP4kPath\n");
break;
case "info: Reading_p4k_file":
_loadStartTime = DateTime.now();
state = state.copyWith(endMessage: S.current.tools_unp4k_msg_reading);
break;
case "info: All Ready":
state = state.copyWith(endMessage: S.current.tools_unp4k_msg_reading2);
break;
case "data: P4K_Files":
final p4kFiles = (data as List<dynamic>);
final files = <String, AppUnp4kP4kItemData>{};
final fs = MemoryFileSystem(style: FileSystemStyle.posix);
var nextAwait = 0;
for (var i = 0; i < p4kFiles.length; i++) {
final item = AppUnp4kP4kItemData.fromJson(p4kFiles[i]);
item.name = "${item.name}";
files["\\${item.name}"] = item;
await fs
.file(item.name?.replaceAll("\\", "/") ?? "")
.create(recursive: true);
if (i == nextAwait) {
state = state.copyWith(
endMessage:
S.current.tools_unp4k_msg_reading3(i, p4kFiles.length));
await Future.delayed(Duration.zero);
nextAwait += 20000;
}
}
final endTime = DateTime.now();
state = state.copyWith(
files: files,
fs: fs,
endMessage: S.current.tools_unp4k_msg_read_completed(files.length,
endTime.difference(_loadStartTime!).inMilliseconds));
_loadStartTime = null;
break;
case "info: Extracted_Open":
final filePath = data.toString();
dPrint("[unp4kc] Extracted_Open file: $filePath");
const textExt = [".txt", ".xml", ".json", ".lua", ".cfg", ".ini"];
const imgExt = [".png"];
String openType = "unknown";
for (var element in textExt) {
if (filePath.toLowerCase().endsWith(element)) {
openType = "text";
}
}
for (var element in imgExt) {
if (filePath.endsWith(element)) {
openType = "image";
}
}
state = state.copyWith(
tempOpenFile: MapEntry(openType, filePath),
endMessage: S.current.tools_unp4k_msg_open_file(filePath));
break;
default:
dPrint("[unp4kc] unknown action: $action");
break;
}
}
List<AppUnp4kP4kItemData>? getFiles() {
final path = state.curPath.replaceAll("\\", "/");
final fs = state.fs;
if (fs == null) return null;
final dir = fs.directory(path);
if (!dir.existsSync()) return [];
final files = dir.listSync(recursive: false, followLinks: false);
files.sort((a, b) {
if (a is Directory && b is File) {
return -1;
} else if (a is File && b is Directory) {
return 1;
} else {
return a.path.compareTo(b.path);
}
});
final result = <AppUnp4kP4kItemData>[];
for (var file in files) {
if (file is File) {
final f = state.files?[file.path.replaceAll("/", "\\")];
if (f != null) {
if (!(f.name?.startsWith("\\") ?? true)) {
f.name = "\\${f.name}";
}
result.add(f);
}
} else {
result.add(AppUnp4kP4kItemData(
name: file.path.replaceAll("/", "\\"), isDirectory: true));
}
}
return result;
}
void changeDir(String name, {bool fullPath = false}) {
if (fullPath) {
state = state.copyWith(curPath: name);
} else {
state = state.copyWith(curPath: "${state.curPath}$name\\");
}
}
openFile(String filePath) async {
final tempDir = await getTemporaryDirectory();
final tempPath =
"${tempDir.absolute.path}\\SCToolbox_unp4kc\\${SCLoggerHelper.getGameChannelID(getGamePath())}\\";
state = state.copyWith(
tempOpenFile: const MapEntry("loading", ""),
endMessage: S.current.tools_unp4k_msg_open_file(filePath));
extractFile(filePath, tempPath, mode: "extract_open");
}
extractFile(String filePath, String outputPath,
{String mode = "extract"}) async {
// remove first \\
if (filePath.startsWith("\\")) {
filePath = filePath.substring(1);
}
outputPath = "$outputPath$filePath";
dPrint("extractFile .... $filePath");
if (_rsPid != null) {
rs_process.write(
rsPid: _rsPid!, data: "$mode<:,:>$filePath<:,:>$outputPath\n");
}
}
static bool checkRunTimeError(String errorMessage) {
if (errorMessage
.contains("You must install .NET to run this application") ||
errorMessage.contains(
"You must install or update .NET to run this application") ||
errorMessage.contains(
"It was not possible to find any compatible framework version")) {
AnalyticsApi.touch("unp4k_no_runtime");
return true;
}
return false;
}
static Future<Uint8List> unp4kTools(
String applicationBinaryModuleDir, List<String> args) async {
await BinaryModuleConf.extractModule(
["unp4kc"], applicationBinaryModuleDir);
final execDir = "$applicationBinaryModuleDir\\unp4kc";
final exec = "$execDir\\unp4kc.exe";
final r = await Process.run(exec, args);
if (r.exitCode != 0) {
Process.killPid(r.pid);
throw Exception(
"error: ${r.exitCode} , info= ${r.stdout} , err= ${r.stderr}");
}
final eventJson = await compute(json.decode, r.stdout.toString());
if (eventJson["action"] == "data: Uint8List") {
final data = eventJson["data"];
return Uint8List.fromList((data as List).cast<int>());
}
throw Exception("error: data error");
}
}

View File

@ -0,0 +1,304 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'unp4kc.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$Unp4kcState {
bool get startUp => throw _privateConstructorUsedError;
Map<String, AppUnp4kP4kItemData>? get files =>
throw _privateConstructorUsedError;
MemoryFileSystem? get fs => throw _privateConstructorUsedError;
String get curPath => throw _privateConstructorUsedError;
String? get endMessage => throw _privateConstructorUsedError;
MapEntry<String, String>? get tempOpenFile =>
throw _privateConstructorUsedError;
String get errorMessage => throw _privateConstructorUsedError;
/// Create a copy of Unp4kcState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$Unp4kcStateCopyWith<Unp4kcState> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $Unp4kcStateCopyWith<$Res> {
factory $Unp4kcStateCopyWith(
Unp4kcState value, $Res Function(Unp4kcState) then) =
_$Unp4kcStateCopyWithImpl<$Res, Unp4kcState>;
@useResult
$Res call(
{bool startUp,
Map<String, AppUnp4kP4kItemData>? files,
MemoryFileSystem? fs,
String curPath,
String? endMessage,
MapEntry<String, String>? tempOpenFile,
String errorMessage});
}
/// @nodoc
class _$Unp4kcStateCopyWithImpl<$Res, $Val extends Unp4kcState>
implements $Unp4kcStateCopyWith<$Res> {
_$Unp4kcStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of Unp4kcState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startUp = null,
Object? files = freezed,
Object? fs = freezed,
Object? curPath = null,
Object? endMessage = freezed,
Object? tempOpenFile = freezed,
Object? errorMessage = null,
}) {
return _then(_value.copyWith(
startUp: null == startUp
? _value.startUp
: startUp // ignore: cast_nullable_to_non_nullable
as bool,
files: freezed == files
? _value.files
: files // ignore: cast_nullable_to_non_nullable
as Map<String, AppUnp4kP4kItemData>?,
fs: freezed == fs
? _value.fs
: fs // ignore: cast_nullable_to_non_nullable
as MemoryFileSystem?,
curPath: null == curPath
? _value.curPath
: curPath // ignore: cast_nullable_to_non_nullable
as String,
endMessage: freezed == endMessage
? _value.endMessage
: endMessage // ignore: cast_nullable_to_non_nullable
as String?,
tempOpenFile: freezed == tempOpenFile
? _value.tempOpenFile
: tempOpenFile // ignore: cast_nullable_to_non_nullable
as MapEntry<String, String>?,
errorMessage: null == errorMessage
? _value.errorMessage
: errorMessage // ignore: cast_nullable_to_non_nullable
as String,
) as $Val);
}
}
/// @nodoc
abstract class _$$Unp4kcStateImplCopyWith<$Res>
implements $Unp4kcStateCopyWith<$Res> {
factory _$$Unp4kcStateImplCopyWith(
_$Unp4kcStateImpl value, $Res Function(_$Unp4kcStateImpl) then) =
__$$Unp4kcStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{bool startUp,
Map<String, AppUnp4kP4kItemData>? files,
MemoryFileSystem? fs,
String curPath,
String? endMessage,
MapEntry<String, String>? tempOpenFile,
String errorMessage});
}
/// @nodoc
class __$$Unp4kcStateImplCopyWithImpl<$Res>
extends _$Unp4kcStateCopyWithImpl<$Res, _$Unp4kcStateImpl>
implements _$$Unp4kcStateImplCopyWith<$Res> {
__$$Unp4kcStateImplCopyWithImpl(
_$Unp4kcStateImpl _value, $Res Function(_$Unp4kcStateImpl) _then)
: super(_value, _then);
/// Create a copy of Unp4kcState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? startUp = null,
Object? files = freezed,
Object? fs = freezed,
Object? curPath = null,
Object? endMessage = freezed,
Object? tempOpenFile = freezed,
Object? errorMessage = null,
}) {
return _then(_$Unp4kcStateImpl(
startUp: null == startUp
? _value.startUp
: startUp // ignore: cast_nullable_to_non_nullable
as bool,
files: freezed == files
? _value._files
: files // ignore: cast_nullable_to_non_nullable
as Map<String, AppUnp4kP4kItemData>?,
fs: freezed == fs
? _value.fs
: fs // ignore: cast_nullable_to_non_nullable
as MemoryFileSystem?,
curPath: null == curPath
? _value.curPath
: curPath // ignore: cast_nullable_to_non_nullable
as String,
endMessage: freezed == endMessage
? _value.endMessage
: endMessage // ignore: cast_nullable_to_non_nullable
as String?,
tempOpenFile: freezed == tempOpenFile
? _value.tempOpenFile
: tempOpenFile // ignore: cast_nullable_to_non_nullable
as MapEntry<String, String>?,
errorMessage: null == errorMessage
? _value.errorMessage
: errorMessage // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
class _$Unp4kcStateImpl with DiagnosticableTreeMixin implements _Unp4kcState {
const _$Unp4kcStateImpl(
{required this.startUp,
final Map<String, AppUnp4kP4kItemData>? files,
this.fs,
required this.curPath,
this.endMessage,
this.tempOpenFile,
this.errorMessage = ""})
: _files = files;
@override
final bool startUp;
final Map<String, AppUnp4kP4kItemData>? _files;
@override
Map<String, AppUnp4kP4kItemData>? get files {
final value = _files;
if (value == null) return null;
if (_files is EqualUnmodifiableMapView) return _files;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(value);
}
@override
final MemoryFileSystem? fs;
@override
final String curPath;
@override
final String? endMessage;
@override
final MapEntry<String, String>? tempOpenFile;
@override
@JsonKey()
final String errorMessage;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'Unp4kcState(startUp: $startUp, files: $files, fs: $fs, curPath: $curPath, endMessage: $endMessage, tempOpenFile: $tempOpenFile, errorMessage: $errorMessage)';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties
..add(DiagnosticsProperty('type', 'Unp4kcState'))
..add(DiagnosticsProperty('startUp', startUp))
..add(DiagnosticsProperty('files', files))
..add(DiagnosticsProperty('fs', fs))
..add(DiagnosticsProperty('curPath', curPath))
..add(DiagnosticsProperty('endMessage', endMessage))
..add(DiagnosticsProperty('tempOpenFile', tempOpenFile))
..add(DiagnosticsProperty('errorMessage', errorMessage));
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$Unp4kcStateImpl &&
(identical(other.startUp, startUp) || other.startUp == startUp) &&
const DeepCollectionEquality().equals(other._files, _files) &&
(identical(other.fs, fs) || other.fs == fs) &&
(identical(other.curPath, curPath) || other.curPath == curPath) &&
(identical(other.endMessage, endMessage) ||
other.endMessage == endMessage) &&
(identical(other.tempOpenFile, tempOpenFile) ||
other.tempOpenFile == tempOpenFile) &&
(identical(other.errorMessage, errorMessage) ||
other.errorMessage == errorMessage));
}
@override
int get hashCode => Object.hash(
runtimeType,
startUp,
const DeepCollectionEquality().hash(_files),
fs,
curPath,
endMessage,
tempOpenFile,
errorMessage);
/// Create a copy of Unp4kcState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$Unp4kcStateImplCopyWith<_$Unp4kcStateImpl> get copyWith =>
__$$Unp4kcStateImplCopyWithImpl<_$Unp4kcStateImpl>(this, _$identity);
}
abstract class _Unp4kcState implements Unp4kcState {
const factory _Unp4kcState(
{required final bool startUp,
final Map<String, AppUnp4kP4kItemData>? files,
final MemoryFileSystem? fs,
required final String curPath,
final String? endMessage,
final MapEntry<String, String>? tempOpenFile,
final String errorMessage}) = _$Unp4kcStateImpl;
@override
bool get startUp;
@override
Map<String, AppUnp4kP4kItemData>? get files;
@override
MemoryFileSystem? get fs;
@override
String get curPath;
@override
String? get endMessage;
@override
MapEntry<String, String>? get tempOpenFile;
@override
String get errorMessage;
/// Create a copy of Unp4kcState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$Unp4kcStateImplCopyWith<_$Unp4kcStateImpl> get copyWith =>
throw _privateConstructorUsedError;
}

View File

@ -0,0 +1,25 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'unp4kc.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$unp4kCModelHash() => r'636da3fe20d1fa94917dd63934f08f8dbffc8a9d';
/// See also [Unp4kCModel].
@ProviderFor(Unp4kCModel)
final unp4kCModelProvider =
AutoDisposeNotifierProvider<Unp4kCModel, Unp4kcState>.internal(
Unp4kCModel.new,
name: r'unp4kCModelProvider',
debugGetCreateSourceHash:
const bool.fromEnvironment('dart.vm.product') ? null : _$unp4kCModelHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$Unp4kCModel = AutoDisposeNotifier<Unp4kcState>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

View File

@ -147,7 +147,7 @@ class AboutUI extends HookConsumerWidget {
], ],
), ),
onPressed: () { onPressed: () {
launchUrlString("mailto:scbox@xkeyc.com"); launchUrlString("mailto:xkeyc@qq.com");
}, },
), ),
const SizedBox(width: 24), const SizedBox(width: 24),

View File

@ -6,24 +6,30 @@ import 'package:starcitizen_doctor/widgets/widgets.dart';
import 'home_game_login_dialog_ui_model.dart'; import 'home_game_login_dialog_ui_model.dart';
class HomeGameLoginDialogUI extends HookConsumerWidget { class HomeGameLoginDialogUI extends HookConsumerWidget {
const HomeGameLoginDialogUI({super.key}); final BuildContext launchContext;
const HomeGameLoginDialogUI(this.launchContext, {super.key});
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final loginState = ref.watch(homeGameLoginUIModelProvider); final loginState = ref.watch(homeGameLoginUIModelProvider);
useEffect(() { useEffect(() {
ref.read(homeGameLoginUIModelProvider.notifier).launchWebLogin(context); ref
.read(homeGameLoginUIModelProvider.notifier)
.launchWebLogin(launchContext);
return null; return null;
}, []); }, []);
return ContentDialog( return ContentDialog(
constraints: BoxConstraints( constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * .56, maxWidth: MediaQuery.of(context).size.width * .56,
), ),
title: (loginState.loginStatus == 2) ? null : Text(S.current.home_action_one_click_launch), title: (loginState.loginStatus == 2)
? null
: Text(S.current.home_action_one_click_launch),
content: AnimatedSize( content: AnimatedSize(
duration: const Duration(milliseconds: 230), duration: const Duration(milliseconds: 230),
child: Padding( child: Padding(
padding: const EdgeInsets.only(top: 12, bottom: 12), padding: const EdgeInsets.only(top: 12, bottom: 0),
child: Column( child: Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min, mainAxisSize: MainAxisSize.min,
@ -33,16 +39,9 @@ class HomeGameLoginDialogUI extends HookConsumerWidget {
Center( Center(
child: Column( child: Column(
children: [ children: [
Text(S.current.home_title_logging_in), Text(S.current.home_title_logging_in),
const SizedBox(height: 12), const SizedBox(height: 12),
const ProgressRing(), const ProgressRing(),
if (loginState.isDeviceSupportWinHello ?? false)
const SizedBox(height: 24),
Text(
S.current.home_info_auto_fill_notice,
style: TextStyle(
fontSize: 13, color: Colors.white.withOpacity(.6)),
)
], ],
), ),
), ),
@ -73,10 +72,42 @@ class HomeGameLoginDialogUI extends HookConsumerWidget {
style: const TextStyle( style: const TextStyle(
fontSize: 24, fontWeight: FontWeight.bold), fontSize: 24, fontWeight: FontWeight.bold),
), ),
const SizedBox(height: 32), const SizedBox(height: 12),
if (loginState.libraryData?.games != null) ...[
Container(
padding: const EdgeInsets.all(6),
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(12),
),
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
for (final game in loginState.libraryData!.games!)
Padding(
padding: const EdgeInsets.only(
left: 12, right: 12),
child: Row(
children: [
Icon(
FluentIcons.skype_circle_check,
color: Colors.green,
),
const SizedBox(width: 6),
Text("${game.name}"),
],
),
)
],
),
),
const SizedBox(height: 24)
],
const SizedBox(height: 12),
Text(S.current.home_login_title_launching_game), Text(S.current.home_login_title_launching_game),
const SizedBox(height: 12), const SizedBox(height: 12),
const ProgressRing(), const ProgressRing(),
const SizedBox(height: 12),
], ],
), ),
) )

View File

@ -4,16 +4,14 @@ import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:local_auth/local_auth.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:cryptography/cryptography.dart';
import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:jwt_decode/jwt_decode.dart'; import 'package:jwt_decode/jwt_decode.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/utils/base_utils.dart'; import 'package:starcitizen_doctor/common/utils/base_utils.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart'; import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/common/win32/credentials.dart'; import 'package:starcitizen_doctor/data/rsi_game_library_data.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart'; import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'package:starcitizen_doctor/ui/webview/webview.dart'; import 'package:starcitizen_doctor/ui/webview/webview.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@ -32,6 +30,7 @@ class HomeGameLoginState with _$HomeGameLoginState {
String? authToken, String? authToken,
String? webToken, String? webToken,
Map? releaseInfo, Map? releaseInfo,
RsiGameLibraryData? libraryData,
String? installPath, String? installPath,
bool? isDeviceSupportWinHello, bool? isDeviceSupportWinHello,
}) = _LoginStatus; }) = _LoginStatus;
@ -44,82 +43,50 @@ class HomeGameLoginUIModel extends _$HomeGameLoginUIModel {
return HomeGameLoginState(loginStatus: 0); return HomeGameLoginState(loginStatus: 0);
} }
final LocalAuthentication _localAuth = LocalAuthentication();
// ignore: avoid_build_context_in_providers // ignore: avoid_build_context_in_providers
Future<void> launchWebLogin(BuildContext context) async { Future<void> launchWebLogin(BuildContext context) async {
final homeState = ref.read(homeUIModelProvider); final homeState = ref.read(homeUIModelProvider);
final isDeviceSupportWinHello = await _localAuth.isDeviceSupported();
state = state.copyWith(isDeviceSupportWinHello: isDeviceSupportWinHello);
if (!context.mounted) return; if (!context.mounted) return;
goWebView(context, S.current.home_action_login_rsi_account, goWebView(context, S.current.home_action_login_rsi_account,
"https://robertsspaceindustries.com/connect", loginMode: true, "https://robertsspaceindustries.com/connect?jumpto=/connect",
rsiLoginCallback: (message, ok) async { loginMode: true, rsiLoginCallback: (message, ok) async {
// dPrint( // dPrint(
// "======rsiLoginCallback=== $ok ===== data==\n${json.encode(message)}"); // "======rsiLoginCallback=== $ok ===== data==\n${json.encode(message)}");
if (message == null || !ok) { if (message == null || !ok) {
Navigator.pop(context); Navigator.pop(context);
return; return;
} }
// final emailBox = await Hive.openBox("quick_login_email"); // final emailBox = await Hive.openBox("quick_login_email");
final data = message["data"]; final data = message["data"];
final authToken = data["authToken"]; final authToken = data["authToken"];
final webToken = data["webToken"]; final webToken = data["webToken"];
final releaseInfo = data["releaseInfo"]; final releaseInfo = data["releaseInfo"];
final avatarUrl = data["avatar"] final libraryData = RsiGameLibraryData.fromJson(data["libraryData"]);
var avatarUrl = data["avatar"]
?.toString() ?.toString()
.replaceAll("url(\"", "") .replaceAll("url(\"", "")
.replaceAll("\")", ""); .replaceAll("\")", "");
if (avatarUrl?.startsWith("/") ?? false) {
avatarUrl = "https://robertsspaceindustries.com$avatarUrl";
}
final Map<String, dynamic> payload = Jwt.parseJwt(authToken!); final Map<String, dynamic> payload = Jwt.parseJwt(authToken!);
final nickname = payload["nickname"] ?? ""; final nickname = payload["nickname"] ?? "";
final inputEmail = data["inputEmail"];
final inputPassword = data["inputPassword"];
final userBox = await Hive.openBox("rsi_account_data");
if (inputEmail != null && inputEmail != "") {
await userBox.put("account_email", inputEmail);
}
state = state.copyWith( state = state.copyWith(
nickname: nickname, nickname: nickname,
avatarUrl: avatarUrl, avatarUrl: avatarUrl,
authToken: authToken, authToken: authToken,
webToken: webToken, webToken: webToken,
releaseInfo: releaseInfo, releaseInfo: releaseInfo,
libraryData: libraryData,
); );
if (isDeviceSupportWinHello) {
if (await userBox.get("enable", defaultValue: true)) {
if (inputEmail != null &&
inputEmail != "" &&
inputPassword != null &&
inputPassword != "") {
if (!context.mounted) return;
final ok = await showConfirmDialogs(
context,
S.current.home_action_q_auto_password_fill_prompt,
Text(S.current.home_login_info_password_encryption_notice));
if (ok == true) {
if (await _localAuth.authenticate(
localizedReason:
S.current.home_login_info_enter_pin_to_encrypt) ==
true) {
await _savePwd(inputEmail, inputPassword);
}
} else {
await userBox.put("enable", false);
}
}
}
}
final buildInfoFile = final buildInfoFile =
File("${homeState.scInstalledPath}\\build_manifest.id"); File("${homeState.scInstalledPath}\\build_manifest.id");
if (await buildInfoFile.exists()) { if (await buildInfoFile.exists()) {
final buildInfo = final buildInfo =
json.decode(await buildInfoFile.readAsString())["Data"]; json.decode(await buildInfoFile.readAsString())["Data"];
dPrint("buildInfo ======= $buildInfo");
if (releaseInfo?["versionLabel"] != null && if (releaseInfo?["versionLabel"] != null &&
buildInfo["RequestedP4ChangeNum"] != null) { buildInfo["RequestedP4ChangeNum"] != null) {
@ -230,18 +197,16 @@ class HomeGameLoginUIModel extends _$HomeGameLoginUIModel {
}; };
final executable = state.releaseInfo?["executable"]; final executable = state.releaseInfo?["executable"];
final launchOptions = state.releaseInfo?["launchOptions"]; final launchOptions = state.releaseInfo?["launchOptions"];
dPrint("----------launch data ====== -----------\n$launchData"); // dPrint("----------launch data ====== -----------\n$launchData");
dPrint( // dPrint(
"----------executable data ====== -----------\n${homeState.scInstalledPath}\\$executable $launchOptions"); // "----------executable data ====== -----------\n${homeState.scInstalledPath}\\$executable $launchOptions");
final launchFile = File("${homeState.scInstalledPath}\\loginData.json"); final launchFile = File("${homeState.scInstalledPath}\\loginData.json");
if (await launchFile.exists()) { if (await launchFile.exists()) {
await launchFile.delete(); await launchFile.delete();
} }
await launchFile.create(); await launchFile.create();
await launchFile.writeAsString(json.encode(launchData)); await launchFile.writeAsString(json.encode(launchData));
await Future.delayed(const Duration(seconds: 1));
await Future.delayed(const Duration(seconds: 3));
final processorAffinity = await SystemHelper.getCpuAffinity(); final processorAffinity = await SystemHelper.getCpuAffinity();
final homeUIModel = ref.read(homeUIModelProvider.notifier); final homeUIModel = ref.read(homeUIModelProvider.notifier);
if (!context.mounted) return; if (!context.mounted) return;
@ -259,40 +224,7 @@ class HomeGameLoginUIModel extends _$HomeGameLoginUIModel {
String getChannelID(String installPath) { String getChannelID(String installPath) {
if (installPath.endsWith("\\LIVE")) { if (installPath.endsWith("\\LIVE")) {
return "LIVE"; return "LIVE";
} else if (installPath.endsWith("\\PTU")) {
return "PTU";
} else if (installPath.endsWith("\\EPTU")) {
return "EPTU";
} }
return "LIVE"; return "PTU";
}
_savePwd(String inputEmail, String inputPassword) async {
final algorithm = AesGcm.with256bits();
final secretKey = await algorithm.newSecretKey();
final nonce = algorithm.newNonce();
final secretBox = await algorithm.encrypt(utf8.encode(inputPassword),
secretKey: secretKey, nonce: nonce);
await algorithm.decrypt(
SecretBox(secretBox.cipherText,
nonce: secretBox.nonce, mac: secretBox.mac),
secretKey: secretKey);
final pwdEncrypted = base64.encode(secretBox.cipherText);
final userBox = await Hive.openBox("rsi_account_data");
await userBox.put("account_email", inputEmail);
await userBox.put("account_pwd_encrypted", pwdEncrypted);
await userBox.put("nonce", base64.encode(secretBox.nonce));
await userBox.put("mac", base64.encode(secretBox.mac.bytes));
final secretKeyStr = base64.encode((await secretKey.extractBytes()));
Win32Credentials.write(
credentialName: "SCToolbox_RSI_Account_secret",
userName: inputEmail,
password: secretKeyStr);
} }
} }

View File

@ -22,10 +22,13 @@ mixin _$HomeGameLoginState {
String? get authToken => throw _privateConstructorUsedError; String? get authToken => throw _privateConstructorUsedError;
String? get webToken => throw _privateConstructorUsedError; String? get webToken => throw _privateConstructorUsedError;
Map<dynamic, dynamic>? get releaseInfo => throw _privateConstructorUsedError; Map<dynamic, dynamic>? get releaseInfo => throw _privateConstructorUsedError;
RsiGameLibraryData? get libraryData => throw _privateConstructorUsedError;
String? get installPath => throw _privateConstructorUsedError; String? get installPath => throw _privateConstructorUsedError;
bool? get isDeviceSupportWinHello => throw _privateConstructorUsedError; bool? get isDeviceSupportWinHello => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of HomeGameLoginState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HomeGameLoginStateCopyWith<HomeGameLoginState> get copyWith => $HomeGameLoginStateCopyWith<HomeGameLoginState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -43,6 +46,7 @@ abstract class $HomeGameLoginStateCopyWith<$Res> {
String? authToken, String? authToken,
String? webToken, String? webToken,
Map<dynamic, dynamic>? releaseInfo, Map<dynamic, dynamic>? releaseInfo,
RsiGameLibraryData? libraryData,
String? installPath, String? installPath,
bool? isDeviceSupportWinHello}); bool? isDeviceSupportWinHello});
} }
@ -57,6 +61,8 @@ class _$HomeGameLoginStateCopyWithImpl<$Res, $Val extends HomeGameLoginState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of HomeGameLoginState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -66,6 +72,7 @@ class _$HomeGameLoginStateCopyWithImpl<$Res, $Val extends HomeGameLoginState>
Object? authToken = freezed, Object? authToken = freezed,
Object? webToken = freezed, Object? webToken = freezed,
Object? releaseInfo = freezed, Object? releaseInfo = freezed,
Object? libraryData = freezed,
Object? installPath = freezed, Object? installPath = freezed,
Object? isDeviceSupportWinHello = freezed, Object? isDeviceSupportWinHello = freezed,
}) { }) {
@ -94,6 +101,10 @@ class _$HomeGameLoginStateCopyWithImpl<$Res, $Val extends HomeGameLoginState>
? _value.releaseInfo ? _value.releaseInfo
: releaseInfo // ignore: cast_nullable_to_non_nullable : releaseInfo // ignore: cast_nullable_to_non_nullable
as Map<dynamic, dynamic>?, as Map<dynamic, dynamic>?,
libraryData: freezed == libraryData
? _value.libraryData
: libraryData // ignore: cast_nullable_to_non_nullable
as RsiGameLibraryData?,
installPath: freezed == installPath installPath: freezed == installPath
? _value.installPath ? _value.installPath
: installPath // ignore: cast_nullable_to_non_nullable : installPath // ignore: cast_nullable_to_non_nullable
@ -121,6 +132,7 @@ abstract class _$$LoginStatusImplCopyWith<$Res>
String? authToken, String? authToken,
String? webToken, String? webToken,
Map<dynamic, dynamic>? releaseInfo, Map<dynamic, dynamic>? releaseInfo,
RsiGameLibraryData? libraryData,
String? installPath, String? installPath,
bool? isDeviceSupportWinHello}); bool? isDeviceSupportWinHello});
} }
@ -133,6 +145,8 @@ class __$$LoginStatusImplCopyWithImpl<$Res>
_$LoginStatusImpl _value, $Res Function(_$LoginStatusImpl) _then) _$LoginStatusImpl _value, $Res Function(_$LoginStatusImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of HomeGameLoginState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -142,6 +156,7 @@ class __$$LoginStatusImplCopyWithImpl<$Res>
Object? authToken = freezed, Object? authToken = freezed,
Object? webToken = freezed, Object? webToken = freezed,
Object? releaseInfo = freezed, Object? releaseInfo = freezed,
Object? libraryData = freezed,
Object? installPath = freezed, Object? installPath = freezed,
Object? isDeviceSupportWinHello = freezed, Object? isDeviceSupportWinHello = freezed,
}) { }) {
@ -170,6 +185,10 @@ class __$$LoginStatusImplCopyWithImpl<$Res>
? _value._releaseInfo ? _value._releaseInfo
: releaseInfo // ignore: cast_nullable_to_non_nullable : releaseInfo // ignore: cast_nullable_to_non_nullable
as Map<dynamic, dynamic>?, as Map<dynamic, dynamic>?,
libraryData: freezed == libraryData
? _value.libraryData
: libraryData // ignore: cast_nullable_to_non_nullable
as RsiGameLibraryData?,
installPath: freezed == installPath installPath: freezed == installPath
? _value.installPath ? _value.installPath
: installPath // ignore: cast_nullable_to_non_nullable : installPath // ignore: cast_nullable_to_non_nullable
@ -192,6 +211,7 @@ class _$LoginStatusImpl implements _LoginStatus {
this.authToken, this.authToken,
this.webToken, this.webToken,
final Map<dynamic, dynamic>? releaseInfo, final Map<dynamic, dynamic>? releaseInfo,
this.libraryData,
this.installPath, this.installPath,
this.isDeviceSupportWinHello}) this.isDeviceSupportWinHello})
: _releaseInfo = releaseInfo; : _releaseInfo = releaseInfo;
@ -216,6 +236,8 @@ class _$LoginStatusImpl implements _LoginStatus {
return EqualUnmodifiableMapView(value); return EqualUnmodifiableMapView(value);
} }
@override
final RsiGameLibraryData? libraryData;
@override @override
final String? installPath; final String? installPath;
@override @override
@ -223,7 +245,7 @@ class _$LoginStatusImpl implements _LoginStatus {
@override @override
String toString() { String toString() {
return 'HomeGameLoginState(loginStatus: $loginStatus, nickname: $nickname, avatarUrl: $avatarUrl, authToken: $authToken, webToken: $webToken, releaseInfo: $releaseInfo, installPath: $installPath, isDeviceSupportWinHello: $isDeviceSupportWinHello)'; return 'HomeGameLoginState(loginStatus: $loginStatus, nickname: $nickname, avatarUrl: $avatarUrl, authToken: $authToken, webToken: $webToken, releaseInfo: $releaseInfo, libraryData: $libraryData, installPath: $installPath, isDeviceSupportWinHello: $isDeviceSupportWinHello)';
} }
@override @override
@ -243,6 +265,8 @@ class _$LoginStatusImpl implements _LoginStatus {
other.webToken == webToken) && other.webToken == webToken) &&
const DeepCollectionEquality() const DeepCollectionEquality()
.equals(other._releaseInfo, _releaseInfo) && .equals(other._releaseInfo, _releaseInfo) &&
(identical(other.libraryData, libraryData) ||
other.libraryData == libraryData) &&
(identical(other.installPath, installPath) || (identical(other.installPath, installPath) ||
other.installPath == installPath) && other.installPath == installPath) &&
(identical( (identical(
@ -259,10 +283,13 @@ class _$LoginStatusImpl implements _LoginStatus {
authToken, authToken,
webToken, webToken,
const DeepCollectionEquality().hash(_releaseInfo), const DeepCollectionEquality().hash(_releaseInfo),
libraryData,
installPath, installPath,
isDeviceSupportWinHello); isDeviceSupportWinHello);
@JsonKey(ignore: true) /// Create a copy of HomeGameLoginState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$LoginStatusImplCopyWith<_$LoginStatusImpl> get copyWith => _$$LoginStatusImplCopyWith<_$LoginStatusImpl> get copyWith =>
@ -277,6 +304,7 @@ abstract class _LoginStatus implements HomeGameLoginState {
final String? authToken, final String? authToken,
final String? webToken, final String? webToken,
final Map<dynamic, dynamic>? releaseInfo, final Map<dynamic, dynamic>? releaseInfo,
final RsiGameLibraryData? libraryData,
final String? installPath, final String? installPath,
final bool? isDeviceSupportWinHello}) = _$LoginStatusImpl; final bool? isDeviceSupportWinHello}) = _$LoginStatusImpl;
@ -293,11 +321,16 @@ abstract class _LoginStatus implements HomeGameLoginState {
@override @override
Map<dynamic, dynamic>? get releaseInfo; Map<dynamic, dynamic>? get releaseInfo;
@override @override
RsiGameLibraryData? get libraryData;
@override
String? get installPath; String? get installPath;
@override @override
bool? get isDeviceSupportWinHello; bool? get isDeviceSupportWinHello;
/// Create a copy of HomeGameLoginState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$LoginStatusImplCopyWith<_$LoginStatusImpl> get copyWith => _$$LoginStatusImplCopyWith<_$LoginStatusImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -7,7 +7,7 @@ part of 'home_game_login_dialog_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$homeGameLoginUIModelHash() => String _$homeGameLoginUIModelHash() =>
r'108812122298cf826ee57ecad3e519b1dc3fd6ce'; r'e8afccb7bba7c79e766e30a27f64128918a63dd7';
/// See also [HomeGameLoginUIModel]. /// See also [HomeGameLoginUIModel].
@ProviderFor(HomeGameLoginUIModel) @ProviderFor(HomeGameLoginUIModel)

View File

@ -21,7 +21,9 @@ mixin _$HomeDownloaderUIState {
List<Aria2Task> get stoppedTasks => throw _privateConstructorUsedError; List<Aria2Task> get stoppedTasks => throw _privateConstructorUsedError;
Aria2GlobalStat? get globalStat => throw _privateConstructorUsedError; Aria2GlobalStat? get globalStat => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of HomeDownloaderUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HomeDownloaderUIStateCopyWith<HomeDownloaderUIState> get copyWith => $HomeDownloaderUIStateCopyWith<HomeDownloaderUIState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -50,6 +52,8 @@ class _$HomeDownloaderUIStateCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of HomeDownloaderUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -104,6 +108,8 @@ class __$$HomeDownloaderUIStateImplCopyWithImpl<$Res>
$Res Function(_$HomeDownloaderUIStateImpl) _then) $Res Function(_$HomeDownloaderUIStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of HomeDownloaderUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -190,8 +196,8 @@ class _$HomeDownloaderUIStateImpl implements _HomeDownloaderUIState {
.equals(other._waitingTasks, _waitingTasks) && .equals(other._waitingTasks, _waitingTasks) &&
const DeepCollectionEquality() const DeepCollectionEquality()
.equals(other._stoppedTasks, _stoppedTasks) && .equals(other._stoppedTasks, _stoppedTasks) &&
const DeepCollectionEquality() (identical(other.globalStat, globalStat) ||
.equals(other.globalStat, globalStat)); other.globalStat == globalStat));
} }
@override @override
@ -200,9 +206,11 @@ class _$HomeDownloaderUIStateImpl implements _HomeDownloaderUIState {
const DeepCollectionEquality().hash(_tasks), const DeepCollectionEquality().hash(_tasks),
const DeepCollectionEquality().hash(_waitingTasks), const DeepCollectionEquality().hash(_waitingTasks),
const DeepCollectionEquality().hash(_stoppedTasks), const DeepCollectionEquality().hash(_stoppedTasks),
const DeepCollectionEquality().hash(globalStat)); globalStat);
@JsonKey(ignore: true) /// Create a copy of HomeDownloaderUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$HomeDownloaderUIStateImplCopyWith<_$HomeDownloaderUIStateImpl> _$$HomeDownloaderUIStateImplCopyWith<_$HomeDownloaderUIStateImpl>
@ -225,8 +233,11 @@ abstract class _HomeDownloaderUIState implements HomeDownloaderUIState {
List<Aria2Task> get stoppedTasks; List<Aria2Task> get stoppedTasks;
@override @override
Aria2GlobalStat? get globalStat; Aria2GlobalStat? get globalStat;
/// Create a copy of HomeDownloaderUIState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$HomeDownloaderUIStateImplCopyWith<_$HomeDownloaderUIStateImpl> _$$HomeDownloaderUIStateImplCopyWith<_$HomeDownloaderUIStateImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }

View File

@ -3,6 +3,7 @@ import 'package:flutter/scheduler.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_tilt/flutter_tilt.dart'; import 'package:flutter_tilt/flutter_tilt.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/helper/log_helper.dart'; import 'package:starcitizen_doctor/common/helper/log_helper.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
@ -22,6 +23,7 @@ class HomeGameDoctorUI extends HookConsumerWidget {
final model = ref.read(homeGameDoctorUIModelProvider.notifier); final model = ref.read(homeGameDoctorUIModelProvider.notifier);
useEffect(() { useEffect(() {
AnalyticsApi.touch("auto_scan_issues");
SchedulerBinding.instance.addPostFrameCallback((timeStamp) { SchedulerBinding.instance.addPostFrameCallback((timeStamp) {
dPrint("HomeGameDoctorUI useEffect doCheck timeStamp === $timeStamp"); dPrint("HomeGameDoctorUI useEffect doCheck timeStamp === $timeStamp");
model.doCheck(context); model.doCheck(context);

View File

@ -103,7 +103,7 @@ class HomeGameDoctorUIModel extends _$HomeGameDoctorUIModel {
showToast(context, S.current.doctor_action_result_redirect_warning); showToast(context, S.current.doctor_action_result_redirect_warning);
await Future.delayed(const Duration(milliseconds: 300)); await Future.delayed(const Duration(milliseconds: 300));
launchUrlString( launchUrlString(
"https://btfy.eu.org/?q=5L+u5pS5d2luZG93c+eUqOaIt+WQjeS7juS4reaWh+WIsOiLseaWhw=="); "https://jingyan.baidu.com/article/59703552a318a08fc0074021.html");
break; break;
default: default:
showToast(context, S.current.doctor_action_result_issue_not_supported); showToast(context, S.current.doctor_action_result_issue_not_supported);
@ -169,7 +169,7 @@ class HomeGameDoctorUIModel extends _$HomeGameDoctorUIModel {
if (info != null) { if (info != null) {
if (info.key != "_") { if (info.key != "_") {
checkResult.add(MapEntry( checkResult.add(MapEntry(
S.current.doctor_action_info_game_abnormal_exit(info..key), S.current.doctor_action_info_game_abnormal_exit(info.key),
info.value)); info.value));
} else { } else {
checkResult.add(MapEntry( checkResult.add(MapEntry(

View File

@ -23,7 +23,9 @@ mixin _$HomeGameDoctorState {
List<MapEntry<String, String>>? get checkResult => List<MapEntry<String, String>>? get checkResult =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of HomeGameDoctorState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HomeGameDoctorStateCopyWith<HomeGameDoctorState> get copyWith => $HomeGameDoctorStateCopyWith<HomeGameDoctorState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -52,6 +54,8 @@ class _$HomeGameDoctorStateCopyWithImpl<$Res, $Val extends HomeGameDoctorState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of HomeGameDoctorState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -110,6 +114,8 @@ class __$$HomeGameDoctorStateImplCopyWithImpl<$Res>
$Res Function(_$HomeGameDoctorStateImpl) _then) $Res Function(_$HomeGameDoctorStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of HomeGameDoctorState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -208,7 +214,9 @@ class _$HomeGameDoctorStateImpl implements _HomeGameDoctorState {
isFixingString, isFixingString,
const DeepCollectionEquality().hash(_checkResult)); const DeepCollectionEquality().hash(_checkResult));
@JsonKey(ignore: true) /// Create a copy of HomeGameDoctorState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$HomeGameDoctorStateImplCopyWith<_$HomeGameDoctorStateImpl> get copyWith => _$$HomeGameDoctorStateImplCopyWith<_$HomeGameDoctorStateImpl> get copyWith =>
@ -235,8 +243,11 @@ abstract class _HomeGameDoctorState implements HomeGameDoctorState {
String get isFixingString; String get isFixingString;
@override @override
List<MapEntry<String, String>>? get checkResult; List<MapEntry<String, String>>? get checkResult;
/// Create a copy of HomeGameDoctorState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$HomeGameDoctorStateImplCopyWith<_$HomeGameDoctorStateImpl> get copyWith => _$$HomeGameDoctorStateImplCopyWith<_$HomeGameDoctorStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -7,7 +7,7 @@ part of 'game_doctor_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$homeGameDoctorUIModelHash() => String _$homeGameDoctorUIModelHash() =>
r'b4132559510e3e59b1e2e330d9327ff8790df461'; r'b69a19a937ca375214a7c7e73b8288f577265625';
/// See also [HomeGameDoctorUIModel]. /// See also [HomeGameDoctorUIModel].
@ProviderFor(HomeGameDoctorUIModel) @ProviderFor(HomeGameDoctorUIModel)

View File

@ -7,7 +7,7 @@ import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/ui/tools/tools_ui_model.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart';
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
@ -149,26 +149,24 @@ class HomeUI extends HookConsumerWidget {
onPressed: homeState.webLocalizationVersionsData == null onPressed: homeState.webLocalizationVersionsData == null
? null ? null
: () => model.launchRSI(context), : () => model.launchRSI(context),
style: homeState.isCurGameRunning
? null
: ButtonStyle(
backgroundColor:
WidgetStateProperty.resolveWith(_getRunButtonColor),
),
child: Padding( child: Padding(
padding: const EdgeInsets.all(6), padding: const EdgeInsets.all(6),
child: Icon( child: Icon(
homeState.isCurGameRunning homeState.isCurGameRunning
? FluentIcons.stop_solid ? FluentIcons.stop_solid
: FluentIcons.play, : FluentIcons.play_solid,
color: homeState.isCurGameRunning color: homeState.isCurGameRunning
? Colors.red.withOpacity(.8) ? Colors.red.withOpacity(.8)
: null, : Colors.white,
), ),
)), )),
const SizedBox(width: 12), const SizedBox(width: 12),
Button(
child: const Padding(
padding: EdgeInsets.all(6),
child: Icon(FluentIcons.folder_open),
),
onPressed: () => SystemHelper.openDir(homeState.scInstalledPath),
),
const SizedBox(width: 12),
Button( Button(
onPressed: model.reScanPath, onPressed: model.reScanPath,
child: const Padding( child: const Padding(
@ -349,7 +347,8 @@ class HomeUI extends HookConsumerWidget {
child: makeLoading(context), child: makeLoading(context),
) )
: Swiper( : Swiper(
itemCount: homeState.rssVideoItems?.length ?? 0, itemCount: getMinNumber(
[homeState.rssVideoItems?.length ?? 0, 6]),
itemBuilder: (context, index) { itemBuilder: (context, index) {
final item = homeState.rssVideoItems![index]; final item = homeState.rssVideoItems![index];
return GestureDetector( return GestureDetector(
@ -468,13 +467,13 @@ class HomeUI extends HookConsumerWidget {
final item = items.elementAt(index); final item = items.elementAt(index);
return HoverButton( return HoverButton(
onPressed: () => _onMenuTap(context, item.key, homeState, ref), onPressed: () => _onMenuTap(context, item.key, homeState, ref),
builder: (BuildContext context, Set<ButtonStates> states) { builder: (BuildContext context, Set<WidgetState> states) {
return Container( return Container(
width: 300, width: 300,
height: 120, height: 120,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(12), borderRadius: BorderRadius.circular(12),
color: states.isHovering color: states.isHovered
? FluentTheme.of(context).cardColor.withOpacity(.1) ? FluentTheme.of(context).cardColor.withOpacity(.1)
: FluentTheme.of(context).cardColor, : FluentTheme.of(context).cardColor,
), ),
@ -705,7 +704,8 @@ class HomeUI extends HookConsumerWidget {
width: width, width: width,
height: 62, height: 62,
child: Swiper( child: Swiper(
itemCount: homeState.countdownFestivalListData!.length, itemCount: getMinNumber(
[homeState.countdownFestivalListData!.length, 6]),
autoplay: true, autoplay: true,
autoplayDelay: 5000, autoplayDelay: 5000,
itemBuilder: (context, index) { itemBuilder: (context, index) {
@ -786,21 +786,39 @@ class HomeUI extends HookConsumerWidget {
switch (key) { switch (key) {
case "localization": case "localization":
if (homeState.scInstalledPath == "not_install") { if (homeState.scInstalledPath == "not_install") {
showToast(context, gameInstallReqInfo); ToolsUIModel.rsiEnhance(context, showNotGameInstallMsg: true);
break; break;
} }
final model = ref.watch(homeUIModelProvider.notifier); final model = ref.watch(homeUIModelProvider.notifier);
model.checkLocalizationUpdate(); model.checkLocalizationUpdate();
await showDialog( await showDialog(
context: context, context: context,
dismissWithEsc: false, dismissWithEsc: false,
builder: (BuildContext context) => const LocalizationDialogUI()); builder: (BuildContext context) => const LocalizationDialogUI(),
);
model.checkLocalizationUpdate(skipReload: true); model.checkLocalizationUpdate(skipReload: true);
break; break;
case "performance":
if (homeState.scInstalledPath == "not_install") {
showToast(context, gameInstallReqInfo);
break;
}
context.push("/index/$key");
break;
default: default:
context.push("/index/$key"); context.push("/index/$key");
} }
} }
Color? _getRunButtonColor(Set<WidgetState> states) {
if (states.isPressed) {
return const Color.fromRGBO(49, 227, 88, .5);
}
if (states.isPressed) {
return const Color.fromRGBO(47, 213, 84, 1.0);
}
return const Color.fromRGBO(49, 227, 88, .8);
}
} }
class _HomeItemData { class _HomeItemData {

View File

@ -16,6 +16,7 @@ import 'package:starcitizen_doctor/common/conf/url_conf.dart';
import 'package:starcitizen_doctor/common/helper/log_helper.dart'; import 'package:starcitizen_doctor/common/helper/log_helper.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/io/rs_http.dart'; import 'package:starcitizen_doctor/common/io/rs_http.dart';
import 'package:starcitizen_doctor/common/rust/api/win32_api.dart' as win32;
import 'package:starcitizen_doctor/common/utils/async.dart'; import 'package:starcitizen_doctor/common/utils/async.dart';
import 'package:starcitizen_doctor/common/utils/base_utils.dart'; import 'package:starcitizen_doctor/common/utils/base_utils.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
@ -27,7 +28,6 @@ import 'package:starcitizen_doctor/ui/home/dialogs/home_game_login_dialog_ui.dar
import 'package:url_launcher/url_launcher_string.dart'; import 'package:url_launcher/url_launcher_string.dart';
import 'package:html/parser.dart' as html; import 'package:html/parser.dart' as html;
import 'package:html/dom.dart' as html_dom; import 'package:html/dom.dart' as html_dom;
import 'package:windows_ui/windows_ui.dart';
import '../webview/webview.dart'; import '../webview/webview.dart';
import 'localization/localization_ui_model.dart'; import 'localization/localization_ui_model.dart';
@ -290,25 +290,14 @@ class HomeUIModel extends _$HomeUIModel {
_appUpdateTimer?.cancel(); _appUpdateTimer?.cancel();
_appUpdateTimer = null; _appUpdateTimer = null;
// //
final toastNotifier = ToastNotificationManager.createToastNotifierWithId( await win32.sendNotify(
S.current.home_title_app_name); summary: S.current.home_localization_new_version_available,
if (toastNotifier != null) { body:
final toastContent = ToastNotificationManager.getTemplateContent( S.current.home_localization_new_version_installed(updates.first),
ToastTemplateType.toastText02); appName: S.current.home_title_app_name,
if (toastContent != null) { appId: ConstConf.isMSE
final xmlNodeList = toastContent.getElementsByTagName('text'); ? "56575xkeyC.MSE_bsn1nexg8e4qe!starcitizendoctor"
final title = S.current.home_localization_new_version_available; : "{6D809377-6AF0-444B-8957-A3773F02200E}\\Starcitizen_Doctor\\starcitizen_doctor.exe");
final content =
S.current.home_localization_new_version_installed(updates.first);
xmlNodeList.item(0)?.appendChild(toastContent.createTextNode(title));
xmlNodeList
.item(1)
?.appendChild(toastContent.createTextNode(content));
final toastNotification =
ToastNotification.createToastNotification(toastContent);
toastNotifier.show(toastNotification);
}
}
} }
} }
@ -329,7 +318,7 @@ class HomeUIModel extends _$HomeUIModel {
showDialog( showDialog(
context: context, context: context,
dismissWithEsc: false, dismissWithEsc: false,
builder: (context) => const HomeGameLoginDialogUI()); builder: (context) => HomeGameLoginDialogUI(context));
} else { } else {
final ok = await showConfirmDialogs( final ok = await showConfirmDialogs(
context, context,

View File

@ -33,7 +33,9 @@ mixin _$HomeUIModelState {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
Map<String, bool> get isGameRunning => throw _privateConstructorUsedError; Map<String, bool> get isGameRunning => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of HomeUIModelState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HomeUIModelStateCopyWith<HomeUIModelState> get copyWith => $HomeUIModelStateCopyWith<HomeUIModelState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -70,6 +72,8 @@ class _$HomeUIModelStateCopyWithImpl<$Res, $Val extends HomeUIModelState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of HomeUIModelState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -176,6 +180,8 @@ class __$$HomeUIModelStateImplCopyWithImpl<$Res>
$Res Function(_$HomeUIModelStateImpl) _then) $Res Function(_$HomeUIModelStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of HomeUIModelState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -407,7 +413,9 @@ class _$HomeUIModelStateImpl implements _HomeUIModelState {
const DeepCollectionEquality().hash(_countdownFestivalListData), const DeepCollectionEquality().hash(_countdownFestivalListData),
const DeepCollectionEquality().hash(_isGameRunning)); const DeepCollectionEquality().hash(_isGameRunning));
@JsonKey(ignore: true) /// Create a copy of HomeUIModelState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$HomeUIModelStateImplCopyWith<_$HomeUIModelStateImpl> get copyWith => _$$HomeUIModelStateImplCopyWith<_$HomeUIModelStateImpl> get copyWith =>
@ -457,8 +465,11 @@ abstract class _HomeUIModelState implements HomeUIModelState {
List<CountdownFestivalItemData>? get countdownFestivalListData; List<CountdownFestivalItemData>? get countdownFestivalListData;
@override @override
Map<String, bool> get isGameRunning; Map<String, bool> get isGameRunning;
/// Create a copy of HomeUIModelState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$HomeUIModelStateImplCopyWith<_$HomeUIModelStateImpl> get copyWith => _$$HomeUIModelStateImplCopyWith<_$HomeUIModelStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -6,7 +6,7 @@ part of 'home_ui_model.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$homeUIModelHash() => r'b62026bb0b5ab37c0aed33e0ed018aa9732da58e'; String _$homeUIModelHash() => r'85d3242abb4264a814768a2d5ce108df46df38d9';
/// See also [HomeUIModel]. /// See also [HomeUIModel].
@ProviderFor(HomeUIModel) @ProviderFor(HomeUIModel)

View File

@ -0,0 +1,315 @@
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:re_editor/re_editor.dart';
import 'package:re_highlight/languages/ini.dart';
import 'package:re_highlight/styles/vs2015.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'package:starcitizen_doctor/ui/home/localization/advanced_localization_ui_model.dart';
import 'package:starcitizen_doctor/ui/tools/unp4kc/unp4kc_ui.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart';
import 'package:super_sliver_list/super_sliver_list.dart';
import 'localization_form_file_dialog_ui.dart';
class AdvancedLocalizationUI extends HookConsumerWidget {
const AdvancedLocalizationUI({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(advancedLocalizationUIModelProvider);
final model = ref.read(advancedLocalizationUIModelProvider.notifier);
final homeUIState = ref.watch(homeUIModelProvider);
onSwitchFile() async {
final sb = await showDialog(
context: context,
builder: (BuildContext context) => const LocalizationFromFileDialogUI(),
);
if (sb is StringBuffer) {
model.setCustomizeGlobalIni(sb.toString());
}
}
useEffect(() {
AnalyticsApi.touch("advanced_localization_launch");
return null;
}, const []);
return makeDefaultPage(
title: S.current.home_localization_advanced_title(
homeUIState.scInstalledPath ?? "-"),
context,
content: state.workingText.isNotEmpty
? Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const ProgressRing(),
const SizedBox(height: 12),
Text(state.workingText),
],
),
)
: Column(
children: [
if (state.errorMessage.isNotEmpty)
UnP4kErrorWidget(
errorMessage: state.errorMessage,
)
else ...[
Row(
children: [
const SizedBox(width: 12),
Expanded(
child: Row(
children: [
Text(
S.current.home_localization_advanced_msg_version(
state.apiLocalizationData?.versionName ??
"-"),
),
const SizedBox(width: 12),
Button(
onPressed: onSwitchFile,
child: const Padding(
padding: EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
child: Icon(FluentIcons.switch_widget),
)),
if (state.customizeGlobalIni != null) ...[
const SizedBox(width: 12),
Button(
onPressed: () {
model.setCustomizeGlobalIni(null);
},
child: const Padding(
padding: EdgeInsets.symmetric(
horizontal: 6, vertical: 3),
child: Icon(FluentIcons.delete),
)),
]
],
)),
Text(S.current.home_localization_advanced_title_msg(
state.serverGlobalIniLines,
state.p4kGlobalIniLines)),
const SizedBox(width: 32),
Button(
child: Padding(
padding: const EdgeInsets.only(
left: 12, right: 12, top: 4, bottom: 4),
child: Text(S.current
.home_localization_advanced_action_install),
),
onPressed: () async {
await model.doInstall().unwrap(context: context);
}),
const SizedBox(width: 12),
],
),
Expanded(
child:
_makeBody(context, homeUIState, state, ref, model)),
]
],
));
}
Widget _makeBody(
BuildContext context,
HomeUIModelState homeUIState,
AdvancedLocalizationUIState state,
WidgetRef ref,
AdvancedLocalizationUIModel model) {
return AlignedGridView.count(
crossAxisCount: 4,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
padding: const EdgeInsets.all(12),
itemBuilder: (BuildContext context, int index) {
final item = state.classMap!.values.elementAt(index);
return Container(
padding: const EdgeInsets.only(top: 6, bottom: 12),
decoration: BoxDecoration(
color: Colors.white.withOpacity(.05),
borderRadius: BorderRadius.circular(4),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
IconButton(
onPressed:
item.isWorking ? null : () => _showContent(context, item),
icon: Padding(
padding: const EdgeInsets.only(left: 12, right: 12),
child: Row(
children: [
Expanded(
child: Text(
"${item.className}",
style: const TextStyle(
fontSize: 16, fontWeight: FontWeight.bold),
textAlign: TextAlign.start,
)),
Text(
"${item.valuesMap.length}",
style: TextStyle(
fontSize: 14,
color: Colors.white.withOpacity(.6),
),
),
const SizedBox(width: 6),
Icon(
FluentIcons.chevron_right,
color: Colors.white.withOpacity(.6),
size: 16,
),
],
),
),
),
Container(
margin: const EdgeInsets.only(top: 6, bottom: 12),
width: MediaQuery.of(context).size.width,
height: 1,
color: Colors.white.withOpacity(.1),
),
if (item.isWorking)
Column(
children: [
makeLoading(context),
const SizedBox(height: 6),
Text(
S.current.home_localization_advanced_action_mod_change),
],
)
else ...[
Padding(
padding: const EdgeInsets.only(left: 12, right: 12),
child: Row(
children: [
Expanded(
child: Text(S
.current.home_localization_advanced_action_mode)),
ComboBox(
value: item.mode,
items: [
for (final type
in AppAdvancedLocalizationClassKeysDataMode
.values)
ComboBoxItem(
value: type,
child: Text(state.typeNames[type] ?? "-"),
),
],
onChanged: item.lockMod
? null
: (v) => model.onChangeMod(item,
v as AppAdvancedLocalizationClassKeysDataMode),
),
],
),
),
const SizedBox(height: 6),
SizedBox(
height: 180,
child: SuperListView.builder(
itemCount: item.valuesMap.length,
padding: const EdgeInsets.only(left: 12, right: 12),
itemBuilder: (BuildContext context, int index) {
final itemKey = item.valuesMap.keys.elementAt(index);
return Text(
"${item.valuesMap[itemKey]}",
maxLines: 1,
style: const TextStyle(
fontSize: 12,
overflow: TextOverflow.ellipsis,
),
);
},
),
),
],
],
),
);
},
itemCount: state.classMap?.length ?? 0,
);
}
_showContent(
BuildContext context, AppAdvancedLocalizationClassKeysData item) {
showDialog(
context: context,
builder: (BuildContext context) {
return HookConsumer(
builder: (BuildContext context, WidgetRef ref, Widget? child) {
final textData = useState("");
loadData() async {
final v = StringBuffer("");
for (var element in item.valuesMap.entries) {
v.write("${element.key}=${element.value}\n");
await Future.delayed(Duration.zero);
}
textData.value = v.toString();
}
useEffect(() {
loadData();
return null;
}, const []);
return ContentDialog(
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * .8,
),
title: Row(
children: [
IconButton(
icon: const Icon(
FluentIcons.back,
size: 22,
),
onPressed: () => context.pop()),
const SizedBox(
width: 24,
),
Text(S.current.home_localization_advanced_title_preview(
item.className ?? "-")),
],
),
content: textData.value.isEmpty
? makeLoading(context)
: Container(
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(7),
),
child: CodeEditor(
readOnly: true,
controller:
CodeLineEditingController.fromText(textData.value),
style: CodeEditorStyle(
codeTheme: CodeHighlightTheme(
languages: {
'ini': CodeHighlightThemeMode(mode: langIni)
},
theme: vs2015Theme,
),
),
),
),
);
},
);
},
);
}
}

View File

@ -0,0 +1,571 @@
import 'package:starcitizen_doctor/generated/l10n.dart';
Map<String, dynamic> get advancedLocalizationJsonData => {
"class_keys": [
{
"id": "location_opt",
"class_name":
S.current.home_localization_advanced_json_text_location_other,
"keys": [
"ATC_.*",
"Crus_HistMarker_.*",
"Enroll_.*",
"Hurston_JumpPoint_.*",
"Jurisdictions_Name_.*",
"LandingPad_.*",
"Lorville_.*",
"MiningClaim_.*",
"MiningClaims_Desc_.*",
"NavBeacon_.*",
"NavPoint_.*",
"Nav_.*",
"Navpoint_.*",
"Orison_Destination_.*",
"Starfarer_Wreckage_QT_.*",
"area_.*",
"cargodeck_.*",
"dockingport_.*",
"garage_.*",
"hangar_.*",
"landing_pad_.*",
"pyro_.*",
"room_.*",
"security_.*",
"select_.*",
"shop_name_.*",
"vehicle_room_.*",
"weapons_heal_.*",
"QT_.*",
"RR_.*",
"Shubin_.*",
"Solar_system_.*",
"Bacchus.*_Desc.*",
"Cano.*_Desc.*",
"Castra.*_Desc.*",
"Delamar.*_Desc.*",
"Ellis.*_Desc.*",
"Goss.*_Desc.*",
"Hadrian.*_Desc.*",
"Levski_Shop_Teach.*_Desc.*",
"Magnus.*_Desc.*",
"Nyx.*_Desc.*",
"Oso.*_Desc.*",
"Pyro.*_Desc.*",
"Stanton.*_Desc.*",
"Taranis.*_Desc.*",
"Tarpits.*_Desc.*",
"Tayac.*_Desc.*",
"Terra.*_Desc.*",
"Virgil.*_Desc.*"
]
},
{
"id": "location",
"class_name":
S.current.home_localization_advanced_json_text_location_used,
"keys": [
"Bacchus(?!.*_Desc).*",
"Cano(?!.*_Desc).*",
"Castra(?!.*_Desc).*",
"Delamar(?!.*_Desc).*",
"Ellis(?!.*_Desc).*",
"Goss(?!.*_Desc).*",
"Hadrian(?!.*_Desc).*",
"Levski_Shop_Teach(?!.*_Desc).*",
"Magnus(?!.*_Desc).*",
"Nyx(?!.*_Desc).*",
"Oso(?!.*_Desc).*",
"Pyro(?!.*_Desc).*",
"Stanton(?!.*_Desc).*",
"Taranis(?!.*_Desc).*",
"Tarpits(?!.*_Desc).*",
"Tayac(?!.*_Desc).*",
"Terra(?!.*_Desc).*",
"Virgil(?!.*_Desc).*"
]
},
{
"class_name":
S.current.home_localization_advanced_json_text_things_other,
"id": "thing_opt",
"keys": [
"BarMenu_.*",
"FLOOR_Flair_Items.*",
"FPS_AI_.*",
"ItemPort_.*",
"itemPort_.*",
"destoryitems_.*",
"destroyItems_.*",
"kopion_.*",
"item_desc.*"
]
},
{
"class_name":
S.current.home_localization_advanced_json_text_things_used,
"id": "thing",
"keys": ["item_Name.*"]
},
{
"class_name":
S.current.home_localization_advanced_json_text_vehicle_other,
"id": "vehicle_name",
"keys": [
"vehicle_Desc.*",
"vehicl_Desc.*",
"vehicel_Desc.*",
"vehicles_.*"
]
},
{
"class_name":
S.current.home_localization_advanced_json_text_vehicle_used,
"id": "vehicle",
"keys": ["vehicle_Name.*"]
},
{
"id": "mission",
"class_name":
S.current.home_localization_advanced_json_text_mission_or_logs,
"keys": [
"BasicSalvage_.*",
"BitZeros_.*",
"BHG_.*",
"BlacJac_.*",
"BountyHuntersGuild_.*",
"BrightSky_.*",
"CThing_.*",
"ChainedDeliveryModule_.*",
"Clovis_Safe_.*",
"CommArray_.*",
"Commissary_.*",
"Community_Service.*",
"CovalexIC_.*",
"Constantine_.*",
"Covalex_.*",
"Criminal_.*",
"CrusaderSecurity_.*",
"Crusader_ReputationJournal_.*",
"Crusader_from_.*",
"DC_room_.*",
"DataHeist_.*",
"Datapad_.*",
"Delivery_.*",
"Derelict_.*",
"DestroyDebris_.*",
"DestroyEvidence_.*",
"DestroyObj_Text_.*",
"DistributionCenter_.*",
"DynamicEvent_.*",
"Eckhart_.*",
"FPSPVEVS_.*",
"FTL_.*",
"FW22_NT_Journal_Title_.*",
"ForceDepletion_.*",
"GLoc_Bartender_Conv_.*",
"GMCapture_.*",
"GarethWIP_.*",
"Gathering_.*",
"Gen_NPC_Conv_.*",
"Greeter_.*",
"HeadHunters_.*",
"HexPenetrator_.*",
"Hurston_ReputationJournal_.*",
"Hurston_bounty_.*",
"Hurston_destroystash_.*",
"Hurston_eliminateall_.*",
"Hurston_eliminatespecifc_.*",
"Hurston_killcreatureslocation_.*",
"Hurston_searchbody_.*",
"IAE2951_.*",
"IAE2952_.*",
"IAE952_.*",
"Info_Kiosks_.*",
"Infractions_.*",
"Investigation_.*",
"Invictus2951_.*",
"Invictus_.*",
"JournalEntry_.*",
"JournalText.*",
"Journal_.*",
"Jumptown2_.*",
"JurisdictionJournals_.*",
"Kill_Civ_.*",
"LingFamily_.*",
"Ling_.*",
"LocalDelivery_.*",
"Local_Delivery_.*",
"MG_.*",
"MTPS_.*",
"MTProtectiveServices_.*",
"MilesEckhart_.*",
"Mission.*",
"Missions.*",
"Mtps_killallcreatures_.*",
"NB_.*",
"NPE_.*",
"NTLockdown_.*",
"Name_.*",
"NorthRock_.*",
"Orison_CRUShowroom_.*",
"Orison_DiscoverySpot_.*",
"OutlawSweep_.*",
"Outpost_.*",
"Pacheco_.*",
"PreventData_.*",
"ProtLife_.*",
"RAIN_.*",
"RacingRep_.*",
"Racing_Ship_DisplayName.*",
"RedWind_.*",
"RepScope_.*",
"RepStanding_.*",
"RepairOxygenKiosk_.*",
"Reststop_.*",
"RetakeLocation_.*",
"RetrieveConsignment_.*",
"RetrieveDatapad_.*",
"ReturnObjective_.*",
"ReturnToLocation_.*",
"Roughready_.*",
"Ruto_.*",
"SB_.*",
"SalvageContractor_.*",
"ScanVehicleLocationModule_.*",
"ScrambleRace_.*",
"ScreamingGalsons_.*",
"ServiceBeacon_.*",
"ShipName_.*",
"ShipStrip_.*",
"Special_Event_.*",
"Station_Illegal_.*",
"Staton4_NewBab_.*",
"StealEvidence_.*",
"TarPits_.*",
"Temp_.*",
"Terminal_.*",
"Text_.*",
"TimeSensative_.*",
"TimeSensitive_.*",
"TimeTrial_.*",
"TimedSalvage_.*",
"TransportGuild_.*",
"TravelObjective_.*",
"Tut.*",
"Tutorial.*",
"UDM_.*",
"Vaughn_.*",
"VendingMachien_.*",
"VendingMachin_.*",
"VendingMachine_.*",
"WSTR_.*",
"WantedLevel5_.*",
"XenoThreat_.*",
"acquirepart_.*",
"alt_criminal_collect_reclaimer_desc.*",
"aracersurvivesrace_.*",
"assassin_.*",
"assassination_.*",
"asteroidfield_.*",
"basesweep_.*",
"bitzeros_.*",
"blacJac_.*",
"blackbox_.*",
"blackboxillegal_.*",
"blackboxlegal_.*",
"boarders_.*",
"bounty_.*",
"bountymarker_.*",
"cave_.*",
"ccdemo19_.*",
"cdf_.*",
"cfp_.*",
"civilian_.*",
"claimsweep_.*",
"collect_reclaimer_.*",
"combatassist_.*",
"commarray_hack_.*",
"commarray_repair_.*",
"confirmkill_.*",
"constantine_.*",
"criminal_.*",
"crus_.*",
"crusader_.*",
"delivery_.*",
"deliverydecoy_.*",
"deploypiggyback_.*",
"deployprobe_.*",
"destroyblade_.*",
"destroyitem_.*",
"destroyitems_.*",
"destroyitemsspace_.*",
"destroyprobe_.*",
"destroyprobeillegal_.*",
"destroyprobelegal_.*",
"destroyprove_illegal_.*",
"destroystash_.*",
"dfmcrusader_.*",
"distraction_.*",
"distractionkill_.*",
"dusters_.*",
"ecn_.*",
"eliminatespecificracer_.*",
"escort_.*",
"escortscan_.*",
"fleetweek2950_.*",
"fps_.*",
"goupbounty_.*",
"groupbounty_.*",
"hack_prevent_.*",
"hdactivist_.*",
"headhunters_.*",
"hurston_.*",
"iae2953_.*",
"kareah_.*",
"kareahsweep_.*",
"killallanimal_.*",
"killallanimals_.*",
"killallkopion_.*",
"killallmarok_.*",
"killanimalslocation_.*",
"killatlocation_.*",
"killcollect_.*",
"killcollectanimal_.*",
"killcollectkopion_.*",
"killcollectmarok_.*",
"loc_.*",
"manufacturer_.*",
"meet_miles_.*",
"mgClovus_.*",
"mg_*",
"missionManager_.*",
"mission_.*",
"mtps_.*",
"murderspree_.*",
"mustcomesecond_.*",
"ninetails_.*",
"northrock_.*",
"notification_.*",
"openbounty_.*",
"outlawsweep_.*",
"outpost_.*",
"p_protectandresupply_.*",
"p_showdown_.*",
"pickanddestroy_.*",
"planetcollect_.*",
"prisonerbreak_.*",
"prisonermanifest_.*",
"protlife_.*",
"racelastforxcheckpoints_.*",
"recoverspace_.*",
"recoverstash_.*",
"recoverstolen_.*",
"recovery_.*",
"redwind_.*",
"roughready_.*",
"sandbox_.*",
"seachbody_.*",
"searchbody_.*",
"searchcrew_.*",
"sectorsweep_.*",
"shubin_.*",
"shuttle_.*",
"spacecargo_.*",
"spacecollect_.*",
"spacesteal_.*",
"stanton.*",
"stealfromship_.*",
"stealitem_.*",
"takecheckpointsxandy_.*",
"ugf_.*",
"vaughn_.*",
"winwithoutkillingracer_.*",
"xdamagetoracersinorder_.*",
"xenothreat_.*"
]
},
{
"id": "subtitle",
"class_name": S.current.home_localization_advanced_json_text_subtitle,
"keys": [
"DXSH_",
"Dlg_SC_.*",
"FW22_NT_Datapad_.*",
"FleetWeek2950_.*",
"GenResponse_.*",
"GenericLanding_.*",
"IT_Shared_.*",
"Imperilled_.*",
"MKTG_CUSTOMS1_CV_Access_.*",
"PH_PU_.*",
"PU_.*",
"Pacheco_.*",
"SC_ac_.*",
"SC_lz_.*",
"SM_SIMANN1_.*",
"contract_.*",
"covalex_.*",
"covalexrand_.*",
"covalexspec_.*"
]
},
{
"id": "ui",
"class_name":
S.current.home_localization_advanced_json_text_ui_or_hud_or_menu,
"keys": [
".*_RepUI_.*",
"CharacterCustomizer_.*",
".*_OEM_UI_.*",
"DownloadConnectivity_.*",
"DownloadError_.*",
"DownloadStalled_.*",
"DownloadState_.*",
"Download_BrowseForFolder",
"Exit_Screen_.*",
"FW2022_DatapadScreen_.*",
"FW2022_IFFIscreen_.*",
"FW2022_TransferScreen_.*",
"FW22_NT_Journal_Body_.*",
".*_DisplayName_.*",
"FreightElevator_.*",
"Frontend_.*",
"Fines_.*",
"FireMode_.*",
"GraceWarnings_.*",
"HUD_.*",
"Heads_Male_.*",
"Hints_.*",
"Human_Crew_.*",
"Human_First_Names_.*",
"Human_Nicknames_.*",
"Human_Security_Titles_.*",
"Human_Surnames_.*",
"HurDynDrugUGF_.*",
"HurDynMining_.*",
"HurstonSecurity_.*",
"Inner_.*",
"Kareah_.*",
"KeypadButton_.*",
"KeypadDisplay_.*",
"Map_Header_.*",
"Maps_.*",
"Marker_.*",
"Markers_.*",
"MurderSpree.*",
"NPC_Interact_Generic_.*",
"Out_of_Quantum_fuel.*",
"Oxygen_Screen_.*",
"PAUSE_OPTIONS_.*",
"PBay_.*",
"PIT_.*",
"PrisonKeypadPass_.*",
"Prison_.*",
"Prisoner.*",
"RN_.*",
"ShipSelector_.*",
"SkyLine_.*",
"Takedown.*",
"UEERanks_.*",
"UGF_.*",
"UI_.*",
"UnitedWorkersOfHurston_.*",
"Usable_CommTower_.*",
"Usable_Terminal_.*",
"Vehicle_Container_.*",
"actor_.*",
"ad_.*",
"airlock_.*",
"annun_.*",
"cargoTransfer_HUD_.*",
"cargo_.*",
"cc_.*",
"chat_.*",
"citizencon16_.*",
"cockpit_screen_.*",
"comm_.*",
"comms_.*",
"concate_.*",
"constellation_rear_tube.*",
"crate_panel_.*",
"defend_UGF_.*",
"dfm_.*",
"diff_notification_ui_.*",
"docking_.*",
"ea_popup_.*",
"ea_ui_.*",
"elevator_.*",
"engineering_.*",
"entrance_.*",
"fine_terminal_.*",
"flightHUD_.*",
"frontend_.*",
"generic_.*",
"global_terminal_.*",
"group_.*",
"hack_program_.*",
"hud_.*",
"infopanel_.*",
"innerthought_.*",
"input_.*",
"install_.*",
"interaction_.*",
"interiormap_.*",
"invictus_.*",
"journal_.*",
"kiosk_.*",
"law_.*",
"lens_.*",
"loadout_.*",
"mG_.*",
"masterMode_.*",
"me_.*",
"med_.*",
"medbed_.*",
"mfd_.*",
"mm_LobbyStatus_.*",
"mobiGlas_.*",
"mobiglas_.*",
"navitem_.*",
"net_dialog_.*",
"operatorMode_.*",
"panel_.*",
"pause_.*",
"pit_.*",
"port_Name.*",
"quantum_hud_.*",
"rc_ScanInfo_.*",
"refinery_ui_.*",
"refueling_HUD_.*",
"refueling_ui_.*",
"respawn_hud_.*",
"salvage_.*",
"scan_data_.*",
"scrambleracesubmissions_.*",
"shop_ui_.*",
"sm_ui_.*",
"spaceship_.*",
"starmap_.*",
"stomp_warning_.*",
"swapWheel_.*",
"system_.*",
"target_hud_.*",
"terminal_.*",
"text_.*",
"transit_.*",
"tutorial_.*",
"ui_.*",
"unittest_.*",
"usable_.*",
"vehicle_Type.*",
"vehicle_class_.*",
"vehicle_deck_.*",
"vehicle_focus_.*",
"vehicle_gunnery_hud_.*",
"vehicle_interactor_.*",
"weapon_stats.*",
"warning_.*"
]
}
]
};

View File

@ -0,0 +1,311 @@
import 'dart:async';
import 'dart:io';
import 'package:flutter/foundation.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/data/app_advanced_localization_data.dart';
import 'package:starcitizen_doctor/data/sc_localization_data.dart';
import 'package:starcitizen_doctor/provider/unp4kc.dart';
import '../home_ui_model.dart';
import 'advanced_localization_ui.json.dart';
import 'localization_ui_model.dart';
part 'advanced_localization_ui_model.g.dart';
part 'advanced_localization_ui_model.freezed.dart';
@freezed
class AdvancedLocalizationUIState with _$AdvancedLocalizationUIState {
factory AdvancedLocalizationUIState({
@Default("") String workingText,
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni,
String? serverGlobalIni,
String? customizeGlobalIni,
ScLocalizationData? apiLocalizationData,
@Default(0) int p4kGlobalIniLines,
@Default(0) int serverGlobalIniLines,
@Default("") String errorMessage,
}) = _AdvancedLocalizationUIState;
}
extension AdvancedLocalizationUIStateEx on AdvancedLocalizationUIState {
Map<AppAdvancedLocalizationClassKeysDataMode, String> get typeNames => {
AppAdvancedLocalizationClassKeysDataMode.localization:
S.current.home_localization_advanced_action_mod_change_localization,
AppAdvancedLocalizationClassKeysDataMode.unLocalization: S.current
.home_localization_advanced_action_mod_change_un_localization,
AppAdvancedLocalizationClassKeysDataMode.mixed:
S.current.home_localization_advanced_action_mod_change_mixed,
AppAdvancedLocalizationClassKeysDataMode.mixedNewline: S
.current.home_localization_advanced_action_mod_change_mixed_newline,
};
}
@riverpod
class AdvancedLocalizationUIModel extends _$AdvancedLocalizationUIModel {
@override
AdvancedLocalizationUIState build() {
final localizationUIState = ref.read(localizationUIModelProvider);
final localizationUIModel = ref.read(localizationUIModelProvider.notifier);
state = AdvancedLocalizationUIState(classMap: {});
_init(localizationUIState, localizationUIModel);
return state;
}
Future<void> _init(LocalizationUIState localizationUIState,
LocalizationUIModel localizationUIModel) async {
final (p4kGlobalIni, serverGlobalIni) =
await _readIni(localizationUIState, localizationUIModel);
final ald = await _readClassJson();
if (ald.classKeys == null) return;
state = state.copyWith(
workingText: S.current.home_localization_advanced_msg_classifying);
final m = await compute(_doClassIni, (
ald,
p4kGlobalIni,
serverGlobalIni,
S.current.home_localization_advanced_json_text_un_localization,
S.current.home_localization_advanced_json_text_others
));
final p4kGlobalIniLines = p4kGlobalIni.split("\n").length;
final serverGlobalIniLines = serverGlobalIni.split("\n").length;
state = state.copyWith(
workingText: "",
p4kGlobalIni: p4kGlobalIni,
serverGlobalIni: serverGlobalIni,
p4kGlobalIniLines: p4kGlobalIniLines,
serverGlobalIniLines: serverGlobalIniLines,
classMap: m);
}
void setCustomizeGlobalIni(String? data) async {
state = state.copyWith(customizeGlobalIni: data);
final localizationUIState = ref.read(localizationUIModelProvider);
final localizationUIModel = ref.read(localizationUIModelProvider.notifier);
await _init(localizationUIState, localizationUIModel);
}
static Map<String, AppAdvancedLocalizationClassKeysData> _doClassIni(
(
AppAdvancedLocalizationData ald,
String p4kGlobalIni,
String serverGlobalIni,
String unLocalizationClassName,
String othersClassName,
) v,
) {
final (
AppAdvancedLocalizationData ald,
String p4kGlobalIni,
String serverGlobalIni,
String unLocalizationClassName,
String othersClassName,
) = v;
final unLocalization = AppAdvancedLocalizationClassKeysData(
id: "un_localization",
className: unLocalizationClassName,
keys: [],
)
..mode = AppAdvancedLocalizationClassKeysDataMode.unLocalization
..lockMod = true;
final unClass = AppAdvancedLocalizationClassKeysData(
id: "un_class",
className: othersClassName,
keys: [],
);
final classMap = <String, AppAdvancedLocalizationClassKeysData>{
for (final keys in ald.classKeys!) keys.id ?? "": keys,
};
final p4kIniMap = readIniAsMap(p4kGlobalIni);
final serverIniMap = readIniAsMap(serverGlobalIni);
var regexList = classMap.values
.expand((c) =>
c.keys!.map((k) => MapEntry(c, RegExp(k, caseSensitive: false))))
.toList();
iniKeysLoop:
for (var p4kIniKey in p4kIniMap.keys) {
final serverValue = serverIniMap[p4kIniKey];
if (serverValue == null || serverValue.trim().isEmpty) {
final p4kValue = p4kIniMap[p4kIniKey] ?? "";
if (p4kValue.trim().isNotEmpty) {
unLocalization.valuesMap[p4kIniKey] = p4kValue;
}
continue iniKeysLoop;
} else {
for (var item in regexList) {
if (p4kIniKey.startsWith(item.value)) {
item.key.valuesMap[p4kIniKey] = serverValue;
serverIniMap.remove(p4kIniKey);
continue iniKeysLoop;
}
}
}
}
if (serverIniMap.isNotEmpty) {
for (var element in serverIniMap.keys) {
unClass.valuesMap[element] = serverIniMap[element] ?? "";
}
classMap[unClass.id!] = unClass;
}
if (unLocalization.valuesMap.isNotEmpty) {
classMap[unLocalization.id!] = unLocalization;
}
return classMap;
}
static Map<String, String> readIniAsMap(String iniString) {
final iniMap = <String, String>{};
for (final line in iniString.split("\n")) {
final index = line.indexOf("=");
if (index == -1) continue;
final key = line.substring(0, index).trim();
final value = line.substring(index + 1).trim();
iniMap[key] = value;
}
return iniMap;
}
Future<AppAdvancedLocalizationData> _readClassJson() async {
return AppAdvancedLocalizationData.fromJson(advancedLocalizationJsonData);
}
Future<(String, String)> _readIni(LocalizationUIState localizationUIState,
LocalizationUIModel localizationUIModel) async {
final homeUIState = ref.read(homeUIModelProvider);
final gameDir = homeUIState.scInstalledPath;
if (gameDir == null) return ("", "");
state = state.copyWith(
workingText: S.current.home_localization_advanced_msg_reading_p4k);
final p4kGlobalIni = await readEnglishInI(gameDir);
dPrint("read p4kGlobalIni => ${p4kGlobalIni.length}");
state = state.copyWith(
workingText: S.current
.home_localization_advanced_msg_reading_server_localization_text);
if (state.customizeGlobalIni != null) {
final apiLocalizationData = ScLocalizationData(
versionName: S.current.localization_info_custom_files,
info: "Customize");
state = state.copyWith(apiLocalizationData: apiLocalizationData);
return (p4kGlobalIni, state.customizeGlobalIni!);
} else {
final apiLocalizationData =
localizationUIState.apiLocalizationData?.values.firstOrNull;
if (apiLocalizationData == null) return ("", "");
final file = File(
"${localizationUIModel.getDownloadDir().absolute.path}\\${apiLocalizationData.versionName}.sclang");
if (!await file.exists()) {
await localizationUIModel.downloadLocalizationFile(
file, apiLocalizationData);
}
state = state.copyWith(apiLocalizationData: apiLocalizationData);
final serverGlobalIni =
(await compute(LocalizationUIModel.readArchive, file.absolute.path))
.toString();
dPrint("read serverGlobalIni => ${serverGlobalIni.length}");
return (p4kGlobalIni, serverGlobalIni);
}
}
Future<String> readEnglishInI(String gameDir) async {
try {
var data = await Unp4kCModel.unp4kTools(
appGlobalState.applicationBinaryModuleDir!, [
"extract_memory",
"$gameDir\\Data.p4k",
"Data\\Localization\\english\\global.ini"
]);
// remove bom
if (data.length > 3 &&
data[0] == 0xEF &&
data[1] == 0xBB &&
data[2] == 0xBF) {
data = data.sublist(3);
}
final iniData = String.fromCharCodes(data);
return iniData;
} catch (e) {
final errorMessage = e.toString();
if (Unp4kCModel.checkRunTimeError(errorMessage)) {
AnalyticsApi.touch("advanced_localization_no_runtime");
}
state = state.copyWith(
errorMessage: errorMessage,
);
// rethrow;
}
return "";
}
onChangeMod(AppAdvancedLocalizationClassKeysData item,
AppAdvancedLocalizationClassKeysDataMode mode) async {
if (item.lockMod) return;
item.mode = mode;
item.isWorking = true;
final classMap =
Map<String, AppAdvancedLocalizationClassKeysData>.from(state.classMap!);
classMap[item.id!] = item;
state = state.copyWith(classMap: classMap);
final p4kIniMap = readIniAsMap(state.p4kGlobalIni!);
final serverIniMap = readIniAsMap(state.serverGlobalIni!);
final newValuesMap = <String, String>{};
for (var kv in item.valuesMap.entries) {
switch (mode) {
case AppAdvancedLocalizationClassKeysDataMode.localization:
newValuesMap[kv.key] = serverIniMap[kv.key] ?? "";
break;
case AppAdvancedLocalizationClassKeysDataMode.unLocalization:
newValuesMap[kv.key] = p4kIniMap[kv.key] ?? "";
break;
case AppAdvancedLocalizationClassKeysDataMode.mixed:
newValuesMap[kv.key] =
"${serverIniMap[kv.key]} [${p4kIniMap[kv.key]}]";
break;
case AppAdvancedLocalizationClassKeysDataMode.mixedNewline:
newValuesMap[kv.key] =
"${serverIniMap[kv.key]}\\n${p4kIniMap[kv.key]}";
break;
}
await Future.delayed(Duration.zero);
}
item.valuesMap = newValuesMap;
item.isWorking = false;
classMap[item.id!] = item;
state = state.copyWith(classMap: classMap);
}
Future<bool> doInstall() async {
AnalyticsApi.touch("advanced_localization_apply");
state = state.copyWith(
workingText:
S.current.home_localization_advanced_msg_gen_localization_text);
final classMap = state.classMap!;
final globalIni = StringBuffer();
for (var item in classMap.values) {
for (var kv in item.valuesMap.entries) {
globalIni.write("${kv.key}=${kv.value}\n");
await Future.delayed(Duration.zero);
}
}
state = state.copyWith(
workingText:
S.current.home_localization_advanced_msg_gen_localization_install);
final localizationUIModel = ref.read(localizationUIModelProvider.notifier);
await localizationUIModel.installFormString(
globalIni, state.apiLocalizationData?.versionName ?? "-",
advanced: true);
state = state.copyWith(workingText: "");
return true;
}
}

View File

@ -0,0 +1,366 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'advanced_localization_ui_model.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$AdvancedLocalizationUIState {
String get workingText => throw _privateConstructorUsedError;
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap =>
throw _privateConstructorUsedError;
String? get p4kGlobalIni => throw _privateConstructorUsedError;
String? get serverGlobalIni => throw _privateConstructorUsedError;
String? get customizeGlobalIni => throw _privateConstructorUsedError;
ScLocalizationData? get apiLocalizationData =>
throw _privateConstructorUsedError;
int get p4kGlobalIniLines => throw _privateConstructorUsedError;
int get serverGlobalIniLines => throw _privateConstructorUsedError;
String get errorMessage => throw _privateConstructorUsedError;
/// Create a copy of AdvancedLocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$AdvancedLocalizationUIStateCopyWith<AdvancedLocalizationUIState>
get copyWith => throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $AdvancedLocalizationUIStateCopyWith<$Res> {
factory $AdvancedLocalizationUIStateCopyWith(
AdvancedLocalizationUIState value,
$Res Function(AdvancedLocalizationUIState) then) =
_$AdvancedLocalizationUIStateCopyWithImpl<$Res,
AdvancedLocalizationUIState>;
@useResult
$Res call(
{String workingText,
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni,
String? serverGlobalIni,
String? customizeGlobalIni,
ScLocalizationData? apiLocalizationData,
int p4kGlobalIniLines,
int serverGlobalIniLines,
String errorMessage});
}
/// @nodoc
class _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
$Val extends AdvancedLocalizationUIState>
implements $AdvancedLocalizationUIStateCopyWith<$Res> {
_$AdvancedLocalizationUIStateCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of AdvancedLocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? workingText = null,
Object? classMap = freezed,
Object? p4kGlobalIni = freezed,
Object? serverGlobalIni = freezed,
Object? customizeGlobalIni = freezed,
Object? apiLocalizationData = freezed,
Object? p4kGlobalIniLines = null,
Object? serverGlobalIniLines = null,
Object? errorMessage = null,
}) {
return _then(_value.copyWith(
workingText: null == workingText
? _value.workingText
: workingText // ignore: cast_nullable_to_non_nullable
as String,
classMap: freezed == classMap
? _value.classMap
: classMap // ignore: cast_nullable_to_non_nullable
as Map<String, AppAdvancedLocalizationClassKeysData>?,
p4kGlobalIni: freezed == p4kGlobalIni
? _value.p4kGlobalIni
: p4kGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
serverGlobalIni: freezed == serverGlobalIni
? _value.serverGlobalIni
: serverGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
customizeGlobalIni: freezed == customizeGlobalIni
? _value.customizeGlobalIni
: customizeGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
apiLocalizationData: freezed == apiLocalizationData
? _value.apiLocalizationData
: apiLocalizationData // ignore: cast_nullable_to_non_nullable
as ScLocalizationData?,
p4kGlobalIniLines: null == p4kGlobalIniLines
? _value.p4kGlobalIniLines
: p4kGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
serverGlobalIniLines: null == serverGlobalIniLines
? _value.serverGlobalIniLines
: serverGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
errorMessage: null == errorMessage
? _value.errorMessage
: errorMessage // ignore: cast_nullable_to_non_nullable
as String,
) as $Val);
}
}
/// @nodoc
abstract class _$$AdvancedLocalizationUIStateImplCopyWith<$Res>
implements $AdvancedLocalizationUIStateCopyWith<$Res> {
factory _$$AdvancedLocalizationUIStateImplCopyWith(
_$AdvancedLocalizationUIStateImpl value,
$Res Function(_$AdvancedLocalizationUIStateImpl) then) =
__$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{String workingText,
Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
String? p4kGlobalIni,
String? serverGlobalIni,
String? customizeGlobalIni,
ScLocalizationData? apiLocalizationData,
int p4kGlobalIniLines,
int serverGlobalIniLines,
String errorMessage});
}
/// @nodoc
class __$$AdvancedLocalizationUIStateImplCopyWithImpl<$Res>
extends _$AdvancedLocalizationUIStateCopyWithImpl<$Res,
_$AdvancedLocalizationUIStateImpl>
implements _$$AdvancedLocalizationUIStateImplCopyWith<$Res> {
__$$AdvancedLocalizationUIStateImplCopyWithImpl(
_$AdvancedLocalizationUIStateImpl _value,
$Res Function(_$AdvancedLocalizationUIStateImpl) _then)
: super(_value, _then);
/// Create a copy of AdvancedLocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? workingText = null,
Object? classMap = freezed,
Object? p4kGlobalIni = freezed,
Object? serverGlobalIni = freezed,
Object? customizeGlobalIni = freezed,
Object? apiLocalizationData = freezed,
Object? p4kGlobalIniLines = null,
Object? serverGlobalIniLines = null,
Object? errorMessage = null,
}) {
return _then(_$AdvancedLocalizationUIStateImpl(
workingText: null == workingText
? _value.workingText
: workingText // ignore: cast_nullable_to_non_nullable
as String,
classMap: freezed == classMap
? _value._classMap
: classMap // ignore: cast_nullable_to_non_nullable
as Map<String, AppAdvancedLocalizationClassKeysData>?,
p4kGlobalIni: freezed == p4kGlobalIni
? _value.p4kGlobalIni
: p4kGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
serverGlobalIni: freezed == serverGlobalIni
? _value.serverGlobalIni
: serverGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
customizeGlobalIni: freezed == customizeGlobalIni
? _value.customizeGlobalIni
: customizeGlobalIni // ignore: cast_nullable_to_non_nullable
as String?,
apiLocalizationData: freezed == apiLocalizationData
? _value.apiLocalizationData
: apiLocalizationData // ignore: cast_nullable_to_non_nullable
as ScLocalizationData?,
p4kGlobalIniLines: null == p4kGlobalIniLines
? _value.p4kGlobalIniLines
: p4kGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
serverGlobalIniLines: null == serverGlobalIniLines
? _value.serverGlobalIniLines
: serverGlobalIniLines // ignore: cast_nullable_to_non_nullable
as int,
errorMessage: null == errorMessage
? _value.errorMessage
: errorMessage // ignore: cast_nullable_to_non_nullable
as String,
));
}
}
/// @nodoc
class _$AdvancedLocalizationUIStateImpl
with DiagnosticableTreeMixin
implements _AdvancedLocalizationUIState {
_$AdvancedLocalizationUIStateImpl(
{this.workingText = "",
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
this.p4kGlobalIni,
this.serverGlobalIni,
this.customizeGlobalIni,
this.apiLocalizationData,
this.p4kGlobalIniLines = 0,
this.serverGlobalIniLines = 0,
this.errorMessage = ""})
: _classMap = classMap;
@override
@JsonKey()
final String workingText;
final Map<String, AppAdvancedLocalizationClassKeysData>? _classMap;
@override
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap {
final value = _classMap;
if (value == null) return null;
if (_classMap is EqualUnmodifiableMapView) return _classMap;
// ignore: implicit_dynamic_type
return EqualUnmodifiableMapView(value);
}
@override
final String? p4kGlobalIni;
@override
final String? serverGlobalIni;
@override
final String? customizeGlobalIni;
@override
final ScLocalizationData? apiLocalizationData;
@override
@JsonKey()
final int p4kGlobalIniLines;
@override
@JsonKey()
final int serverGlobalIniLines;
@override
@JsonKey()
final String errorMessage;
@override
String toString({DiagnosticLevel minLevel = DiagnosticLevel.info}) {
return 'AdvancedLocalizationUIState(workingText: $workingText, classMap: $classMap, p4kGlobalIni: $p4kGlobalIni, serverGlobalIni: $serverGlobalIni, customizeGlobalIni: $customizeGlobalIni, apiLocalizationData: $apiLocalizationData, p4kGlobalIniLines: $p4kGlobalIniLines, serverGlobalIniLines: $serverGlobalIniLines, errorMessage: $errorMessage)';
}
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
properties
..add(DiagnosticsProperty('type', 'AdvancedLocalizationUIState'))
..add(DiagnosticsProperty('workingText', workingText))
..add(DiagnosticsProperty('classMap', classMap))
..add(DiagnosticsProperty('p4kGlobalIni', p4kGlobalIni))
..add(DiagnosticsProperty('serverGlobalIni', serverGlobalIni))
..add(DiagnosticsProperty('customizeGlobalIni', customizeGlobalIni))
..add(DiagnosticsProperty('apiLocalizationData', apiLocalizationData))
..add(DiagnosticsProperty('p4kGlobalIniLines', p4kGlobalIniLines))
..add(DiagnosticsProperty('serverGlobalIniLines', serverGlobalIniLines))
..add(DiagnosticsProperty('errorMessage', errorMessage));
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$AdvancedLocalizationUIStateImpl &&
(identical(other.workingText, workingText) ||
other.workingText == workingText) &&
const DeepCollectionEquality().equals(other._classMap, _classMap) &&
(identical(other.p4kGlobalIni, p4kGlobalIni) ||
other.p4kGlobalIni == p4kGlobalIni) &&
(identical(other.serverGlobalIni, serverGlobalIni) ||
other.serverGlobalIni == serverGlobalIni) &&
(identical(other.customizeGlobalIni, customizeGlobalIni) ||
other.customizeGlobalIni == customizeGlobalIni) &&
(identical(other.apiLocalizationData, apiLocalizationData) ||
other.apiLocalizationData == apiLocalizationData) &&
(identical(other.p4kGlobalIniLines, p4kGlobalIniLines) ||
other.p4kGlobalIniLines == p4kGlobalIniLines) &&
(identical(other.serverGlobalIniLines, serverGlobalIniLines) ||
other.serverGlobalIniLines == serverGlobalIniLines) &&
(identical(other.errorMessage, errorMessage) ||
other.errorMessage == errorMessage));
}
@override
int get hashCode => Object.hash(
runtimeType,
workingText,
const DeepCollectionEquality().hash(_classMap),
p4kGlobalIni,
serverGlobalIni,
customizeGlobalIni,
apiLocalizationData,
p4kGlobalIniLines,
serverGlobalIniLines,
errorMessage);
/// Create a copy of AdvancedLocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl>
get copyWith => __$$AdvancedLocalizationUIStateImplCopyWithImpl<
_$AdvancedLocalizationUIStateImpl>(this, _$identity);
}
abstract class _AdvancedLocalizationUIState
implements AdvancedLocalizationUIState {
factory _AdvancedLocalizationUIState(
{final String workingText,
final Map<String, AppAdvancedLocalizationClassKeysData>? classMap,
final String? p4kGlobalIni,
final String? serverGlobalIni,
final String? customizeGlobalIni,
final ScLocalizationData? apiLocalizationData,
final int p4kGlobalIniLines,
final int serverGlobalIniLines,
final String errorMessage}) = _$AdvancedLocalizationUIStateImpl;
@override
String get workingText;
@override
Map<String, AppAdvancedLocalizationClassKeysData>? get classMap;
@override
String? get p4kGlobalIni;
@override
String? get serverGlobalIni;
@override
String? get customizeGlobalIni;
@override
ScLocalizationData? get apiLocalizationData;
@override
int get p4kGlobalIniLines;
@override
int get serverGlobalIniLines;
@override
String get errorMessage;
/// Create a copy of AdvancedLocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$AdvancedLocalizationUIStateImplCopyWith<_$AdvancedLocalizationUIStateImpl>
get copyWith => throw _privateConstructorUsedError;
}

View File

@ -0,0 +1,28 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'advanced_localization_ui_model.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
String _$advancedLocalizationUIModelHash() =>
r'8241143c6dec93cd705e6b2e65cbca711cdfe2fb';
/// See also [AdvancedLocalizationUIModel].
@ProviderFor(AdvancedLocalizationUIModel)
final advancedLocalizationUIModelProvider = AutoDisposeNotifierProvider<
AdvancedLocalizationUIModel, AdvancedLocalizationUIState>.internal(
AdvancedLocalizationUIModel.new,
name: r'advancedLocalizationUIModelProvider',
debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product')
? null
: _$advancedLocalizationUIModelHash,
dependencies: null,
allTransitiveDependencies: null,
);
typedef _$AdvancedLocalizationUIModel
= AutoDisposeNotifier<AdvancedLocalizationUIState>;
// ignore_for_file: type=lint
// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member

View File

@ -1,9 +1,14 @@
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:flutter_staggered_grid_view/flutter_staggered_grid_view.dart';
import 'package:flutter_tilt/flutter_tilt.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/data/sc_localization_data.dart'; import 'package:starcitizen_doctor/data/sc_localization_data.dart';
import 'package:starcitizen_doctor/ui/tools/tools_ui_model.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart';
import 'localization_form_file_dialog_ui.dart';
import 'localization_ui_model.dart'; import 'localization_ui_model.dart';
class LocalizationDialogUI extends HookConsumerWidget { class LocalizationDialogUI extends HookConsumerWidget {
@ -13,7 +18,7 @@ class LocalizationDialogUI extends HookConsumerWidget {
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(localizationUIModelProvider); final state = ref.watch(localizationUIModelProvider);
final model = ref.read(localizationUIModelProvider.notifier); final model = ref.read(localizationUIModelProvider.notifier);
final curInstallInfo = state.apiLocalizationData?[state.patchStatus?.value]; // final curInstallInfo = state.apiLocalizationData?[state.patchStatus?.value];
useEffect(() { useEffect(() {
addPostFrameCallback(() { addPostFrameCallback(() {
@ -56,8 +61,25 @@ class LocalizationDialogUI extends HookConsumerWidget {
width: MediaQuery.of(context).size.width, width: MediaQuery.of(context).size.width,
), ),
), ),
if (!(model.getScInstallPath() ?? "").contains("LIVE"))
Padding(
padding: const EdgeInsets.only(bottom: 12),
child: InfoBar(
title: Text(S.current
.home_localization_ptu_advanced_localization_tip_title),
content: Text(S.current
.home_localization_ptu_advanced_localization_tip_title_info),
severity: InfoBarSeverity.info,
style: InfoBarThemeData(decoration: (severity) {
return BoxDecoration(color: Colors.orange);
}, iconColor: (severity) {
return Colors.white;
}),
),
),
makeToolsListContainer(context, model, state),
makeListContainer( makeListContainer(
S.current.localization_info_translation_status, S.current.localization_info_translation,
[ [
if (state.patchStatus == null) if (state.patchStatus == null)
makeLoading(context) makeLoading(context)
@ -82,7 +104,7 @@ class LocalizationDialogUI extends HookConsumerWidget {
Row( Row(
children: [ children: [
Text(S.current.localization_info_installed_version( Text(S.current.localization_info_installed_version(
state.patchStatus?.value ?? "")), "${state.patchStatus?.value ?? ""} ${(state.isInstalledAdvanced ?? false) ? S.current.home_localization_msg_version_advanced : ""}")),
const Spacer(), const Spacer(),
if (state.patchStatus?.value != if (state.patchStatus?.value !=
S.current.home_action_info_game_built_in) S.current.home_action_info_game_built_in)
@ -119,150 +141,41 @@ class LocalizationDialogUI extends HookConsumerWidget {
), ),
], ],
), ),
AnimatedSize( const SizedBox(height: 12),
duration: const Duration(milliseconds: 130), Container(
child: (curInstallInfo != null && color: Colors.white.withOpacity(.1),
curInstallInfo.note != null && height: 1,
curInstallInfo.note!.isNotEmpty)
? Padding(
padding: const EdgeInsets.only(top: 12),
child: Container(
width: MediaQuery.of(context).size.width,
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(7)),
child: Padding(
padding: const EdgeInsets.all(12),
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Text(
S.current.localization_info_note,
style: const TextStyle(fontSize: 18),
),
const SizedBox(height: 6),
Text(
"${curInstallInfo.note}",
style: TextStyle(
color:
Colors.white.withOpacity(.8)),
)
],
),
),
),
)
: SizedBox(
width: MediaQuery.of(context).size.width,
),
), ),
const SizedBox(height: 12),
if (state.apiLocalizationData == null)
makeLoading(context)
else if (state.apiLocalizationData!.isEmpty)
Center(
child: Text(
S.current
.localization_info_no_translation_available,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(.8)),
),
)
else
AlignedGridView.count(
crossAxisCount: 2,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
itemBuilder: (BuildContext context, int index) {
final item = state.apiLocalizationData!.entries
.elementAt(index);
return makeRemoteList(context, model, item, state);
},
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: state.apiLocalizationData?.length ?? 0,
)
], ],
], ],
context), context),
makeListContainer(
S.current.localization_info_community_translation,
[
if (state.apiLocalizationData == null)
makeLoading(context)
else if (state.apiLocalizationData!.isEmpty)
Center(
child: Text(
S.current.localization_info_no_translation_available,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(.8)),
),
)
else
for (final item in state.apiLocalizationData!.entries)
makeRemoteList(context, model, item, state),
],
context),
const SizedBox(height: 12),
IconButton(
icon: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(state.enableCustomize
? FluentIcons.chevron_up
: FluentIcons.chevron_down),
const SizedBox(width: 12),
Text(S.current.localization_action_advanced_features),
],
),
onPressed: model.toggleCustomize),
AnimatedSize(
duration: const Duration(milliseconds: 130),
child: Column(
children: [
const SizedBox(height: 12),
state.enableCustomize
? makeListContainer(
S.current.localization_info_custom_text,
[
if (state.customizeList == null)
makeLoading(context)
else if (state.customizeList!.isEmpty)
Center(
child: Text(
S.current.localization_info_no_custom_text,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(.8)),
),
)
else ...[
for (final file in state.customizeList!)
Row(
children: [
Text(
model.getCustomizeFileName(file),
),
const Spacer(),
if (state.workingVersion == file)
const Padding(
padding: EdgeInsets.only(right: 12),
child: ProgressRing(),
)
else
Button(
onPressed:
model.doLocalInstall(file),
child: Padding(
padding: const EdgeInsets.only(
left: 8,
right: 8,
top: 4,
bottom: 4),
child: Text(S.current
.localization_action_install),
))
],
)
],
],
context,
actions: [
Button(
onPressed: () => model.openDir(context),
child: Padding(
padding: const EdgeInsets.all(4),
child: Row(
children: [
const Icon(FluentIcons.folder_open),
const SizedBox(width: 6),
Text(S.current.action_open_folder),
],
),
)),
])
: SizedBox(
width: MediaQuery.of(context).size.width,
)
],
),
),
], ],
), ),
), ),
@ -275,88 +188,116 @@ class LocalizationDialogUI extends HookConsumerWidget {
final isWorking = state.workingVersion.isNotEmpty; final isWorking = state.workingVersion.isNotEmpty;
final isMineWorking = state.workingVersion == item.key; final isMineWorking = state.workingVersion == item.key;
final isInstalled = state.patchStatus?.value == item.key; final isInstalled = state.patchStatus?.value == item.key;
return Padding( final isItemEnabled = ((item.value.enable ?? false));
padding: const EdgeInsets.only(bottom: 12), final tapDisabled =
child: Column( isInstalled || isWorking || !isItemEnabled || isMineWorking;
children: [ return Tilt(
Row( shadowConfig: const ShadowConfig(maxIntensity: .3),
borderRadius: BorderRadius.circular(7),
disable: tapDisabled,
child: GestureDetector(
onTap:
tapDisabled ? null : () => doInsTall(context, model, item, state),
child: Container(
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Colors.white.withOpacity(tapDisabled ? .03 : .05),
borderRadius: BorderRadius.circular(7),
),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Column( Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
Text( Expanded(
"${item.value.info}", child: Column(
style: const TextStyle(fontSize: 19), crossAxisAlignment: CrossAxisAlignment.start,
), children: [
const SizedBox(height: 4), Text(
Text( "${item.value.info}",
S.current.localization_info_version_number( style: const TextStyle(fontSize: 19),
item.value.versionName ?? ""), ),
style: TextStyle(color: Colors.white.withOpacity(.6)), const SizedBox(height: 4),
), Text(
const SizedBox(height: 4), S.current.localization_info_version_number(
Text( item.value.versionName ?? ""),
S.current.localization_info_channel( style: TextStyle(color: Colors.white.withOpacity(.6)),
item.value.gameChannel ?? ""), ),
style: TextStyle(color: Colors.white.withOpacity(.6)), const SizedBox(height: 4),
), Text(
const SizedBox(height: 4), S.current.localization_info_channel(
Text( item.value.gameChannel ?? ""),
S.current.localization_info_update_time( style: TextStyle(color: Colors.white.withOpacity(.6)),
item.value.updateAt ?? ""), ),
style: TextStyle(color: Colors.white.withOpacity(.6)), const SizedBox(height: 4),
Text(
S.current.localization_info_update_time(
item.value.updateAt ?? ""),
style: TextStyle(color: Colors.white.withOpacity(.6)),
),
],
),
), ),
if (isMineWorking)
const Padding(
padding: EdgeInsets.only(right: 12),
child: ProgressRing(),
)
else ...[
Icon(
isInstalled
? FluentIcons.check_mark
: isItemEnabled
? FluentIcons.download
: FluentIcons.disable_updates,
color: Colors.white.withOpacity(.8),
size: 18,
),
const SizedBox(width: 6),
Text(
isInstalled
? S.current.localization_info_installed
: (isItemEnabled
? S.current.localization_action_install
: S.current.localization_info_unavailable),
style: TextStyle(
color: Colors.white.withOpacity(.8),
),
),
const SizedBox(width: 6),
if ((!isInstalled) && isItemEnabled)
Icon(
FluentIcons.chevron_right,
size: 14,
color: Colors.white.withOpacity(.6),
)
]
], ],
), ),
const Spacer(), if (item.value.note != null) ...[
if (isMineWorking) const SizedBox(height: 6),
const Padding( Text(
padding: EdgeInsets.only(right: 12), "${item.value.note}",
child: ProgressRing(), maxLines: 1,
) overflow: TextOverflow.ellipsis,
else style: TextStyle(
Button( color: Colors.white.withOpacity(.4),
onPressed: ((item.value.enable == true && fontSize: 13,
!isWorking && ),
!isInstalled) ),
? model.doRemoteInstall(context, item.value) ],
: null),
child: Padding(
padding: const EdgeInsets.only(
left: 8, right: 8, top: 4, bottom: 4),
child: Row(
children: [
Padding(
padding: const EdgeInsets.only(right: 6),
child: Icon(isInstalled
? FluentIcons.check_mark
: (item.value.enable ?? false)
? FluentIcons.download
: FluentIcons.disable_updates),
),
Text(isInstalled
? S.current.localization_info_installed
: ((item.value.enable ?? false)
? S.current.localization_action_install
: S.current.localization_info_unavailable)),
],
),
)),
], ],
), ),
const SizedBox(height: 6), ),
Container(
color: Colors.white.withOpacity(.05),
height: 1,
),
],
), ),
); );
} }
Widget makeListContainer( Widget makeListContainer(
String title, List<Widget> children, BuildContext context, String title, List<Widget> children, BuildContext context,
{List<Widget> actions = const []}) { {List<Widget> actions = const [],
bool gridViewMode = false,
int gridViewCrossAxisCount = 2}) {
return Padding( return Padding(
padding: const EdgeInsets.only(bottom: 12), padding: const EdgeInsets.only(bottom: 12),
child: AnimatedSize( child: AnimatedSize(
@ -389,7 +330,20 @@ class LocalizationDialogUI extends HookConsumerWidget {
height: 1, height: 1,
), ),
const SizedBox(height: 12), const SizedBox(height: 12),
...children if (gridViewMode)
AlignedGridView.count(
crossAxisCount: gridViewCrossAxisCount,
crossAxisSpacing: 12,
mainAxisSpacing: 12,
itemBuilder: (BuildContext context, int index) {
return children[index];
},
shrinkWrap: true,
physics: const NeverScrollableScrollPhysics(),
itemCount: children.length,
)
else
...children
], ],
), ),
), ),
@ -455,4 +409,149 @@ class LocalizationDialogUI extends HookConsumerWidget {
], ],
); );
} }
doInsTall(
BuildContext context,
LocalizationUIModel model,
MapEntry<String, ScLocalizationData> item,
LocalizationUIState state) async {
final userOK = await showConfirmDialogs(
context,
"${item.value.info}",
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
S.current.localization_info_version_number(
item.value.versionName ?? ""),
style: TextStyle(color: Colors.white.withOpacity(.6)),
),
const SizedBox(height: 4),
Text(
S.current
.localization_info_channel(item.value.gameChannel ?? ""),
style: TextStyle(color: Colors.white.withOpacity(.6)),
),
const SizedBox(height: 4),
Text(
S.current
.localization_info_update_time(item.value.updateAt ?? ""),
style: TextStyle(color: Colors.white.withOpacity(.6)),
),
],
),
const SizedBox(height: 12),
Container(
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(7)),
padding: const EdgeInsets.all(12),
child: Row(
children: [
Expanded(
child: Text(
item.value.note ?? S.current.home_localization_msg_no_note,
style: const TextStyle(fontSize: 15),
),
),
],
),
),
],
),
confirm: S.current.localization_action_install,
cancel: S.current.home_action_cancel,
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * .45),
);
if (userOK) {
if (!context.mounted) return;
model.doRemoteInstall(context, item.value)?.call();
}
}
Widget makeToolsListContainer(BuildContext context, LocalizationUIModel model,
LocalizationUIState state) {
final toolsMenu = {
"launcher_mod": (
const Icon(FluentIcons.c_plus_plus, size: 24),
(S.current.home_localization_action_rsi_launcher_localization),
),
"advanced": (
const Icon(FluentIcons.queue_advanced, size: 24),
(S.current.home_localization_action_advanced),
),
"custom_files": (
const Icon(FluentIcons.custom_activity, size: 24),
(S.current.home_localization_action_install_customize),
),
};
final enableTap = state.workingVersion.isEmpty;
return makeListContainer(
S.current.home_localization_title_localization_tools,
[
for (final item in toolsMenu.entries)
Tilt(
disable: !enableTap,
shadowConfig: const ShadowConfig(maxIntensity: .3),
borderRadius: BorderRadius.circular(7),
child: GestureDetector(
onTap: enableTap
? () async {
switch (item.key) {
case "launcher_mod":
ToolsUIModel.rsiEnhance(context);
break;
case "advanced":
context.push("/index/advanced_localization");
break;
case "custom_files":
final sb = await showDialog(
context: context,
builder: (BuildContext context) =>
const LocalizationFromFileDialogUI(),
);
if (sb is StringBuffer) {
await model.installFormString(
sb, S.current.localization_info_custom_files);
}
break;
}
}
: null,
child: Container(
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(7),
),
padding: const EdgeInsets.all(12),
child: Row(
children: [
item.value.$1,
const SizedBox(width: 12),
Text(item.value.$2),
const SizedBox(width: 12),
const Spacer(),
Icon(
FluentIcons.chevron_right,
size: 14,
color: Colors.white.withOpacity(.6),
)
],
),
),
),
),
],
context,
gridViewMode: true,
gridViewCrossAxisCount: 3);
}
} }

View File

@ -0,0 +1,132 @@
import 'dart:io';
import 'package:file_picker/file_picker.dart';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:re_editor/re_editor.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart';
class LocalizationFromFileDialogUI extends HookConsumerWidget {
const LocalizationFromFileDialogUI({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final selectedStringBuffer = useState<StringBuffer?>(null);
final isLoading = useState(false);
void onSelectFile() async {
final result = await FilePicker.platform.pickFiles(
dialogTitle: S.current.home_localization_select_customize_file_ini,
type: FileType.custom,
allowedExtensions: ["ini"],
allowMultiple: false,
lockParentWindow: true);
if (result == null || result.files.firstOrNull == null) return;
isLoading.value = true;
final file = result.files.first;
final buffer = StringBuffer();
final content = await File(file.path!).readAsString();
for (final line in content.split("\n")) {
if (line.startsWith("_starcitizen_doctor_")) continue;
buffer.writeln(line);
}
selectedStringBuffer.value = buffer;
isLoading.value = false;
}
useEffect(() {
addPostFrameCallback(() => onSelectFile());
return null;
}, const []);
return ContentDialog(
constraints: BoxConstraints(
maxWidth: selectedStringBuffer.value == null
? MediaQuery.of(context).size.width * .5
: MediaQuery.of(context).size.width * .75,
maxHeight: MediaQuery.of(context).size.height * .8,
),
title: Row(
mainAxisSize: MainAxisSize.min,
children: [
IconButton(
icon: const Icon(
FluentIcons.back,
size: 22,
),
onPressed: () => context.pop()),
const SizedBox(width: 12),
Text(S.current.home_localization_select_customize_file),
const Spacer(),
if (selectedStringBuffer.value != null)
FilledButton(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 6, vertical: 3),
child: Text(S.current.app_common_tip_confirm),
),
onPressed: () {
Navigator.pop(context, selectedStringBuffer.value);
})
],
),
content: AnimatedSize(
duration: const Duration(milliseconds: 130),
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (selectedStringBuffer.value == null)
Center(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(.05),
borderRadius: BorderRadius.circular(7),
),
padding: const EdgeInsets.all(12),
child: IconButton(
icon: Padding(
padding: const EdgeInsets.all(24),
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Icon(
FluentIcons.file_code,
size: 32,
color: Colors.white.withOpacity(.6),
),
const SizedBox(height: 12),
Text(S.current
.home_localization_action_select_customize_file)
],
),
),
onPressed: onSelectFile,
),
),
)
else if (isLoading.value) ...[
makeLoading(context),
] else ...[
Expanded(
child: Container(
decoration: BoxDecoration(
color: Colors.white.withOpacity(.05),
borderRadius: BorderRadius.circular(7),
),
padding: const EdgeInsets.all(6),
child: CodeEditor(
controller: CodeLineEditingController.fromText(
selectedStringBuffer.value.toString()),
readOnly: true,
),
),
),
],
],
),
),
);
}
}

View File

@ -12,7 +12,6 @@ import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/api/api.dart'; import 'package:starcitizen_doctor/api/api.dart';
import 'package:starcitizen_doctor/common/conf/const_conf.dart'; import 'package:starcitizen_doctor/common/conf/const_conf.dart';
import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/common/conf/url_conf.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/io/rs_http.dart'; import 'package:starcitizen_doctor/common/io/rs_http.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart'; import 'package:starcitizen_doctor/common/utils/provider.dart';
@ -33,8 +32,8 @@ class LocalizationUIState with _$LocalizationUIState {
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
@Default("") String workingVersion, @Default("") String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
bool? isInstalledAdvanced,
List<String>? customizeList, List<String>? customizeList,
@Default(false) bool enableCustomize,
}) = _LocalizationUIState; }) = _LocalizationUIState;
} }
@ -45,16 +44,15 @@ class LocalizationUIModel extends _$LocalizationUIModel {
"chinese_(traditional)": NoL10n.langZHT, "chinese_(traditional)": NoL10n.langZHT,
}; };
late final _downloadDir = Directory get _downloadDir =>
Directory("${appGlobalState.applicationSupportDir}\\Localizations"); Directory("${appGlobalState.applicationSupportDir}\\Localizations");
late final _customizeDir = Directory getDownloadDir() => _downloadDir;
Directory("${_downloadDir.absolute.path}\\Customize_ini");
late final _scDataDir = Directory get _scDataDir =>
Directory("${ref.read(homeUIModelProvider).scInstalledPath}\\data"); Directory("${ref.read(homeUIModelProvider).scInstalledPath}\\data");
late final _cfgFile = File("${_scDataDir.absolute.path}\\system.cfg"); File get _cfgFile => File("${_scDataDir.absolute.path}\\system.cfg");
StreamSubscription? _customizeDirListenSub; StreamSubscription? _customizeDirListenSub;
@ -71,12 +69,6 @@ class LocalizationUIModel extends _$LocalizationUIModel {
if (_scInstallPath == "not_install") { if (_scInstallPath == "not_install") {
return; return;
} }
if (!_customizeDir.existsSync()) {
await _customizeDir.create(recursive: true);
}
_customizeDirListenSub = _customizeDir.watch().listen((event) {
_scanCustomizeDir();
});
ref.onDispose(() { ref.onDispose(() {
_customizeDirListenSub?.cancel(); _customizeDirListenSub?.cancel();
_customizeDirListenSub = null; _customizeDirListenSub = null;
@ -94,7 +86,6 @@ class LocalizationUIModel extends _$LocalizationUIModel {
Future<void> _loadData() async { Future<void> _loadData() async {
_allVersionLocalizationData.clear(); _allVersionLocalizationData.clear();
await _updateStatus(); await _updateStatus();
_scanCustomizeDir();
for (var lang in languageSupport.keys) { for (var lang in languageSupport.keys) {
final l = await Api.getScLocalizationData(lang).unwrap(); final l = await Api.getScLocalizationData(lang).unwrap();
if (l != null) { if (l != null) {
@ -216,37 +207,24 @@ class LocalizationUIModel extends _$LocalizationUIModel {
}; };
} }
void toggleCustomize() {
state = state.copyWith(enableCustomize: !state.enableCustomize);
}
String getCustomizeFileName(String path) { String getCustomizeFileName(String path) {
return path.split("\\").last; return path.split("\\").last;
} }
VoidCallback? doLocalInstall(String filePath) { installFormString(StringBuffer globalIni, String versionName,
if (state.workingVersion.isNotEmpty) return null; {bool? advanced}) async {
return () async { dPrint("LocalizationUIModel -> installFormString $versionName");
final f = File(filePath);
if (!await f.exists()) return;
state = state.copyWith(workingVersion: filePath);
final str = await f.readAsString();
await _installFormString(
StringBuffer(str),
S.current
.localization_info_custom_file(getCustomizeFileName(filePath)));
state = state.copyWith(workingVersion: "");
};
}
_installFormString(StringBuffer globalIni, String versionName) async {
final iniFile = File( final iniFile = File(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini"); "${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini");
if (versionName.isNotEmpty) { if (versionName.isNotEmpty) {
if (!globalIni.toString().endsWith("\n")) { if (!globalIni.toString().endsWith("\n")) {
globalIni.write("\n"); globalIni.write("\n");
} }
globalIni.write("_starcitizen_doctor_localization_version=$versionName"); if (advanced ?? false) {
globalIni.write("_starcitizen_doctor_localization_advanced=true\n");
}
globalIni
.write("_starcitizen_doctor_localization_version=$versionName\n");
} }
/// write cfg /// write cfg
@ -263,40 +241,28 @@ class LocalizationUIModel extends _$LocalizationUIModel {
await _updateStatus(); await _updateStatus();
} }
openDir(BuildContext context) async {
showToast(context, S.current.localization_info_custom_file_instructions);
SystemHelper.openDir("\"${_customizeDir.absolute.path}\"\\");
}
VoidCallback? doRemoteInstall( VoidCallback? doRemoteInstall(
BuildContext context, ScLocalizationData value) { BuildContext context, ScLocalizationData value) {
return () async { return () async {
AnalyticsApi.touch("install_localization"); AnalyticsApi.touch("install_localization");
final downloadUrl =
"${URLConf.gitlabLocalizationUrl}/archive/${value.versionName}.tar.gz";
final savePath = final savePath =
File("${_downloadDir.absolute.path}\\${value.versionName}.sclang"); File("${_downloadDir.absolute.path}\\${value.versionName}.sclang");
try { try {
state = state.copyWith(workingVersion: value.versionName!); state = state.copyWith(workingVersion: value.versionName!);
if (!await savePath.exists()) { if (!await savePath.exists()) {
// download // download
dPrint("downloading file to $savePath"); await downloadLocalizationFile(savePath, value);
final r = await RSHttp.get(downloadUrl);
if (r.statusCode == 200 && r.data != null) {
await savePath.writeAsBytes(r.data!);
} else {
throw "statusCode Error : ${r.statusCode}";
}
} else { } else {
dPrint("use cache $savePath"); dPrint("use cache $savePath");
} }
await Future.delayed(const Duration(milliseconds: 300)); await Future.delayed(const Duration(milliseconds: 300));
// check file // check file
final globalIni = await compute(_readArchive, savePath.absolute.path); final globalIni = await compute(readArchive, savePath.absolute.path);
if (globalIni.isEmpty) { if (globalIni.isEmpty) {
throw S.current.localization_info_corrupted_file; throw S.current.localization_info_corrupted_file;
} }
await _installFormString(globalIni, value.versionName ?? ""); await installFormString(globalIni, value.versionName ?? "");
} catch (e) { } catch (e) {
if (!context.mounted) return; if (!context.mounted) return;
await showToast( await showToast(
@ -307,7 +273,21 @@ class LocalizationUIModel extends _$LocalizationUIModel {
}; };
} }
static StringBuffer _readArchive(String savePath) { Future<void> downloadLocalizationFile(
File savePath, ScLocalizationData value) async {
dPrint("downloading file to $savePath");
final downloadUrl =
"${URLConf.gitlabLocalizationUrl}/archive/${value.versionName}.tar.gz";
final r = await RSHttp.get(downloadUrl);
if (r.statusCode == 200 && r.data != null) {
await savePath.create(recursive: true);
await savePath.writeAsBytes(r.data!, flush: true);
} else {
throw "statusCode Error : ${r.statusCode}";
}
}
static StringBuffer readArchive(String savePath) {
final inputStream = InputFileStream(savePath); final inputStream = InputFileStream(savePath);
final archive = final archive =
TarDecoder().decodeBytes(GZipDecoder().decodeBuffer(inputStream)); TarDecoder().decodeBytes(GZipDecoder().decodeBuffer(inputStream));
@ -317,7 +297,7 @@ class LocalizationUIModel extends _$LocalizationUIModel {
for (var value for (var value
in (element.rawContent?.readString() ?? "").split("\n")) { in (element.rawContent?.readString() ?? "").split("\n")) {
final tv = value.trim(); final tv = value.trim();
if (tv.isNotEmpty) globalIni.writeln(tv); if (tv.isNotEmpty) globalIni.writeln(value);
} }
} }
} }
@ -351,28 +331,34 @@ class LocalizationUIModel extends _$LocalizationUIModel {
}; };
} }
void _scanCustomizeDir() {
final fileList = _customizeDir.listSync();
final customizeList = <String>[];
for (var value in fileList) {
if (value is File && value.path.endsWith(".ini")) {
customizeList.add(value.absolute.path);
}
}
state = state.copyWith(customizeList: customizeList);
}
_updateStatus() async { _updateStatus() async {
final patchStatus = MapEntry( final patchStatus = MapEntry(
await _getLangCfgEnableLang(lang: state.selectedLanguage!), await _getLangCfgEnableLang(lang: state.selectedLanguage!),
await _getInstalledIniVersion( await _getInstalledIniVersion(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini")); "${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini"));
state = state.copyWith(patchStatus: patchStatus); final isInstalledAdvanced = await _checkAdvancedStatus(
"${_scDataDir.absolute.path}\\Localization\\${state.selectedLanguage}\\global.ini");
state = state.copyWith(
patchStatus: patchStatus, isInstalledAdvanced: isInstalledAdvanced);
} }
Future<bool> _getLangCfgEnableLang({String lang = ""}) async { Future<bool> _checkAdvancedStatus(String path) async {
if (!await _cfgFile.exists()) return false; final iniFile = File(path);
final str = (await _cfgFile.readAsString()).replaceAll(" ", ""); if (!await iniFile.exists()) {
return false;
}
final iniString = (await iniFile.readAsString());
return iniString.contains("_starcitizen_doctor_localization_advanced=true");
}
Future<bool> _getLangCfgEnableLang(
{String lang = "", String gamePath = ""}) async {
if (gamePath.isEmpty) {
gamePath = _scInstallPath;
}
final cfgFile = File("${_scDataDir.absolute.path}\\system.cfg");
if (!await cfgFile.exists()) return false;
final str = (await cfgFile.readAsString()).replaceAll(" ", "");
return str.contains("sys_languages=$lang") && return str.contains("sys_languages=$lang") &&
str.contains("g_language=$lang") && str.contains("g_language=$lang") &&
str.contains("g_languageAudio=english"); str.contains("g_languageAudio=english");
@ -416,10 +402,13 @@ class LocalizationUIModel extends _$LocalizationUIModel {
final dirList = await scDataDir.list().toList(); final dirList = await scDataDir.list().toList();
for (var element in dirList) { for (var element in dirList) {
for (var lang in languageSupport.keys) { for (var lang in languageSupport.keys) {
if (element.path.contains(lang)) { if (element.path.contains(lang) &&
await _getLangCfgEnableLang(
lang: lang, gamePath: scInstallPath)) {
final installedVersion = final installedVersion =
await _getInstalledIniVersion("${element.path}\\global.ini"); await _getInstalledIniVersion("${element.path}\\global.ini");
if (installedVersion == S.current.home_action_info_game_built_in) { if (installedVersion == S.current.home_action_info_game_built_in ||
installedVersion == S.current.localization_info_custom_files) {
continue; continue;
} }
final curData = _allVersionLocalizationData[lang]; final curData = _allVersionLocalizationData[lang];

View File

@ -21,10 +21,12 @@ mixin _$LocalizationUIState {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
String get workingVersion => throw _privateConstructorUsedError; String get workingVersion => throw _privateConstructorUsedError;
MapEntry<bool, String>? get patchStatus => throw _privateConstructorUsedError; MapEntry<bool, String>? get patchStatus => throw _privateConstructorUsedError;
bool? get isInstalledAdvanced => throw _privateConstructorUsedError;
List<String>? get customizeList => throw _privateConstructorUsedError; List<String>? get customizeList => throw _privateConstructorUsedError;
bool get enableCustomize => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of LocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$LocalizationUIStateCopyWith<LocalizationUIState> get copyWith => $LocalizationUIStateCopyWith<LocalizationUIState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -40,8 +42,8 @@ abstract class $LocalizationUIStateCopyWith<$Res> {
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
String workingVersion, String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
List<String>? customizeList, bool? isInstalledAdvanced,
bool enableCustomize}); List<String>? customizeList});
} }
/// @nodoc /// @nodoc
@ -54,6 +56,8 @@ class _$LocalizationUIStateCopyWithImpl<$Res, $Val extends LocalizationUIState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of LocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -61,8 +65,8 @@ class _$LocalizationUIStateCopyWithImpl<$Res, $Val extends LocalizationUIState>
Object? apiLocalizationData = freezed, Object? apiLocalizationData = freezed,
Object? workingVersion = null, Object? workingVersion = null,
Object? patchStatus = freezed, Object? patchStatus = freezed,
Object? isInstalledAdvanced = freezed,
Object? customizeList = freezed, Object? customizeList = freezed,
Object? enableCustomize = null,
}) { }) {
return _then(_value.copyWith( return _then(_value.copyWith(
selectedLanguage: freezed == selectedLanguage selectedLanguage: freezed == selectedLanguage
@ -81,14 +85,14 @@ class _$LocalizationUIStateCopyWithImpl<$Res, $Val extends LocalizationUIState>
? _value.patchStatus ? _value.patchStatus
: patchStatus // ignore: cast_nullable_to_non_nullable : patchStatus // ignore: cast_nullable_to_non_nullable
as MapEntry<bool, String>?, as MapEntry<bool, String>?,
isInstalledAdvanced: freezed == isInstalledAdvanced
? _value.isInstalledAdvanced
: isInstalledAdvanced // ignore: cast_nullable_to_non_nullable
as bool?,
customizeList: freezed == customizeList customizeList: freezed == customizeList
? _value.customizeList ? _value.customizeList
: customizeList // ignore: cast_nullable_to_non_nullable : customizeList // ignore: cast_nullable_to_non_nullable
as List<String>?, as List<String>?,
enableCustomize: null == enableCustomize
? _value.enableCustomize
: enableCustomize // ignore: cast_nullable_to_non_nullable
as bool,
) as $Val); ) as $Val);
} }
} }
@ -106,8 +110,8 @@ abstract class _$$LocalizationUIStateImplCopyWith<$Res>
Map<String, ScLocalizationData>? apiLocalizationData, Map<String, ScLocalizationData>? apiLocalizationData,
String workingVersion, String workingVersion,
MapEntry<bool, String>? patchStatus, MapEntry<bool, String>? patchStatus,
List<String>? customizeList, bool? isInstalledAdvanced,
bool enableCustomize}); List<String>? customizeList});
} }
/// @nodoc /// @nodoc
@ -118,6 +122,8 @@ class __$$LocalizationUIStateImplCopyWithImpl<$Res>
$Res Function(_$LocalizationUIStateImpl) _then) $Res Function(_$LocalizationUIStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of LocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -125,8 +131,8 @@ class __$$LocalizationUIStateImplCopyWithImpl<$Res>
Object? apiLocalizationData = freezed, Object? apiLocalizationData = freezed,
Object? workingVersion = null, Object? workingVersion = null,
Object? patchStatus = freezed, Object? patchStatus = freezed,
Object? isInstalledAdvanced = freezed,
Object? customizeList = freezed, Object? customizeList = freezed,
Object? enableCustomize = null,
}) { }) {
return _then(_$LocalizationUIStateImpl( return _then(_$LocalizationUIStateImpl(
selectedLanguage: freezed == selectedLanguage selectedLanguage: freezed == selectedLanguage
@ -145,14 +151,14 @@ class __$$LocalizationUIStateImplCopyWithImpl<$Res>
? _value.patchStatus ? _value.patchStatus
: patchStatus // ignore: cast_nullable_to_non_nullable : patchStatus // ignore: cast_nullable_to_non_nullable
as MapEntry<bool, String>?, as MapEntry<bool, String>?,
isInstalledAdvanced: freezed == isInstalledAdvanced
? _value.isInstalledAdvanced
: isInstalledAdvanced // ignore: cast_nullable_to_non_nullable
as bool?,
customizeList: freezed == customizeList customizeList: freezed == customizeList
? _value._customizeList ? _value._customizeList
: customizeList // ignore: cast_nullable_to_non_nullable : customizeList // ignore: cast_nullable_to_non_nullable
as List<String>?, as List<String>?,
enableCustomize: null == enableCustomize
? _value.enableCustomize
: enableCustomize // ignore: cast_nullable_to_non_nullable
as bool,
)); ));
} }
} }
@ -165,8 +171,8 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
final Map<String, ScLocalizationData>? apiLocalizationData, final Map<String, ScLocalizationData>? apiLocalizationData,
this.workingVersion = "", this.workingVersion = "",
this.patchStatus, this.patchStatus,
final List<String>? customizeList, this.isInstalledAdvanced,
this.enableCustomize = false}) final List<String>? customizeList})
: _apiLocalizationData = apiLocalizationData, : _apiLocalizationData = apiLocalizationData,
_customizeList = customizeList; _customizeList = customizeList;
@ -188,6 +194,8 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
final String workingVersion; final String workingVersion;
@override @override
final MapEntry<bool, String>? patchStatus; final MapEntry<bool, String>? patchStatus;
@override
final bool? isInstalledAdvanced;
final List<String>? _customizeList; final List<String>? _customizeList;
@override @override
List<String>? get customizeList { List<String>? get customizeList {
@ -198,13 +206,9 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
return EqualUnmodifiableListView(value); return EqualUnmodifiableListView(value);
} }
@override
@JsonKey()
final bool enableCustomize;
@override @override
String toString() { String toString() {
return 'LocalizationUIState(selectedLanguage: $selectedLanguage, apiLocalizationData: $apiLocalizationData, workingVersion: $workingVersion, patchStatus: $patchStatus, customizeList: $customizeList, enableCustomize: $enableCustomize)'; return 'LocalizationUIState(selectedLanguage: $selectedLanguage, apiLocalizationData: $apiLocalizationData, workingVersion: $workingVersion, patchStatus: $patchStatus, isInstalledAdvanced: $isInstalledAdvanced, customizeList: $customizeList)';
} }
@override @override
@ -220,10 +224,10 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
other.workingVersion == workingVersion) && other.workingVersion == workingVersion) &&
(identical(other.patchStatus, patchStatus) || (identical(other.patchStatus, patchStatus) ||
other.patchStatus == patchStatus) && other.patchStatus == patchStatus) &&
(identical(other.isInstalledAdvanced, isInstalledAdvanced) ||
other.isInstalledAdvanced == isInstalledAdvanced) &&
const DeepCollectionEquality() const DeepCollectionEquality()
.equals(other._customizeList, _customizeList) && .equals(other._customizeList, _customizeList));
(identical(other.enableCustomize, enableCustomize) ||
other.enableCustomize == enableCustomize));
} }
@override @override
@ -233,10 +237,12 @@ class _$LocalizationUIStateImpl implements _LocalizationUIState {
const DeepCollectionEquality().hash(_apiLocalizationData), const DeepCollectionEquality().hash(_apiLocalizationData),
workingVersion, workingVersion,
patchStatus, patchStatus,
const DeepCollectionEquality().hash(_customizeList), isInstalledAdvanced,
enableCustomize); const DeepCollectionEquality().hash(_customizeList));
@JsonKey(ignore: true) /// Create a copy of LocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$LocalizationUIStateImplCopyWith<_$LocalizationUIStateImpl> get copyWith => _$$LocalizationUIStateImplCopyWith<_$LocalizationUIStateImpl> get copyWith =>
@ -250,8 +256,8 @@ abstract class _LocalizationUIState implements LocalizationUIState {
final Map<String, ScLocalizationData>? apiLocalizationData, final Map<String, ScLocalizationData>? apiLocalizationData,
final String workingVersion, final String workingVersion,
final MapEntry<bool, String>? patchStatus, final MapEntry<bool, String>? patchStatus,
final List<String>? customizeList, final bool? isInstalledAdvanced,
final bool enableCustomize}) = _$LocalizationUIStateImpl; final List<String>? customizeList}) = _$LocalizationUIStateImpl;
@override @override
String? get selectedLanguage; String? get selectedLanguage;
@ -262,11 +268,14 @@ abstract class _LocalizationUIState implements LocalizationUIState {
@override @override
MapEntry<bool, String>? get patchStatus; MapEntry<bool, String>? get patchStatus;
@override @override
bool? get isInstalledAdvanced;
@override
List<String>? get customizeList; List<String>? get customizeList;
/// Create a copy of LocalizationUIState
/// with the given fields replaced by the non-null parameter values.
@override @override
bool get enableCustomize; @JsonKey(includeFromJson: false, includeToJson: false)
@override
@JsonKey(ignore: true)
_$$LocalizationUIStateImplCopyWith<_$LocalizationUIStateImpl> get copyWith => _$$LocalizationUIStateImplCopyWith<_$LocalizationUIStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -7,7 +7,7 @@ part of 'localization_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$localizationUIModelHash() => String _$localizationUIModelHash() =>
r'697f9e00ea08729c5debb4d87ffe9fadb5c0ec71'; r'd08a3d100c72b3f1f4a6c96944d4a73bb3c21808';
/// See also [LocalizationUIModel]. /// See also [LocalizationUIModel].
@ProviderFor(LocalizationUIModel) @ProviderFor(LocalizationUIModel)

View File

@ -0,0 +1,325 @@
import 'package:starcitizen_doctor/generated/l10n.dart';
List get performanceUIConfJsonData => [
{
"key": "r_ssdo",
"name": S.current.performance_json_text_ssdo,
"info": S.current.performance_json_text_ssdo_info,
"type": "int",
"max": 2,
"min": 0,
"value": 1,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "r_AntialiasingMode",
"name": S.current.performance_json_text_antialiasing,
"info": S.current.performance_json_text_antialiasing_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_gameeffects",
"name": S.current.performance_json_text_game_effects,
"info": S.current.performance_json_text_game_effects_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_texture",
"name": S.current.performance_json_text_texture,
"info": S.current.performance_json_text_texture_info,
"type": "int",
"max": 3,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_volumetriceffects",
"name": S.current.performance_json_text_volumetric_effects,
"info": S.current.performance_json_text_volumetric_effects_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_water",
"name": S.current.performance_json_text_water,
"info": S.current.performance_json_text_water_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_objectdetail",
"name": S.current.performance_json_text_object_detail,
"info": S.current.performance_json_text_object_detail_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_particles",
"name": S.current.performance_json_text_particles,
"info": "",
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_physics",
"name": S.current.performance_json_text_physics,
"info": S.current.performance_json_text_physics_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_shading",
"name": S.current.performance_json_text_shading,
"info": S.current.performance_json_text_shading_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_shadows",
"name": S.current.performance_json_text_shadows,
"info": S.current.performance_json_text_shadows_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "sys_spec_postprocessing",
"name": S.current.performance_json_text_postprocessing,
"info": S.current.performance_json_text_postprocessing_info,
"type": "int",
"max": 4,
"min": 1,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_Renderer",
"name": S.current.performance_json_text_renderer,
"info": S.current.performance_json_text_renderer_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderDecal",
"name": S.current.performance_json_text_shader_decal,
"info": S.current.performance_json_text_shader_decal_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderPostProcess",
"name": S.current.performance_json_text_shader_post_process,
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 3,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderFX",
"name": S.current.performance_json_text_shader_fx,
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderGeneral",
"name": S.current.performance_json_text_shader_general,
"info": S.current.performance_json_text_shader_general_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderGlass",
"name": S.current.performance_json_text_shader_glass,
"info": S.current.performance_json_text_shader_glass_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderHDR",
"name": S.current.performance_json_text_shader_hdr,
"info": S.current.performance_json_text_shader_hdr_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderParticle",
"name": S.current.performance_json_text_shader_particle,
"info": S.current.performance_json_text_shader_particle_info,
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderTerrain",
"name": S.current.performance_json_text_shader_terrain,
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderShadow",
"name": S.current.performance_json_text_shader_shadow,
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "q_ShaderSky",
"name": S.current.performance_json_text_shader_sky,
"info": "",
"type": "int",
"max": 3,
"min": 0,
"value": 2,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "e_ParticlesObjectCollisions",
"name": S.current.performance_json_text_particles_object_collisions,
"info":
S.current.performance_json_text_particles_object_collisions_info,
"type": "int",
"max": 2,
"min": 1,
"value": 1,
"group": S.current.performance_json_text_title_graphics
},
{
"key": "r_displayinfo",
"name": S.current.performance_json_text_displayinfo,
"info": S.current.performance_json_text_displayinfo_info,
"type": "int",
"max": 4,
"min": 0,
"value": 1,
"group": S.current.app_index_menu_settings
},
{
"key": "sys_maxFps",
"name": S.current.performance_json_text_max_fps,
"info": S.current.performance_json_text_max_fps_info,
"type": "int",
"max": 300,
"min": 0,
"value": 0,
"group": S.current.app_index_menu_settings
},
{
"key": "r_DisplaySessionInfo",
"name": S.current.performance_json_text_display_session,
"info": S.current.performance_json_text_display_session_info,
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": S.current.app_index_menu_settings
},
{
"key": "r_VSync",
"name": S.current.performance_json_text_vsync,
"info": S.current.performance_json_text_vsync_info,
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": S.current.app_index_menu_settings
},
{
"key": "r_MotionBlur",
"name": S.current.performance_json_text_motion_blur,
"info": S.current.performance_json_text_motion_blur_info,
"type": "bool",
"max": 1,
"min": 0,
"value": 0,
"group": S.current.app_index_menu_settings
},
{
"key": "cl_fov",
"name": "FOV",
"info": S.current.performance_json_text_fov,
"type": "int",
"max": 160,
"min": 25,
"value": 90,
"group": S.current.app_index_menu_settings
},
{
"key": "ui_disableScreenFade",
"name": S.current.performance_json_text_ui_animation,
"info": "",
"type": "bool",
"max": 1,
"min": 0,
"value": 1,
"group": S.current.app_index_menu_settings
},
{
"key": "customize",
"name": S.current.performance_json_text_custom_parameters,
"info": "",
"type": "customize",
"max": 1,
"min": 0,
"value": 1,
"group": S.current.performance_json_text_title_custom
}
];

View File

@ -1,9 +1,7 @@
// ignore_for_file: avoid_build_context_in_providers, avoid_public_notifier_properties // ignore_for_file: avoid_build_context_in_providers, avoid_public_notifier_properties
import 'dart:convert';
import 'dart:io'; import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/services.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
@ -14,6 +12,8 @@ import 'package:starcitizen_doctor/data/game_performance_data.dart';
import 'package:starcitizen_doctor/generated/l10n.dart'; import 'package:starcitizen_doctor/generated/l10n.dart';
import 'package:starcitizen_doctor/ui/home/home_ui_model.dart'; import 'package:starcitizen_doctor/ui/home/home_ui_model.dart';
import 'performance_ui.json.dart';
part 'performance_ui_model.freezed.dart'; part 'performance_ui_model.freezed.dart';
part 'performance_ui_model.g.dart'; part 'performance_ui_model.g.dart';
@ -50,22 +50,16 @@ class HomePerformanceUIModel extends _$HomePerformanceUIModel {
Future<void> _init() async { Future<void> _init() async {
customizeCtrl.clear(); customizeCtrl.clear();
_inAppKeys.clear(); _inAppKeys.clear();
final String jsonString = final performanceMap = <String, List<GamePerformanceData>>{};
await rootBundle.loadString('assets/performance.json'); for (var element in performanceUIConfJsonData) {
final list = json.decode(jsonString); final item = GamePerformanceData.fromJson(element);
if (item.key != "customize") {
if (list is List) { _inAppKeys.add(item.key ?? "");
final performanceMap = <String, List<GamePerformanceData>>{};
for (var element in list) {
final item = GamePerformanceData.fromJson(element);
if (item.key != "customize") {
_inAppKeys.add(item.key ?? "");
}
performanceMap[item.group!] ??= [];
performanceMap[item.group]?.add(item);
} }
state = state.copyWith(performanceMap: performanceMap); performanceMap[item.group!] ??= [];
performanceMap[item.group]?.add(item);
} }
state = state.copyWith(performanceMap: performanceMap);
if (await confFile.exists()) { if (await confFile.exists()) {
await _readConf(); await _readConf();
@ -155,11 +149,13 @@ class HomePerformanceUIModel extends _$HomePerformanceUIModel {
} }
clean(BuildContext context) async { clean(BuildContext context) async {
state = state.copyWith(workingString: S.current.performance_info_delete_config_file); state = state.copyWith(
workingString: S.current.performance_info_delete_config_file);
if (await confFile.exists()) { if (await confFile.exists()) {
await confFile.delete(recursive: true); await confFile.delete(recursive: true);
} }
state = state.copyWith(workingString: S.current.performance_action_clear_shaders); state = state.copyWith(
workingString: S.current.performance_action_clear_shaders);
if (!context.mounted) return; if (!context.mounted) return;
await cleanShaderCache(context); await cleanShaderCache(context);
state = state.copyWith(workingString: S.current.performance_info_done); state = state.copyWith(workingString: S.current.performance_info_done);
@ -188,7 +184,8 @@ class HomePerformanceUIModel extends _$HomePerformanceUIModel {
applyProfile(bool cleanShader) async { applyProfile(bool cleanShader) async {
if (state.performanceMap == null) return; if (state.performanceMap == null) return;
AnalyticsApi.touch("performance_apply"); AnalyticsApi.touch("performance_apply");
state = state.copyWith(workingString: S.current.performance_info_generate_config_file); state = state.copyWith(
workingString: S.current.performance_info_generate_config_file);
String conf = ""; String conf = "";
for (var v in state.performanceMap!.entries) { for (var v in state.performanceMap!.entries) {
for (var c in v.value) { for (var c in v.value) {
@ -207,14 +204,16 @@ class HomePerformanceUIModel extends _$HomePerformanceUIModel {
} }
} }
} }
state = state.copyWith(workingString: S.current.performance_info_write_out_config_file); state = state.copyWith(
workingString: S.current.performance_info_write_out_config_file);
if (await confFile.exists()) { if (await confFile.exists()) {
await confFile.delete(); await confFile.delete();
} }
await confFile.create(); await confFile.create();
await confFile.writeAsString(conf); await confFile.writeAsString(conf);
if (cleanShader) { if (cleanShader) {
state = state.copyWith(workingString: S.current.performance_action_clear_shaders); state = state.copyWith(
workingString: S.current.performance_action_clear_shaders);
await cleanShaderCache(null); await cleanShaderCache(null);
} }
state = state.copyWith(workingString: S.current.performance_info_done); state = state.copyWith(workingString: S.current.performance_info_done);

View File

@ -22,7 +22,9 @@ mixin _$HomePerformanceUIState {
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
String get workingString => throw _privateConstructorUsedError; String get workingString => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of HomePerformanceUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$HomePerformanceUIStateCopyWith<HomePerformanceUIState> get copyWith => $HomePerformanceUIStateCopyWith<HomePerformanceUIState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -51,6 +53,8 @@ class _$HomePerformanceUIStateCopyWithImpl<$Res,
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of HomePerformanceUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -106,6 +110,8 @@ class __$$HomePerformanceUIStateImplCopyWithImpl<$Res>
$Res Function(_$HomePerformanceUIStateImpl) _then) $Res Function(_$HomePerformanceUIStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of HomePerformanceUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -194,7 +200,9 @@ class _$HomePerformanceUIStateImpl implements _HomePerformanceUIState {
const DeepCollectionEquality().hash(_performanceMap), const DeepCollectionEquality().hash(_performanceMap),
workingString); workingString);
@JsonKey(ignore: true) /// Create a copy of HomePerformanceUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$HomePerformanceUIStateImplCopyWith<_$HomePerformanceUIStateImpl> _$$HomePerformanceUIStateImplCopyWith<_$HomePerformanceUIStateImpl>
@ -217,8 +225,11 @@ abstract class _HomePerformanceUIState implements HomePerformanceUIState {
Map<String, List<GamePerformanceData>>? get performanceMap; Map<String, List<GamePerformanceData>>? get performanceMap;
@override @override
String get workingString; String get workingString;
/// Create a copy of HomePerformanceUIState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$HomePerformanceUIStateImplCopyWith<_$HomePerformanceUIStateImpl> _$$HomePerformanceUIStateImplCopyWith<_$HomePerformanceUIStateImpl>
get copyWith => throw _privateConstructorUsedError; get copyWith => throw _privateConstructorUsedError;
} }

View File

@ -7,7 +7,7 @@ part of 'performance_ui_model.dart';
// ************************************************************************** // **************************************************************************
String _$homePerformanceUIModelHash() => String _$homePerformanceUIModelHash() =>
r'6ac9c9adc428120cb5ce71949221064c9e5d9385'; r'83fbdbbae287892dd0c67f5fd86d42a73d0ab91f';
/// See also [HomePerformanceUIModel]. /// See also [HomePerformanceUIModel].
@ProviderFor(HomePerformanceUIModel) @ProviderFor(HomePerformanceUIModel)

View File

@ -81,20 +81,28 @@ class IndexUI extends HookConsumerWidget {
openWidth: S.current.app_language_code.startsWith("zh") ? 64 : 74), openWidth: S.current.app_language_code.startsWith("zh") ? 64 : 74),
), ),
paneBodyBuilder: (item, child) { paneBodyBuilder: (item, child) {
return FocusTraversalGroup( return item!.body;
key: ValueKey('body_$curIndex'),
child: getPage(curIndex.value),
);
}, },
); );
} }
Map<IconData, String> get pageMenus => { Map<IconData, (String, Widget)> get pageMenus => {
FluentIcons.home: S.current.app_index_menu_home, FluentIcons.home: (
// FluentIcons.game: S.current.app_index_menu_lobby, S.current.app_index_menu_home,
FluentIcons.toolbox: S.current.app_index_menu_tools, const HomeUI(),
FluentIcons.settings: S.current.app_index_menu_settings, ),
FluentIcons.info: S.current.app_index_menu_about, FluentIcons.toolbox: (
S.current.app_index_menu_tools,
const ToolsUI(),
),
FluentIcons.settings: (
S.current.app_index_menu_settings,
const SettingsUI()
),
FluentIcons.info: (
S.current.app_index_menu_about,
const AboutUI(),
),
}; };
List<NavigationPaneItem> getNavigationPaneItems( List<NavigationPaneItem> getNavigationPaneItems(
@ -113,7 +121,7 @@ class IndexUI extends HookConsumerWidget {
Icon(kv.key, size: 18), Icon(kv.key, size: 18),
const SizedBox(height: 3), const SizedBox(height: 3),
Text( Text(
kv.value, kv.value.$1,
style: const TextStyle(fontSize: 11), style: const TextStyle(fontSize: 11),
) )
], ],
@ -121,34 +129,15 @@ class IndexUI extends HookConsumerWidget {
), ),
), ),
// title: Text(kv.value), // title: Text(kv.value),
body: const SizedBox.shrink(), body: kv.value.$2,
onTap: () => _onTapIndexMenu(kv.value, curIndexState), onTap: () => _onTapIndexMenu(kv.value.$1, curIndexState),
), ),
]; ];
} }
Widget getPage(int value) {
switch (value) {
case 0:
return const HomeUI();
// case 1:
// return const PartyRoomUI();
case 1:
return const ToolsUI();
case 2:
return const SettingsUI();
case 3:
return const AboutUI();
default:
return Center(
child: Text("UnimplPage $value"),
);
}
}
void _onTapIndexMenu(String value, ValueNotifier<int> curIndexState) { void _onTapIndexMenu(String value, ValueNotifier<int> curIndexState) {
final pageIndex = final pageIndex =
pageMenus.values.toList().indexWhere((element) => element == value); pageMenus.values.toList().indexWhere((element) => element.$1 == value);
curIndexState.value = pageIndex; curIndexState.value = pageIndex;
} }

View File

@ -2,7 +2,6 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/app.dart'; import 'package:starcitizen_doctor/app.dart';
import 'package:starcitizen_doctor/common/conf/const_conf.dart';
import 'package:starcitizen_doctor/generated/l10n.dart'; import 'package:starcitizen_doctor/generated/l10n.dart';
import 'package:starcitizen_doctor/ui/settings/settings_ui_model.dart'; import 'package:starcitizen_doctor/ui/settings/settings_ui_model.dart';
@ -31,23 +30,6 @@ class SettingsUI extends HookConsumerWidget {
S.current.setting_action_create_settings_shortcut, S.current.setting_action_create_settings_shortcut,
subTitle: S.current.setting_action_create_desktop_shortcut, subTitle: S.current.setting_action_create_desktop_shortcut,
onTap: () => model.addShortCut(context)), onTap: () => model.addShortCut(context)),
if (ConstConf.isMSE) ...[
const SizedBox(height: 12),
makeSettingsItem(const Icon(FluentIcons.reset_device, size: 20),
S.current.setting_action_reset_auto_password_fill,
subTitle: S.current.setting_action_info_device_support_info(
sate.isEnableAutoLogin
? S.current.setting_action_info_enabled
: S.current.setting_action_info_disabled,
sate.isDeviceSupportWinHello
? S.current.setting_action_info_support
: S.current.setting_action_info_not_support,
sate.autoLoginEmail,
sate.isEnableAutoLoginPwd
? S.current.setting_action_info_encrypted_saved
: S.current.setting_action_info_not_saved),
onTap: () => model.onResetAutoLogin(context)),
],
const SizedBox(height: 12), const SizedBox(height: 12),
makeSettingsItem(const Icon(FontAwesomeIcons.microchip, size: 20), makeSettingsItem(const Icon(FontAwesomeIcons.microchip, size: 20),
S.current.setting_action_ignore_efficiency_cores_on_launch, S.current.setting_action_ignore_efficiency_cores_on_launch,

View File

@ -6,13 +6,11 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:freezed_annotation/freezed_annotation.dart'; import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:local_auth/local_auth.dart';
import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart';
import 'package:starcitizen_doctor/common/conf/const_conf.dart'; import 'package:starcitizen_doctor/common/conf/const_conf.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/utils/provider.dart'; import 'package:starcitizen_doctor/common/utils/provider.dart';
import 'package:starcitizen_doctor/common/win32/credentials.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart'; import 'package:starcitizen_doctor/widgets/widgets.dart';
part 'settings_ui_model.g.dart'; part 'settings_ui_model.g.dart';
@ -22,10 +20,6 @@ part 'settings_ui_model.freezed.dart';
@freezed @freezed
class SettingsUIState with _$SettingsUIState { class SettingsUIState with _$SettingsUIState {
factory SettingsUIState({ factory SettingsUIState({
@Default(false) isDeviceSupportWinHello,
@Default("-") String autoLoginEmail,
@Default(false) bool isEnableAutoLogin,
@Default(false) bool isEnableAutoLoginPwd,
@Default(false) bool isEnableToolSiteMirrors, @Default(false) bool isEnableToolSiteMirrors,
@Default("0") String inputGameLaunchECore, @Default("0") String inputGameLaunchECore,
String? customLauncherPath, String? customLauncherPath,
@ -44,47 +38,12 @@ class SettingsUIModel extends _$SettingsUIModel {
} }
void _initState() async { void _initState() async {
final LocalAuthentication localAuth = LocalAuthentication();
final isDeviceSupportWinHello = await localAuth.isDeviceSupported();
state = state.copyWith(isDeviceSupportWinHello: isDeviceSupportWinHello);
_updateGameLaunchECore(); _updateGameLaunchECore();
if (ConstConf.isMSE) {
_updateAutoLoginAccount();
}
_loadCustomPath(); _loadCustomPath();
_loadLocationCacheSize(); _loadLocationCacheSize();
_loadToolSiteMirrorState(); _loadToolSiteMirrorState();
} }
Future<void> onResetAutoLogin(BuildContext context) async {
final ok = await showConfirmDialogs(
context,
S.current.setting_action_info_confirm_reset_autofill,
Text(S.current.setting_action_info_delete_local_account_warning));
if (ok) {
final userBox = await Hive.openBox("rsi_account_data");
await userBox.deleteFromDisk();
Win32Credentials.delete("SCToolbox_RSI_Account_secret");
if (!context.mounted) return;
showToast(context, S.current.setting_action_info_autofill_data_cleared);
_initState();
}
}
Future _updateAutoLoginAccount() async {
final userBox = await Hive.openBox("rsi_account_data");
final autoLoginEmail = userBox.get("account_email", defaultValue: "-");
final isEnableAutoLogin = userBox.get("enable", defaultValue: true);
final isEnableAutoLoginPwd =
userBox.get("account_pwd_encrypted", defaultValue: "") != "";
state = state.copyWith(
autoLoginEmail: autoLoginEmail,
isEnableAutoLogin: isEnableAutoLogin,
isEnableAutoLoginPwd: isEnableAutoLoginPwd);
}
Future<void> setGameLaunchECore(BuildContext context) async { Future<void> setGameLaunchECore(BuildContext context) async {
final userBox = await Hive.openBox("app_conf"); final userBox = await Hive.openBox("app_conf");
final defaultInput = final defaultInput =
@ -133,8 +92,9 @@ class SettingsUIModel extends _$SettingsUIModel {
if (r == null || r.files.firstOrNull?.path == null) return; if (r == null || r.files.firstOrNull?.path == null) return;
final fileName = r.files.first.path!; final fileName = r.files.first.path!;
dPrint(fileName); dPrint(fileName);
final fileNameRegExp = final fileNameRegExp = RegExp(
RegExp(r"^(.*\\StarCitizen\\.*\\)Bin64\\StarCitizen\.exe$"); r"^(.*\\StarCitizen\\.*\\)Bin64\\StarCitizen\.exe$",
caseSensitive: false);
if (fileNameRegExp.hasMatch(fileName)) { if (fileNameRegExp.hasMatch(fileName)) {
RegExp pathRegex = RegExp(r"\\[^\\]+\\Bin64\\StarCitizen\.exe$"); RegExp pathRegex = RegExp(r"\\[^\\]+\\Bin64\\StarCitizen\.exe$");
String extractedPath = fileName.replaceFirst(pathRegex, ''); String extractedPath = fileName.replaceFirst(pathRegex, '');
@ -231,6 +191,7 @@ class SettingsUIModel extends _$SettingsUIModel {
} }
showLogs() async { showLogs() async {
SystemHelper.openDir(getDPrintFile()?.absolute.path.replaceAll("/", "\\")); SystemHelper.openDir(getDPrintFile()?.absolute.path.replaceAll("/", "\\"),
isFile: true);
} }
} }

View File

@ -16,17 +16,15 @@ final _privateConstructorUsedError = UnsupportedError(
/// @nodoc /// @nodoc
mixin _$SettingsUIState { mixin _$SettingsUIState {
dynamic get isDeviceSupportWinHello => throw _privateConstructorUsedError;
String get autoLoginEmail => throw _privateConstructorUsedError;
bool get isEnableAutoLogin => throw _privateConstructorUsedError;
bool get isEnableAutoLoginPwd => throw _privateConstructorUsedError;
bool get isEnableToolSiteMirrors => throw _privateConstructorUsedError; bool get isEnableToolSiteMirrors => throw _privateConstructorUsedError;
String get inputGameLaunchECore => throw _privateConstructorUsedError; String get inputGameLaunchECore => throw _privateConstructorUsedError;
String? get customLauncherPath => throw _privateConstructorUsedError; String? get customLauncherPath => throw _privateConstructorUsedError;
String? get customGamePath => throw _privateConstructorUsedError; String? get customGamePath => throw _privateConstructorUsedError;
int get locationCacheSize => throw _privateConstructorUsedError; int get locationCacheSize => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of SettingsUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$SettingsUIStateCopyWith<SettingsUIState> get copyWith => $SettingsUIStateCopyWith<SettingsUIState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -38,11 +36,7 @@ abstract class $SettingsUIStateCopyWith<$Res> {
_$SettingsUIStateCopyWithImpl<$Res, SettingsUIState>; _$SettingsUIStateCopyWithImpl<$Res, SettingsUIState>;
@useResult @useResult
$Res call( $Res call(
{dynamic isDeviceSupportWinHello, {bool isEnableToolSiteMirrors,
String autoLoginEmail,
bool isEnableAutoLogin,
bool isEnableAutoLoginPwd,
bool isEnableToolSiteMirrors,
String inputGameLaunchECore, String inputGameLaunchECore,
String? customLauncherPath, String? customLauncherPath,
String? customGamePath, String? customGamePath,
@ -59,13 +53,11 @@ class _$SettingsUIStateCopyWithImpl<$Res, $Val extends SettingsUIState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of SettingsUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
Object? isDeviceSupportWinHello = freezed,
Object? autoLoginEmail = null,
Object? isEnableAutoLogin = null,
Object? isEnableAutoLoginPwd = null,
Object? isEnableToolSiteMirrors = null, Object? isEnableToolSiteMirrors = null,
Object? inputGameLaunchECore = null, Object? inputGameLaunchECore = null,
Object? customLauncherPath = freezed, Object? customLauncherPath = freezed,
@ -73,22 +65,6 @@ class _$SettingsUIStateCopyWithImpl<$Res, $Val extends SettingsUIState>
Object? locationCacheSize = null, Object? locationCacheSize = null,
}) { }) {
return _then(_value.copyWith( return _then(_value.copyWith(
isDeviceSupportWinHello: freezed == isDeviceSupportWinHello
? _value.isDeviceSupportWinHello
: isDeviceSupportWinHello // ignore: cast_nullable_to_non_nullable
as dynamic,
autoLoginEmail: null == autoLoginEmail
? _value.autoLoginEmail
: autoLoginEmail // ignore: cast_nullable_to_non_nullable
as String,
isEnableAutoLogin: null == isEnableAutoLogin
? _value.isEnableAutoLogin
: isEnableAutoLogin // ignore: cast_nullable_to_non_nullable
as bool,
isEnableAutoLoginPwd: null == isEnableAutoLoginPwd
? _value.isEnableAutoLoginPwd
: isEnableAutoLoginPwd // ignore: cast_nullable_to_non_nullable
as bool,
isEnableToolSiteMirrors: null == isEnableToolSiteMirrors isEnableToolSiteMirrors: null == isEnableToolSiteMirrors
? _value.isEnableToolSiteMirrors ? _value.isEnableToolSiteMirrors
: isEnableToolSiteMirrors // ignore: cast_nullable_to_non_nullable : isEnableToolSiteMirrors // ignore: cast_nullable_to_non_nullable
@ -122,11 +98,7 @@ abstract class _$$SettingsUIStateImplCopyWith<$Res>
@override @override
@useResult @useResult
$Res call( $Res call(
{dynamic isDeviceSupportWinHello, {bool isEnableToolSiteMirrors,
String autoLoginEmail,
bool isEnableAutoLogin,
bool isEnableAutoLoginPwd,
bool isEnableToolSiteMirrors,
String inputGameLaunchECore, String inputGameLaunchECore,
String? customLauncherPath, String? customLauncherPath,
String? customGamePath, String? customGamePath,
@ -141,13 +113,11 @@ class __$$SettingsUIStateImplCopyWithImpl<$Res>
_$SettingsUIStateImpl _value, $Res Function(_$SettingsUIStateImpl) _then) _$SettingsUIStateImpl _value, $Res Function(_$SettingsUIStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of SettingsUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
Object? isDeviceSupportWinHello = freezed,
Object? autoLoginEmail = null,
Object? isEnableAutoLogin = null,
Object? isEnableAutoLoginPwd = null,
Object? isEnableToolSiteMirrors = null, Object? isEnableToolSiteMirrors = null,
Object? inputGameLaunchECore = null, Object? inputGameLaunchECore = null,
Object? customLauncherPath = freezed, Object? customLauncherPath = freezed,
@ -155,21 +125,6 @@ class __$$SettingsUIStateImplCopyWithImpl<$Res>
Object? locationCacheSize = null, Object? locationCacheSize = null,
}) { }) {
return _then(_$SettingsUIStateImpl( return _then(_$SettingsUIStateImpl(
isDeviceSupportWinHello: freezed == isDeviceSupportWinHello
? _value.isDeviceSupportWinHello!
: isDeviceSupportWinHello,
autoLoginEmail: null == autoLoginEmail
? _value.autoLoginEmail
: autoLoginEmail // ignore: cast_nullable_to_non_nullable
as String,
isEnableAutoLogin: null == isEnableAutoLogin
? _value.isEnableAutoLogin
: isEnableAutoLogin // ignore: cast_nullable_to_non_nullable
as bool,
isEnableAutoLoginPwd: null == isEnableAutoLoginPwd
? _value.isEnableAutoLoginPwd
: isEnableAutoLoginPwd // ignore: cast_nullable_to_non_nullable
as bool,
isEnableToolSiteMirrors: null == isEnableToolSiteMirrors isEnableToolSiteMirrors: null == isEnableToolSiteMirrors
? _value.isEnableToolSiteMirrors ? _value.isEnableToolSiteMirrors
: isEnableToolSiteMirrors // ignore: cast_nullable_to_non_nullable : isEnableToolSiteMirrors // ignore: cast_nullable_to_non_nullable
@ -198,28 +153,12 @@ class __$$SettingsUIStateImplCopyWithImpl<$Res>
class _$SettingsUIStateImpl implements _SettingsUIState { class _$SettingsUIStateImpl implements _SettingsUIState {
_$SettingsUIStateImpl( _$SettingsUIStateImpl(
{this.isDeviceSupportWinHello = false, {this.isEnableToolSiteMirrors = false,
this.autoLoginEmail = "-",
this.isEnableAutoLogin = false,
this.isEnableAutoLoginPwd = false,
this.isEnableToolSiteMirrors = false,
this.inputGameLaunchECore = "0", this.inputGameLaunchECore = "0",
this.customLauncherPath, this.customLauncherPath,
this.customGamePath, this.customGamePath,
this.locationCacheSize = 0}); this.locationCacheSize = 0});
@override
@JsonKey()
final dynamic isDeviceSupportWinHello;
@override
@JsonKey()
final String autoLoginEmail;
@override
@JsonKey()
final bool isEnableAutoLogin;
@override
@JsonKey()
final bool isEnableAutoLoginPwd;
@override @override
@JsonKey() @JsonKey()
final bool isEnableToolSiteMirrors; final bool isEnableToolSiteMirrors;
@ -236,7 +175,7 @@ class _$SettingsUIStateImpl implements _SettingsUIState {
@override @override
String toString() { String toString() {
return 'SettingsUIState(isDeviceSupportWinHello: $isDeviceSupportWinHello, autoLoginEmail: $autoLoginEmail, isEnableAutoLogin: $isEnableAutoLogin, isEnableAutoLoginPwd: $isEnableAutoLoginPwd, isEnableToolSiteMirrors: $isEnableToolSiteMirrors, inputGameLaunchECore: $inputGameLaunchECore, customLauncherPath: $customLauncherPath, customGamePath: $customGamePath, locationCacheSize: $locationCacheSize)'; return 'SettingsUIState(isEnableToolSiteMirrors: $isEnableToolSiteMirrors, inputGameLaunchECore: $inputGameLaunchECore, customLauncherPath: $customLauncherPath, customGamePath: $customGamePath, locationCacheSize: $locationCacheSize)';
} }
@override @override
@ -244,14 +183,6 @@ class _$SettingsUIStateImpl implements _SettingsUIState {
return identical(this, other) || return identical(this, other) ||
(other.runtimeType == runtimeType && (other.runtimeType == runtimeType &&
other is _$SettingsUIStateImpl && other is _$SettingsUIStateImpl &&
const DeepCollectionEquality().equals(
other.isDeviceSupportWinHello, isDeviceSupportWinHello) &&
(identical(other.autoLoginEmail, autoLoginEmail) ||
other.autoLoginEmail == autoLoginEmail) &&
(identical(other.isEnableAutoLogin, isEnableAutoLogin) ||
other.isEnableAutoLogin == isEnableAutoLogin) &&
(identical(other.isEnableAutoLoginPwd, isEnableAutoLoginPwd) ||
other.isEnableAutoLoginPwd == isEnableAutoLoginPwd) &&
(identical( (identical(
other.isEnableToolSiteMirrors, isEnableToolSiteMirrors) || other.isEnableToolSiteMirrors, isEnableToolSiteMirrors) ||
other.isEnableToolSiteMirrors == isEnableToolSiteMirrors) && other.isEnableToolSiteMirrors == isEnableToolSiteMirrors) &&
@ -268,17 +199,15 @@ class _$SettingsUIStateImpl implements _SettingsUIState {
@override @override
int get hashCode => Object.hash( int get hashCode => Object.hash(
runtimeType, runtimeType,
const DeepCollectionEquality().hash(isDeviceSupportWinHello),
autoLoginEmail,
isEnableAutoLogin,
isEnableAutoLoginPwd,
isEnableToolSiteMirrors, isEnableToolSiteMirrors,
inputGameLaunchECore, inputGameLaunchECore,
customLauncherPath, customLauncherPath,
customGamePath, customGamePath,
locationCacheSize); locationCacheSize);
@JsonKey(ignore: true) /// Create a copy of SettingsUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$SettingsUIStateImplCopyWith<_$SettingsUIStateImpl> get copyWith => _$$SettingsUIStateImplCopyWith<_$SettingsUIStateImpl> get copyWith =>
@ -288,24 +217,12 @@ class _$SettingsUIStateImpl implements _SettingsUIState {
abstract class _SettingsUIState implements SettingsUIState { abstract class _SettingsUIState implements SettingsUIState {
factory _SettingsUIState( factory _SettingsUIState(
{final dynamic isDeviceSupportWinHello, {final bool isEnableToolSiteMirrors,
final String autoLoginEmail,
final bool isEnableAutoLogin,
final bool isEnableAutoLoginPwd,
final bool isEnableToolSiteMirrors,
final String inputGameLaunchECore, final String inputGameLaunchECore,
final String? customLauncherPath, final String? customLauncherPath,
final String? customGamePath, final String? customGamePath,
final int locationCacheSize}) = _$SettingsUIStateImpl; final int locationCacheSize}) = _$SettingsUIStateImpl;
@override
dynamic get isDeviceSupportWinHello;
@override
String get autoLoginEmail;
@override
bool get isEnableAutoLogin;
@override
bool get isEnableAutoLoginPwd;
@override @override
bool get isEnableToolSiteMirrors; bool get isEnableToolSiteMirrors;
@override @override
@ -316,8 +233,11 @@ abstract class _SettingsUIState implements SettingsUIState {
String? get customGamePath; String? get customGamePath;
@override @override
int get locationCacheSize; int get locationCacheSize;
/// Create a copy of SettingsUIState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$SettingsUIStateImplCopyWith<_$SettingsUIStateImpl> get copyWith => _$$SettingsUIStateImplCopyWith<_$SettingsUIStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -6,7 +6,7 @@ part of 'settings_ui_model.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$settingsUIModelHash() => r'acc2a90f5bbfc6ba82b17454e73881ac32b30b6a'; String _$settingsUIModelHash() => r'2be0fe230d23f84796e0a3a39dd3248c2aa90f23';
/// See also [SettingsUIModel]. /// See also [SettingsUIModel].
@ProviderFor(SettingsUIModel) @ProviderFor(SettingsUIModel)

View File

@ -259,7 +259,7 @@ class UpgradeDialogUI extends HookConsumerWidget {
progress.value = 0; progress.value = 0;
if (!context.mounted) return; if (!context.mounted) return;
showToast(context, S.current.app_upgrade_info_run_failed); showToast(context, S.current.app_upgrade_info_run_failed);
SystemHelper.openDir("\"$fileName\""); SystemHelper.openDir(fileName);
} }
} }
} }

View File

@ -1,7 +1,12 @@
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart'; import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:go_router/go_router.dart'; import 'package:go_router/go_router.dart';
import 'package:hive/hive.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:markdown_widget/widget/markdown.dart';
import 'package:starcitizen_doctor/api/analytics.dart'; import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/app.dart'; import 'package:starcitizen_doctor/app.dart';
import 'package:starcitizen_doctor/common/conf/const_conf.dart'; import 'package:starcitizen_doctor/common/conf/const_conf.dart';
@ -13,6 +18,8 @@ import 'package:starcitizen_doctor/widgets/widgets.dart';
class SplashUI extends HookConsumerWidget { class SplashUI extends HookConsumerWidget {
const SplashUI({super.key}); const SplashUI({super.key});
static const _alertInfoVersion = 1;
@override @override
Widget build(BuildContext context, WidgetRef ref) { Widget build(BuildContext context, WidgetRef ref) {
final stepState = useState(0); final stepState = useState(0);
@ -61,9 +68,16 @@ class SplashUI extends HookConsumerWidget {
void _initApp(BuildContext context, AppGlobalModel appModel, void _initApp(BuildContext context, AppGlobalModel appModel,
ValueNotifier<int> stepState, WidgetRef ref) async { ValueNotifier<int> stepState, WidgetRef ref) async {
await appModel.initApp(); await appModel.initApp();
final appConf = await Hive.openBox("app_conf");
final v = appConf.get("splash_alert_info_version", defaultValue: 0);
AnalyticsApi.touch("launch"); AnalyticsApi.touch("launch");
if (v < _alertInfoVersion) {
if (!context.mounted) return;
await _showAlert(context, appConf);
}
try { try {
await URLConf.checkHost(); // crash on debug mode, why?
if (!kDebugMode) await URLConf.checkHost();
} catch (e) { } catch (e) {
dPrint("checkHost Error:$e"); dPrint("checkHost Error:$e");
} }
@ -77,4 +91,18 @@ class SplashUI extends HookConsumerWidget {
if (!context.mounted) return; if (!context.mounted) return;
context.go("/index"); context.go("/index");
} }
_showAlert(BuildContext context, Box<dynamic> appConf) async {
final userOk = await showConfirmDialogs(
context,
S.current.app_splash_dialog_u_a_p_p,
MarkdownWidget(data: S.current.app_splash_dialog_u_a_p_p_content),
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * .5));
if (userOk) {
await appConf.put("splash_alert_info_version", _alertInfoVersion);
} else {
exit(0);
}
}
} }

View File

@ -4,6 +4,7 @@ import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:font_awesome_flutter/font_awesome_flutter.dart'; import 'package:font_awesome_flutter/font_awesome_flutter.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart'; import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/io/rs_http.dart'; import 'package:starcitizen_doctor/common/io/rs_http.dart';
import 'package:starcitizen_doctor/common/utils/async.dart'; import 'package:starcitizen_doctor/common/utils/async.dart';
@ -14,9 +15,12 @@ class HostsBoosterDialogUI extends HookConsumerWidget {
static final _hostsMap = { static final _hostsMap = {
"Recaptcha": ["www.recaptcha.net", "recaptcha.net"], "Recaptcha": ["www.recaptcha.net", "recaptcha.net"],
S.current.tools_hosts_info_rsi_official_website: ["robertsspaceindustries.com"], S.current.tools_hosts_info_rsi_official_website: [
S.current.tools_hosts_info_rsi_zendesk: ["cloudimperiumservicesllc.zendesk.com"], "robertsspaceindustries.com"
S.current.tools_hosts_info_rsi_customer_service: ["support.robertsspaceindustries.com"], ],
S.current.tools_hosts_info_rsi_customer_service: [
"support.robertsspaceindustries.com"
],
}; };
@override @override
@ -48,6 +52,7 @@ class HostsBoosterDialogUI extends HookConsumerWidget {
} }
useEffect(() { useEffect(() {
AnalyticsApi.touch("host_dns_boost");
// Hosts // Hosts
_readHostsState(workingMap, checkedMap); _readHostsState(workingMap, checkedMap);
return null; return null;
@ -164,9 +169,10 @@ class HostsBoosterDialogUI extends HookConsumerWidget {
child: FilledButton( child: FilledButton(
onPressed: () => doHost(context), onPressed: () => doHost(context),
child: Padding( child: Padding(
padding: padding: const EdgeInsets.only(
const EdgeInsets.only(top: 3, bottom: 3, left: 12, right: 12), top: 3, bottom: 3, left: 12, right: 12),
child: Text(S.current.tools_hosts_action_one_click_acceleration), child: Text(
S.current.tools_hosts_action_one_click_acceleration),
), ),
), ),
), ),

View File

@ -0,0 +1,482 @@
import 'dart:async';
import 'dart:convert';
import 'dart:io';
import 'package:archive/archive_io.dart';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:freezed_annotation/freezed_annotation.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/app.dart';
import 'package:starcitizen_doctor/common/conf/url_conf.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/common/io/rs_http.dart';
import 'package:starcitizen_doctor/common/rust/api/asar_api.dart' as asar_api;
import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/generated/no_l10n_strings.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart';
part 'rsi_launcher_enhance_dialog_ui.freezed.dart';
@freezed
class RSILauncherStateData with _$RSILauncherStateData {
const factory RSILauncherStateData({
required String version,
required asar_api.RsiLauncherAsarData data,
required String serverData,
@Default(false) bool isPatchInstalled,
String? enabledLocalization,
bool? enableDownloaderBoost,
}) = _RSILauncherStateData;
}
class RsiLauncherEnhanceDialogUI extends HookConsumerWidget {
final bool showNotGameInstallMsg;
const RsiLauncherEnhanceDialogUI(
{super.key, this.showNotGameInstallMsg = false});
static const supportLocalizationMap = {
"en": NoL10n.langEn,
"zh_CN": NoL10n.langZHS,
"zh_TW": NoL10n.langZHT,
"fr": NoL10n.langFR,
};
@override
Widget build(BuildContext context, WidgetRef ref) {
final workingText = useState("");
final assarState = useState<RSILauncherStateData?>(null);
final expandEnhance = useState(false);
Future<void> readState() async {
workingText.value = S.current.tools_rsi_launcher_enhance_init_msg1;
assarState.value = await _readState(context).unwrap(context: context);
if (assarState.value == null) {
workingText.value = "";
return;
}
workingText.value = S.current.tools_rsi_launcher_enhance_init_msg2;
if (!context.mounted) return;
await _loadEnhanceData(context, ref, assarState)
.unwrap(context: context)
.unwrap(context: context);
workingText.value = "";
}
void doInstall() async {
if ((await SystemHelper.getPID("\"RSI Launcher\"")).isNotEmpty) {
if (!context.mounted) return;
showToast(
context, S.current.tools_action_info_rsi_launcher_running_warning,
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * .35));
return;
}
if (!context.mounted) return;
workingText.value = S.current.tools_rsi_launcher_enhance_working_msg1;
final newScript =
await _genNewScript(assarState).unwrap(context: context);
workingText.value = S.current.tools_rsi_launcher_enhance_working_msg2;
if (!context.mounted) return;
await assarState.value?.data
.writeMainJs(content: utf8.encode(newScript))
.unwrap(context: context);
AnalyticsApi.touch("rsi_launcher_mod_apply");
await readState();
}
useEffect(() {
AnalyticsApi.touch("rsi_launcher_mod_launch");
readState();
return null;
}, const []);
return ContentDialog(
constraints:
BoxConstraints(maxWidth: MediaQuery.of(context).size.width * .48),
title: Row(children: [
IconButton(
icon: const Icon(
FluentIcons.back,
size: 22,
),
onPressed:
workingText.value.isEmpty ? Navigator.of(context).pop : null),
const SizedBox(width: 12),
Text(S.current.tools_rsi_launcher_enhance_title),
]),
content: AnimatedSize(
duration: const Duration(milliseconds: 130),
child: Column(
mainAxisSize: MainAxisSize.min,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (showNotGameInstallMsg) ...[
InfoBar(
title: const SizedBox(),
content: Text(S.current
.home_localization_action_rsi_launcher_no_game_path_msg),
style: InfoBarThemeData(decoration: (severity) {
return BoxDecoration(
color: Colors.orange,
);
}, iconColor: (severity) {
return Colors.white;
}),
),
const SizedBox(
height: 12,
),
],
if (workingText.value.isNotEmpty) ...[
Center(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
children: [
const Row(),
const SizedBox(height: 12),
const ProgressRing(),
const SizedBox(height: 12),
Text(workingText.value),
const SizedBox(height: 12),
],
),
),
] else ...[
Row(
children: [
Expanded(
child: Text(
S.current.tools_rsi_launcher_enhance_msg_version(
assarState.value?.version ?? ""),
style: TextStyle(
color: Colors.white.withOpacity(.6),
),
),
),
Text(
S.current.tools_rsi_launcher_enhance_msg_patch_status(
(assarState.value?.isPatchInstalled ?? false)
? S.current.localization_info_installed
: S.current.tools_action_info_not_installed),
style: TextStyle(
color: Colors.white.withOpacity(.6),
),
)
],
),
if (assarState.value?.serverData.isEmpty ?? true) ...[
Text(S.current.tools_rsi_launcher_enhance_msg_error),
] else ...[
const SizedBox(height: 24),
if (assarState.value?.enabledLocalization != null)
Container(
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(bottom: 12),
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(12),
),
child: Row(
children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(S.current
.tools_rsi_launcher_enhance_title_localization),
const SizedBox(height: 3),
Text(
S.current
.tools_rsi_launcher_enhance_subtitle_localization,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(.6),
),
),
],
)),
ComboBox(
items: [
for (final key in supportLocalizationMap.keys)
ComboBoxItem(
value: key,
child: Text(supportLocalizationMap[key]!))
],
value: assarState.value?.enabledLocalization,
onChanged: (v) {
assarState.value = assarState.value!
.copyWith(enabledLocalization: v);
},
),
],
)),
const SizedBox(height: 3),
if (assarState.value?.enableDownloaderBoost != null) ...[
IconButton(
icon: Padding(
padding: const EdgeInsets.only(top: 3, bottom: 3),
child: Row(
children: [
Expanded(
child: Center(
child: Row(
mainAxisSize: MainAxisSize.min,
children: [
Icon(expandEnhance.value
? FluentIcons.chevron_up
: FluentIcons.chevron_down),
const SizedBox(width: 12),
Text(expandEnhance.value
? S.current
.tools_rsi_launcher_enhance_action_fold
: S.current
.tools_rsi_launcher_enhance_action_expand),
],
))),
],
),
),
onPressed: () async {
if (!expandEnhance.value) {
final userOK = await showConfirmDialogs(
context,
S.current.tools_rsi_launcher_enhance_note_title,
Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(S.current
.tools_rsi_launcher_enhance_note_msg),
],
),
constraints: BoxConstraints(
maxWidth:
MediaQuery.of(context).size.width * .55));
if (!userOK) return;
}
expandEnhance.value = !expandEnhance.value;
},
),
if (expandEnhance.value)
Container(
padding: const EdgeInsets.all(12),
margin: const EdgeInsets.only(bottom: 12),
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor,
borderRadius: BorderRadius.circular(12),
),
child: Row(children: [
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(S.current
.tools_rsi_launcher_enhance_title_download_booster),
const SizedBox(height: 3),
Text(
S.current
.tools_rsi_launcher_enhance_subtitle_download_booster,
style: TextStyle(
fontSize: 13,
color: Colors.white.withOpacity(.6),
),
),
],
)),
ToggleSwitch(
onChanged: (value) {
assarState.value = assarState.value
?.copyWith(enableDownloaderBoost: value);
},
checked: assarState.value?.enableDownloaderBoost ??
false,
)
])),
],
const SizedBox(height: 12),
Center(
child: FilledButton(
onPressed: doInstall,
child: Padding(
padding: const EdgeInsets.symmetric(
vertical: 4, horizontal: 6),
child: Text(S.current
.tools_rsi_launcher_enhance_action_install),
))),
],
const SizedBox(height: 16),
Text(
S.current.tools_rsi_launcher_enhance_msg_uninstall,
style: TextStyle(
color: Colors.white.withOpacity(.6), fontSize: 13),
),
],
],
),
),
);
}
Future<RSILauncherStateData?> _readState(BuildContext context) async {
final lPath = await SystemHelper.getRSILauncherPath(skipEXE: true);
if (lPath.isEmpty) {
if (!context.mounted) return null;
showToast(context,
S.current.tools_rsi_launcher_enhance_msg_error_launcher_notfound);
return null;
}
dPrint("[RsiLauncherEnhanceDialogUI] rsiLauncherPath ==== $lPath");
final dataPath = "${lPath}resources\\app.asar";
dPrint("[RsiLauncherEnhanceDialogUI] rsiLauncherDataPath ==== $dataPath");
try {
final data = await asar_api.getRsiLauncherAsarData(asarPath: dataPath);
dPrint(
"[RsiLauncherEnhanceDialogUI] rsiLauncherPath main.js path == ${data.mainJsPath}");
final version =
RegExp(r"main\.(\w+)\.js").firstMatch(data.mainJsPath)?.group(1);
if (version == null) {
if (!context.mounted) return null;
showToast(
context,
S.current
.tools_rsi_launcher_enhance_msg_error_get_launcher_info_error);
return null;
}
dPrint(
"[RsiLauncherEnhanceDialogUI] rsiLauncherPath main.js version == $version");
final mainJsString = String.fromCharCodes(data.mainJsContent);
final (enabledLocalization, enableDownloaderBoost) =
_readScriptState(mainJsString);
return RSILauncherStateData(
version: version,
data: data,
serverData: "",
isPatchInstalled: mainJsString.contains("SC_TOOLBOX"),
enabledLocalization: enabledLocalization,
enableDownloaderBoost: enableDownloaderBoost,
);
} catch (e) {
if (!context.mounted) return null;
showToast(
context,
S.current
.tools_rsi_launcher_enhance_msg_error_get_launcher_info_error_with_args(
e));
return null;
}
}
Future<String> _loadEnhanceData(BuildContext context, WidgetRef ref,
ValueNotifier<RSILauncherStateData?> assarState) async {
final globalModel = ref.read(appGlobalModelProvider);
final enhancePath =
"${globalModel.applicationSupportDir}/launcher_enhance_data";
final enhanceFile =
File("$enhancePath/${assarState.value?.version}.tar.gz");
if (!await enhanceFile.exists()) {
final downloadUrl =
"${URLConf.gitApiRSILauncherEnhanceUrl}/archive/${assarState.value?.version}.tar.gz";
final r = await RSHttp.get(downloadUrl).unwrap();
if (r.statusCode != 200 || r.data == null) {
return "";
}
await enhanceFile.create(recursive: true);
await enhanceFile.writeAsBytes(r.data!, flush: true);
}
final severMainJS =
await compute(_readArchive, (enhanceFile.path, "main.js"));
final serverMainJSString = severMainJS.toString();
final scriptState = _readScriptState(serverMainJSString);
if (assarState.value?.enabledLocalization == null) {
assarState.value =
assarState.value?.copyWith(enabledLocalization: scriptState.$1);
dPrint(
"[RsiLauncherEnhanceDialogUI] _loadEnhanceData enabledLocalization == ${scriptState.$1}");
}
if (assarState.value?.enableDownloaderBoost == null) {
assarState.value =
assarState.value?.copyWith(enableDownloaderBoost: scriptState.$2);
dPrint(
"[RsiLauncherEnhanceDialogUI] _loadEnhanceData enableDownloaderBoost == ${scriptState.$2}");
}
assarState.value =
assarState.value?.copyWith(serverData: serverMainJSString);
return serverMainJSString;
}
static StringBuffer _readArchive((String savePath, String fileName) data) {
final inputStream = InputFileStream(data.$1);
final archive =
TarDecoder().decodeBytes(GZipDecoder().decodeBuffer(inputStream));
StringBuffer dataBuffer = StringBuffer("");
for (var element in archive.files) {
if (element.name.endsWith(data.$2)) {
for (var value
in (element.rawContent?.readString() ?? "").split("\n")) {
final tv = value;
if (tv.isNotEmpty) dataBuffer.writeln(tv);
}
}
}
archive.clear();
return dataBuffer;
}
// ignore: constant_identifier_names
static const SC_TOOLBOX_ENABLED_LOCALIZATION_SCRIPT_START =
"const SC_TOOLBOX_ENABLED_LOCALIZATION = ";
// ignore: constant_identifier_names
static const SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST_SCRIPT_START =
"const SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST = ";
(String?, bool?) _readScriptState(String mainJsString) {
String? enabledLocalization;
bool? enableDownloaderBoost;
for (final line in mainJsString.split("\n")) {
final lineTrim = line.trim();
if (lineTrim.startsWith(SC_TOOLBOX_ENABLED_LOCALIZATION_SCRIPT_START)) {
enabledLocalization = lineTrim
.substring(SC_TOOLBOX_ENABLED_LOCALIZATION_SCRIPT_START.length)
.replaceAll("\"", "")
.replaceAll(";", "");
} else if (lineTrim
.startsWith(SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST_SCRIPT_START)) {
enableDownloaderBoost = lineTrim
.substring(
SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST_SCRIPT_START.length)
.toLowerCase() ==
"true;";
}
}
return (enabledLocalization, enableDownloaderBoost);
}
Future<String> _genNewScript(
ValueNotifier<RSILauncherStateData?> assarState) async {
final serverScriptLines = assarState.value!.serverData.split("\n");
final StringBuffer scriptBuffer = StringBuffer("");
for (final line in serverScriptLines) {
final lineTrim = line.trim();
if (lineTrim.startsWith(SC_TOOLBOX_ENABLED_LOCALIZATION_SCRIPT_START)) {
scriptBuffer.writeln(
"$SC_TOOLBOX_ENABLED_LOCALIZATION_SCRIPT_START\"${assarState.value!.enabledLocalization}\";");
} else if (lineTrim
.startsWith(SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST_SCRIPT_START)) {
scriptBuffer.writeln(
"$SC_TOOLBOX_ENABLE_DOWNLOADER_BOOST_SCRIPT_START${assarState.value!.enableDownloaderBoost};");
} else {
scriptBuffer.writeln(line);
}
}
return scriptBuffer.toString();
}
}

View File

@ -0,0 +1,256 @@
// coverage:ignore-file
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint
// ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark
part of 'rsi_launcher_enhance_dialog_ui.dart';
// **************************************************************************
// FreezedGenerator
// **************************************************************************
T _$identity<T>(T value) => value;
final _privateConstructorUsedError = UnsupportedError(
'It seems like you constructed your class using `MyClass._()`. This constructor is only meant to be used by freezed and you are not supposed to need it nor use it.\nPlease check the documentation here for more information: https://github.com/rrousselGit/freezed#adding-getters-and-methods-to-our-models');
/// @nodoc
mixin _$RSILauncherStateData {
String get version => throw _privateConstructorUsedError;
asar_api.RsiLauncherAsarData get data => throw _privateConstructorUsedError;
String get serverData => throw _privateConstructorUsedError;
bool get isPatchInstalled => throw _privateConstructorUsedError;
String? get enabledLocalization => throw _privateConstructorUsedError;
bool? get enableDownloaderBoost => throw _privateConstructorUsedError;
/// Create a copy of RSILauncherStateData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$RSILauncherStateDataCopyWith<RSILauncherStateData> get copyWith =>
throw _privateConstructorUsedError;
}
/// @nodoc
abstract class $RSILauncherStateDataCopyWith<$Res> {
factory $RSILauncherStateDataCopyWith(RSILauncherStateData value,
$Res Function(RSILauncherStateData) then) =
_$RSILauncherStateDataCopyWithImpl<$Res, RSILauncherStateData>;
@useResult
$Res call(
{String version,
asar_api.RsiLauncherAsarData data,
String serverData,
bool isPatchInstalled,
String? enabledLocalization,
bool? enableDownloaderBoost});
}
/// @nodoc
class _$RSILauncherStateDataCopyWithImpl<$Res,
$Val extends RSILauncherStateData>
implements $RSILauncherStateDataCopyWith<$Res> {
_$RSILauncherStateDataCopyWithImpl(this._value, this._then);
// ignore: unused_field
final $Val _value;
// ignore: unused_field
final $Res Function($Val) _then;
/// Create a copy of RSILauncherStateData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? version = null,
Object? data = null,
Object? serverData = null,
Object? isPatchInstalled = null,
Object? enabledLocalization = freezed,
Object? enableDownloaderBoost = freezed,
}) {
return _then(_value.copyWith(
version: null == version
? _value.version
: version // ignore: cast_nullable_to_non_nullable
as String,
data: null == data
? _value.data
: data // ignore: cast_nullable_to_non_nullable
as asar_api.RsiLauncherAsarData,
serverData: null == serverData
? _value.serverData
: serverData // ignore: cast_nullable_to_non_nullable
as String,
isPatchInstalled: null == isPatchInstalled
? _value.isPatchInstalled
: isPatchInstalled // ignore: cast_nullable_to_non_nullable
as bool,
enabledLocalization: freezed == enabledLocalization
? _value.enabledLocalization
: enabledLocalization // ignore: cast_nullable_to_non_nullable
as String?,
enableDownloaderBoost: freezed == enableDownloaderBoost
? _value.enableDownloaderBoost
: enableDownloaderBoost // ignore: cast_nullable_to_non_nullable
as bool?,
) as $Val);
}
}
/// @nodoc
abstract class _$$RSILauncherStateDataImplCopyWith<$Res>
implements $RSILauncherStateDataCopyWith<$Res> {
factory _$$RSILauncherStateDataImplCopyWith(_$RSILauncherStateDataImpl value,
$Res Function(_$RSILauncherStateDataImpl) then) =
__$$RSILauncherStateDataImplCopyWithImpl<$Res>;
@override
@useResult
$Res call(
{String version,
asar_api.RsiLauncherAsarData data,
String serverData,
bool isPatchInstalled,
String? enabledLocalization,
bool? enableDownloaderBoost});
}
/// @nodoc
class __$$RSILauncherStateDataImplCopyWithImpl<$Res>
extends _$RSILauncherStateDataCopyWithImpl<$Res, _$RSILauncherStateDataImpl>
implements _$$RSILauncherStateDataImplCopyWith<$Res> {
__$$RSILauncherStateDataImplCopyWithImpl(_$RSILauncherStateDataImpl _value,
$Res Function(_$RSILauncherStateDataImpl) _then)
: super(_value, _then);
/// Create a copy of RSILauncherStateData
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline')
@override
$Res call({
Object? version = null,
Object? data = null,
Object? serverData = null,
Object? isPatchInstalled = null,
Object? enabledLocalization = freezed,
Object? enableDownloaderBoost = freezed,
}) {
return _then(_$RSILauncherStateDataImpl(
version: null == version
? _value.version
: version // ignore: cast_nullable_to_non_nullable
as String,
data: null == data
? _value.data
: data // ignore: cast_nullable_to_non_nullable
as asar_api.RsiLauncherAsarData,
serverData: null == serverData
? _value.serverData
: serverData // ignore: cast_nullable_to_non_nullable
as String,
isPatchInstalled: null == isPatchInstalled
? _value.isPatchInstalled
: isPatchInstalled // ignore: cast_nullable_to_non_nullable
as bool,
enabledLocalization: freezed == enabledLocalization
? _value.enabledLocalization
: enabledLocalization // ignore: cast_nullable_to_non_nullable
as String?,
enableDownloaderBoost: freezed == enableDownloaderBoost
? _value.enableDownloaderBoost
: enableDownloaderBoost // ignore: cast_nullable_to_non_nullable
as bool?,
));
}
}
/// @nodoc
class _$RSILauncherStateDataImpl implements _RSILauncherStateData {
const _$RSILauncherStateDataImpl(
{required this.version,
required this.data,
required this.serverData,
this.isPatchInstalled = false,
this.enabledLocalization,
this.enableDownloaderBoost});
@override
final String version;
@override
final asar_api.RsiLauncherAsarData data;
@override
final String serverData;
@override
@JsonKey()
final bool isPatchInstalled;
@override
final String? enabledLocalization;
@override
final bool? enableDownloaderBoost;
@override
String toString() {
return 'RSILauncherStateData(version: $version, data: $data, serverData: $serverData, isPatchInstalled: $isPatchInstalled, enabledLocalization: $enabledLocalization, enableDownloaderBoost: $enableDownloaderBoost)';
}
@override
bool operator ==(Object other) {
return identical(this, other) ||
(other.runtimeType == runtimeType &&
other is _$RSILauncherStateDataImpl &&
(identical(other.version, version) || other.version == version) &&
(identical(other.data, data) || other.data == data) &&
(identical(other.serverData, serverData) ||
other.serverData == serverData) &&
(identical(other.isPatchInstalled, isPatchInstalled) ||
other.isPatchInstalled == isPatchInstalled) &&
(identical(other.enabledLocalization, enabledLocalization) ||
other.enabledLocalization == enabledLocalization) &&
(identical(other.enableDownloaderBoost, enableDownloaderBoost) ||
other.enableDownloaderBoost == enableDownloaderBoost));
}
@override
int get hashCode => Object.hash(runtimeType, version, data, serverData,
isPatchInstalled, enabledLocalization, enableDownloaderBoost);
/// Create a copy of RSILauncherStateData
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override
@pragma('vm:prefer-inline')
_$$RSILauncherStateDataImplCopyWith<_$RSILauncherStateDataImpl>
get copyWith =>
__$$RSILauncherStateDataImplCopyWithImpl<_$RSILauncherStateDataImpl>(
this, _$identity);
}
abstract class _RSILauncherStateData implements RSILauncherStateData {
const factory _RSILauncherStateData(
{required final String version,
required final asar_api.RsiLauncherAsarData data,
required final String serverData,
final bool isPatchInstalled,
final String? enabledLocalization,
final bool? enableDownloaderBoost}) = _$RSILauncherStateDataImpl;
@override
String get version;
@override
asar_api.RsiLauncherAsarData get data;
@override
String get serverData;
@override
bool get isPatchInstalled;
@override
String? get enabledLocalization;
@override
bool? get enableDownloaderBoost;
/// Create a copy of RSILauncherStateData
/// with the given fields replaced by the non-null parameter values.
@override
@JsonKey(includeFromJson: false, includeToJson: false)
_$$RSILauncherStateDataImplCopyWith<_$RSILauncherStateDataImpl>
get copyWith => throw _privateConstructorUsedError;
}

View File

@ -220,7 +220,14 @@ class ToolsUI extends HookConsumerWidget {
padding: EdgeInsets.all(6), padding: EdgeInsets.all(6),
child: Icon(FluentIcons.folder_open), child: Icon(FluentIcons.folder_open),
), ),
onPressed: () => model.openDir(state.scInstalledPath)) onPressed: () {
if (state.scInstalledPath.trim().isEmpty) {
showToast(context,
S.current.tools_action_info_star_citizen_not_found);
return;
}
model.openDir(state.scInstalledPath);
})
], ],
); );
} }
@ -258,7 +265,16 @@ class ToolsUI extends HookConsumerWidget {
padding: EdgeInsets.all(6), padding: EdgeInsets.all(6),
child: Icon(FluentIcons.folder_open), child: Icon(FluentIcons.folder_open),
), ),
onPressed: () => model.openDir(state.rsiLauncherInstalledPath)) onPressed: () {
if (state.scInstalledPath.trim().isEmpty) {
showToast(
context,
S.current
.tools_rsi_launcher_enhance_msg_error_launcher_notfound);
return;
}
model.openDir(state.rsiLauncherInstalledPath);
})
], ],
); );
} }

View File

@ -23,6 +23,7 @@ import 'package:url_launcher/url_launcher_string.dart';
import 'package:xml/xml.dart'; import 'package:xml/xml.dart';
import 'dialogs/hosts_booster_dialog_ui.dart'; import 'dialogs/hosts_booster_dialog_ui.dart';
import 'dialogs/rsi_launcher_enhance_dialog_ui.dart';
part 'tools_ui_model.g.dart'; part 'tools_ui_model.g.dart';
@ -90,6 +91,13 @@ class ToolsUIModel extends _$ToolsUIModel {
const Icon(FluentIcons.virtual_network, size: 24), const Icon(FluentIcons.virtual_network, size: 24),
onTap: () => _doHostsBooster(context), onTap: () => _doHostsBooster(context),
), ),
ToolsItemData(
"rsilauncher_enhance_mod",
S.current.tools_rsi_launcher_enhance_title,
S.current.tools_action_rsi_launcher_enhance_info,
const Icon(FluentIcons.c_plus_plus, size: 24),
onTap: () => rsiEnhance(context),
),
ToolsItemData( ToolsItemData(
"reinstall_eac", "reinstall_eac",
S.current.tools_action_reinstall_easyanticheat, S.current.tools_action_reinstall_easyanticheat,
@ -104,6 +112,13 @@ class ToolsUIModel extends _$ToolsUIModel {
const Icon(FluentIcons.admin, size: 24), const Icon(FluentIcons.admin, size: 24),
onTap: () => _adminRSILauncher(context), onTap: () => _adminRSILauncher(context),
), ),
ToolsItemData(
"unp4kc",
S.current.tools_action_unp4k,
S.current.tools_action_unp4k_info,
const Icon(FontAwesomeIcons.fileZipper, size: 24),
onTap: () => _unp4kc(context),
),
]; ];
state = state.copyWith(items: items); state = state.copyWith(items: items);
@ -114,9 +129,6 @@ class ToolsUIModel extends _$ToolsUIModel {
items.add(await _addPhotographyCard(context)); items.add(await _addPhotographyCard(context));
state = state.copyWith(items: items); state = state.copyWith(items: items);
if (!context.mounted) return; if (!context.mounted) return;
items.addAll(await _addLogCard(context));
state = state.copyWith(items: items);
if (!context.mounted) return;
items.addAll(await _addNvmePatchCard(context)); items.addAll(await _addNvmePatchCard(context));
state = state.copyWith(items: items, isItemLoading: false); state = state.copyWith(items: items, isItemLoading: false);
} catch (e) { } catch (e) {
@ -125,26 +137,6 @@ class ToolsUIModel extends _$ToolsUIModel {
} }
} }
Future<List<ToolsItemData>> _addLogCard(BuildContext context) async {
double logPathLen = 0;
try {
logPathLen =
(await File(await SCLoggerHelper.getLogFilePath() ?? "").length()) /
1024 /
1024;
} catch (_) {}
return [
ToolsItemData(
"rsilauncher_log_fix",
S.current.tools_action_rsi_launcher_log_fix,
S.current.tools_action_info_rsi_launcher_log_issue(
logPathLen.toStringAsFixed(4)),
const Icon(FontAwesomeIcons.bookBible, size: 24),
onTap: () => _rsiLogFix(context),
),
];
}
Future<List<ToolsItemData>> _addNvmePatchCard(BuildContext context) async { Future<List<ToolsItemData>> _addNvmePatchCard(BuildContext context) async {
final nvmePatchStatus = await SystemHelper.checkNvmePatchStatus(); final nvmePatchStatus = await SystemHelper.checkNvmePatchStatus();
return [ return [
@ -338,30 +330,8 @@ class ToolsUIModel extends _$ToolsUIModel {
SystemHelper.checkAndLaunchRSILauncher(state.rsiLauncherInstalledPath); SystemHelper.checkAndLaunchRSILauncher(state.rsiLauncherInstalledPath);
} }
Future<void> _rsiLogFix(BuildContext context) async {
state = state.copyWith(working: true);
final path = await SCLoggerHelper.getLogFilePath();
if (!await File(path!).exists()) {
if (!context.mounted) return;
showToast(context, S.current.tools_action_info_log_file_not_exist);
return;
}
try {
SystemHelper.killRSILauncher();
await File(path).delete(recursive: true);
if (!context.mounted) return;
showToast(context, S.current.tools_action_info_cleanup_complete);
SystemHelper.checkAndLaunchRSILauncher(state.rsiLauncherInstalledPath);
} catch (_) {
if (!context.mounted) return;
showToast(context, S.current.tools_action_info_cleanup_failed(path));
}
state = state.copyWith(working: false);
}
openDir(path) async { openDir(path) async {
SystemHelper.openDir("\"$path\""); SystemHelper.openDir(path);
} }
Future _showSystemInfo(BuildContext context) async { Future _showSystemInfo(BuildContext context) async {
@ -573,4 +543,26 @@ class ToolsUIModel extends _$ToolsUIModel {
context: context, context: context,
builder: (BuildContext context) => const HostsBoosterDialogUI()); builder: (BuildContext context) => const HostsBoosterDialogUI());
} }
_unp4kc(BuildContext context) async {
context.push("/tools/unp4kc");
}
static rsiEnhance(BuildContext context,
{bool showNotGameInstallMsg = false}) async {
if ((await SystemHelper.getPID("\"RSI Launcher\"")).isNotEmpty) {
if (!context.mounted) return;
showToast(
context, S.current.tools_action_info_rsi_launcher_running_warning,
constraints: BoxConstraints(
maxWidth: MediaQuery.of(context).size.width * .35));
return;
}
if (!context.mounted) return;
showDialog(
context: context,
builder: (BuildContext context) => RsiLauncherEnhanceDialogUI(
showNotGameInstallMsg: showNotGameInstallMsg,
));
}
} }

View File

@ -25,7 +25,9 @@ mixin _$ToolsUIState {
List<ToolsItemData> get items => throw _privateConstructorUsedError; List<ToolsItemData> get items => throw _privateConstructorUsedError;
bool get isItemLoading => throw _privateConstructorUsedError; bool get isItemLoading => throw _privateConstructorUsedError;
@JsonKey(ignore: true) /// Create a copy of ToolsUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
$ToolsUIStateCopyWith<ToolsUIState> get copyWith => $ToolsUIStateCopyWith<ToolsUIState> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }
@ -56,6 +58,8 @@ class _$ToolsUIStateCopyWithImpl<$Res, $Val extends ToolsUIState>
// ignore: unused_field // ignore: unused_field
final $Res Function($Val) _then; final $Res Function($Val) _then;
/// Create a copy of ToolsUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -126,6 +130,8 @@ class __$$ToolsUIStateImplCopyWithImpl<$Res>
_$ToolsUIStateImpl _value, $Res Function(_$ToolsUIStateImpl) _then) _$ToolsUIStateImpl _value, $Res Function(_$ToolsUIStateImpl) _then)
: super(_value, _then); : super(_value, _then);
/// Create a copy of ToolsUIState
/// with the given fields replaced by the non-null parameter values.
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
@override @override
$Res call({ $Res call({
@ -262,7 +268,9 @@ class _$ToolsUIStateImpl implements _ToolsUIState {
const DeepCollectionEquality().hash(_items), const DeepCollectionEquality().hash(_items),
isItemLoading); isItemLoading);
@JsonKey(ignore: true) /// Create a copy of ToolsUIState
/// with the given fields replaced by the non-null parameter values.
@JsonKey(includeFromJson: false, includeToJson: false)
@override @override
@pragma('vm:prefer-inline') @pragma('vm:prefer-inline')
_$$ToolsUIStateImplCopyWith<_$ToolsUIStateImpl> get copyWith => _$$ToolsUIStateImplCopyWith<_$ToolsUIStateImpl> get copyWith =>
@ -293,8 +301,11 @@ abstract class _ToolsUIState implements ToolsUIState {
List<ToolsItemData> get items; List<ToolsItemData> get items;
@override @override
bool get isItemLoading; bool get isItemLoading;
/// Create a copy of ToolsUIState
/// with the given fields replaced by the non-null parameter values.
@override @override
@JsonKey(ignore: true) @JsonKey(includeFromJson: false, includeToJson: false)
_$$ToolsUIStateImplCopyWith<_$ToolsUIStateImpl> get copyWith => _$$ToolsUIStateImplCopyWith<_$ToolsUIStateImpl> get copyWith =>
throw _privateConstructorUsedError; throw _privateConstructorUsedError;
} }

View File

@ -6,7 +6,7 @@ part of 'tools_ui_model.dart';
// RiverpodGenerator // RiverpodGenerator
// ************************************************************************** // **************************************************************************
String _$toolsUIModelHash() => r'6b4ab0195cc9606202ae5d0dce574735090f486f'; String _$toolsUIModelHash() => r'b61ae444063db4c550fbf71e724eddd0f7104dc5';
/// See also [ToolsUIModel]. /// See also [ToolsUIModel].
@ProviderFor(ToolsUIModel) @ProviderFor(ToolsUIModel)

View File

@ -0,0 +1,330 @@
import 'dart:io';
import 'package:file_sizes/file_sizes.dart';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:flutter_hooks/flutter_hooks.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:re_editor/re_editor.dart';
import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/helper/system_helper.dart';
import 'package:starcitizen_doctor/data/app_unp4k_p4k_item_data.dart';
import 'package:starcitizen_doctor/provider/unp4kc.dart';
import 'package:starcitizen_doctor/widgets/widgets.dart';
import 'package:super_sliver_list/super_sliver_list.dart';
import 'package:url_launcher/url_launcher_string.dart';
class UnP4kcUI extends HookConsumerWidget {
const UnP4kcUI({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final state = ref.watch(unp4kCModelProvider);
final model = ref.read(unp4kCModelProvider.notifier);
final files = model.getFiles();
final paths = state.curPath.trim().split("\\");
useEffect(() {
AnalyticsApi.touch("unp4k_launch");
return null;
}, const []);
return makeDefaultPage(context,
title: S.current.tools_unp4k_title(model.getGamePath()),
useBodyContainer: false,
content: makeBody(context, state, model, files, paths));
}
Widget makeBody(BuildContext context, Unp4kcState state, Unp4kCModel model,
List<AppUnp4kP4kItemData>? files, List<String> paths) {
if (state.errorMessage.isNotEmpty) {
return UnP4kErrorWidget(errorMessage: state.errorMessage);
}
return state.files == null
? Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(child: makeLoading(context)),
if (state.endMessage != null)
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"${state.endMessage}",
style: const TextStyle(fontSize: 12),
),
),
],
)
: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Container(
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor.withOpacity(.06)),
height: 36,
padding: const EdgeInsets.only(left: 12, right: 12),
child: SuperListView.builder(
itemCount: paths.length - 1,
scrollDirection: Axis.horizontal,
itemBuilder: (BuildContext context, int index) {
var path = paths[index];
if (path.isEmpty) {
path = "\\";
}
final fullPath =
"${paths.sublist(0, index + 1).join("\\")}\\";
return Row(
children: [
IconButton(
icon: Text(path),
onPressed: () {
model.changeDir(fullPath, fullPath: true);
},
),
const Icon(
FluentIcons.chevron_right,
size: 12,
),
],
);
},
),
),
Expanded(
child: Row(
children: [
Container(
width: MediaQuery.of(context).size.width * .3,
decoration: BoxDecoration(
color: FluentTheme.of(context).cardColor.withOpacity(.01),
),
child: SuperListView.builder(
padding: const EdgeInsets.only(
top: 6, bottom: 6, left: 3, right: 12),
itemBuilder: (BuildContext context, int index) {
final item = files![index];
final fileName =
item.name?.replaceAll(state.curPath.trim(), "") ??
"?";
return Container(
margin: const EdgeInsets.only(top: 4, bottom: 4),
decoration: BoxDecoration(
color: FluentTheme.of(context)
.cardColor
.withOpacity(.05),
),
child: IconButton(
onPressed: () {
if (item.isDirectory ?? false) {
model.changeDir(fileName);
} else {
model.openFile(item.name ?? "");
}
},
icon: Padding(
padding: const EdgeInsets.only(left: 4, right: 4),
child: Row(
children: [
if (item.isDirectory ?? false)
const Icon(
FluentIcons.folder_fill,
color: Color.fromRGBO(255, 224, 138, 1),
)
else if (fileName.endsWith(".xml"))
const Icon(
FluentIcons.file_code,
)
else
const Icon(
FluentIcons.open_file,
),
const SizedBox(width: 12),
Expanded(
child: Column(
crossAxisAlignment:
CrossAxisAlignment.start,
children: [
Row(
children: [
Expanded(
child: Text(
fileName,
style: const TextStyle(
fontSize: 13),
textAlign: TextAlign.start,
),
),
],
),
if (!(item.isDirectory ?? true)) ...[
const SizedBox(height: 1),
Row(
children: [
Text(
FileSize.getSize(item.size),
style: TextStyle(
fontSize: 10,
color: Colors.white
.withOpacity(.6)),
),
const SizedBox(width: 12),
Text(
"${item.dateTime}",
style: TextStyle(
fontSize: 10,
color: Colors.white
.withOpacity(.6)),
),
],
),
],
],
),
),
const SizedBox(width: 3),
Icon(
FluentIcons.chevron_right,
size: 14,
color: Colors.white.withOpacity(.6),
)
],
),
),
),
);
},
itemCount: files?.length ?? 0,
),
),
Expanded(
child: Container(
child: state.tempOpenFile == null
? Center(
child: Text(S.current.tools_unp4k_view_file),
)
: state.tempOpenFile?.key == "loading"
? makeLoading(context)
: Padding(
padding: const EdgeInsets.all(12),
child: Column(
children: [
if (state.tempOpenFile?.key == "text")
Expanded(
child: _TextTempWidget(
state.tempOpenFile?.value ?? ""))
else
Expanded(
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
Text(S.current
.tools_unp4k_msg_unknown_file_type(
state.tempOpenFile
?.value ??
"")),
const SizedBox(height: 32),
FilledButton(
child: Padding(
padding:
const EdgeInsets.all(4),
child: Text(S.current
.action_open_folder),
),
onPressed: () {
SystemHelper.openDir(state
.tempOpenFile
?.value ??
"");
})
],
),
),
)
],
),
),
))
],
)),
if (state.endMessage != null)
Padding(
padding: const EdgeInsets.all(8.0),
child: Text(
"${state.endMessage}",
style: const TextStyle(fontSize: 12),
),
),
],
);
}
}
class _TextTempWidget extends HookConsumerWidget {
final String filePath;
const _TextTempWidget(this.filePath);
@override
Widget build(BuildContext context, WidgetRef ref) {
final textData = useState<String?>(null);
useEffect(() {
File(filePath).readAsString().then((value) {
textData.value = value;
}).catchError((err) {
textData.value = "Error: $err";
});
return null;
}, const []);
if (textData.value == null) return makeLoading(context);
return CodeEditor(
controller: CodeLineEditingController.fromText('${textData.value}'),
readOnly: true,
);
}
}
class UnP4kErrorWidget extends StatelessWidget {
final String errorMessage;
const UnP4kErrorWidget({super.key, required this.errorMessage});
static const _downloadUrl =
"https://aka.ms/dotnet-core-applaunch?missing_runtime=true&arch=x64&rid=win-x64&os=win10&apphost_version=8.0.0";
@override
Widget build(BuildContext context) {
return Padding(
padding: const EdgeInsets.all(24),
child: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
if (Unp4kCModel.checkRunTimeError(errorMessage)) ...[
Text(
S.current.tools_unp4k_missing_runtime,
style: const TextStyle(fontSize: 16),
),
const SizedBox(height: 6),
Text(S.current.tools_unp4k_missing_runtime_info),
const SizedBox(height: 16),
FilledButton(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 12, vertical: 3),
child: Text(
S.current.tools_unp4k_missing_runtime_action_install),
),
onPressed: () {
launchUrlString(_downloadUrl);
}),
] else
Text(errorMessage),
],
),
),
);
}
}

View File

@ -2,18 +2,17 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:cryptography/cryptography.dart';
import 'package:desktop_webview_window/desktop_webview_window.dart'; import 'package:desktop_webview_window/desktop_webview_window.dart';
import 'package:flutter/services.dart'; import 'package:flutter/services.dart';
import 'package:flutter/widgets.dart'; import 'package:flutter/widgets.dart';
import 'package:hive/hive.dart'; import 'package:hive/hive.dart';
import 'package:local_auth/local_auth.dart'; import 'package:starcitizen_doctor/api/analytics.dart';
import 'package:starcitizen_doctor/common/conf/url_conf.dart'; import 'package:starcitizen_doctor/common/conf/url_conf.dart';
import 'package:starcitizen_doctor/common/io/rs_http.dart'; import 'package:starcitizen_doctor/common/io/rs_http.dart';
import 'package:starcitizen_doctor/common/utils/base_utils.dart'; import 'package:starcitizen_doctor/common/utils/base_utils.dart';
import 'package:starcitizen_doctor/common/utils/log.dart'; import 'package:starcitizen_doctor/common/utils/log.dart';
import 'package:starcitizen_doctor/common/win32/credentials.dart';
import 'package:starcitizen_doctor/data/app_version_data.dart'; import 'package:starcitizen_doctor/data/app_version_data.dart';
import 'package:starcitizen_doctor/data/app_web_localization_versions_data.dart'; import 'package:starcitizen_doctor/data/app_web_localization_versions_data.dart';
@ -65,7 +64,7 @@ class WebViewModel {
windowWidth: loginMode ? 960 : 1920, windowWidth: loginMode ? 960 : 1920,
windowHeight: loginMode ? 720 : 1080, windowHeight: loginMode ? 720 : 1080,
userDataFolderWindows: "$applicationSupportDir/webview_data", userDataFolderWindows: "$applicationSupportDir/webview_data",
title: title)); title: Platform.isMacOS ? "" : title));
// webview.openDevToolsWindow(); // webview.openDevToolsWindow();
webview.isNavigating.addListener(() async { webview.isNavigating.addListener(() async {
if (!webview.isNavigating.value && localizationResource.isNotEmpty) { if (!webview.isNavigating.value && localizationResource.isNotEmpty) {
@ -188,15 +187,12 @@ class WebViewModel {
final message = json.decode(messageString); final message = json.decode(messageString);
if (message["action"] == "webview_rsi_login_show_window") { if (message["action"] == "webview_rsi_login_show_window") {
webview.setWebviewWindowVisibility(true); webview.setWebviewWindowVisibility(true);
_checkAutoLogin(webview);
} else if (message["action"] == "webview_rsi_login_success") { } else if (message["action"] == "webview_rsi_login_success") {
_loginModeSuccess = true; _loginModeSuccess = true;
loginCallback?.call(message, true); loginCallback?.call(message, true);
webview.close(); webview.close();
} }
}); });
Future.delayed(const Duration(seconds: 1))
.then((value) => {webview.setWebviewWindowVisibility(false)});
} }
} catch (e) { } catch (e) {
showToast(context, S.current.app_init_failed_with_reason(e)); showToast(context, S.current.app_init_failed_with_reason(e));
@ -210,6 +206,7 @@ class WebViewModel {
for (var kv in appVersionData.webMirrors!.entries) { for (var kv in appVersionData.webMirrors!.entries) {
if (url.startsWith(kv.key)) { if (url.startsWith(kv.key)) {
finalUrl = url.replaceFirst(kv.key, kv.value); finalUrl = url.replaceFirst(kv.key, kv.value);
AnalyticsApi.touch("webLocalization_with_boost_mirror");
} }
} }
} }
@ -302,39 +299,4 @@ class WebViewModel {
} }
_isClosed = true; _isClosed = true;
} }
Future<void> _checkAutoLogin(Webview webview) async {
final LocalAuthentication localAuth = LocalAuthentication();
if (!await localAuth.isDeviceSupported()) return;
final userBox = await Hive.openBox("rsi_account_data");
final email = await userBox.get("account_email", defaultValue: "");
final pwdE = await userBox.get("account_pwd_encrypted", defaultValue: "");
final nonceStr = await userBox.get("nonce", defaultValue: "");
final macStr = await userBox.get("mac", defaultValue: "");
if (email == "") return;
webview.evaluateJavaScript("RSIAutoLogin(\"$email\",\"\")");
if (pwdE != "" && nonceStr != "" && macStr != "") {
// send toast
final toastMsg =
S.current.webview_localization_device_windows_hello_toast;
webview.evaluateJavaScript("SCTShowToast(\"$toastMsg\")");
// decrypt
if (await localAuth.authenticate(
localizedReason:
S.current.webview_localization_enter_device_pin) !=
true) return;
final kv = Win32Credentials.read("SCToolbox_RSI_Account_secret");
if (kv == null || kv.key != email) return;
final algorithm = AesGcm.with256bits();
final r = await algorithm.decrypt(
SecretBox(base64.decode(pwdE),
nonce: base64.decode(nonceStr), mac: Mac(base64.decode(macStr))),
secretKey: SecretKey(base64.decode(kv.value)));
final decryptedPwd = utf8.decode(r);
webview.evaluateJavaScript("RSIAutoLogin(\"$email\",\"$decryptedPwd\")");
}
}
} }

1
linux/.gitignore vendored Normal file
View File

@ -0,0 +1 @@
flutter/ephemeral

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