commit
df0967d2f7
71 changed files with 2017 additions and 1420 deletions
2
.github/workflows/check_source_code.yml
vendored
2
.github/workflows/check_source_code.yml
vendored
|
@ -27,7 +27,7 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
apt update
|
apt update
|
||||||
apt install -y libgtk-4-dev libadwaita-1-dev git curl
|
apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
|
|
2
.github/workflows/compile_release_build.yml
vendored
2
.github/workflows/compile_release_build.yml
vendored
|
@ -26,7 +26,7 @@ jobs:
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
run: |
|
run: |
|
||||||
apt update
|
apt update
|
||||||
apt install -y libgtk-4-dev libadwaita-1-dev git curl
|
apt install -y build-essential libgtk-4-dev libadwaita-1-dev git curl
|
||||||
|
|
||||||
- uses: dtolnay/rust-toolchain@stable
|
- uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
|
|
18
CHANGELOG.md
18
CHANGELOG.md
|
@ -7,6 +7,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
|
### Added
|
||||||
|
|
||||||
|
- Bundle `applications-system-symbolic` icon to the app
|
||||||
|
- Added "force grab cursor" option to the gamescope settings
|
||||||
|
- Added Thai
|
||||||
|
- Added Ukrainian
|
||||||
|
|
||||||
|
### Changed
|
||||||
|
|
||||||
|
- Update wish url
|
||||||
|
- Updated dependencies
|
||||||
|
- Improved app args parsing
|
||||||
|
- Updated locales
|
||||||
|
|
||||||
|
### Fixed
|
||||||
|
|
||||||
|
- Fixed GtkSwitch UI state representation
|
||||||
|
|
||||||
## [1.5.2] - 29.12.2023
|
## [1.5.2] - 29.12.2023
|
||||||
|
|
||||||
### Fixed
|
### Fixed
|
||||||
|
|
1171
Cargo.lock
generated
1171
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
17
Cargo.toml
17
Cargo.toml
|
@ -15,34 +15,35 @@ lto = true
|
||||||
opt-level = "s"
|
opt-level = "s"
|
||||||
|
|
||||||
[build-dependencies]
|
[build-dependencies]
|
||||||
glib-build-tools = "0.18"
|
glib-build-tools = "0.19"
|
||||||
|
|
||||||
[dependencies.anime-launcher-sdk]
|
[dependencies.anime-launcher-sdk]
|
||||||
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
git = "https://github.com/an-anime-team/anime-launcher-sdk"
|
||||||
tag = "1.12.5"
|
tag = "1.12.7"
|
||||||
features = ["all", "star-rail", "star-rail-patch"]
|
features = ["all", "star-rail", "star-rail-patch"]
|
||||||
|
|
||||||
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
# path = "../anime-launcher-sdk" # ! for dev purposes only
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
relm4 = { version = "0.7.0-beta.2", features = ["macros", "libadwaita"] }
|
relm4 = { version = "0.8.1", features = ["macros", "libadwaita"] }
|
||||||
gtk = { package = "gtk4", version = "0.7.3", features = ["v4_12"] }
|
gtk = { package = "gtk4", version = "0.8.1", features = ["v4_12"] }
|
||||||
adw = { package = "libadwaita", version = "0.5.3", features = ["v1_3"] }
|
adw = { package = "libadwaita", version = "0.6.0", features = ["v1_4"] }
|
||||||
|
|
||||||
rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false }
|
rfd = { version = "0.14.1", features = ["xdg-portal", "tokio"], default-features = false }
|
||||||
open = "5.0.0"
|
open = "5.0.0"
|
||||||
whatadistro = "0.1.0"
|
whatadistro = "0.1.0"
|
||||||
|
|
||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
anyhow = "1.0"
|
anyhow = "1.0"
|
||||||
lazy_static = "1.4.0"
|
lazy_static = "1.4.0"
|
||||||
cached = { version = "0.46", features = ["proc_macro"] }
|
cached = { version = "0.49", features = ["proc_macro"] }
|
||||||
md-5 = { version = "0.10", features = ["asm"] }
|
md-5 = { version = "0.10", features = ["asm"] }
|
||||||
|
enum-ordinalize = "4.3"
|
||||||
|
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
tracing-subscriber = "0.3"
|
tracing-subscriber = "0.3"
|
||||||
|
|
||||||
fluent-templates = "0.8"
|
fluent-templates = "0.9"
|
||||||
unic-langid = "0.9"
|
unic-langid = "0.9"
|
||||||
|
|
||||||
human-panic = "1.2.2"
|
human-panic = "1.2.2"
|
||||||
|
|
|
@ -1,8 +1,3 @@
|
||||||
<div float="left" align="center">
|
|
||||||
<img src="repository/logo.png" width="200px" height="200px">
|
|
||||||
<img src="repository/patchstatus.svg" height="200px">
|
|
||||||
</div>
|
|
||||||
|
|
||||||
| Modern style | Classic style |
|
| Modern style | Classic style |
|
||||||
| :-: | :-: |
|
| :-: | :-: |
|
||||||
| <picture><source media="(prefers-color-scheme: dark)" srcset="repository/main-modern-dark.png"><img src="repository/main-modern.png"></picture> | <picture><source media="(prefers-color-scheme: dark)" srcset="repository/main-classic-dark.png"><img src="repository/main-classic.png"></picture> |
|
| <picture><source media="(prefers-color-scheme: dark)" srcset="repository/main-modern-dark.png"><img src="repository/main-modern.png"></picture> | <picture><source media="(prefers-color-scheme: dark)" srcset="repository/main-classic-dark.png"><img src="repository/main-classic.png"></picture> |
|
||||||
|
|
4
assets/images/icons/applications-system-symbolic.svg
Normal file
4
assets/images/icons/applications-system-symbolic.svg
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg height="16px" viewBox="0 0 16 16" width="16px" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m 8 0 c -0.550781 0 -1 0.449219 -1 1 v 0.238281 c 0 0.46875 -0.375 0.902344 -0.820312 1.046875 c -0.023438 0.007813 -0.042969 0.011719 -0.0625 0.019532 c -0.445313 0.148437 -1.003907 0.019531 -1.28125 -0.359376 l -0.140626 -0.195312 c -0.15625 -0.214844 -0.390624 -0.359375 -0.652343 -0.398438 c -0.261719 -0.042968 -0.527344 0.019532 -0.742188 0.175782 c -0.449219 0.324218 -0.550781 0.953125 -0.222656 1.398437 l 0.140625 0.199219 c 0.277344 0.378906 0.226562 0.953125 -0.050781 1.328125 c -0.011719 0.015625 -0.023438 0.035156 -0.035157 0.050781 c -0.273437 0.378906 -0.804687 0.601563 -1.25 0.457032 l -0.230468 -0.074219 c -0.523438 -0.171875 -1.089844 0.117187 -1.257813 0.640625 c -0.171875 0.527344 0.113281 1.089844 0.640625 1.261718 l 0.222656 0.074219 c 0.445313 0.144531 0.738282 0.636719 0.75 1.101563 v 0.070312 c 0.015626 0.464844 -0.304687 0.960938 -0.746093 1.105469 l -0.226563 0.074219 c -0.527344 0.167968 -0.8125 0.734375 -0.640625 1.257812 c 0.167969 0.527344 0.734375 0.8125 1.257813 0.644532 l 0.230468 -0.078126 c 0.445313 -0.144531 0.976563 0.078126 1.25 0.457032 c 0.011719 0.019531 0.027344 0.035156 0.039063 0.050781 c 0.277344 0.375 0.324219 0.953125 0.050781 1.328125 l -0.144531 0.203125 c -0.324219 0.445313 -0.226563 1.070313 0.222656 1.394531 c 0.445313 0.324219 1.070313 0.226563 1.394531 -0.21875 l 0.144532 -0.199218 c 0.273437 -0.375 0.835937 -0.507813 1.277344 -0.359376 c 0.019531 0.007813 0.042968 0.011719 0.0625 0.019532 c 0.445312 0.140625 0.820312 0.578125 0.820312 1.046875 v 0.238281 c 0 0.550781 0.449219 1 1 1 c 0.554688 0 1 -0.449219 1 -1 v -0.238281 c 0 -0.46875 0.378906 -0.90625 0.824219 -1.046875 c 0.019531 -0.007813 0.039062 -0.015625 0.0625 -0.019532 c 0.441406 -0.148437 1.003906 -0.019531 1.277343 0.359376 l 0.144532 0.199218 c 0.324218 0.445313 0.949218 0.542969 1.394531 0.21875 c 0.445313 -0.324218 0.546875 -0.949218 0.222656 -1.394531 l -0.144531 -0.203125 c -0.277344 -0.375 -0.226562 -0.953125 0.050781 -1.328125 c 0.011719 -0.015625 0.023438 -0.03125 0.035157 -0.050781 c 0.273437 -0.378906 0.804687 -0.601563 1.25 -0.457032 l 0.234374 0.078126 c 0.523438 0.167968 1.089844 -0.117188 1.257813 -0.644532 c 0.171875 -0.523437 -0.117187 -1.089844 -0.640625 -1.257812 l -0.230469 -0.074219 c -0.445312 -0.144531 -0.734375 -0.640625 -0.742187 -1.105469 c -0.003906 -0.023437 -0.003906 -0.046875 -0.003906 -0.070312 c -0.015626 -0.464844 0.300781 -0.957032 0.746093 -1.101563 l 0.230469 -0.074219 c 0.523438 -0.171874 0.8125 -0.734374 0.640625 -1.261718 c -0.171875 -0.523438 -0.734375 -0.8125 -1.257813 -0.640625 l -0.230468 0.074219 c -0.445313 0.144531 -0.976563 -0.078126 -1.25 -0.457032 c -0.015625 -0.015625 -0.027344 -0.035156 -0.039063 -0.050781 c -0.277343 -0.375 -0.324219 -0.949219 -0.050781 -1.328125 l 0.144531 -0.199219 c 0.324219 -0.445312 0.226563 -1.074219 -0.222656 -1.398437 c -0.214844 -0.15625 -0.480469 -0.21875 -0.742187 -0.175782 c -0.261719 0.039063 -0.5 0.183594 -0.652344 0.398438 l -0.144532 0.195312 c -0.273437 0.378907 -0.835937 0.507813 -1.277343 0.363282 c -0.023438 -0.007813 -0.042969 -0.015625 -0.066407 -0.023438 c -0.441406 -0.140625 -0.820312 -0.578125 -0.820312 -1.046875 v -0.238281 c 0 -0.550781 -0.449219 -1 -1 -1 z m 0 4 c 0.871094 0 1.675781 0.273438 2.332031 0.742188 c 0.003907 0.007812 0.011719 0.015624 0.019531 0.023437 c 0.011719 0.003906 0.019532 0.007813 0.03125 0.015625 c 0.660157 0.484375 1.160157 1.175781 1.421876 1.976562 v 0.007813 s 0.003906 0.003906 0.003906 0.007813 c 0.292968 0.851562 0.15625 1.65625 0 2.457031 c 0 0 -0.003906 0.003906 -0.003906 0.007812 v 0.003907 c -0.257813 0.800781 -0.757813 1.488281 -1.414063 1.976562 c -0.015625 0.003906 -0.027344 0.011719 -0.039063 0.019531 c -0.007812 0.007813 -0.015624 0.011719 -0.019531 0.019531 c -0.65625 0.46875 -1.460937 0.742188 -2.332031 0.742188 c -0.855469 0 -1.644531 -0.265625 -2.289062 -0.714844 c -0.019532 -0.015625 -0.042969 -0.03125 -0.0625 -0.046875 c -0.011719 -0.007812 -0.023438 -0.015625 -0.035157 -0.019531 c -0.648437 -0.484375 -1.148437 -1.160156 -1.40625 -1.945312 c -0.003906 -0.011719 -0.007812 -0.023438 -0.011719 -0.035157 c -0.003906 -0.007812 -0.007812 -0.011719 -0.011718 -0.019531 c -0.28125 -0.847656 -0.148438 -1.644531 0 -2.4375 c 0.003906 -0.003906 0.007812 -0.011719 0.011718 -0.015625 c 0.003907 -0.015625 0.007813 -0.027344 0.011719 -0.039063 c 0.261719 -0.789062 0.761719 -1.464843 1.414063 -1.945312 c 0.007812 -0.007812 0.019531 -0.011719 0.027344 -0.015625 c 0.019531 -0.015625 0.042968 -0.035156 0.0625 -0.050781 c 0.644531 -0.449219 1.433593 -0.714844 2.289062 -0.714844 z m 0 0" fill="#2e3436"/>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 4.7 KiB |
|
@ -31,3 +31,5 @@ ja-jp = 日本語
|
||||||
ko-kr = 한국어
|
ko-kr = 한국어
|
||||||
id-id = Indonesia
|
id-id = Indonesia
|
||||||
vi-vn = Tiếng Việt
|
vi-vn = Tiếng Việt
|
||||||
|
uk-ua = Українська
|
||||||
|
th-th = ไทย
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Eine Open-Source-Upscaling-Technik, die von Nvidia als herstel
|
||||||
other-settings = Andere Einstellungen
|
other-settings = Andere Einstellungen
|
||||||
framerate-limit = Framerate-Limit
|
framerate-limit = Framerate-Limit
|
||||||
unfocused-framerate-limit = Unfokussiert Framerate-Limit
|
unfocused-framerate-limit = Unfokussiert Framerate-Limit
|
||||||
|
|
||||||
|
force-grab-cursor = Cursor greifen erzwingen
|
||||||
|
force-grab-cursor-description = Verwende immer den relativen Mausmodus, anstatt abhängig von der Sichtbarkeit des Cursors umzuschalten. Der Mauszeiger wird korrekt in der Mitte des Spiels zentriert.
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
|
||||||
other-settings = Other settings
|
other-settings = Other settings
|
||||||
framerate-limit = Framerate limit
|
framerate-limit = Framerate limit
|
||||||
unfocused-framerate-limit = Unfocused framerate limit
|
unfocused-framerate-limit = Unfocused framerate limit
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Una técnica de escalado de código abierto desarrollada por N
|
||||||
other-settings = Otras opciones
|
other-settings = Otras opciones
|
||||||
framerate-limit = Límite de framerate
|
framerate-limit = Límite de framerate
|
||||||
unfocused-framerate-limit = Límite de framerate en segundo plano
|
unfocused-framerate-limit = Límite de framerate en segundo plano
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Une technologie de mise à l'échelle Open Source développée
|
||||||
other-settings = Autres paramètres
|
other-settings = Autres paramètres
|
||||||
framerate-limit = Limitation des FPS
|
framerate-limit = Limitation des FPS
|
||||||
unfocused-framerate-limit = Limitation des FPS hors focus
|
unfocused-framerate-limit = Limitation des FPS hors focus
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -48,8 +48,8 @@ fps-unlocker-description = Eltávolítja az fps limitet. Az anti-cheat észreveh
|
||||||
|
|
||||||
enabled = Bekapcsolva
|
enabled = Bekapcsolva
|
||||||
|
|
||||||
fps-unlocker-interval = Overwrite interval
|
fps-unlocker-interval = Felülírási időköz
|
||||||
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
|
fps-unlocker-interval-description = Milliszekundumban (ms) hogy mekkora időközönként van felülírva az fps limit értéke. Erre szükség van hogy ne állítsa vissza magát az fps limit
|
||||||
|
|
||||||
window-mode = Ablak mód
|
window-mode = Ablak mód
|
||||||
borderless = Keretmentes
|
borderless = Keretmentes
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Open source upscaling technika az Nvidia-tól, alternatíva a
|
||||||
other-settings = Egyéb beállítások
|
other-settings = Egyéb beállítások
|
||||||
framerate-limit = FPS limit
|
framerate-limit = FPS limit
|
||||||
unfocused-framerate-limit = Fókuszon kívüli FPS limit
|
unfocused-framerate-limit = Fókuszon kívüli FPS limit
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -48,8 +48,8 @@ fps-unlocker-description = Meniadakan batas maksimum frame yang dapat dirender o
|
||||||
|
|
||||||
enabled = Aktifkan
|
enabled = Aktifkan
|
||||||
|
|
||||||
fps-unlocker-interval = Overwrite interval
|
fps-unlocker-interval = Interval penulisan ulang FPS
|
||||||
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
|
fps-unlocker-interval-description = Jeda antara penulisan ulang nilai batas FPS dalam milidetik. Penulisan ulang secara berkala dibutuhkan untuk mencegah nilai batas FPS kembali seperti semula
|
||||||
|
|
||||||
window-mode = Window Mode
|
window-mode = Window Mode
|
||||||
borderless = Tanpa border
|
borderless = Tanpa border
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Teknik peningkatan skala yang dikembangkan oleh Nvidia sebagai
|
||||||
other-settings = Pengaturan lainnya
|
other-settings = Pengaturan lainnya
|
||||||
framerate-limit = Batas framerate
|
framerate-limit = Batas framerate
|
||||||
unfocused-framerate-limit = Batas framerate saat tidak fokus
|
unfocused-framerate-limit = Batas framerate saat tidak fokus
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -48,8 +48,8 @@ fps-unlocker-description = Rimuovi la limitazione del rendering dei frame modifi
|
||||||
|
|
||||||
enabled = Abilitato
|
enabled = Abilitato
|
||||||
|
|
||||||
fps-unlocker-interval = Overwrite interval
|
fps-unlocker-interval = Intervallo di sovrascrittura
|
||||||
fps-unlocker-interval-description = Delay in milliseconds between overwriting the FPS limit value. Periodic overwrites are necessary to prevent it from resetting
|
fps-unlocker-interval-description = Ritardo in millisecondi tra le sovrascritture del valore limite FPS. Sovrascritture periodiche sono necessarie per impedire che si reimposti al valore predefinito
|
||||||
|
|
||||||
window-mode = Modalità della finestra
|
window-mode = Modalità della finestra
|
||||||
borderless = Senza bordi
|
borderless = Senza bordi
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Una tecnica di upscaling open-source sviluppata da Nvidia per
|
||||||
other-settings = Altre impostazioni
|
other-settings = Altre impostazioni
|
||||||
framerate-limit = Limite del framerate
|
framerate-limit = Limite del framerate
|
||||||
unfocused-framerate-limit = Limite del framerate quando fuori dal focus
|
unfocused-framerate-limit = Limite del framerate quando fuori dal focus
|
||||||
|
|
||||||
|
force-grab-cursor = Forza la cattura del cursore
|
||||||
|
force-grab-cursor-description = Usa sempre la modalità relativa del mouse invece di cambiare in base alla visibilità del cursore. Il cursore del mouse verrà correttamente centrato nel gioco
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = An open source upscaling technique developed by Nvidia as a cr
|
||||||
other-settings = その他の設定
|
other-settings = その他の設定
|
||||||
framerate-limit = FPS制限
|
framerate-limit = FPS制限
|
||||||
unfocused-framerate-limit = 非フォーカス時の最大FPS
|
unfocused-framerate-limit = 非フォーカス時の最大FPS
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Nvidia가 독점 DLSS 솔루션에 대한 낮은 오버헤드
|
||||||
other-settings = 기타 설정
|
other-settings = 기타 설정
|
||||||
framerate-limit = 프레임 속도 제한
|
framerate-limit = 프레임 속도 제한
|
||||||
unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한
|
unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Een open source opschalingstechniek ontwikkeld door Nvidia als
|
||||||
other-settings = Andere instellingen
|
other-settings = Andere instellingen
|
||||||
framerate-limit = Frameratelimiet
|
framerate-limit = Frameratelimiet
|
||||||
unfocused-framerate-limit = Ongefocuste frameratelimiet
|
unfocused-framerate-limit = Ongefocuste frameratelimiet
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -10,4 +10,7 @@ nis-description = Technika skalowania otwartego źródła opracowana przez Nvidi
|
||||||
|
|
||||||
other-settings = Inne ustawienia
|
other-settings = Inne ustawienia
|
||||||
framerate-limit = Limit klatek na sekundę
|
framerate-limit = Limit klatek na sekundę
|
||||||
unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia
|
unfocused-framerate-limit = Limit klatek na sekundę po utraceniu skupienia
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Uma técnica de upscaling de código aberto desenvolvida pela
|
||||||
other-settings = Outras configuraões
|
other-settings = Outras configuraões
|
||||||
framerate-limit = Limite de taxa de quadros
|
framerate-limit = Limite de taxa de quadros
|
||||||
unfocused-framerate-limit = Limite de taxa de quadros desfocado
|
unfocused-framerate-limit = Limite de taxa de quadros desfocado
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = Открытая техника масштабирования
|
||||||
other-settings = Другие настройки
|
other-settings = Другие настройки
|
||||||
framerate-limit = Лимит числа кадров
|
framerate-limit = Лимит числа кадров
|
||||||
unfocused-framerate-limit = Лимит числа кадров вне фокуса
|
unfocused-framerate-limit = Лимит числа кадров вне фокуса
|
||||||
|
|
||||||
|
force-grab-cursor = Принудительный захват курсора
|
||||||
|
force-grab-cursor-description = Использовать относительный режим мыши вместо переворачивания в зависимости от видимости курсора. Курсор мыши будет правильно центрирован в игре
|
||||||
|
|
|
@ -11,3 +11,6 @@ nis-description = En uppskalningsteknik med öppen källkod som utvecklats av Nv
|
||||||
other-settings = Andra inställningar
|
other-settings = Andra inställningar
|
||||||
framerate-limit = Gräns för bilduppdateringshastighet
|
framerate-limit = Gräns för bilduppdateringshastighet
|
||||||
unfocused-framerate-limit = Gräns för bilduppdateringshastighet utan fokus
|
unfocused-framerate-limit = Gräns för bilduppdateringshastighet utan fokus
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
20
assets/locales/th/components.ftl
Normal file
20
assets/locales/th/components.ftl
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
components = ส่วนประกอบ
|
||||||
|
components-description = จัดการเวอร์ชัน Wine และ DXVK
|
||||||
|
|
||||||
|
selected-version = เวอร์ชันที่เลือก
|
||||||
|
recommended-only = แสดงเเวอร์ชั่นที่แนะนำเท่านั้น
|
||||||
|
|
||||||
|
wine-version = เวอร์ชันของ Wine
|
||||||
|
wine-recommended-description = แสดงเฉพาะเวอร์ชัน Wine ที่แนะนำเท่านั้น
|
||||||
|
|
||||||
|
wine-options = การตั้งค่าของ Wine
|
||||||
|
|
||||||
|
wine-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ Wine
|
||||||
|
wine-use-shared-libraries-description = ตั้งค่าตัว LD_LIBRARY_PATH เพื่อโหลดไลบรารีระบบจากบิลด์ Wine ที่เลือก
|
||||||
|
|
||||||
|
gstreamer-use-shared-libraries = ใช้ไลบรารีที่ใช้ร่วมกันของ gstreamer
|
||||||
|
gstreamer-use-shared-libraries-description = ตั้งค่าตัวแปร GST_PLUGIN_PATH เพื่อโหลดไลบรารี gstreamer จากบิลด์ Wine ที่เลือก
|
||||||
|
|
||||||
|
dxvk-version = เวอร์ชันของ DXVK
|
||||||
|
dxvk-selection-disabled = การเลือก DXVK ถูกปิดใช้งานโดยการตั้งค่ากลุ่ม Wine ของคุณ
|
||||||
|
dxvk-recommended-description = แสดงเฉพาะเวอร์ชัน DXVK ที่แนะนำเท่านั้น
|
57
assets/locales/th/enhancements.ftl
Normal file
57
assets/locales/th/enhancements.ftl
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
game-settings-description = จัดการการตั้งค่าในเกมและเซสชันบัญชี
|
||||||
|
sandbox-settings-description = รันเกมในแซนด์บ็อกซ์ คล้ายกับที่ Flatpak ทำ
|
||||||
|
environment-settings-description = ระบุตัวแปรสภาวะแวดล้อมและคำสั่งเปิดเกม
|
||||||
|
|
||||||
|
wine = Wine
|
||||||
|
|
||||||
|
synchronization = การซิงโครไนซ์
|
||||||
|
wine-sync-description = เทคโนโลยีที่ใช้ในการประสานเหตุการณ์ Wine ภายใน
|
||||||
|
|
||||||
|
language = ภาษา
|
||||||
|
wine-lang-description = ภาษาที่ใช้ในสภาพแวดล้อมไวน์ สามารถแก้ไขปัญหารูปแบบแป้นพิมพ์ได้
|
||||||
|
system = ระบบ
|
||||||
|
|
||||||
|
borderless-window = หน้าต่างไร้ขอบ
|
||||||
|
virtual-desktop = เดสก์ท็อปเสมือน
|
||||||
|
|
||||||
|
map-drive-c = เชื่อม ไดรฟ์ C:
|
||||||
|
map-drive-c-description = เชื่อมโยง ไดรฟ์ C: จาก Wine prefix ไปยังระบบ dosdevices โดยอัตโนมัติ
|
||||||
|
|
||||||
|
map-game-folder = เชื่อม โฟลเดอร์เกม
|
||||||
|
map-game-folder-description = เชื่อมโยงโฟลเดอร์เกมไปยังระบบ dosdevices โดยอัตโนมัติ
|
||||||
|
|
||||||
|
game = เกม
|
||||||
|
|
||||||
|
hud = HUD
|
||||||
|
|
||||||
|
fsr = FSR
|
||||||
|
fsr-description = ยกระดับความชัดเกมให้เข้ากับขนาดจอภาพของคุณ หากต้องการใช้เลือกความละเอียดที่ต่ำกว่าในการตั้งค่าของเกมแล้วกด Alt+Enter
|
||||||
|
ultra-quality = คุณภาพเยี่ยม
|
||||||
|
quality = คุณภาพ
|
||||||
|
balanced = พอประมาณ
|
||||||
|
performance = เร็วที่สุด
|
||||||
|
|
||||||
|
gamemode = Gamemode
|
||||||
|
gamemode-description = จัดลำดับความสำคัญของเกมเหนือกระบวนการอื่น
|
||||||
|
|
||||||
|
gamescope = Gamescope
|
||||||
|
gamescope-description = Gamescope เป็นเครื่องมือจาก Valve ที่ช่วยให้เกมทำงานในอินสแตนซ์ Xwayland ที่แยกจากระบบ และรองรับ GPU ของ AMD, Intel และ Nvidia
|
||||||
|
|
||||||
|
discord-rpc = Discord RPC
|
||||||
|
discord-rpc-description = Discord RPC อนุญาตให้คุณให้ข้อมูล Discord ที่คุณกำลังเล่นเกมอยู่เพื่อแจ้งให้เพื่อนของคุณทราบ
|
||||||
|
icon = ไอคอน
|
||||||
|
title = หัวข้อ
|
||||||
|
description = คำอธิบาย
|
||||||
|
|
||||||
|
fps-unlocker = FPS Unlocker
|
||||||
|
fps-unlocker-description = ลบข้อจำกัดในการเรนเดอร์เฟรมโดยการปรับเปลี่ยนหน่วยความจำของเกม สามารถตรวจจับได้โดยระบบการป้องกันการโกงของเกม
|
||||||
|
|
||||||
|
enabled = เปิดใช้งาน
|
||||||
|
|
||||||
|
fps-unlocker-interval = เขียนทับช่วงเวลา
|
||||||
|
fps-unlocker-interval-description = การเขียนทับค่าจำกัด FPS ทุกมิลลิวินาที จำเป็นต้องเขียนทับเป็นระยะเพื่อป้องกันไม่ให้รีเซ็ต
|
||||||
|
|
||||||
|
window-mode = โหมดหน้าต่างเกม
|
||||||
|
borderless = โหมดไร้ขอบเขต
|
||||||
|
popup = ป๊อปอัพ
|
||||||
|
fullscreen = เต็มจอ
|
7
assets/locales/th/environment.ftl
Normal file
7
assets/locales/th/environment.ftl
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
environment = สภาวะแวดล้อม
|
||||||
|
game-command = คำสั่งเกม
|
||||||
|
game-command-description = คำสั่งที่ใช้ในการเปิดเกม ตัวยึดตำแหน่ง %command% ถูกสร้างขึ้นโดยอัตโนมัติโดยตัวเรียกใช้งาน ตัวอย่างเช่น: gamemoderun '%command%'
|
||||||
|
new-variable = ตัวแปรใหม่
|
||||||
|
name = ชื่อ
|
||||||
|
value = ค่า
|
||||||
|
add = เพิ่ม
|
66
assets/locales/th/errors.ftl
Normal file
66
assets/locales/th/errors.ftl
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
launcher-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์ Launcher ได้
|
||||||
|
game-folder-opening-error = ไม่สามารถเปิดโฟลเดอร์เกมได้
|
||||||
|
config-file-opening-error = ไม่สามารถเปิดไฟล์ config ได้
|
||||||
|
debug-file-opening-error = ไม่สามารถเปิดไฟล์ debug ได้
|
||||||
|
|
||||||
|
wish-url-search-failed = ไม่พบ URL การอธิษฐาน
|
||||||
|
wish-url-opening-error = ไม่สามารถเปิด URL การอธิษฐานได้
|
||||||
|
|
||||||
|
wine-run-error = ล้มเหลวในการปฏิบัติการเรียกใช้ไฟล์ {$executable} โดยใช้ Wine
|
||||||
|
|
||||||
|
game-launching-failed = ไม่สามารถเปิดเกมได้
|
||||||
|
failed-get-selected-wine = ไม่สามารถดาวน์โหลดเวอร์ชัน wine ที่เลือกไปได้
|
||||||
|
downloading-failed = การดาวน์โหลดล้มเหลว
|
||||||
|
unpacking-failed = การแกะไฟล์ล้มเหลว
|
||||||
|
|
||||||
|
kill-game-process-failed = ไม่สามารถฆ่ากระบวนการของเกมได้
|
||||||
|
|
||||||
|
game-file-repairing-error = ไม่สามารถซ่อมแซมไฟล์เกมได้
|
||||||
|
integrity-files-getting-error = ไม่สามารถรับไฟล์การตรวจสอบความสมบูรณ์ได้
|
||||||
|
|
||||||
|
background-downloading-failed = ดาวน์โหลดภาพพื้นหลังไม่สำเร็จ
|
||||||
|
components-index-sync-failed = ไม่สามารถซิงค์ index ส่วนประกอบ
|
||||||
|
components-index-verify-failed = ไม่สามารถตรวจสอบ index ส่วนประกอบได้
|
||||||
|
config-update-error = บันทึกการกำหนดค่าไม่สำเร็จ
|
||||||
|
wine-prefix-update-failed = ไม่สามารถอัปเดตการตั้งค่า Wine
|
||||||
|
dxvk-install-failed = ติดตั้ง DXVK ไม่สำเร็จ
|
||||||
|
voice-package-deletion-error = ลบแพ็คเกจเสียงไม่สำเร็จ
|
||||||
|
|
||||||
|
game-diff-finding-error = ไม่พบความแตกต่างของเกม
|
||||||
|
patch-info-fetching-error = ไม่สามารถเรียกข้อมูลแพตช์ได้
|
||||||
|
launcher-state-updating-error = อัปเดตสถานะ launcher ไม่สำเร็จ
|
||||||
|
|
||||||
|
package-not-available = ไม่พบแพ็คเกจนี้: {$package}
|
||||||
|
wine-download-error = ดาวน์โหลด Wine ไม่สำเร็จ
|
||||||
|
wine-unpack-errror = ไม่สามารถแกะไฟล์ Wine ได้
|
||||||
|
wine-install-failed = ไม่สามารถติดตั้ง Wine ได้
|
||||||
|
dxvk-download-error = ดาวน์โหลด DXVK ไม่สำเร็จ
|
||||||
|
dxvk-unpack-error = ไม่สามารถแกะไฟล์ DXVK ได้
|
||||||
|
dxvk-apply-error = ไม่สามารถติดตั้ง DXVK ได้
|
||||||
|
|
||||||
|
downloaded-wine-list-failed = ไม่สามารถแสดงเวอร์ชัน Wine ที่ดาวน์โหลดไปแล้วได้
|
||||||
|
|
||||||
|
patch-sync-failed = ไม่สามารถซิงค์โฟลเดอร์แพตช์ได้
|
||||||
|
patch-state-check-failed = ไม่สามารถตรวจสอบสถานะโฟลเดอร์แพตช์ได้
|
||||||
|
game-patching-error = ไม่สามารถแพตช์เกมได้
|
||||||
|
|
||||||
|
# Disable telemetry
|
||||||
|
|
||||||
|
telemetry-servers-disabling-error = ไม่สามารถปิดใช้งานเซิร์ฟเวอร์การวัดและส่งข้อมูล
|
||||||
|
|
||||||
|
# Sandbox
|
||||||
|
|
||||||
|
documentation-url-open-failed = ไม่สามารถเปิด URL เอกสารประกอบ
|
||||||
|
|
||||||
|
# Game
|
||||||
|
|
||||||
|
game-session-add-failed = ไม่สามารถเพิ่มเซสชันเกมได้
|
||||||
|
game-session-update-failed = ไม่สามารถอัปเดตเซสชันเกมได้
|
||||||
|
game-session-remove-failed = ไม่สามารถลบเซสชันเกมได้
|
||||||
|
game-session-set-current-failed = ไม่สามารถตั้งเซสชันเกมปัจจุบันได้
|
||||||
|
game-session-apply-failed = ไม่สามารถติดตั้งเซสชันเกมได้
|
||||||
|
|
||||||
|
# Enhancements
|
||||||
|
|
||||||
|
discord-rpc-icons-fetch-failed = ไม่สามารถดึงไอคอน Discord RPC
|
||||||
|
discord-rpc-icon-download-failed = ไม่สามารถดาวน์โหลดไอคอน Discord RPC
|
64
assets/locales/th/first_run.ftl
Normal file
64
assets/locales/th/first_run.ftl
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
welcome = ยินดีต้อนรับ
|
||||||
|
|
||||||
|
welcome-page-message =
|
||||||
|
สวัสดี! ยินดีต้อนรับสู่ An Anime Game Launcher
|
||||||
|
|
||||||
|
เราจำเป็นต้องเตรียมบางสิ่งและดาวน์โหลดส่วนประกอบเริ่มต้นก่อนที่คุณจะสามารถเล่นเกมได้
|
||||||
|
|
||||||
|
tos-violation-warning = คำเตือนการละเมิดข้อตกลงการใช้บริการของเกม
|
||||||
|
|
||||||
|
tos-violation-warning-message =
|
||||||
|
Launcher นี้เป็นเครื่องมือที่ไม่การเกี่ยวข้องแต่อย่างใดกับ {company-name} หรือ {company-alter-name}.
|
||||||
|
|
||||||
|
เครื่องมือนี้ออกแบบมาเพื่ออำนวยความสะดวกในการเล่น {game-name} บน Linux และสร้างขึ้นโดยมีวัตถุประสงค์เพียงอย่างเดียวในการติดตั้งและรันเกมโดยมีความยุ่งยากที่น้อยลง
|
||||||
|
|
||||||
|
Launcher นี้ทำงานได้โดยใช้คอมโพเนนต์ที่มีอยู่แล้ว ผู้ใช้จึงจะได้รับประสบการณ์ที่เรียบง่าย
|
||||||
|
|
||||||
|
อย่างไรก็ตาม ส่วนประกอบบางอย่างที่ใช้อาจฝ่าฝืนข้อกำหนดในการให้บริการของ {company-name} สำหรับเกม {game-name}
|
||||||
|
|
||||||
|
หากคุณใช้ Launcher นี้ บัญชีของคุณอาจถูกระบุว่าไม่เป็นไปตามข้อกำหนดของ {company-name}/{company-alter-name}.
|
||||||
|
|
||||||
|
หากเกิดเหตุการณ์เช่นนี้ เนื่องจากบัญชีของคุณไม่ปฏิบัติตามข้อกำหนด, {company-name}/{company-alter-name} จึงมีอิสระที่จะทำสิ่งที่พวกเขาอยาก รวมถึงการแบนบัญชีของคุณ
|
||||||
|
|
||||||
|
หากคุณเข้าใจถึงความเสี่ยงในการพยายามเล่นเกมอย่างไม่เป็นทางการ ให้กด ตกลง เพื่อดำเนินการต่อ
|
||||||
|
|
||||||
|
tos-dialog-title = คุณแน่ใจหรือว่าคุณเข้าใจสิ่งที่เราพูด?
|
||||||
|
tos-dialog-message =
|
||||||
|
1. อย่าเผยแพร่ข้อมูลใดๆ เกี่ยวกับโครงการนี้
|
||||||
|
2. อย่าใช้มันในทางที่ผิดโดยใช้ไคลเอนต์ดัดแปลง
|
||||||
|
3. ถามคำถามเป็นพิเศษในเซิร์ฟเวอร์ Discord หรือ Matrix ของเรา
|
||||||
|
|
||||||
|
|
||||||
|
dependencies = โปรแกรมที่จำเป็น
|
||||||
|
missing-dependencies-title = คุณขาดโปรแกรมที่จำเป็น!
|
||||||
|
missing-dependencies-message = คุณต้องติดตั้งแพ็คเกจบางอย่างให้กับระบบของคุณก่อนที่จะดำเนินการติดตั้งต่อ
|
||||||
|
|
||||||
|
|
||||||
|
default-paths = เส้นทางเริ่มต้น
|
||||||
|
choose-default-paths = เลือกเส้นทางเริ่มต้น
|
||||||
|
show-all-folders = ฉันรู้ว่าฉันกำลังทำอะไรอยู่
|
||||||
|
show-all-folders-subtitle = แสดงการตั้งค่าการเลือกเส้นทางเพิ่มเติม (ทำตามที่ฉันบอก...)
|
||||||
|
runners-folder = โฟลเดอร์ Runners
|
||||||
|
dxvks-folder = โฟลเดอร์ DXVKs
|
||||||
|
wine-prefix-folder = โฟลเดอร์ prefix ของ Wine
|
||||||
|
global-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมสากล
|
||||||
|
chinese-game-installation-folder = โฟลเดอร์การติดตั้งเวอร์ชันเกมจีน
|
||||||
|
fps-unlocker-folder = โฟลเดอร์ FPS Unlocker
|
||||||
|
components-index = Index ส่วนประกอบ
|
||||||
|
patch-folder = โฟลเดอร์แพทช์
|
||||||
|
temp-folder = โฟลเดอร์ชั่วคราว
|
||||||
|
|
||||||
|
migrate = ย้าย
|
||||||
|
|
||||||
|
|
||||||
|
select-voice-packages = เลือกแพ็คเกจภาษาเสียง
|
||||||
|
|
||||||
|
|
||||||
|
download-components = ดาวน์โหลดส่วนประกอบ
|
||||||
|
download-dxvk = ดาวน์โหลด DXVK
|
||||||
|
apply-dxvk = ติดตั้ง DXVK
|
||||||
|
|
||||||
|
|
||||||
|
finish = สำเร็จ
|
||||||
|
finish-title = ทุกอย่างเสร็จแล้ว!
|
||||||
|
finish-message = ดาวน์โหลดส่วนประกอบพื้นฐานทั้งหมดแล้ว ตอนนี้คุณสามารถรีสตาร์ท Launcher และดาวน์โหลดเกมได้ ยินดีต้อนรับสู่ club ของเรา!
|
7
assets/locales/th/game.ftl
Normal file
7
assets/locales/th/game.ftl
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
game-sessions = เซสชันเกม
|
||||||
|
|
||||||
|
active-sessions = เซสชันที่ใช้งานอยู่
|
||||||
|
active-session-description = เซสชั่นเกมที่เลือกในปัจจุบัน อัปเดตหลังจากเปิดตัวเกมแต่ละครั้ง
|
||||||
|
|
||||||
|
update-session = อัปเดตเซสชันโดยใช้ค่าตั้งค่า Wine ปัจจุบัน
|
||||||
|
delete-session = ลบเซสชัน
|
16
assets/locales/th/gamescope.ftl
Normal file
16
assets/locales/th/gamescope.ftl
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
game-resolution = ความละเอียดของเกม
|
||||||
|
gamescope-resolution = ความละเอียดของ Gamescope
|
||||||
|
|
||||||
|
upscaling = การเพิ่มขนาดความละเอียด
|
||||||
|
|
||||||
|
integer-scaling = มาตราส่วนจำนวนเต็ม
|
||||||
|
integer-scaling-description = เปลี่ยนแต่ละพิกเซลเป็นกลุ่มสี่เหลี่ยมจัตุรัสหรือสี่เหลี่ยมของจำนวนเต็มของพิกเซลสีเดียวกัน ป้องกันการสูญเสียความคมชัดเมื่อปรับขนาด Full HD เป็น 4K
|
||||||
|
gamescope-fsr-description = เทคนิคการขยายขนาดที่พัฒนาโดย AMD เพื่อคุณภาพการขยายขนาดที่ดีขึ้น
|
||||||
|
nis-description = เทคนิคการขยายขนาดโอเพ่นซอร์สที่พัฒนาโดย Nvidia เป็นทางเลือกข้ามผู้จำหน่ายและมีค่าใช้จ่ายต่ำแทนโซลูชัน DLSS ที่เป็นกรรมสิทธิ์ ซึ่งหมายความว่าใช้งานได้กับ AMD และ Intel GPU รวมถึง Nvidia GPU
|
||||||
|
|
||||||
|
other-settings = การตั้งค่าอื่นๆ
|
||||||
|
framerate-limit = ขีดจำกัดเฟรมเรต
|
||||||
|
unfocused-framerate-limit = เฟรมเรทจำกัดขณะไม่ได้โฟกัส
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
70
assets/locales/th/general.ftl
Normal file
70
assets/locales/th/general.ftl
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
appearance = รูปร่าง
|
||||||
|
modern = โมเดิร์น
|
||||||
|
classic = คลาสสิค
|
||||||
|
update-background = อัพเดตภาพพื้นหลัง
|
||||||
|
update-background-description = ดาวน์โหลดภาพพื้นหลังสำหรับ launcher คุณสามารถปิดการใช้งานเพื่อใช้รูปภาพที่คุณกำหนดเองแทนได้
|
||||||
|
|
||||||
|
launcher-language = ภาษาของ launcher
|
||||||
|
launcher-language-description = ใช้หลังจากรีสตาร์ท launcher
|
||||||
|
|
||||||
|
game-edition = ฉบับเกม
|
||||||
|
global = สากล
|
||||||
|
china = จีน
|
||||||
|
|
||||||
|
game-environment = สภาพแวดล้อมของเกม
|
||||||
|
game-environment-description = รับคุณสมบัติเฉพาะ เช่น วิธีการชำระเงินอื่นๆ
|
||||||
|
|
||||||
|
game-voiceovers = ภาษาพากย์เสียงเกม
|
||||||
|
game-voiceovers-description = ภาษาเสียงพากย์เกมที่ดาวน์โหลดได้ คุณสามารถเลือกในการตั้งค่าเกม
|
||||||
|
english = ภาษาอังกฤษ
|
||||||
|
japanese = ภาษาญี่ปุ่น
|
||||||
|
korean = ภาษาเกาหลี
|
||||||
|
chinese = ภาษาจีน
|
||||||
|
|
||||||
|
migrate-installation = ย้ายการติดตั้งเกม
|
||||||
|
migrate-installation-description = เปิดหน้าต่างพิเศษที่คุณสามารถเปลี่ยนโฟลเดอร์การติดตั้งเกมของคุณได้
|
||||||
|
repair-game = ซ่อมแซมการติดตั้งเกม
|
||||||
|
|
||||||
|
status = สถานะ
|
||||||
|
|
||||||
|
game-version = เวอร์ชันเกม
|
||||||
|
game-not-installed = ยังไม่ได้ติดตั้ง
|
||||||
|
|
||||||
|
game-predownload-available = มีการอัปเดตเกมให้ดาวน์โหลดได้ล่วงหน้าแล้ว: {$old} -> {$new}
|
||||||
|
game-update-available = มีอัปเดตเวอร์ชันเกมใหม่: {$old} -> {$new}
|
||||||
|
game-outdated = เวอร์ชันเกมล้าสมัยเกินไปและไม่สามารถอัปเดตได้. เวอร์ชันล่าสุด: {$latest}
|
||||||
|
|
||||||
|
player-patch-version = เวอร์ชั่นแพทช์
|
||||||
|
player-patch-version-description = แพทช์หลักที่ให้คุณเล่นเกมบน Linux
|
||||||
|
|
||||||
|
patch-not-available = ไม่พร้อมใช้งาน
|
||||||
|
patch-not-available-tooltip = ไม่สามารถเข้าถึงเซิร์ฟเวอร์แพทช์ได้
|
||||||
|
|
||||||
|
patch-outdated = แพทช์ล้าสมัย ({$current})
|
||||||
|
patch-outdated-tooltip = แพทช์ล้าสมัยแล้ว: {$current} -> {$latest}
|
||||||
|
|
||||||
|
patch-preparation = เตรียมการ
|
||||||
|
patch-preparation-tooltip = แพทช์อยู่ระหว่างการพัฒนา
|
||||||
|
|
||||||
|
patch-testing-tooltip = มีแพทช์ทดสอบให้ใช้งาน
|
||||||
|
patch-not-applied-tooltip = แพทช์ยังไม่มีการติดตั้ง
|
||||||
|
|
||||||
|
apply-main-patch = ติดตั้งแพทช์หลัก
|
||||||
|
apply-main-patch-description = การทดลอง. การปิดใช้งานจะทำให้คุณสามารถรันเกมได้โดยไม่ต้องใช้แพตช์ สิ่งนี้อาจไม่ทำงานหรือต้องมีการแก้ไขไฟล์ด้วยตนเอง ใใช้เฉพาะเมื่อคุณรู้ว่าคุณกำลังทำอะไรอยู่
|
||||||
|
|
||||||
|
disable-mhypbase = ปิดการใช้งาน mhypbase
|
||||||
|
disable-mhypbase-description = การทดลอง. หากเปิดใช้งาน launcher จะปิดใช้งาน mhypbase.dll ในระหว่างการติดตั้งแพตช์หลัก ซึ่งในปัจจุบันเทียบเท่ากับแพตช์ xlua ปรับปรุงประสิทธิภาพและลดการใช้งาน CPU
|
||||||
|
|
||||||
|
ask-superuser-permissions = ขอสิทธิ์ผู้ใช้ขั้นสูง (superuser)
|
||||||
|
ask-superuser-permissions-description = Launcher จะใช้ไฟล์เหล่านี้เพื่ออัปเดตไฟล์โฮสต์ของคุณโดยอัตโนมัติ สิ่งนี้ไม่จำเป็นในรุ่น flatpak
|
||||||
|
|
||||||
|
launcher-behavior = พฤติกรรม Launcher
|
||||||
|
launcher-behavior-description = หน้าต่าง Launcher ควรทำอย่างไรเมื่อเริ่มเกม
|
||||||
|
|
||||||
|
wine-tools = เครื่องมือ Wine
|
||||||
|
command-line = Command line
|
||||||
|
registry-editor = Registry editor
|
||||||
|
explorer = Explorer
|
||||||
|
task-manager = Task manager
|
||||||
|
configuration = Configuration
|
||||||
|
debugger = Debugger
|
76
assets/locales/th/main.ftl
Normal file
76
assets/locales/th/main.ftl
Normal file
|
@ -0,0 +1,76 @@
|
||||||
|
custom = กำหนดเอง
|
||||||
|
none = ไม่ใช้
|
||||||
|
default = ค่าเริ่มต้น
|
||||||
|
details = รายละเอียด
|
||||||
|
options = ตัวเลือก
|
||||||
|
|
||||||
|
width = ความกว้าง
|
||||||
|
height = ความสูง
|
||||||
|
|
||||||
|
# Menu items
|
||||||
|
|
||||||
|
launcher-folder = โฟลเดอร์ Launcher
|
||||||
|
game-folder = โฟลเดอร์เกม
|
||||||
|
config-file = ไฟล์ Config
|
||||||
|
debug-file = ไฟล์ Debug
|
||||||
|
wish-url = เปิด URL การอธิษฐาน
|
||||||
|
about = เกี่ยวกับ
|
||||||
|
|
||||||
|
|
||||||
|
close = ปิด
|
||||||
|
hide = ซ่อน
|
||||||
|
nothing = ไม่ทำอะไร
|
||||||
|
save = บันทึก
|
||||||
|
continue = ดำเนินการต่อ
|
||||||
|
resume = ดำเนินการต่อ
|
||||||
|
exit = ออก
|
||||||
|
check = ตรวจสอบ
|
||||||
|
restart = เริ่มต้นใหม่
|
||||||
|
agree = ตกลง
|
||||||
|
|
||||||
|
|
||||||
|
loading-data = กำลังโหลดข้อมูล
|
||||||
|
downloading-background-picture = กำลังดาวน์โหลดภาพพื้นหลัง
|
||||||
|
updating-components-index = กำลังอัปเดต index ส่วนประกอบ
|
||||||
|
loading-game-version = กำลังโหลดเวอร์ชั่นเกม
|
||||||
|
loading-patch-status = กำลังโหลดสถานะแพทช์
|
||||||
|
loading-launcher-state = กำลังโหลดสถานะ launcher
|
||||||
|
loading-launcher-state--game = กำลังโหลดสถานะ launcher: กำลังตรวจสอบเวอร์ชันเกม
|
||||||
|
loading-launcher-state--voice = กำลังโหลดสถานะ launcher: กำลังตรวจสอบภาษาพากย์เสียง {$locale}
|
||||||
|
loading-launcher-state--patch = กำลังโหลดสถานะ launcher: กำลังตรวจสอบแพตช์ที่ติดตั้ง
|
||||||
|
|
||||||
|
|
||||||
|
checking-free-space = กำลังตรวจสอบพื้นที่ว่าง
|
||||||
|
downloading = กำลังดาวน์โหลด
|
||||||
|
updating-permissions = กำลังอัปเดตสิทธิ์
|
||||||
|
unpacking = กำลังแกะ
|
||||||
|
verifying-files = กำลังตรวจสอบไฟล์
|
||||||
|
repairing-files = กำลังซ่อมแซมไฟล์
|
||||||
|
migrating-folders = กำลังย้ายโฟลเดอร์
|
||||||
|
applying-hdiff = กำลังติดตั้งแพตช์ hdiff
|
||||||
|
removing-outdated = กำลังลบไฟล์ที่ล้าสมัย
|
||||||
|
|
||||||
|
|
||||||
|
components-index-updated = อัปเดตส่วนประกอบแล้ว
|
||||||
|
|
||||||
|
|
||||||
|
launch = เริ่มเกมส์
|
||||||
|
migrate-folders = ย้ายโฟลเดอร์
|
||||||
|
migrate-folders-tooltip = อัพเดตโครงสร้างโฟลเดอร์เกม
|
||||||
|
apply-patch = ติดตั้งแพทช์
|
||||||
|
disable-telemetry = ปิดใช้งานการวัดและส่งข้อมูล
|
||||||
|
download-wine = ดาวน์โหลด Wine
|
||||||
|
create-prefix = สร้างการตั้งค่า Wine
|
||||||
|
update = อัปเดต
|
||||||
|
download = ดาวน์โหลด
|
||||||
|
predownload-update = ดาวน์โหลดล่วงหน้า {$version} อัปเดต ({$size})
|
||||||
|
|
||||||
|
kill-game-process = ฆ่ากระบวนการเกม
|
||||||
|
|
||||||
|
main-window--patch-unavailable-tooltip = เซิร์ฟเวอร์แพตช์ไม่พร้อมใช้งานและ launcher ไม่สามารถตรวจสอบสถานะการแพตช์ของเกมได้ คุณสามารถรันเกมได้แต่ต้องยอมรับความเสี่ยงเอง
|
||||||
|
main-window--patch-outdated-tooltip = โแพตช์ล้าสมัยหรืออยู่ในสถานะเตรียมการ ดังนั้นจึงไม่สามารถใช้งานได้ โปรดกลับมาใหม่ในภายหลังเพื่อดูสถานะ
|
||||||
|
main-window--version-outdated-tooltip = เวอร์ชันล้าสมัยเกินไปและไม่สามารถอัปเดตได้
|
||||||
|
|
||||||
|
preferences = การตั้งค่า
|
||||||
|
general = ทั่วไป
|
||||||
|
enhancements = การปรับปรุง
|
28
assets/locales/th/sandbox.ftl
Normal file
28
assets/locales/th/sandbox.ftl
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
sandbox = แซนด์บ็อกซ์
|
||||||
|
sandbox-description = รันเกมที่แยกออกจากระบบ เพื่อป้องกันไม่ให้เข้าถึงข้อมูลส่วนบุคคลของคุณ
|
||||||
|
|
||||||
|
enable-sandboxing = เปิดใช้งานแซนด์บ็อกซ์
|
||||||
|
enable-sandboxing-description = รันเกมในระบบไฟล์รูทของคุณแบบอ่านได้อย่างเดียว
|
||||||
|
|
||||||
|
hide-home-directory = ซ่อนโฮมไดเร็กตอรี่
|
||||||
|
hide-home-directory-description = ซ่อนโฟลเดอร์ /home, /var/home/$USER และ $HOME ของคุณจากเกม
|
||||||
|
|
||||||
|
hostname = ชื่อโฮสต์
|
||||||
|
additional-arguments = arguments เพิ่มเติม
|
||||||
|
|
||||||
|
private-directories = ไดเรกทอรีส่วนตัว
|
||||||
|
private-directories-description = โฟลเดอร์เหล่านี้จะถูกแทนที่ด้วยระบบไฟล์เสมือนที่ว่างเปล่า (tmpfs) และไฟล์เหล่านั้นจะไม่สามารถเข้าถึงได้โดยเกมแซนด์บ็อกซ์
|
||||||
|
|
||||||
|
path = เส้นทาง
|
||||||
|
|
||||||
|
shared-directories = ไดเรกทอรีใช้ร่วมกัน
|
||||||
|
shared-directories-description = ไดเร็กทอรีเหล่านี้จะเชื่อมโยงกับไดเร็กทอรีในระบบโฮสต์ของคุณ
|
||||||
|
|
||||||
|
original-path = เส้นทางเดิม
|
||||||
|
new-path = เส้นทางใหม่
|
||||||
|
|
||||||
|
read-only = อ่านได้เท่านั้น
|
||||||
|
read-only-description = ห้ามเกมเขียนข้อมูลใดๆ ลงในไดเร็กทอรีนี้
|
||||||
|
|
||||||
|
symlinks = Symlinks
|
||||||
|
symlinks-description = สร้าง Symbolic Link จากตำแหน่งเดิมไปยังตำแหน่งใหม่ภายในแซนด์บ็อกซ์ของคุณ
|
|
@ -11,3 +11,6 @@ nis-description = DLSS teknolojisine düşük maliyetli bir alternatif olarak Nv
|
||||||
other-settings = Diğer ayarlar
|
other-settings = Diğer ayarlar
|
||||||
framerate-limit = Kare hızı limiti
|
framerate-limit = Kare hızı limiti
|
||||||
unfocused-framerate-limit = Odakta değilken kare hızı limiti
|
unfocused-framerate-limit = Odakta değilken kare hızı limiti
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
20
assets/locales/uk/components.ftl
Normal file
20
assets/locales/uk/components.ftl
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
components = Компоненти
|
||||||
|
components-description = Керування версіями Wine і DXVK
|
||||||
|
|
||||||
|
selected-version = Обрана версія
|
||||||
|
recommended-only = Тільки рекомендоване
|
||||||
|
|
||||||
|
wine-version = Версія Wine
|
||||||
|
wine-recommended-description = Показувати тільки рекомендовані версії Wine
|
||||||
|
|
||||||
|
wine-options = Опції Wine
|
||||||
|
|
||||||
|
wine-use-shared-libraries = Використовувати динамічні бібліотеки Wine
|
||||||
|
wine-use-shared-libraries-description = Встановити змінну LD_LIBRARY_PATH, щоб завантажувати системні бібліотеки з обраної збірки Wine
|
||||||
|
|
||||||
|
gstreamer-use-shared-libraries = Використовувати динамічні бібліотеки gstreamer
|
||||||
|
gstreamer-use-shared-libraries-description = Встановити змінну GST_PLUGIN_PATH, щоб завантажувати бібліотеки gstreamer з обраної збірки Wine
|
||||||
|
|
||||||
|
dxvk-version = Версія DXVK
|
||||||
|
dxvk-selection-disabled = Вибір версії DXVK вимкнено налаштуваннями обраного вами Wine
|
||||||
|
dxvk-recommended-description = Показувати тільки рекомендовані версії DXVK
|
57
assets/locales/uk/enhancements.ftl
Normal file
57
assets/locales/uk/enhancements.ftl
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
game-settings-description = Керування налаштуваннями гри та сесією акаунту
|
||||||
|
sandbox-settings-description = Запускати гру в bubblewrap пісочниці, схожу на ту яку використовує Flatpak
|
||||||
|
environment-settings-description = Вказати змінні середовища та команду запуску гри
|
||||||
|
|
||||||
|
wine = Wine
|
||||||
|
|
||||||
|
synchronization = Синхронізація
|
||||||
|
wine-sync-description = Технологія, що використовується для синхронізації внутрішніх подій Wine
|
||||||
|
|
||||||
|
language = Мова
|
||||||
|
wine-lang-description = Мова, яка використовується в середовищі Wine. Може виправити проблеми з розкладкою клавіатури
|
||||||
|
system = Системний
|
||||||
|
|
||||||
|
borderless-window = Вікно без рамок
|
||||||
|
virtual-desktop = Віртуальний робочий стіл
|
||||||
|
|
||||||
|
map-drive-c = Створювати диск C:
|
||||||
|
map-drive-c-description = Автоматично створювати посилання на drive_c з префіксу Wine в dosdevices
|
||||||
|
|
||||||
|
map-game-folder = Створювати диск з грою
|
||||||
|
map-game-folder-description = Автоматично створювати посилання на теку гри в dosdevices
|
||||||
|
|
||||||
|
game = Гра
|
||||||
|
|
||||||
|
hud = HUD
|
||||||
|
|
||||||
|
fsr = FSR
|
||||||
|
fsr-description = Для використання встановіть нижчу роздільну здатність в грі та настисність Alt+Enter
|
||||||
|
ultra-quality = Ультра
|
||||||
|
quality = Гарно
|
||||||
|
balanced = Баланс
|
||||||
|
performance = Картопля
|
||||||
|
|
||||||
|
gamemode = Gamemode
|
||||||
|
gamemode-description = Ставити грі вищий пріоритет над процесами
|
||||||
|
|
||||||
|
gamescope = Gamescope
|
||||||
|
gamescope-description = Програма від Valve, яка дозволяє запускати програми в ізольовоному середевощі Xwayland і підтримує відеокарти від AMD, Intel, та Nvidia
|
||||||
|
|
||||||
|
discord-rpc = Discord RPC
|
||||||
|
discord-rpc-description = Discord RPC дозволяє вам показувати в Discord інформацію про гру в яку ви зараз граєте
|
||||||
|
icon = Іконка
|
||||||
|
title = Заголовок
|
||||||
|
description = Опис
|
||||||
|
|
||||||
|
fps-unlocker = FPS Unlocker
|
||||||
|
fps-unlocker-description = Змінити обмеження кадрів в грі шляхом модифікування пам'яті гри. Може бути виявлено античитом гри
|
||||||
|
|
||||||
|
enabled = Ввімкнений
|
||||||
|
|
||||||
|
fps-unlocker-interval = Затримка між перезаписами
|
||||||
|
fps-unlocker-interval-description = Затримка між перезаписами в мілісекунадх. Періодичний перезапис значення обмеження необхідна для запобігання його скидання
|
||||||
|
|
||||||
|
window-mode = Режим вікна
|
||||||
|
borderless = Безрамковий
|
||||||
|
popup = Спливаючий
|
||||||
|
fullscreen = Повноекранний
|
7
assets/locales/uk/environment.ftl
Normal file
7
assets/locales/uk/environment.ftl
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
environment = Середовище
|
||||||
|
game-command = Команда запуска
|
||||||
|
game-command-description = Команда, яка використовується для запуску гри. Ключ %command% генерується лаунчером автоматично. Наприклад: gamemoderun '%command%'
|
||||||
|
new-variable = Нова змінна
|
||||||
|
name = Ім'я
|
||||||
|
value = Значення
|
||||||
|
add = Додати
|
66
assets/locales/uk/errors.ftl
Normal file
66
assets/locales/uk/errors.ftl
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
launcher-folder-opening-error = Не вдалося відкрити папку лаунчера
|
||||||
|
game-folder-opening-error = Не вдалося відкрити папку гри
|
||||||
|
config-file-opening-error = Не вдалося відкрити файл налаштувань
|
||||||
|
debug-file-opening-error = Не вдалося відкрити файл налагодження
|
||||||
|
|
||||||
|
wish-url-search-failed = Посилання на історію молитов не знайдено
|
||||||
|
wish-url-opening-error = Не вдалося відкрити посилання з історією молитов
|
||||||
|
|
||||||
|
wine-run-error = Не вдалося запустити {$executable} використовуючи Wine
|
||||||
|
|
||||||
|
game-launching-failed = Не вдалося запустити гру
|
||||||
|
failed-get-selected-wine = Не вдалося знайти обрану версію Wine
|
||||||
|
downloading-failed = Помилка завантаження
|
||||||
|
unpacking-failed = Помилка розпакування
|
||||||
|
|
||||||
|
kill-game-process-failed = Не вдалося вбити процес гри
|
||||||
|
|
||||||
|
game-file-repairing-error = Не вдалося відремонтувати гру
|
||||||
|
integrity-files-getting-error = Не вдалося отримати вірні дані про файли гри
|
||||||
|
|
||||||
|
background-downloading-failed = Не вдалося завантажити фонове зображення
|
||||||
|
components-index-sync-failed = Не вдалося синхронізувати індекс компонентів
|
||||||
|
components-index-verify-failed = Не вдалося перевірити індекс компонентів
|
||||||
|
config-update-error = Помилка збереження налаштувань
|
||||||
|
wine-prefix-update-failed = Помилка оновлення префікса Wine
|
||||||
|
dxvk-install-failed = Помилка встановлення DXVK
|
||||||
|
voice-package-deletion-error = Не вдалося видалити мовний пакет
|
||||||
|
|
||||||
|
game-diff-finding-error = Не вдалося визначити оновлення гри
|
||||||
|
patch-info-fetching-error = Не вдалося отримати інформацію про патч
|
||||||
|
launcher-state-updating-error = Не вдалося оновити стан лаунчера
|
||||||
|
|
||||||
|
package-not-available = Пакет недоступний: {$package}
|
||||||
|
wine-download-error = Помилка завантаження Wine
|
||||||
|
wine-unpack-errror = Помилка розпакування Wine
|
||||||
|
wine-install-failed = Помилка встановлення Wine
|
||||||
|
dxvk-download-error = Помилка завантаження DXVK
|
||||||
|
dxvk-unpack-error = Помилка розпакування DXVK
|
||||||
|
dxvk-apply-error = Не вдалося застосувати DXVK
|
||||||
|
|
||||||
|
downloaded-wine-list-failed = Не вдалося отримати список встановлених версій Wine
|
||||||
|
|
||||||
|
patch-sync-failed = Помилка синхронізації папки патча
|
||||||
|
patch-state-check-failed = Помилка перевірки статусу папки патча
|
||||||
|
game-patching-error = Не вдалося встановити патч гри
|
||||||
|
|
||||||
|
# Disable telemetry
|
||||||
|
|
||||||
|
telemetry-servers-disabling-error = Не вдалося відключити сервери телеметрії
|
||||||
|
|
||||||
|
# Sandbox
|
||||||
|
|
||||||
|
documentation-url-open-failed = Не вдалося відкрити посилання з документацією
|
||||||
|
|
||||||
|
# Game
|
||||||
|
|
||||||
|
game-session-add-failed = Не вдалося додати гру
|
||||||
|
game-session-update-failed = Не вдалося оновити гру
|
||||||
|
game-session-remove-failed = Не вдалося видалити гру
|
||||||
|
game-session-set-current-failed = Не вдалося вибрати гру
|
||||||
|
game-session-apply-failed = Не вдалося застосувати гру
|
||||||
|
|
||||||
|
# Enhancements
|
||||||
|
|
||||||
|
discord-rpc-icons-fetch-failed = Не вдалося отримати список іконок Discord RPC
|
||||||
|
discord-rpc-icon-download-failed = Не вдалося завантажити іконку Discord RPC
|
66
assets/locales/uk/first_run.ftl
Normal file
66
assets/locales/uk/first_run.ftl
Normal file
|
@ -0,0 +1,66 @@
|
||||||
|
welcome = Ласкаво просимо
|
||||||
|
|
||||||
|
welcome-page-message =
|
||||||
|
Вітаю! Ласкаво просимо до An Anime Game Launcher
|
||||||
|
|
||||||
|
Нам потрібно підготувати декілька речей і встановити стандартні компоненти, перш ніж ти зможеш запустити гру
|
||||||
|
|
||||||
|
|
||||||
|
tos-violation-warning = Порушення угоди користувача
|
||||||
|
|
||||||
|
tos-violation-warning-message =
|
||||||
|
Цей лаунчер є неофіційним і ніяк не відноситься до {company-name} або {company-alter-name}.
|
||||||
|
|
||||||
|
Він був розроблений з метою надання можливості грати в {game-name} на Linux.
|
||||||
|
|
||||||
|
Його головна мета - допомогти встановити і запустити гру з меншими клопотами.
|
||||||
|
|
||||||
|
Це досягається за рахунок використання існуючих компонентів і спрощення роботи користувача.
|
||||||
|
|
||||||
|
Однак, деякі компоненти, що використовуються тут, ймовірно порушують угоду користувача {game-name}, що належить {company-name}.
|
||||||
|
|
||||||
|
Якщо ви використовуєте цей лаунчер - ваш геймерський аккаунт може бути визнаний як порушуючий угоду користувача {company-name}/{company-alter-name}.
|
||||||
|
|
||||||
|
Якщо це станеться - оскільки ваш обліковий запис буде порушувати правила, {company-name}/{company-alter-name} будуть вільні робити те, що захочуть, включаючи блокування вашого аккаунта.
|
||||||
|
|
||||||
|
Якщо ви усвідомлюєте ризик використання неофіційних засобів гри - натисніть "Продовжити"
|
||||||
|
|
||||||
|
tos-dialog-title = Ви точно впевнені, що розумієте, що ми хочемо сказати?
|
||||||
|
tos-dialog-message =
|
||||||
|
1. Не публікуйте жодної інформації про проект
|
||||||
|
2. Не використовуйте його разом з модифікованими клієнтами та подібним
|
||||||
|
3. Задавайте питання виключно на нашому discord або matrix сервері
|
||||||
|
|
||||||
|
dependencies = Залежності
|
||||||
|
missing-dependencies-title = У вас не встановлено деякі компоненти!
|
||||||
|
missing-dependencies-message = Ви повинні встановити деякі системні пакети, щоб продовжити процес встановлення
|
||||||
|
|
||||||
|
|
||||||
|
default-paths = Шляхи за замовчуванням
|
||||||
|
choose-default-paths = Вибрати шляхи за замовчуванням
|
||||||
|
show-all-folders = Я знаю, що я роблю
|
||||||
|
show-all-folders-subtitle = Відобразити додаткові опції вибору шляхів
|
||||||
|
runners-folder = Папка версій Wine
|
||||||
|
dxvks-folder = Папка версій DXVK
|
||||||
|
wine-prefix-folder = Папка префікса Wine
|
||||||
|
global-game-installation-folder = Шлях встановлення глобальної версії гри
|
||||||
|
chinese-game-installation-folder = Шлях встановлення китайської версії гри
|
||||||
|
fps-unlocker-folder = Папка FPS Unlocker
|
||||||
|
components-index = Індекс компонентів
|
||||||
|
patch-folder = Папка завантаження патча
|
||||||
|
temp-folder = Тимчасова папка
|
||||||
|
|
||||||
|
migrate = Мігрувати
|
||||||
|
|
||||||
|
|
||||||
|
select-voice-packages = Вибрати мовні пакети
|
||||||
|
|
||||||
|
|
||||||
|
download-components = Завантажити компоненти
|
||||||
|
download-dxvk = Завантажити DXVK
|
||||||
|
apply-dxvk = Застосувати DXVK
|
||||||
|
|
||||||
|
|
||||||
|
finish = Завершення
|
||||||
|
finish-title = Робота завершена!
|
||||||
|
finish-message = Всі базові компоненти були встановлені. Тепер ви можете перезапустити лаунчер і встановити гру. Ласкаво просимо до клубу!
|
7
assets/locales/uk/game.ftl
Normal file
7
assets/locales/uk/game.ftl
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
game-sessions = Ігрові сесії
|
||||||
|
|
||||||
|
active-sessions = Активна сесія
|
||||||
|
active-session-description = Обрана ігрова сесія. Оновлюється після кожного запуску гри
|
||||||
|
|
||||||
|
update-session = Оновити сесію, використовуючи значення реєстру з префікса Wine
|
||||||
|
delete-session = Видалити сесію
|
16
assets/locales/uk/gamescope.ftl
Normal file
16
assets/locales/uk/gamescope.ftl
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
game-resolution = Роздільна здатність гри
|
||||||
|
gamescope-resolution = Роздільна здатність Gamescope
|
||||||
|
|
||||||
|
upscaling = Масштабування
|
||||||
|
|
||||||
|
integer-scaling = Цілочисельне масштабування
|
||||||
|
integer-scaling-description = Кожен піксель перетворюється на квадрат або прямокутник з цілого числа пікселів одного кольору. Запобігає втраті чіткості при масштабуванні Full HD до 4K
|
||||||
|
gamescope-fsr-description = Відкрита техніка масштабування зі збереженням хорошої якості зображення, розроблена AMD
|
||||||
|
nis-description = Відкрита техніка масштабування зі збереженням хорошої якості зображення, розроблена Nvidia для заміни DLSS і працює на відеокартах AMD, Intel і Nvidia
|
||||||
|
|
||||||
|
other-settings = Інші налаштування
|
||||||
|
framerate-limit = Обмеження кількості кадрів
|
||||||
|
unfocused-framerate-limit = Обмеження кількості кадрів поза фокусом
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
70
assets/locales/uk/general.ftl
Normal file
70
assets/locales/uk/general.ftl
Normal file
|
@ -0,0 +1,70 @@
|
||||||
|
appearance = Зовнішній вигляд
|
||||||
|
modern = Сучасний
|
||||||
|
classic = Класичний
|
||||||
|
update-background = Оновлювати фонове зображення
|
||||||
|
update-background-description = Завантажувати фонове зображення для лаунчера. Ви можете вимкнути це, щоб використовувати власне зображення
|
||||||
|
|
||||||
|
launcher-language = Мова лаунчера
|
||||||
|
launcher-language-description = Застосовується після перезапуску
|
||||||
|
|
||||||
|
game-edition = Редакція гри
|
||||||
|
global = Глобальна
|
||||||
|
china = Китайська
|
||||||
|
|
||||||
|
game-environment = Оточення гри
|
||||||
|
game-environment-description = Отримати спеціальні функції, такі як додаткові методи оплати
|
||||||
|
|
||||||
|
game-voiceovers = Мова озвучення
|
||||||
|
game-voiceovers-description = Список встановлених озвучок гри. Ви можете вибрати їх в налаштуваннях гри
|
||||||
|
english = Англійська
|
||||||
|
japanese = Японська
|
||||||
|
korean = Корейська
|
||||||
|
chinese = Китайська
|
||||||
|
|
||||||
|
migrate-installation = Перенести лаунчер
|
||||||
|
migrate-installation-description = Відкрити спеціальне вікно, в якому ви зможете перенести встановлену гру
|
||||||
|
repair-game = Відновити гру
|
||||||
|
|
||||||
|
status = Статус
|
||||||
|
|
||||||
|
game-version = Версія гри
|
||||||
|
game-not-installed = не встановлена
|
||||||
|
|
||||||
|
game-predownload-available = Доступне попереднє завантаження оновлення гри: {$old} -> {$new}
|
||||||
|
game-update-available = Доступне оновлення гри: {$old} -> {$new}
|
||||||
|
game-outdated = Версія гри застаріла і не може бути оновлена. Остання версія: {$latest}
|
||||||
|
|
||||||
|
player-patch-version = Версія основного патча
|
||||||
|
player-patch-version-description = Основний патч, який дозволяє вам грати в гру на Linux
|
||||||
|
|
||||||
|
patch-not-available = недоступний
|
||||||
|
patch-not-available-tooltip = Сервери патча недоступні
|
||||||
|
|
||||||
|
patch-outdated = застарілий ({$current})
|
||||||
|
patch-outdated-tooltip = Версія патча застаріла: {$current} -> {$latest}
|
||||||
|
|
||||||
|
patch-preparation = підготовка
|
||||||
|
patch-preparation-tooltip = Патч у розробці
|
||||||
|
|
||||||
|
patch-testing-tooltip = Доступна тестова версія патча
|
||||||
|
patch-not-applied-tooltip = Патч не застосовано
|
||||||
|
|
||||||
|
apply-main-patch = Застосовувати основний патч
|
||||||
|
apply-main-patch-description = Експериментально. Вимкнення опції дозволяє запускати гру без застосування патча. Це може не працювати або вимагати ручної зміни файлів. Використовуйте, якщо знаєте, що робите
|
||||||
|
|
||||||
|
disable-mhypbase = Вимкнути mhypbase
|
||||||
|
disable-mhypbase-description = Експериментально. Коли включено, лаунчер буде вимикати mhypbase.dll під час застосування основного патча, що зараз є еквівалентом патча xlua. Покращує продуктивність і знижує навантаження на процесор
|
||||||
|
|
||||||
|
ask-superuser-permissions = Запитувати права суперкористувача
|
||||||
|
ask-superuser-permissions-description = Лаунчер буде використовувати їх, щоб автоматично оновлювати ваш файл hosts для вимкнення телеметрії гри. Не потрібно при використанні flatpak
|
||||||
|
|
||||||
|
launcher-behavior = Поведінка лаунчера
|
||||||
|
launcher-behavior-description = Що повинно робити вікно лаунчера, коли воно запускає гру
|
||||||
|
|
||||||
|
wine-tools = Інструменти Wine
|
||||||
|
command-line = Командний рядок
|
||||||
|
registry-editor = Редактор реєстру
|
||||||
|
explorer = Провідник
|
||||||
|
task-manager = Диспетчер завдань
|
||||||
|
configuration = Налаштування
|
||||||
|
debugger = Відлагоджувач
|
87
assets/locales/uk/main.ftl
Normal file
87
assets/locales/uk/main.ftl
Normal file
|
@ -0,0 +1,87 @@
|
||||||
|
custom = Своє значення
|
||||||
|
none = Немає
|
||||||
|
default = За замовчуванням
|
||||||
|
details = Детальніше
|
||||||
|
options = Опції
|
||||||
|
|
||||||
|
width = Ширина
|
||||||
|
height = Висота
|
||||||
|
|
||||||
|
# Menu items
|
||||||
|
|
||||||
|
launcher-folder = Папка лаунчера
|
||||||
|
game-folder = Папка гри
|
||||||
|
config-file = Файл налаштувань
|
||||||
|
debug-file = Журнал відлагодження
|
||||||
|
wish-url = Історія молитв
|
||||||
|
about = Про програму
|
||||||
|
|
||||||
|
close = { $form ->
|
||||||
|
[verb] Закриватися
|
||||||
|
*[noun] Закрити
|
||||||
|
}
|
||||||
|
|
||||||
|
hide = { $form ->
|
||||||
|
[verb] Ховатися
|
||||||
|
*[noun] Сховати
|
||||||
|
}
|
||||||
|
|
||||||
|
nothing = Нічого
|
||||||
|
save = Зберегти
|
||||||
|
continue = Продовжити
|
||||||
|
resume = Відновити
|
||||||
|
exit = Вийти
|
||||||
|
check = Перевірити
|
||||||
|
restart = Перезапустити
|
||||||
|
agree = Підтвердити
|
||||||
|
|
||||||
|
|
||||||
|
loading-data = Завантаження даних
|
||||||
|
downloading-background-picture = Завантаження фонового зображення
|
||||||
|
updating-components-index = Оновлення індексу компонентів
|
||||||
|
loading-game-version = Завантаження версії гри
|
||||||
|
loading-patch-status = Завантаження статусу патча
|
||||||
|
loading-launcher-state = Завантаження статусу лаунчера
|
||||||
|
loading-launcher-state--game = Завантаження статусу лаунчера: перевірка версії гри
|
||||||
|
loading-launcher-state--voice = Завантаження статусу лаунчера: перевірка {$locale ->
|
||||||
|
[English] англійської
|
||||||
|
[Japanese] японської
|
||||||
|
[Korean] корейської
|
||||||
|
[Chinese] китайської
|
||||||
|
*[other] $locale
|
||||||
|
} мови пакета
|
||||||
|
loading-launcher-state--patch = Завантаження статусу лаунчера: перевірка встановленого патча
|
||||||
|
|
||||||
|
|
||||||
|
checking-free-space = Перевірка вільного місця
|
||||||
|
downloading = Завантаження
|
||||||
|
updating-permissions = Оновлення привілеїв
|
||||||
|
unpacking = Розпакування
|
||||||
|
verifying-files = Перевірка файлів
|
||||||
|
repairing-files = Відновлення файлів
|
||||||
|
migrating-folders = Переміщення папок
|
||||||
|
applying-hdiff = Застосування патчів hdiff
|
||||||
|
removing-outdated = Видалення застарілих файлів
|
||||||
|
|
||||||
|
components-index-updated = Індекс компонентів було оновлено
|
||||||
|
|
||||||
|
launch = Запустити
|
||||||
|
migrate-folders = Перемістити папки
|
||||||
|
migrate-folders-tooltip = Оновити структуру файлів гри
|
||||||
|
apply-patch = Застосувати патч
|
||||||
|
disable-telemetry = Вимкнути телеметрію
|
||||||
|
download-wine = Встановити Wine
|
||||||
|
create-prefix = Створити префікс
|
||||||
|
update = Оновити
|
||||||
|
download = Встановити
|
||||||
|
predownload-update = Попередньо встановити оновлення {$version} ({$size})
|
||||||
|
|
||||||
|
kill-game-process = Завершити процес гри
|
||||||
|
|
||||||
|
main-window--patch-unavailable-tooltip = Сервери патча недоступні, і лаунчер не може перевірити статус патча гри. Ви можете запустити гру на свій страх і ризик
|
||||||
|
main-window--patch-outdated-tooltip = Патч застарів або знаходиться в процесі розробки, тому не може бути застосований. Поверніться пізніше, щоб перевірити його статус
|
||||||
|
main-window--version-outdated-tooltip = Версія занадто стара і не може бути оновлена
|
||||||
|
|
||||||
|
preferences = Налаштування
|
||||||
|
general = Основне
|
||||||
|
enhancements = Покращення
|
28
assets/locales/uk/sandbox.ftl
Normal file
28
assets/locales/uk/sandbox.ftl
Normal file
|
@ -0,0 +1,28 @@
|
||||||
|
sandbox = Пісочниця
|
||||||
|
sandbox-description = Запускати гру в ізольованому середовищі, що запобігає доступу до ваших особистих даних
|
||||||
|
|
||||||
|
enable-sandboxing = Використовувати пісочницю
|
||||||
|
enable-sandboxing-description = Запускати гру в копії кореневої файлової системи комп'ютера без прав на зміну файлів
|
||||||
|
|
||||||
|
hide-home-directory = Приховувати домашню директорію
|
||||||
|
hide-home-directory-description = Ізолювати ваші директорії /home, /var/home/$USER, і $HOME від гри
|
||||||
|
|
||||||
|
hostname = Ім'я хоста
|
||||||
|
additional-arguments = Додаткові аргументи
|
||||||
|
|
||||||
|
private-directories = Приватні директорії
|
||||||
|
private-directories-description = Ці папки будуть замінені порожньою віртуальною файловою системою (tmpfs) і їх початковий вміст не буде доступний грі
|
||||||
|
|
||||||
|
path = Шлях
|
||||||
|
|
||||||
|
shared-directories = Спільні директорії
|
||||||
|
shared-directories-description = Ці директорії будуть доступні для гри
|
||||||
|
|
||||||
|
original-path = Початковий шлях
|
||||||
|
new-path = Шлях в пісочниці
|
||||||
|
|
||||||
|
read-only = Тільки для читання
|
||||||
|
read-only-description = Заборонити грі змінювати вміст цієї директорії
|
||||||
|
|
||||||
|
symlinks = Посилання
|
||||||
|
symlinks-description = Додати посилання на оригінальний файл або папку в вашу пісочницю
|
|
@ -11,3 +11,6 @@ nis-description = Một kỹ thuật nâng cấp mã nguồn mở do Nvidia phá
|
||||||
other-settings = Cài đặt khác
|
other-settings = Cài đặt khác
|
||||||
framerate-limit = Giới hạn tốc độ khung hình
|
framerate-limit = Giới hạn tốc độ khung hình
|
||||||
unfocused-framerate-limit = Giới hạn tốc độ khung hình khi không tập trung
|
unfocused-framerate-limit = Giới hạn tốc độ khung hình khi không tập trung
|
||||||
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -1,6 +1,11 @@
|
||||||
game-resolution = 游戏分辨率
|
game-resolution = 游戏分辨率
|
||||||
gamescope-resolution = Gamescope 分辨率
|
gamescope-resolution = Gamescope 分辨率
|
||||||
|
|
||||||
|
integer-scaling = 整数倍数缩放
|
||||||
|
|
||||||
other-settings = 其它设置
|
other-settings = 其它设置
|
||||||
framerate-limit = 帧率限制
|
framerate-limit = 帧率限制
|
||||||
unfocused-framerate-limit = 切出游戏帧率限制
|
unfocused-framerate-limit = 切出游戏帧率限制
|
||||||
integer-scaling = 整数倍数缩放
|
|
||||||
|
force-grab-cursor = Force grab cursor
|
||||||
|
force-grab-cursor-description = Always use relative mouse mode instead of flipping dependent on cursor visibility. The mouse cursor will correctly be centered in the game
|
||||||
|
|
|
@ -26,6 +26,7 @@
|
||||||
<file preprocess="xml-stripblanks" alias="list-add-symbolic.svg">images/icons/list-add-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="list-add-symbolic.svg">images/icons/list-add-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks" alias="view-refresh-symbolic.svg">images/icons/view-refresh-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="view-refresh-symbolic.svg">images/icons/view-refresh-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks" alias="applications-games-symbolic.svg">images/icons/applications-games-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="applications-games-symbolic.svg">images/icons/applications-games-symbolic.svg</file>
|
||||||
|
<file preprocess="xml-stripblanks" alias="applications-system-symbolic.svg">images/icons/applications-system-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks" alias="applications-graphics-symbolic.svg">images/icons/applications-graphics-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="applications-graphics-symbolic.svg">images/icons/applications-graphics-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks" alias="go-next-symbolic.svg">images/icons/go-next-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="go-next-symbolic.svg">images/icons/go-next-symbolic.svg</file>
|
||||||
<file preprocess="xml-stripblanks" alias="dialog-information-symbolic.svg">images/icons/dialog-information-symbolic.svg</file>
|
<file preprocess="xml-stripblanks" alias="dialog-information-symbolic.svg">images/icons/dialog-information-symbolic.svg</file>
|
||||||
|
|
Binary file not shown.
|
@ -1,52 +0,0 @@
|
||||||
<svg fill="none" viewBox="0 0 600 300" width="600" height="300" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<foreignObject width="100%" height="100%">
|
|
||||||
<div xmlns="http://www.w3.org/1999/xhtml">
|
|
||||||
<style>
|
|
||||||
.container {
|
|
||||||
margin-left: 50px;
|
|
||||||
color: white;
|
|
||||||
font-size: 45px;
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Dejavu Sans", "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
|
|
||||||
}
|
|
||||||
@media (prefers-color-scheme: light) {
|
|
||||||
.container {
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.container section {
|
|
||||||
position: relative;
|
|
||||||
left: 70px;
|
|
||||||
}
|
|
||||||
.state, .version {
|
|
||||||
color: rgb(95, 117, 233);
|
|
||||||
}
|
|
||||||
.verification-icon {
|
|
||||||
top: 90px;
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
.verification-icon .exclamation {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSkWrDu2g4pChOtlFRRxrFYpQIdQKrTqYXPoHTRqSFBdHwbXg4M9i1cHFWVcHV0EQ/AFxdXFSdJESv2sKLWI8uLuH97735e47QKiXmWZ1xQBNt81UIi5msqti4BV9GECI1mGZWcacJCXhOb7u4eP7XZRnedf9OfrVnMUAn0gcY4ZpE28Qz2zaBud94jAryirxOfGESRckfuS64vIb50KTBZ4ZNtOpeeIwsVjoYKWDWdHUiKeJI6qmU76QcVnlvMVZK1dZ6578hcGcvrLMdZqjSGARS5AgQkEVJZRhI0q7ToqFFJ3HPfwjTb9ELoVcJTByLKACDXLTD/4Hv3tr5acm3aRgHOh+cZyPMSCwCzRqjvN97DiNE8D/DFzpbX+lDsx+kl5ra5EjYHAbuLhua8oecLkDDD0Zsik3JT9NIZ8H3s/om7JA6BboXXP71jrH6QOQpl4lb4CDQ2C8QNnrHu/u6ezbvzWt/v0AY0JyoIwWTZgAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnCw4TDhtaHD7zAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAAAzhJREFUaN7tmstLVFEcxz93nLHHLaxMsgyyuj4K7ElhyEmSLGphL1zZzp1Fiwpq1UbBCAr1f2jXQqGN5e4GRSFhQqkde2Bgkj0oj+KMelt0KitrxpkzM3fC7+pw7++c3/mc77lzHgwsaEEL+pesZDWspCgCrgHV+tFd4JLtuAMZA6Kk2Ag8AnJ/e/Ue2GM77kvTOQNJMqRtDgj0s7aMcERJcQjojBJ22HbcO74FUVIEgR5ga5TQZ1hssze7U36dWg0xQABswaPBl44oKXKB58DKGKt8BIpsx33vN0ca5wGBjm30lSNKijLgMZA1z6rTwE7bcXv94khLHBDoOi2+mFpKihNAVQJNVCkpTqZ1aikpFgFPgU0J9uMFsNV23Ml0OXLeAAS6jfNpcURJsRboB5Yb+s6+ACW24w6n2pHmWCDCkQDhSExplus2U+eIkmIv8CBa/ZdvltF2Mw+Ac3Xv2Lh+LFrTHlBuO+7DpDsy/vqABbTGMgj3unOYDFtMhi3udefEOrCtE337raSDeJGpOqA8lthIxJqzHEXlM0HvdFJBlBQ2cDUFJ9dmnStpjlwGClIAUqBzmQdRUhQCF1J4n3BR5zTuyDVgSQpBFuuc5kCUFJVAbRpueWp17sRBlBTGdqjx7qzVoMgy4Ug9sCONIDvwqE8IREmxAmgi/WrSfYnbkStAng9A8nRf5g+ipCgBzuIfnVVSlMbjyA0g5COQEHB9XiBKiiPA0UQzr1sT/rlUzyonoKO6b9G38UqKEPAEKE00azgS4FHvKgD2lH0gOzRjAqbfgm1LHfeXkQnOEXjGBARAdmiGil2jpqdYifftRrPlr44oKfKAAWAF/tYnoNh23Hd/+0YaTUKoiSAdXfl0dOUzPhE0CfLH+mbNcmM70E18F21zqqMrn877SwE4vG+cYwffmoSZBnbbjtvzwxE1KL4fX7PIHGUBrWrw27E4qI/8p4BK05mqK0aB1bPKxlWJ550Cbln6trAPKCQz9QooDQDHMhgC3feaAFBE5qs4AAz9ByBDAaAdGMlgiBGgPWA77mfgODCcgRDDwHHbcT/PXhBtoAbYQBL/2mFInv61um077hgL8qG+AjY84IemfpY1AAAAAElFTkSuQmCC')
|
|
||||||
}
|
|
||||||
.verification-icon .checkmark {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSkWrDu2g4pChOtlFRRxrFYpQIdQKrTqYXPoHTRqSFBdHwbXg4M9i1cHFWVcHV0EQ/AFxdXFSdJESv2sKLWI8uLuH97735e47QKiXmWZ1xQBNt81UIi5msqti4BV9GECI1mGZWcacJCXhOb7u4eP7XZRnedf9OfrVnMUAn0gcY4ZpE28Qz2zaBud94jAryirxOfGESRckfuS64vIb50KTBZ4ZNtOpeeIwsVjoYKWDWdHUiKeJI6qmU76QcVnlvMVZK1dZ6578hcGcvrLMdZqjSGARS5AgQkEVJZRhI0q7ToqFFJ3HPfwjTb9ELoVcJTByLKACDXLTD/4Hv3tr5acm3aRgHOh+cZyPMSCwCzRqjvN97DiNE8D/DFzpbX+lDsx+kl5ra5EjYHAbuLhua8oecLkDDD0Zsik3JT9NIZ8H3s/om7JA6BboXXP71jrH6QOQpl4lb4CDQ2C8QNnrHu/u6ezbvzWt/v0AY0JyoIwWTZgAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnCw4TDg43wdoYAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAABGlJREFUaN7VmttPHFUcxz8zCkghlhHUB20MrclS3qqgJN5CfOgD1I5W/wtfBkubGFM11nqLjBbffeLBVuq0rg+bFHvzYSktNG2s2wep1pjeoAOBZWVZuj7sGbJddmbPXmZn+T7unjlzPvP9ndvvHIUKyrJNFegAtgPtQBuwSfydAGaBv4CYoqR/390ysFqpdysVaHwr8BbQD7wGbJZ8NA6cA34BRnXNuBkIiGWb3cAA8CbQUOb3SAFhwNQ142xVQCzb3A58KRzwQ6eA93TNmPIFxLLNOuAAsB+ow1+tAsPA+7pmJCoGYtnmM8BRoJvq6irwtq4Zf5QNYtnmi8DPwOMEo3kBc9KrkFoAohc4GSAEYhQMW7a5uyRHhBNjQBO1oWWg380ZxaNPTATshFuY9eiaESsYWmJ0OlKDEE6YjVr2UKNMH/kAeCGw+FlJMRm7QTqddivSCcohz9CybDMEXAbqg4IYGZvkxO0Z3u3cyutdIRRFcZtnurMnzVxHvqgFCIDvrk4zduGamzMPAV/ndcSyzeeAi7UAka0Czryqa8a5XEeMWoOQcGbgAUcs22wBbgKPVBUimWLk1CQnbs14lqtXFIb7XuLJ1kfzrZq36Jpxy3FEr2WIQ73P54MAeBjYkx1a/VUPJwmIOgHx7JYnvIr1ASjWvW8UlPQdsS0NvE/kOlEAAmARhRYVJd2+gSEAmknTqYpEgZRWUqsc/+0KcwuJWoFw1KECW2Uhfjh9ie///IdvI9GiYHyGAGhXZcJqJbXKkdOX+PHf2wBMxRPSMMvJFCO/+goB0KoCjTIQRwWEo6l4gsORKHMLSxUbYkuEAGhUvTZXTjjlQjiajCcYjpzPC1PhIbagVMD1ky7E/+PKjO1ZwcX40jqYtT4h4cRnvV1lQwBLKuD6tsc2NzG4s4dQQ31BmMORceYWEiV07Irs32YUyzb7RJbPvZS9yFeRKNeWk5617Whq5KmmTYTvzPrdJ3K1RwUK5ozatGYGd/bQUcCZqXgiCAiAmApc9wqvbJi9EjABQMwDMVXXjDRwRuaJcmB8ggA4o2vGfWf1G5Z9yoEJFQFT5x/EWtsdEIvMQYw0zKAkTGaI9Q0iCRxbA9E1Yw4YLaYGGZh6f50AOKZrxmzunn2o2Fq8YKoA8UCb10BEjuh4qTDZA0CVIMK6Zky45bX2i7grGiYzmjVUCyIJ7HPNNIqMykfAhyWtE+xF5uMJtj3te9r4E10zDuQuGnP1KXC+lNrbtOZqQEwAB3N/3GjHCnfJ5Hz/zreMXydRcBeZs/BaURzYlQ/CFUTAjNcQzKKAGHcrsBEOQ+8Cb+iaES20Q/SU+ApdwHgAEBOiT0RltrpIwNwAXgE+LmWeKXGeOAi87NYnig6tPKEWAj4nk/j2azW7T+aSQFkgWUA7yJypvEP5mfxlsYod0jXjQikVVOKaU4twx7nmJJtHngXOkrnm9JOuGffKaYdSyZiw7CEFlHYyl8+2Aa2sv3g2DcSAaV0z7lfq3f8DJ0QDuq1Wyp8AAAAASUVORK5CYII=')
|
|
||||||
}
|
|
||||||
.verification-icon .cancel {
|
|
||||||
width: 50px;
|
|
||||||
height: 50px;
|
|
||||||
background: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAYAAAAeP4ixAAABhWlDQ1BJQ0MgcHJvZmlsZQAAKJF9kT1Iw0AYht+mSkWrDu2g4pChOtlFRRxrFYpQIdQKrTqYXPoHTRqSFBdHwbXg4M9i1cHFWVcHV0EQ/AFxdXFSdJESv2sKLWI8uLuH97735e47QKiXmWZ1xQBNt81UIi5msqti4BV9GECI1mGZWcacJCXhOb7u4eP7XZRnedf9OfrVnMUAn0gcY4ZpE28Qz2zaBud94jAryirxOfGESRckfuS64vIb50KTBZ4ZNtOpeeIwsVjoYKWDWdHUiKeJI6qmU76QcVnlvMVZK1dZ6578hcGcvrLMdZqjSGARS5AgQkEVJZRhI0q7ToqFFJ3HPfwjTb9ELoVcJTByLKACDXLTD/4Hv3tr5acm3aRgHOh+cZyPMSCwCzRqjvN97DiNE8D/DFzpbX+lDsx+kl5ra5EjYHAbuLhua8oecLkDDD0Zsik3JT9NIZ8H3s/om7JA6BboXXP71jrH6QOQpl4lb4CDQ2C8QNnrHu/u6ezbvzWt/v0AY0JyoIwWTZgAAAAGYktHRAD/AP8A/6C9p5MAAAAJcEhZcwAALiMAAC4jAXilP3YAAAAHdElNRQfnCw4TDgI+d5YzAAAAGXRFWHRDb21tZW50AENyZWF0ZWQgd2l0aCBHSU1QV4EOFwAABQtJREFUaN7Vmu9PHEUYxz+7d7dI7xJBJB4Bw6KQ0r5TQHghqBFfSf1Z/wPmvdakTYwxMTGNmogmvuv8BzZUjeebFmMKvoBAa2KiJYHgYiRcLFia3EHYu+N8ccv1gLvd2dujh9+3N7u3n3lmnvnOM6NRQ1nj4zqa1gucAbqAx4FTzs87wCZgAYuapv3eeeVKrlb/rQX+eCFagLeAMeAF4FHFR9PADPAjMGlKuV4XEEuIAeAC8CbQELA/skAC+NKUcvqhgFhCnAE+dyJwHPoZeN+U8tdjAbGEiAAfAZeACMerHPA18IEp5U7NQCwhOoGrwAAPV38A500p7wQGsYQYBH4AWqmP7jswU26NdA+Il4CpOkLgZMGEJcTrVUXEicRPQJSToV1grFJkNJc5MV/nSFQaZkOmlIueQ8vJTt+oQNjpNLlMJniKymSw02nVYTZpCdGoMkc+BJ7zjHMqxfr1aZJzC4FgcpkMyblbrF+fZjeVUnnkLHDZdWhZQpwGfgMML4jk1Ax79wq9aPS0Ex/sJxSJVAVhL/1d6NWmKPFXhmmIxVTWmYHSRfNwRD7zCwFgL62RnF0gl8n6gMiSnF0oQgDsbaVJTs2oRCYEfFE2IpYQzwK3/EKUyuhuJz40QCgSVoCYx15eK78mqEdmxJRy5nBE3vOa2MkblSEA7OU1krPzrpHxgihG5saMSgK4cGBoWUI0AeddY2k0EG5t9hwybjAqEPsKtzYTMgyvZmOWEPHSiLwBPOIKEgkTH+zH6OnwAZM5OLEVIYyeDuKDfSrJIwy8XQqiZMl9wzipuZidVCC621Uh9vUqgLYqhJaHf5xtqY+Mo9q77YB2IDu5Qigki0NKaZrWFM4/2FsrKxQJEx8aIOn0vGtkltaU3lklBEAsn8+f1Z1CgW+FImHahgYwutsDW5QAEPvq1YGnqn1adyKjMmeOEQKgS/c7rIIkgLLZaag/KARAiw40Bn1LNTA+UqyKGvVa1LYKyh9ze49hDmzXYj9R6mJVZC+tBd4ClGhbBzaCQRx1sb5gfLrmCtrQgZVgEGoLYxCjqaAVHbhTL4gawizqGvzpd3j5sygdPo2mb5j7wKLeKWUeuOl7TvhwsUFcs4JumlLu7bvfhHp2WsBeVjSAzjpRrWtWVKLUxn9H4SDGPRKKKfaB7YgcXTQVvJmP1GwD14ogppRbwKQriG2T3bgXyDv5MZrZjS1ytu3V7Jop5ebhPfuE6wdGTxEfHUFvjgUygEWj6QKjN0eJj45gRD2rtRNHykFOjeh7t6caYlHio8Poj8UCudiQi2vWm2PER0doiHlCJEwp5yvVtS45484d5uXhA5GpxsWWSwCFSAyrQNjAxcOFrqK+un17892+vjDwouuO3zBo7Ggjvb5O5Mknqnaxekgn2hZnZydFPp9TjQTAZVPKqxVLpk5pKAL8gkL9105vEzKMwPuJXCZLzt5VmRNQOCV43pTSdgVxYE7qscJdCjXf1XI2/oichuconIWfFKWBc+UgKoI4MHMnCCblQMxVavB/OAy9C7xmSjnrtUN0ldML/cBcHSDmnTkxq7LVRQHmL/L5YeBjr3WmRrKBT5zstKryQDVXOE4Dn1IofB+HEsBFlUsCgUBKgJ6hcKbyDh6VfAXtOi52wpRyoZoX1OKaU5MTnf1rTqoFv01gmsI1p29NKf8N8h1aLceENT6uoWldQC/wNNDC0YtnK8AisGJKuVer//4PsDBp3eZTATwAAAAASUVORK5CYII=')
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
<div class="container">
|
|
||||||
<div class="verification-icon"><div class="checkmark"></div></div>
|
|
||||||
<section>
|
|
||||||
<p>Patch version: <span class="version">1.4.0</span></p>
|
|
||||||
<p>Patch state: <span class="state">verified</span></p>
|
|
||||||
</section>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</foreignObject>
|
|
||||||
</svg>
|
|
Before Width: | Height: | Size: 8 KiB |
12
src/i18n.rs
12
src/i18n.rs
|
@ -26,7 +26,9 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[
|
||||||
langid!("pt-br"),
|
langid!("pt-br"),
|
||||||
langid!("pl-pl"),
|
langid!("pl-pl"),
|
||||||
langid!("vi-vn"),
|
langid!("vi-vn"),
|
||||||
langid!("nl-nl")
|
langid!("nl-nl"),
|
||||||
|
langid!("uk-ua"),
|
||||||
|
langid!("th-th")
|
||||||
];
|
];
|
||||||
|
|
||||||
pub static mut LANG: LanguageIdentifier = langid!("en-us");
|
pub static mut LANG: LanguageIdentifier = langid!("en-us");
|
||||||
|
@ -104,9 +106,7 @@ macro_rules! tr {
|
||||||
use fluent_templates::Loader;
|
use fluent_templates::Loader;
|
||||||
|
|
||||||
#[allow(unused_unsafe)]
|
#[allow(unused_unsafe)]
|
||||||
$crate::i18n::LOCALES
|
$crate::i18n::LOCALES.lookup(unsafe { &$crate::i18n::LANG }, $id)
|
||||||
.lookup(unsafe { &$crate::i18n::LANG }, $id)
|
|
||||||
.expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -124,9 +124,7 @@ macro_rules! tr {
|
||||||
)*
|
)*
|
||||||
|
|
||||||
#[allow(unused_unsafe)]
|
#[allow(unused_unsafe)]
|
||||||
$crate::i18n::LOCALES
|
$crate::i18n::LOCALES.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
|
||||||
.lookup_complete(unsafe { &$crate::i18n::LANG }, $id, Some(&args))
|
|
||||||
.expect(&format!("Failed to find a message with given id: {}", stringify!($id)))
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
100
src/main.rs
100
src/main.rs
|
@ -70,6 +70,36 @@ lazy_static::lazy_static! {
|
||||||
///
|
///
|
||||||
/// Standard is `$HOME/.local/share/honkers-railway-launcher/.first-run`
|
/// Standard is `$HOME/.local/share/honkers-railway-launcher/.first-run`
|
||||||
pub static ref FIRST_RUN_FILE: PathBuf = LAUNCHER_FOLDER.join(".first-run");
|
pub static ref FIRST_RUN_FILE: PathBuf = LAUNCHER_FOLDER.join(".first-run");
|
||||||
|
|
||||||
|
/// Global app's css
|
||||||
|
static ref GLOBAL_CSS: String = format!("
|
||||||
|
progressbar > text {{
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}}
|
||||||
|
|
||||||
|
window.classic-style {{
|
||||||
|
background: url(\"file://{}\");
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-size: cover;
|
||||||
|
}}
|
||||||
|
|
||||||
|
window.classic-style progressbar {{
|
||||||
|
background-color: #00000020;
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 8px 16px;
|
||||||
|
}}
|
||||||
|
|
||||||
|
window.classic-style progressbar:hover {{
|
||||||
|
background-color: #00000060;
|
||||||
|
color: #ffffff;
|
||||||
|
transition-duration: 0.5s;
|
||||||
|
transition-timing-function: linear;
|
||||||
|
}}
|
||||||
|
|
||||||
|
.round-bin {{
|
||||||
|
border-radius: 24px;
|
||||||
|
}}
|
||||||
|
", BACKGROUND_FILE.to_string_lossy());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> anyhow::Result<()> {
|
fn main() -> anyhow::Result<()> {
|
||||||
|
@ -105,22 +135,24 @@ fn main() -> anyhow::Result<()> {
|
||||||
let mut no_verbose_tracing = false;
|
let mut no_verbose_tracing = false;
|
||||||
|
|
||||||
let args = std::env::args().collect::<Vec<_>>();
|
let args = std::env::args().collect::<Vec<_>>();
|
||||||
|
let mut gtk_args = Vec::new();
|
||||||
|
|
||||||
// Parse arguments
|
// Parse arguments
|
||||||
for i in 0..args.len() {
|
for i in 0..args.len() {
|
||||||
if args[i] == "--debug" {
|
match args[i].as_str() {
|
||||||
force_debug = true;
|
"--debug" => force_debug = true,
|
||||||
} else if args[i] == "--run-game" {
|
"--run-game" => run_game = true,
|
||||||
run_game = true;
|
"--just-run-game" => just_run_game = true,
|
||||||
} else if args[i] == "--just-run-game" {
|
"--no-verbose-tracing" => no_verbose_tracing = true,
|
||||||
just_run_game = true;
|
|
||||||
} else if args[i] == "--no-verbose-tracing" {
|
"--session" => {
|
||||||
no_verbose_tracing = true;
|
// Switch active session prior running the app
|
||||||
} else if args[i] == "--session" {
|
if let Some(session) = args.get(i + 1) {
|
||||||
// Switch active session prior running the app
|
Sessions::set_current(session.to_owned())?;
|
||||||
if let Some(session) = args.get(i + 1) {
|
}
|
||||||
Sessions::set_current(session.to_owned())?;
|
},
|
||||||
}
|
|
||||||
|
arg => gtk_args.push(arg.to_string())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -170,36 +202,6 @@ fn main() -> anyhow::Result<()> {
|
||||||
gtk::glib::set_application_name("The Honkers Railway Launcher");
|
gtk::glib::set_application_name("The Honkers Railway Launcher");
|
||||||
gtk::glib::set_program_name(Some("The Honkers Railway Launcher"));
|
gtk::glib::set_program_name(Some("The Honkers Railway Launcher"));
|
||||||
|
|
||||||
// Set global css
|
|
||||||
relm4::set_global_css(&format!("
|
|
||||||
progressbar > text {{
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}}
|
|
||||||
|
|
||||||
window.classic-style {{
|
|
||||||
background: url(\"file://{}\");
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-size: cover;
|
|
||||||
}}
|
|
||||||
|
|
||||||
window.classic-style progressbar {{
|
|
||||||
background-color: #00000020;
|
|
||||||
border-radius: 16px;
|
|
||||||
padding: 8px 16px;
|
|
||||||
}}
|
|
||||||
|
|
||||||
window.classic-style progressbar:hover {{
|
|
||||||
background-color: #00000060;
|
|
||||||
color: #ffffff;
|
|
||||||
transition-duration: 0.5s;
|
|
||||||
transition-timing-function: linear;
|
|
||||||
}}
|
|
||||||
|
|
||||||
.round-bin {{
|
|
||||||
border-radius: 24px;
|
|
||||||
}}
|
|
||||||
", BACKGROUND_FILE.to_string_lossy()));
|
|
||||||
|
|
||||||
// Set UI language
|
// Set UI language
|
||||||
let lang = CONFIG.launcher.language.parse().expect("Wrong language format used in config");
|
let lang = CONFIG.launcher.language.parse().expect("Wrong language format used in config");
|
||||||
|
|
||||||
|
@ -210,7 +212,11 @@ fn main() -> anyhow::Result<()> {
|
||||||
// Run FirstRun window if .first-run file persist
|
// Run FirstRun window if .first-run file persist
|
||||||
if FIRST_RUN_FILE.exists() {
|
if FIRST_RUN_FILE.exists() {
|
||||||
// Create the app
|
// Create the app
|
||||||
let app = RelmApp::new(APP_ID);
|
let app = RelmApp::new(APP_ID)
|
||||||
|
.with_args(gtk_args);
|
||||||
|
|
||||||
|
// Set global css
|
||||||
|
app.set_global_css(&GLOBAL_CSS);
|
||||||
|
|
||||||
// Show first run window
|
// Show first run window
|
||||||
app.run::<FirstRunApp>(());
|
app.run::<FirstRunApp>(());
|
||||||
|
@ -285,7 +291,11 @@ fn main() -> anyhow::Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the app
|
// Create the app
|
||||||
let app = RelmApp::new(APP_ID);
|
let app = RelmApp::new(APP_ID)
|
||||||
|
.with_args(gtk_args);
|
||||||
|
|
||||||
|
// Set global css
|
||||||
|
app.set_global_css(&GLOBAL_CSS);
|
||||||
|
|
||||||
// Show main window
|
// Show main window
|
||||||
app.run::<App>(());
|
app.run::<App>(());
|
||||||
|
|
|
@ -82,7 +82,9 @@ impl SimpleComponent for AboutDialog {
|
||||||
"日本語 — @zozonteq https://github.com/zozonteq",
|
"日本語 — @zozonteq https://github.com/zozonteq",
|
||||||
"한국어 — @project-dy https://github.com/project-dy",
|
"한국어 — @project-dy https://github.com/project-dy",
|
||||||
"Indonesia — @yumekarisu https://github.com/yumekarisu",
|
"Indonesia — @yumekarisu https://github.com/yumekarisu",
|
||||||
"Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh"
|
"Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh",
|
||||||
|
"Українська — Іван Потієнко https://github.com/xxanqw",
|
||||||
|
"ไทย — @thegooglerider https://github.com/TheGoogleRider2"
|
||||||
].join("\n"),
|
].join("\n"),
|
||||||
|
|
||||||
set_debug_info: &[
|
set_debug_info: &[
|
||||||
|
@ -97,20 +99,29 @@ impl SimpleComponent for AboutDialog {
|
||||||
|
|
||||||
set_release_notes_version: &APP_VERSION,
|
set_release_notes_version: &APP_VERSION,
|
||||||
set_release_notes: &[
|
set_release_notes: &[
|
||||||
"<p>Fixed</p>",
|
"<p>Added</p>",
|
||||||
|
|
||||||
"<ul>",
|
"<ul>",
|
||||||
"<li>Fixed \"Kill game process\" button</li>",
|
"<li>Bundle applications-system-symbolic icon to the app</li>",
|
||||||
|
"<li>Added force grab cursor option to the gamescope settings</li>",
|
||||||
|
"<li>Added Thai</li>",
|
||||||
|
"<li>Added Ukrainian</li>",
|
||||||
"</ul>",
|
"</ul>",
|
||||||
|
|
||||||
"<p>Changed</p>",
|
"<p>Changed</p>",
|
||||||
|
|
||||||
"<ul>",
|
"<ul>",
|
||||||
"<li>Updated Turkish</li>",
|
"<li>Update wish url</li>",
|
||||||
"<li>Updated German</li>",
|
"<li>Updated dependencies</li>",
|
||||||
"<li>Updated Polish</li>",
|
"<li>Improved app args parsing</li>",
|
||||||
"<li>Updated Chinese</li>",
|
"<li>Updated locales</li>",
|
||||||
"</ul>",
|
"</ul>",
|
||||||
|
|
||||||
|
"<p>Fixed</p>",
|
||||||
|
|
||||||
|
"<ul>",
|
||||||
|
"<li>Fixed GtkSwitch UI state representation</li>",
|
||||||
|
"</ul>"
|
||||||
].join("\n"),
|
].join("\n"),
|
||||||
|
|
||||||
set_modal: true,
|
set_modal: true,
|
||||||
|
@ -127,11 +138,7 @@ impl SimpleComponent for AboutDialog {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: &Self::Root,
|
|
||||||
sender: ComponentSender<Self>,
|
|
||||||
) -> ComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing about dialog");
|
tracing::info!("Initializing about dialog");
|
||||||
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -287,11 +287,7 @@ impl SimpleAsyncComponent for DefaultPathsApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
progress_bar: ProgressBar::builder()
|
progress_bar: ProgressBar::builder()
|
||||||
.launch(ProgressBarInit {
|
.launch(ProgressBarInit {
|
||||||
|
|
|
@ -135,11 +135,7 @@ impl SimpleAsyncComponent for DependenciesApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let distro = whatadistro::identify();
|
let distro = whatadistro::identify();
|
||||||
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -264,11 +264,7 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
progress_bar: ProgressBar::builder()
|
progress_bar: ProgressBar::builder()
|
||||||
.launch(ProgressBarInit {
|
.launch(ProgressBarInit {
|
||||||
|
|
|
@ -68,11 +68,7 @@ impl SimpleAsyncComponent for FinishApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let model = Self;
|
let model = Self;
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
|
|
|
@ -115,11 +115,7 @@ impl SimpleComponent for FirstRunApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
fn init(_parent: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
|
||||||
_parent: Self::Init,
|
|
||||||
root: &Self::Root,
|
|
||||||
sender: ComponentSender<Self>,
|
|
||||||
) -> ComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing first run window");
|
tracing::info!("Initializing first run window");
|
||||||
|
|
||||||
let toast_overlay = adw::ToastOverlay::new();
|
let toast_overlay = adw::ToastOverlay::new();
|
||||||
|
|
|
@ -51,7 +51,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
add_suffix = english -> gtk::Switch {
|
add_suffix = english -> gtk::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_state: true
|
set_active: true
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -110,11 +110,7 @@ impl SimpleAsyncComponent for SelectVoiceoversApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
english: gtk::Switch::new(),
|
english: gtk::Switch::new(),
|
||||||
japanese: gtk::Switch::new(),
|
japanese: gtk::Switch::new(),
|
||||||
|
|
|
@ -66,11 +66,7 @@ impl SimpleAsyncComponent for WelcomeApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
let model = Self;
|
let model = Self;
|
||||||
let widgets = view_output!();
|
let widgets = view_output!();
|
||||||
|
|
||||||
|
|
|
@ -682,11 +682,7 @@ impl SimpleComponent for App {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
fn init(_init: Self::Init, root: Self::Root, sender: ComponentSender<Self>) -> ComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: &Self::Root,
|
|
||||||
sender: ComponentSender<Self>,
|
|
||||||
) -> ComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing main window");
|
tracing::info!("Initializing main window");
|
||||||
|
|
||||||
let model = App {
|
let model = App {
|
||||||
|
@ -819,8 +815,8 @@ impl SimpleComponent for App {
|
||||||
Ok(web_cache) => {
|
Ok(web_cache) => {
|
||||||
let web_cache = String::from_utf8_lossy(&web_cache);
|
let web_cache = String::from_utf8_lossy(&web_cache);
|
||||||
|
|
||||||
// https://webstatic-sea.[ho-yo-ver-se].com/hkrpg/event/e20211215gacha-v2/index.html?......
|
// https://webstatic-sea.[ho-yo-ver-se].com/hkrpg/event/e20211215gacha-v3/index.html?......
|
||||||
if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v2/index.html")) {
|
if let Some(url) = web_cache.lines().rev().find(|line| line.contains("gacha-v3/index.html")) {
|
||||||
let url_begin_pos = url.find("https://").unwrap();
|
let url_begin_pos = url.find("https://").unwrap();
|
||||||
let url_end_pos = url_begin_pos + url[url_begin_pos..].find("\0\0\0\0").unwrap();
|
let url_end_pos = url_begin_pos + url[url_begin_pos..].find("\0\0\0\0").unwrap();
|
||||||
|
|
||||||
|
|
|
@ -36,11 +36,7 @@ impl SimpleComponent for MigrateInstallationApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn init(
|
fn init(_init: Self::Init, root: Self::Root, _sender: ComponentSender<Self>) -> ComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: &Self::Root,
|
|
||||||
_sender: ComponentSender<Self>,
|
|
||||||
) -> ComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing migration window");
|
tracing::info!("Initializing migration window");
|
||||||
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -71,91 +71,82 @@ impl SimpleAsyncComponent for EnvironmentPage {
|
||||||
type Output = EnhancementsAppMsg;
|
type Output = EnhancementsAppMsg;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
gtk::Box {
|
adw::NavigationPage {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
#[wrap(Some)]
|
||||||
|
set_child = >k::Box {
|
||||||
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
|
||||||
adw::HeaderBar {
|
adw::HeaderBar {
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_title_widget = &adw::WindowTitle {
|
set_title_widget = &adw::WindowTitle {
|
||||||
set_title: &tr!("environment")
|
set_title: &tr!("environment")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
pack_start = >k::Button {
|
adw::PreferencesPage {
|
||||||
set_icon_name: "go-previous-symbolic",
|
set_title: &tr!("environment"),
|
||||||
|
set_icon_name: Some("document-properties-symbolic"),
|
||||||
|
|
||||||
connect_clicked[sender] => move |_| {
|
add = &adw::PreferencesGroup {
|
||||||
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
|
set_title: &tr!("game-command"),
|
||||||
}
|
set_description: Some(&tr!("game-command-description")),
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::PreferencesPage {
|
adw::EntryRow {
|
||||||
set_title: &tr!("environment"),
|
set_title: "%command%",
|
||||||
set_icon_name: Some("document-properties-symbolic"),
|
set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(),
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
connect_changed => |entry| {
|
||||||
set_title: &tr!("game-command"),
|
if let Ok(mut config) = Config::get() {
|
||||||
set_description: Some(&tr!("game-command-description")),
|
let command = entry.text().trim().to_string();
|
||||||
|
|
||||||
adw::EntryRow {
|
config.game.command = if command.is_empty() {
|
||||||
set_title: "%command%",
|
None
|
||||||
set_text: CONFIG.game.command.as_ref().unwrap_or(&String::new()).trim(),
|
} else {
|
||||||
|
Some(command)
|
||||||
|
};
|
||||||
|
|
||||||
connect_changed => |entry| {
|
Config::update(config);
|
||||||
if let Ok(mut config) = Config::get() {
|
}
|
||||||
let command = entry.text().trim().to_string();
|
|
||||||
|
|
||||||
config.game.command = if command.is_empty() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(command)
|
|
||||||
};
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
add = &adw::PreferencesGroup {
|
||||||
set_title: &tr!("new-variable"),
|
set_title: &tr!("new-variable"),
|
||||||
|
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_header_suffix = >k::Button {
|
set_header_suffix = >k::Button {
|
||||||
add_css_class: "flat",
|
add_css_class: "flat",
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
adw::ButtonContent {
|
adw::ButtonContent {
|
||||||
set_icon_name: "list-add-symbolic",
|
set_icon_name: "list-add-symbolic",
|
||||||
set_label: &tr!("add")
|
set_label: &tr!("add")
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_clicked => EnvironmentPageMsg::Add
|
||||||
},
|
},
|
||||||
|
|
||||||
connect_clicked => EnvironmentPageMsg::Add
|
#[local_ref]
|
||||||
|
name_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("name")
|
||||||
|
},
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
value_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("value")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
name_entry -> adw::EntryRow {
|
add = variables -> adw::PreferencesGroup {}
|
||||||
set_title: &tr!("name")
|
}
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
value_entry -> adw::EntryRow {
|
|
||||||
set_title: &tr!("value")
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
add = variables -> adw::PreferencesGroup {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing environment settings");
|
tracing::info!("Initializing environment settings");
|
||||||
|
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
|
|
|
@ -74,11 +74,7 @@ impl AsyncFactoryComponent for GameSession {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init_model(
|
async fn init_model(init: Self::Init, _index: &DynamicIndex, _sender: AsyncFactorySender<Self>) -> Self {
|
||||||
init: Self::Init,
|
|
||||||
_index: &DynamicIndex,
|
|
||||||
_sender: AsyncFactorySender<Self>,
|
|
||||||
) -> Self {
|
|
||||||
init
|
init
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -105,57 +101,48 @@ impl SimpleAsyncComponent for GamePage {
|
||||||
type Output = EnhancementsAppMsg;
|
type Output = EnhancementsAppMsg;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
gtk::Box {
|
adw::NavigationPage {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
#[wrap(Some)]
|
||||||
|
set_child = >k::Box {
|
||||||
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
|
||||||
adw::HeaderBar {
|
adw::HeaderBar {
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_title_widget = &adw::WindowTitle {
|
set_title_widget = &adw::WindowTitle {
|
||||||
set_title: &tr!("game")
|
set_title: &tr!("game")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
pack_start = >k::Button {
|
adw::PreferencesPage {
|
||||||
set_icon_name: "go-previous-symbolic",
|
set_title: &tr!("game"),
|
||||||
|
set_icon_name: Some("applications-games-symbolic"),
|
||||||
|
|
||||||
connect_clicked[sender] => move |_| {
|
add = &adw::PreferencesGroup {
|
||||||
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
|
set_title: &tr!("game-sessions"),
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::PreferencesPage {
|
#[local_ref]
|
||||||
set_title: &tr!("game"),
|
session_name_entry -> adw::EntryRow {
|
||||||
set_icon_name: Some("applications-games-symbolic"),
|
set_title: &tr!("name"),
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
add_suffix = >k::Button {
|
||||||
set_title: &tr!("game-sessions"),
|
set_icon_name: "list-add-symbolic",
|
||||||
|
add_css_class: "flat",
|
||||||
|
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
connect_clicked => GamePageMsg::AddSession
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
session_name_entry -> adw::EntryRow {
|
add = sessions -> adw::PreferencesGroup {},
|
||||||
set_title: &tr!("name"),
|
}
|
||||||
|
|
||||||
add_suffix = >k::Button {
|
|
||||||
set_icon_name: "list-add-symbolic",
|
|
||||||
add_css_class: "flat",
|
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
connect_clicked => GamePageMsg::AddSession
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
add = sessions -> adw::PreferencesGroup {},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing game settings");
|
tracing::info!("Initializing game settings");
|
||||||
|
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
|
|
|
@ -17,6 +17,8 @@ use anime_launcher_sdk::anime_game_core::installer::downloader::Downloader;
|
||||||
use anime_launcher_sdk::discord_rpc::DiscordRpc;
|
use anime_launcher_sdk::discord_rpc::DiscordRpc;
|
||||||
use anime_launcher_sdk::is_available;
|
use anime_launcher_sdk::is_available;
|
||||||
|
|
||||||
|
use enum_ordinalize::Ordinalize;
|
||||||
|
|
||||||
pub mod game;
|
pub mod game;
|
||||||
pub mod sandbox;
|
pub mod sandbox;
|
||||||
pub mod environment;
|
pub mod environment;
|
||||||
|
@ -232,12 +234,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.wine.borderless,
|
set_active: CONFIG.game.wine.borderless,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.wine.borderless = switch.state();
|
config.game.wine.borderless = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -277,12 +279,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.wine.virtual_desktop.enabled,
|
set_active: CONFIG.game.wine.virtual_desktop.enabled,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.wine.virtual_desktop.enabled = switch.state();
|
config.game.wine.virtual_desktop.enabled = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -298,12 +300,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.wine.drives.drive_c,
|
set_active: CONFIG.game.wine.drives.drive_c,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.wine.drives.drive_c = switch.state();
|
config.game.wine.drives.drive_c = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -343,12 +345,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.wine.drives.game_folder.is_some(),
|
set_active: CONFIG.game.wine.drives.game_folder.is_some(),
|
||||||
|
|
||||||
connect_state_notify[map_game_folder_row] => move |switch| {
|
connect_state_notify[map_game_folder_row] => move |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
if switch.state() {
|
if switch.is_active() {
|
||||||
config.game.wine.drives.game_folder = Some(AllowedDrives::list()[map_game_folder_row.selected() as usize]);
|
config.game.wine.drives.game_folder = Some(AllowedDrives::list()[map_game_folder_row.selected() as usize]);
|
||||||
} else {
|
} else {
|
||||||
config.game.wine.drives.game_folder = None;
|
config.game.wine.drives.game_folder = None;
|
||||||
|
@ -415,12 +417,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.enhancements.fsr.enabled,
|
set_active: CONFIG.game.enhancements.fsr.enabled,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.fsr.enabled = switch.state();
|
config.game.enhancements.fsr.enabled = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -438,12 +440,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.enhancements.gamemode,
|
set_active: CONFIG.game.enhancements.gamemode,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.gamemode = switch.state();
|
config.game.enhancements.gamemode = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -470,12 +472,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
set_state: CONFIG.game.enhancements.gamescope.enabled,
|
set_active: CONFIG.game.enhancements.gamescope.enabled,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.gamescope.enabled = switch.state();
|
config.game.enhancements.gamescope.enabled = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -494,12 +496,12 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_state: CONFIG.launcher.discord_rpc.enabled,
|
set_active: CONFIG.launcher.discord_rpc.enabled,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.launcher.discord_rpc.enabled = switch.state();
|
config.launcher.discord_rpc.enabled = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
|
@ -546,13 +548,13 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
game_page -> gtk::Box {},
|
game_page -> adw::NavigationPage,
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
sandbox_page -> gtk::Box {},
|
sandbox_page -> adw::NavigationPage,
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
environment_page -> gtk::Box {}
|
environment_page -> adw::NavigationPage,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(
|
||||||
|
@ -688,28 +690,28 @@ impl SimpleAsyncComponent for EnhancementsApp {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.close_subpage();
|
.pop_subpage();
|
||||||
}
|
}
|
||||||
|
|
||||||
EnhancementsAppMsg::OpenGameSettingsPage => unsafe {
|
EnhancementsAppMsg::OpenGameSettingsPage => unsafe {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.present_subpage(self.game_page.widget());
|
.push_subpage(self.game_page.widget());
|
||||||
}
|
}
|
||||||
|
|
||||||
EnhancementsAppMsg::OpenSandboxSettingsPage => unsafe {
|
EnhancementsAppMsg::OpenSandboxSettingsPage => unsafe {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.present_subpage(self.sandbox_page.widget());
|
.push_subpage(self.sandbox_page.widget());
|
||||||
}
|
}
|
||||||
|
|
||||||
EnhancementsAppMsg::OpenEnvironmentSettingsPage => unsafe {
|
EnhancementsAppMsg::OpenEnvironmentSettingsPage => unsafe {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.present_subpage(self.environment_page.widget());
|
.push_subpage(self.environment_page.widget());
|
||||||
}
|
}
|
||||||
|
|
||||||
EnhancementsAppMsg::Toast { title, description } => {
|
EnhancementsAppMsg::Toast { title, description } => {
|
||||||
|
|
|
@ -98,235 +98,226 @@ impl SimpleAsyncComponent for SandboxPage {
|
||||||
type Output = EnhancementsAppMsg;
|
type Output = EnhancementsAppMsg;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
gtk::Box {
|
adw::NavigationPage {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
#[wrap(Some)]
|
||||||
|
set_child = >k::Box {
|
||||||
adw::HeaderBar {
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
#[wrap(Some)]
|
|
||||||
set_title_widget = &adw::WindowTitle {
|
|
||||||
set_title: &tr!("sandbox")
|
|
||||||
},
|
|
||||||
|
|
||||||
pack_start = >k::Button {
|
|
||||||
set_icon_name: "go-previous-symbolic",
|
|
||||||
|
|
||||||
connect_clicked[sender] => move |_| {
|
|
||||||
sender.output(EnhancementsAppMsg::OpenMainPage).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::PreferencesPage {
|
|
||||||
set_title: &tr!("sandbox"),
|
|
||||||
set_icon_name: Some("folder-symbolic"),
|
|
||||||
|
|
||||||
set_sensitive: is_available("bwrap"),
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("sandbox"),
|
|
||||||
set_description: Some(&tr!("sandbox-description")),
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("enable-sandboxing"),
|
|
||||||
set_subtitle: &tr!("enable-sandboxing-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
set_state: CONFIG.sandbox.enabled,
|
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.sandbox.enabled = switch.state();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("hide-home-directory"),
|
|
||||||
set_subtitle: &tr!("hide-home-directory-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
set_state: CONFIG.sandbox.isolate_home,
|
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.sandbox.isolate_home = switch.state();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::EntryRow {
|
|
||||||
set_title: &tr!("hostname"),
|
|
||||||
set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(),
|
|
||||||
|
|
||||||
connect_changed => |entry| {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
let command = entry.text().trim().to_string();
|
|
||||||
|
|
||||||
config.sandbox.hostname = if command.is_empty() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(command)
|
|
||||||
};
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::EntryRow {
|
|
||||||
set_title: &tr!("additional-arguments"),
|
|
||||||
set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(),
|
|
||||||
|
|
||||||
connect_changed => |entry| {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
let command = entry.text().trim().to_string();
|
|
||||||
|
|
||||||
config.sandbox.args = if command.is_empty() {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
Some(command)
|
|
||||||
};
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add_suffix = >k::Button {
|
|
||||||
set_icon_name: "dialog-information-symbolic",
|
|
||||||
add_css_class: "flat",
|
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
connect_clicked[sender] => move |_| {
|
|
||||||
if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") {
|
|
||||||
sender.output(EnhancementsAppMsg::Toast {
|
|
||||||
title: tr!("documentation-url-open-failed"),
|
|
||||||
description: Some(err.to_string())
|
|
||||||
}).unwrap();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("private-directories"),
|
|
||||||
set_description: Some(&tr!("private-directories-description")),
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
private_path_entry -> adw::EntryRow {
|
|
||||||
set_title: &tr!("path"),
|
|
||||||
|
|
||||||
add_suffix = >k::Button {
|
|
||||||
set_icon_name: "list-add-symbolic",
|
|
||||||
add_css_class: "flat",
|
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
connect_clicked => SandboxPageMsg::AddPrivate
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
add = private_paths -> adw::PreferencesGroup {},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("shared-directories"),
|
|
||||||
set_description: Some(&tr!("shared-directories-description")),
|
|
||||||
|
|
||||||
|
adw::HeaderBar {
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_header_suffix = >k::Button {
|
set_title_widget = &adw::WindowTitle {
|
||||||
add_css_class: "flat",
|
set_title: &tr!("sandbox")
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
adw::PreferencesPage {
|
||||||
|
set_title: &tr!("sandbox"),
|
||||||
|
set_icon_name: Some("folder-symbolic"),
|
||||||
|
|
||||||
adw::ButtonContent {
|
set_sensitive: is_available("bwrap"),
|
||||||
set_icon_name: "list-add-symbolic",
|
|
||||||
set_label: &tr!("add")
|
add = &adw::PreferencesGroup {
|
||||||
|
set_title: &tr!("sandbox"),
|
||||||
|
set_description: Some(&tr!("sandbox-description")),
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("enable-sandboxing"),
|
||||||
|
set_subtitle: &tr!("enable-sandboxing-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
set_active: CONFIG.sandbox.enabled,
|
||||||
|
|
||||||
|
connect_state_notify => |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
config.sandbox.enabled = switch.is_active();
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
connect_clicked => SandboxPageMsg::AddShared
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("hide-home-directory"),
|
||||||
|
set_subtitle: &tr!("hide-home-directory-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
set_active: CONFIG.sandbox.isolate_home,
|
||||||
|
|
||||||
|
connect_state_notify => |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
config.sandbox.isolate_home = switch.is_active();
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::EntryRow {
|
||||||
|
set_title: &tr!("hostname"),
|
||||||
|
set_text: CONFIG.sandbox.hostname.as_ref().unwrap_or(&String::new()).trim(),
|
||||||
|
|
||||||
|
connect_changed => |entry| {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
let command = entry.text().trim().to_string();
|
||||||
|
|
||||||
|
config.sandbox.hostname = if command.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(command)
|
||||||
|
};
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::EntryRow {
|
||||||
|
set_title: &tr!("additional-arguments"),
|
||||||
|
set_text: CONFIG.sandbox.args.as_ref().unwrap_or(&String::new()).trim(),
|
||||||
|
|
||||||
|
connect_changed => |entry| {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
let command = entry.text().trim().to_string();
|
||||||
|
|
||||||
|
config.sandbox.args = if command.is_empty() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(command)
|
||||||
|
};
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
add_suffix = >k::Button {
|
||||||
|
set_icon_name: "dialog-information-symbolic",
|
||||||
|
add_css_class: "flat",
|
||||||
|
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
connect_clicked[sender] => move |_| {
|
||||||
|
if let Err(err) = open::that("https://man.archlinux.org/man/bwrap.1") {
|
||||||
|
sender.output(EnhancementsAppMsg::Toast {
|
||||||
|
title: tr!("documentation-url-open-failed"),
|
||||||
|
description: Some(err.to_string())
|
||||||
|
}).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
add = &adw::PreferencesGroup {
|
||||||
shared_path_from_entry -> adw::EntryRow {
|
set_title: &tr!("private-directories"),
|
||||||
set_title: &tr!("original-path")
|
set_description: Some(&tr!("private-directories-description")),
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
shared_path_to_entry -> adw::EntryRow {
|
|
||||||
set_title: &tr!("new-path")
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("read-only"),
|
|
||||||
set_subtitle: &tr!("read-only-description"),
|
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
add_suffix = read_only_switch -> gtk::Switch {
|
private_path_entry -> adw::EntryRow {
|
||||||
set_valign: gtk::Align::Center
|
set_title: &tr!("path"),
|
||||||
|
|
||||||
|
add_suffix = >k::Button {
|
||||||
|
set_icon_name: "list-add-symbolic",
|
||||||
|
add_css_class: "flat",
|
||||||
|
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
connect_clicked => SandboxPageMsg::AddPrivate
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
add = shared_paths -> adw::PreferencesGroup {},
|
add = private_paths -> adw::PreferencesGroup {},
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
add = &adw::PreferencesGroup {
|
||||||
set_title: &tr!("symlinks"),
|
set_title: &tr!("shared-directories"),
|
||||||
set_description: Some(&tr!("symlinks-description")),
|
set_description: Some(&tr!("shared-directories-description")),
|
||||||
|
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_header_suffix = >k::Button {
|
set_header_suffix = >k::Button {
|
||||||
add_css_class: "flat",
|
add_css_class: "flat",
|
||||||
|
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
adw::ButtonContent {
|
adw::ButtonContent {
|
||||||
set_icon_name: "list-add-symbolic",
|
set_icon_name: "list-add-symbolic",
|
||||||
set_label: &tr!("add")
|
set_label: &tr!("add")
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_clicked => SandboxPageMsg::AddShared
|
||||||
},
|
},
|
||||||
|
|
||||||
connect_clicked => SandboxPageMsg::AddSymlink
|
#[local_ref]
|
||||||
|
shared_path_from_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("original-path")
|
||||||
|
},
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
shared_path_to_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("new-path")
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("read-only"),
|
||||||
|
set_subtitle: &tr!("read-only-description"),
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
add_suffix = read_only_switch -> gtk::Switch {
|
||||||
|
set_valign: gtk::Align::Center
|
||||||
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
symlink_path_from_entry -> adw::EntryRow {
|
add = shared_paths -> adw::PreferencesGroup {},
|
||||||
set_title: &tr!("original-path")
|
|
||||||
|
add = &adw::PreferencesGroup {
|
||||||
|
set_title: &tr!("symlinks"),
|
||||||
|
set_description: Some(&tr!("symlinks-description")),
|
||||||
|
|
||||||
|
#[wrap(Some)]
|
||||||
|
set_header_suffix = >k::Button {
|
||||||
|
add_css_class: "flat",
|
||||||
|
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
adw::ButtonContent {
|
||||||
|
set_icon_name: "list-add-symbolic",
|
||||||
|
set_label: &tr!("add")
|
||||||
|
},
|
||||||
|
|
||||||
|
connect_clicked => SandboxPageMsg::AddSymlink
|
||||||
|
},
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
symlink_path_from_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("original-path")
|
||||||
|
},
|
||||||
|
|
||||||
|
#[local_ref]
|
||||||
|
symlink_path_to_entry -> adw::EntryRow {
|
||||||
|
set_title: &tr!("new-path")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
symlink_path_to_entry -> adw::EntryRow {
|
add = symlink_paths -> adw::PreferencesGroup {}
|
||||||
set_title: &tr!("new-path")
|
}
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
#[local_ref]
|
|
||||||
add = symlink_paths -> adw::PreferencesGroup {}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing sandbox settings");
|
tracing::info!("Initializing sandbox settings");
|
||||||
|
|
||||||
let mut model = Self {
|
let mut model = Self {
|
||||||
|
|
|
@ -6,6 +6,8 @@ use anime_launcher_sdk::star_rail::config::Config;
|
||||||
|
|
||||||
use anime_launcher_sdk::config::schema_blanks::prelude::*;
|
use anime_launcher_sdk::config::schema_blanks::prelude::*;
|
||||||
|
|
||||||
|
use enum_ordinalize::Ordinalize;
|
||||||
|
|
||||||
use crate::*;
|
use crate::*;
|
||||||
|
|
||||||
pub struct GamescopeApp;
|
pub struct GamescopeApp;
|
||||||
|
@ -128,13 +130,13 @@ impl SimpleAsyncComponent for GamescopeApp {
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_state: CONFIG.game.enhancements.gamescope.integer_scaling,
|
set_active: CONFIG.game.enhancements.gamescope.integer_scaling,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.gamescope.integer_scaling = switch.state();
|
config.game.enhancements.gamescope.integer_scaling = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -148,13 +150,13 @@ impl SimpleAsyncComponent for GamescopeApp {
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_state: CONFIG.game.enhancements.gamescope.fsr,
|
set_active: CONFIG.game.enhancements.gamescope.fsr,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.gamescope.fsr = switch.state();
|
config.game.enhancements.gamescope.fsr = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -168,13 +170,13 @@ impl SimpleAsyncComponent for GamescopeApp {
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
add_suffix = >k::Switch {
|
||||||
set_valign: gtk::Align::Center,
|
set_valign: gtk::Align::Center,
|
||||||
set_state: CONFIG.game.enhancements.gamescope.nis,
|
set_active: CONFIG.game.enhancements.gamescope.nis,
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
if is_ready() {
|
if is_ready() {
|
||||||
if let Ok(mut config) = Config::get() {
|
if let Ok(mut config) = Config::get() {
|
||||||
config.game.enhancements.gamescope.nis = switch.state();
|
config.game.enhancements.gamescope.nis = switch.is_active();
|
||||||
|
|
||||||
Config::update(config);
|
Config::update(config);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -250,17 +252,33 @@ impl SimpleAsyncComponent for GamescopeApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("force-grab-cursor"),
|
||||||
|
set_subtitle: &tr!("force-grab-cursor-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
set_active: CONFIG.game.enhancements.gamescope.force_grab_cursor,
|
||||||
|
|
||||||
|
connect_state_notify => |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
config.game.enhancements.gamescope.force_grab_cursor = switch.is_active();
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, _sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
_sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing gamescope settings");
|
tracing::info!("Initializing gamescope settings");
|
||||||
|
|
||||||
let model = Self;
|
let model = Self;
|
||||||
|
|
|
@ -49,202 +49,193 @@ impl SimpleAsyncComponent for ComponentsPage {
|
||||||
type Output = GeneralAppMsg;
|
type Output = GeneralAppMsg;
|
||||||
|
|
||||||
view! {
|
view! {
|
||||||
gtk::Box {
|
adw::NavigationPage {
|
||||||
set_orientation: gtk::Orientation::Vertical,
|
#[wrap(Some)]
|
||||||
|
set_child = >k::Box {
|
||||||
|
set_orientation: gtk::Orientation::Vertical,
|
||||||
|
|
||||||
adw::HeaderBar {
|
adw::HeaderBar {
|
||||||
#[wrap(Some)]
|
#[wrap(Some)]
|
||||||
set_title_widget = &adw::WindowTitle {
|
set_title_widget = &adw::WindowTitle {
|
||||||
set_title: &tr!("components")
|
set_title: &tr!("components")
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
pack_start = >k::Button {
|
adw::PreferencesPage {
|
||||||
set_icon_name: "go-previous-symbolic",
|
add = &adw::PreferencesGroup {
|
||||||
|
set_title: &tr!("wine-version"),
|
||||||
|
|
||||||
connect_clicked[sender] => move |_| {
|
adw::ComboRow {
|
||||||
sender.output(GeneralAppMsg::OpenMainPage).unwrap();
|
set_title: &tr!("selected-version"),
|
||||||
}
|
|
||||||
|
#[watch]
|
||||||
|
#[block_signal(wine_selected_notify)]
|
||||||
|
set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::<Vec<&str>>())),
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
#[block_signal(wine_selected_notify)]
|
||||||
|
set_selected: model.selected_wine_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_activatable: !model.selecting_wine_version,
|
||||||
|
|
||||||
|
connect_selected_notify[sender] => move |row| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize));
|
||||||
|
}
|
||||||
|
} @wine_selected_notify,
|
||||||
|
|
||||||
|
add_suffix = >k::Spinner {
|
||||||
|
set_spinning: true,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_visible: model.selecting_wine_version
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("recommended-only"),
|
||||||
|
set_subtitle: &tr!("wine-recommended-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
#[block_signal(wine_recommended_notify)]
|
||||||
|
set_active: true,
|
||||||
|
|
||||||
|
connect_state_notify[sender] => move |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.is_active()));
|
||||||
|
}
|
||||||
|
} @wine_recommended_notify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
add = &adw::PreferencesGroup {
|
||||||
|
add = model.wine_components.widget(),
|
||||||
|
},
|
||||||
|
|
||||||
|
add = &adw::PreferencesGroup {
|
||||||
|
set_title: &tr!("wine-options"),
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("wine-use-shared-libraries"),
|
||||||
|
set_subtitle: &tr!("wine-use-shared-libraries-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
#[block_signal(wine_shared_libraries_notify)]
|
||||||
|
set_active: CONFIG.game.wine.shared_libraries.wine,
|
||||||
|
|
||||||
|
connect_state_notify => |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
config.game.wine.shared_libraries.wine = switch.is_active();
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} @wine_shared_libraries_notify
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("gstreamer-use-shared-libraries"),
|
||||||
|
set_subtitle: &tr!("gstreamer-use-shared-libraries-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
#[block_signal(gstreamer_shared_libraries_notify)]
|
||||||
|
set_active: CONFIG.game.wine.shared_libraries.gstreamer,
|
||||||
|
|
||||||
|
connect_state_notify => |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
if let Ok(mut config) = Config::get() {
|
||||||
|
config.game.wine.shared_libraries.gstreamer = switch.is_active();
|
||||||
|
|
||||||
|
Config::update(config);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} @gstreamer_shared_libraries_notify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
add = &adw::PreferencesGroup {
|
||||||
|
set_title: &tr!("dxvk-version"),
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_description: Some(&if !model.allow_dxvk_selection {
|
||||||
|
tr!("dxvk-selection-disabled")
|
||||||
|
} else {
|
||||||
|
String::new()
|
||||||
|
}),
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_sensitive: model.allow_dxvk_selection,
|
||||||
|
|
||||||
|
adw::ComboRow {
|
||||||
|
set_title: &tr!("selected-version"),
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
#[block_signal(dxvk_selected_notify)]
|
||||||
|
set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::<Vec<&str>>())),
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
#[block_signal(dxvk_selected_notify)]
|
||||||
|
set_selected: model.selected_dxvk_version,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_activatable: !model.selecting_dxvk_version,
|
||||||
|
|
||||||
|
connect_selected_notify[sender] => move |row| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize));
|
||||||
|
}
|
||||||
|
} @dxvk_selected_notify,
|
||||||
|
|
||||||
|
add_suffix = >k::Spinner {
|
||||||
|
set_spinning: true,
|
||||||
|
|
||||||
|
#[watch]
|
||||||
|
set_visible: model.selecting_dxvk_version
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
adw::ActionRow {
|
||||||
|
set_title: &tr!("recommended-only"),
|
||||||
|
set_subtitle: &tr!("dxvk-recommended-description"),
|
||||||
|
|
||||||
|
add_suffix = >k::Switch {
|
||||||
|
set_valign: gtk::Align::Center,
|
||||||
|
|
||||||
|
#[block_signal(dxvk_recommended_notify)]
|
||||||
|
set_active: true,
|
||||||
|
|
||||||
|
connect_state_notify[sender] => move |switch| {
|
||||||
|
if is_ready() {
|
||||||
|
sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.is_active()));
|
||||||
|
}
|
||||||
|
} @dxvk_recommended_notify
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
add = &adw::PreferencesGroup {
|
||||||
|
#[watch]
|
||||||
|
set_sensitive: model.allow_dxvk_selection,
|
||||||
|
|
||||||
|
add = model.dxvk_components.widget(),
|
||||||
|
},
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
adw::PreferencesPage {
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("wine-version"),
|
|
||||||
|
|
||||||
adw::ComboRow {
|
|
||||||
set_title: &tr!("selected-version"),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
#[block_signal(wine_selected_notify)]
|
|
||||||
set_model: Some(>k::StringList::new(&model.downloaded_wine_versions.iter().map(|(version, _)| version.title.as_str()).collect::<Vec<&str>>())),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
#[block_signal(wine_selected_notify)]
|
|
||||||
set_selected: model.selected_wine_version,
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_activatable: !model.selecting_wine_version,
|
|
||||||
|
|
||||||
connect_selected_notify[sender] => move |row| {
|
|
||||||
if is_ready() {
|
|
||||||
sender.input(ComponentsPageMsg::SelectWine(row.selected() as usize));
|
|
||||||
}
|
|
||||||
} @wine_selected_notify,
|
|
||||||
|
|
||||||
add_suffix = >k::Spinner {
|
|
||||||
set_spinning: true,
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_visible: model.selecting_wine_version
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("recommended-only"),
|
|
||||||
set_subtitle: &tr!("wine-recommended-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
#[block_signal(wine_recommended_notify)]
|
|
||||||
set_state: true,
|
|
||||||
|
|
||||||
connect_state_notify[sender] => move |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
sender.input(ComponentsPageMsg::WineRecommendedOnly(switch.state()));
|
|
||||||
}
|
|
||||||
} @wine_recommended_notify
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
add = model.wine_components.widget(),
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("wine-options"),
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("wine-use-shared-libraries"),
|
|
||||||
set_subtitle: &tr!("wine-use-shared-libraries-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
#[block_signal(wine_shared_libraries_notify)]
|
|
||||||
set_state: CONFIG.game.wine.shared_libraries.wine,
|
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.game.wine.shared_libraries.wine = switch.state();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} @wine_shared_libraries_notify
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("gstreamer-use-shared-libraries"),
|
|
||||||
set_subtitle: &tr!("gstreamer-use-shared-libraries-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
#[block_signal(gstreamer_shared_libraries_notify)]
|
|
||||||
set_state: CONFIG.game.wine.shared_libraries.gstreamer,
|
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
if let Ok(mut config) = Config::get() {
|
|
||||||
config.game.wine.shared_libraries.gstreamer = switch.state();
|
|
||||||
|
|
||||||
Config::update(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} @gstreamer_shared_libraries_notify
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
set_title: &tr!("dxvk-version"),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_description: Some(&if !model.allow_dxvk_selection {
|
|
||||||
tr!("dxvk-selection-disabled")
|
|
||||||
} else {
|
|
||||||
String::new()
|
|
||||||
}),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_sensitive: model.allow_dxvk_selection,
|
|
||||||
|
|
||||||
adw::ComboRow {
|
|
||||||
set_title: &tr!("selected-version"),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
#[block_signal(dxvk_selected_notify)]
|
|
||||||
set_model: Some(>k::StringList::new(&model.downloaded_dxvk_versions.iter().map(|version| version.name.as_str()).collect::<Vec<&str>>())),
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
#[block_signal(dxvk_selected_notify)]
|
|
||||||
set_selected: model.selected_dxvk_version,
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_activatable: !model.selecting_dxvk_version,
|
|
||||||
|
|
||||||
connect_selected_notify[sender] => move |row| {
|
|
||||||
if is_ready() {
|
|
||||||
sender.input(ComponentsPageMsg::SelectDxvk(row.selected() as usize));
|
|
||||||
}
|
|
||||||
} @dxvk_selected_notify,
|
|
||||||
|
|
||||||
add_suffix = >k::Spinner {
|
|
||||||
set_spinning: true,
|
|
||||||
|
|
||||||
#[watch]
|
|
||||||
set_visible: model.selecting_dxvk_version
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
adw::ActionRow {
|
|
||||||
set_title: &tr!("recommended-only"),
|
|
||||||
set_subtitle: &tr!("dxvk-recommended-description"),
|
|
||||||
|
|
||||||
add_suffix = >k::Switch {
|
|
||||||
set_valign: gtk::Align::Center,
|
|
||||||
|
|
||||||
#[block_signal(dxvk_recommended_notify)]
|
|
||||||
set_state: true,
|
|
||||||
|
|
||||||
connect_state_notify[sender] => move |switch| {
|
|
||||||
if is_ready() {
|
|
||||||
sender.input(ComponentsPageMsg::DxvkRecommendedOnly(switch.state()));
|
|
||||||
}
|
|
||||||
} @dxvk_recommended_notify
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
add = &adw::PreferencesGroup {
|
|
||||||
#[watch]
|
|
||||||
set_sensitive: model.allow_dxvk_selection,
|
|
||||||
|
|
||||||
add = model.dxvk_components.widget(),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(_init: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
_init: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing general settings -> components page");
|
tracing::info!("Initializing general settings -> components page");
|
||||||
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
|
@ -238,7 +238,7 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
|
|
||||||
connect_state_notify => |switch| {
|
connect_state_notify => |switch| {
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
if switch.state() {
|
if switch.is_active() {
|
||||||
std::fs::remove_file(KEEP_BACKGROUND_FILE.as_path());
|
std::fs::remove_file(KEEP_BACKGROUND_FILE.as_path());
|
||||||
} else {
|
} else {
|
||||||
std::fs::write(KEEP_BACKGROUND_FILE.as_path(), "");
|
std::fs::write(KEEP_BACKGROUND_FILE.as_path(), "");
|
||||||
|
@ -542,7 +542,7 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
},
|
},
|
||||||
|
|
||||||
#[local_ref]
|
#[local_ref]
|
||||||
components_page -> gtk::Box {}
|
components_page -> adw::NavigationPage,
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(
|
||||||
|
@ -684,14 +684,14 @@ impl SimpleAsyncComponent for GeneralApp {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.close_subpage();
|
.pop_subpage();
|
||||||
}
|
}
|
||||||
|
|
||||||
GeneralAppMsg::OpenComponentsPage => unsafe {
|
GeneralAppMsg::OpenComponentsPage => unsafe {
|
||||||
PREFERENCES_WINDOW.as_ref()
|
PREFERENCES_WINDOW.as_ref()
|
||||||
.unwrap_unchecked()
|
.unwrap_unchecked()
|
||||||
.widget()
|
.widget()
|
||||||
.present_subpage(self.components_page.widget());
|
.push_subpage(self.components_page.widget());
|
||||||
}
|
}
|
||||||
|
|
||||||
#[allow(unused_must_use)]
|
#[allow(unused_must_use)]
|
||||||
|
|
|
@ -74,11 +74,7 @@ impl SimpleAsyncComponent for PreferencesApp {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn init(
|
async fn init(parent: Self::Init, root: Self::Root, sender: AsyncComponentSender<Self>) -> AsyncComponentParts<Self> {
|
||||||
parent: Self::Init,
|
|
||||||
root: Self::Root,
|
|
||||||
sender: AsyncComponentSender<Self>,
|
|
||||||
) -> AsyncComponentParts<Self> {
|
|
||||||
tracing::info!("Initializing preferences window");
|
tracing::info!("Initializing preferences window");
|
||||||
|
|
||||||
let model = Self {
|
let model = Self {
|
||||||
|
|
Loading…
Reference in a new issue