Merge pull request #84 from an-anime-team/next

Release 1.5.0
This commit is contained in:
Observer KRypt0n_ 2023-11-13 22:14:29 +02:00 committed by GitHub
commit 8b19427071
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
66 changed files with 2616 additions and 841 deletions

View file

@ -7,6 +7,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased]
### Added
- Added Vietnamese
- Added Korean
- Added Dutch
- Made free space checks resolve symlinks
- Added voiceovers support
- Added new `Concerning` patch status
### Changed
- Updated development libraries versions
- Updated Japanese
- Updated Chinese
## [1.4.0] - 20.08.2023
### Added

1306
Cargo.lock generated

File diff suppressed because it is too large Load diff

View file

@ -2,7 +2,7 @@
name = "honkers-railway-launcher"
version = "1.4.0"
description = "The Honkers Railway launcher"
authors = ["Nikita Podvirnyy <suimin.tu.mu.ga.mi@gmail.com>"]
authors = ["Nikita Podvirnyy <krypt0nn@vk.com>"]
homepage = "https://github.com/an-anime-team/the-honkers-railway-launcher"
repository = "https://github.com/an-anime-team/the-honkers-railway-launcher"
license = "GPL-3.0"
@ -19,24 +19,24 @@ glib-build-tools = "0.18"
[dependencies.anime-launcher-sdk]
git = "https://github.com/an-anime-team/anime-launcher-sdk"
tag = "1.11.0"
tag = "1.12.2"
features = ["all", "star-rail", "star-rail-patch"]
# path = "../anime-launcher-sdk" # ! for dev purposes only
[dependencies]
relm4 = { version = "0.6.0", features = ["macros", "libadwaita"] }
gtk = { package = "gtk4", version = "0.6", features = ["v4_8"] }
adw = { package = "libadwaita", version = "0.4", features = ["v1_2"] }
relm4 = { version = "0.7.0-beta.2", features = ["macros", "libadwaita"] }
gtk = { package = "gtk4", version = "0.7.3", features = ["v4_12"] }
adw = { package = "libadwaita", version = "0.5.3", features = ["v1_3"] }
rfd = { version = "0.11", features = ["xdg-portal"], default-features = false }
rfd = { version = "0.12.1", features = ["xdg-portal"], default-features = false }
open = "5.0.0"
whatadistro = "0.1.0"
serde_json = "1.0"
anyhow = "1.0"
lazy_static = "1.4.0"
cached = { version = "0.44", features = ["proc_macro"] }
cached = { version = "0.46", features = ["proc_macro"] }
md-5 = { version = "0.10", features = ["asm"] }
tracing = "0.1"
@ -45,4 +45,4 @@ tracing-subscriber = "0.3"
fluent-templates = "0.8"
unic-langid = "0.9"
human-panic = "1.1.5"
human-panic = "1.2.2"

View file

@ -19,12 +19,15 @@ ru-ru = Русский
de-de = Deutsch
fr-fr = Français
es-es = Español
tr-tr = Türkçe
pt-br = Português
it-it = Italiano
id-id = Indonesia
zh-cn = 简体中文
ja-jp = 日本語
tr-tr = Türkçe
pl-pl = Polski
hu-hu = Magyar
sv-se = Svenska
pt-br = Português
pl-pl = Polski
nl-nl = Nederlands
zh-cn = 简体中文
ja-jp = 日本語
ko-kr = 한국어
id-id = Indonesia
vi-vn = Tiếng Việt

View file

@ -14,11 +14,11 @@ system = システム
borderless-window = ボーダーレスウィンドウ
virtual-desktop = 仮想デスクトップ
map-drive-c = Cドライブを作成する
map-drive-c-description = DOSデバイスに、WineプレフィックスのCドライブのソフトリンクを自動的に作成します
map-drive-c = WineプレフィックスにCドライブをマップする。
map-drive-c-description = prefixフォルダーの "dosdevices" フォルダーにCドライブのソフトリンクを自動的に作成します
map-game-folder = ゲームフォルダを作成する。
map-game-folder-description = DOSデバイスにゲームフォルダのソフトリンクを自動的に作成します
map-game-folder = Wineプレフィックスにゲームフォルダをマップする。
map-game-folder-description = prefixフォルダーの "dosdevices" フォルダーにゲームフォルダのソフトリンクを自動的に作成します
game = ゲーム

View 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 = 선택한 Wine 빌드에서 시스템 라이브러리를 로드하도록 LD_LIBRARY_PATH 변수를 설정합니다
gstreamer-use-shared-libraries = GStreamer 공유 라이브러리 사용
gstreamer-use-shared-libraries-description = 선택한 Wine 빌드에서 GST_PLUGIN_PATH 변수에 설정된 GStreamer 라이브러리를 로드하도록 설정합니다
dxvk-version = DXVK 버전
dxvk-selection-disabled = Wine 그룹 기본 설정에 따라 DXVK 선택이 비활성화되어 있습니다
dxvk-recommended-description = 권장되는 DXVK 버전만 표시

View file

@ -0,0 +1,69 @@
game-settings-description = 게임 내 설정 및 계정 세션 관리
sandbox-settings-description = Flatpak과 유사한 Bubblewrap 샌드박스에서 게임을 실행합니다
environment-settings-description = 환경 변수 및 게임 실행 명령 지정
wine = Wine
synchronization = 동기화
wine-sync-description = 와인 내부 이벤트를 동기화하는 데 사용되는 기술
language = 언어
wine-lang-description = 와인 환경에서 사용되는 언어 입니다. 키보드 레이아웃 문제를 해결 할 수도 있습니다
system = 시스템
borderless-window = 테두리 없는 창
virtual-desktop = 가상 데스크톱
map-drive-c = Map drive C:
map-drive-c-description = 자동적으로 와인 구성에서 drive_c폴더를 dosdevices로 심볼릭 링크합니다
map-game-folder = Map game folder
map-game-folder-description = 게임 폴더를 dosdevices에 자동으로 심볼릭 링크합니다
game = 게임
hud = HUD
fsr = FSR
fsr-description = 게임을 모니터 크기에 맞게 업스케일링 합니다. 사용하려면 게임 설정에서 더 낮은 해상도를 선택하고 Alt+Enter를 누릅니다
ultra-quality = 울트라 퀄리티
quality = 퀄리티
balanced = 벨런스
performance = 성능
gamemode = 게임모드
gamemode-description = 프로세스중 게임이 가지는 우선순위 설정
gamescope = Gamescope
gamescope-description = Gamescope는 게임을 격리된 Xwayland 인스턴스에서 실행할 수 있게 해주는 Valve의 도구로, AMD, Intel, Nvidia GPU를 지원합니다
discord-rpc = Discord RPC
discord-rpc-description = Discord RPC를 사용하면 현재 게임을 플레이하고 있는 정보를 Discord에 제공하여 친구에게 알릴 수 있습니다
icon = 아이콘
title = 타이틀
description = 설명
fps-unlocker = FPS Unlocker
enabled = Enabled
fps-unlocker-description = 게임 메모리를 수정하여 프레임 렌더링 제한을 제거합니다. 안티 치트에 의해 감지 될 수 있습니다
power-saving = 절전
power-saving-description = 게임에 집중하지 않을 때(예: 탭아웃) 자동으로 FPS 제한을 10으로 설정하고 프로세스 우선순위를 낮춥니다
monitor = 모니터
monitor-description = 게임을 실행하고자 하는 모니터의 수
window-mode = 창 모드
borderless = 테두리 없는 창 모드
popup = 팝업
fullscreen = 전체 화면
priority = 우선 순위
priority-description = 게임 프로세스 우선 순위
realtime = 실시간
high = 높음
above-normal = 보통 이상
normal = 보통
below-normal = 보통 이하
low = 낮음

View file

@ -0,0 +1,7 @@
environment = 환경
game-command = 게임 명령어
game-command-description = 게임을 실행하는 데 사용되는 명령입니다. %command%는 런처에서 자동으로 생성된 값을 불러 오도록 합니다. 에: gamemoderun '%command%'
new-variable = 새 변수
name = 이름
value = 값
add = 추가

View 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 = Wishes URL을 찾지 못했습니다
wish-url-opening-error = Wishes URL을 열지 못했습니다
wine-run-error = Wine을 사용하여 {$executable} 실행 파일을 실행하지 못했습니다
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 = Telemetry 서버를 비활성화하지 못했습니다
# 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 아이콘 다운로드를 실패했습니다

View file

@ -0,0 +1,65 @@
welcome = 환영합니다
welcome-page-message =
안녕하세요! An Anime Game Launcher에 오신 것을 환영합니다
게임을 실행하기 전에 몇 가지 사항을 준비하고 기본 구성 요소를 다운로드해야 합니다
tos-violation-warning = ToS 위반 경고
tos-violation-warning-message =
이 런처는 {company-name} 또는 {company-alter-name}과 전혀 관련이 없는 비공식 도구입니다
이 도구는 Linux에서 {game-name}을 쉽게 플레이할 수 있도록 설계되었으며, 번거로움을 덜고 게임을 설치 및 실행하기 위한 목적으로 제작되었습니다
이는 기존 구성 요소를 사용하고 사용자 경험을 단순화하여 이를 구현됩니다
그러나 여기에 사용된 일부 구성 요소는 {company-name}의 {game-name} 서비스 약관을 위반할 수 있습니다
이 런처를 사용하는 경우, 플레이어 계정이 {company-name}/{company-alter-name}에 의해 TOS를 준수하지 않는 것으로 식별될 수 있습니다
이 경우 계정이 TOS를 위반하는 것이므로 {company-name}/{company-alter-name}은 원하는 대로 자유롭게 조치를 취할 수 있습니다. 물론 차단도 포함됩니다
비공식적인 자격으로 게임을 플레이하는 것에 대한 위험을 이해했다면 확인을 눌러 계속합니다
tos-dialog-title = 저희가 하고자 하는 말을 이해하셨나요?
tos-dialog-message =
1. 이 프로젝트에 대한 정보를 게시하지 마세요.
2. 일부 수정된 클라이언트를 사용하여 남용하지 마세요.
3. 저희의 디스코드 또는 매트릭스 서버에서 예외적으로 질문이 허용됩니다.
dependencies = 의존성
missing-dependencies-title = 일부 의존성이 누락되었습니다!
missing-dependencies-message = 설치 작업을 계속하기 전에 시스템에 일부 패키지를 설치해야 합니다
default-paths = 기본 경로
choose-default-paths = 기본 경로 선택
show-all-folders = 고급 설정
show-all-folders-subtitle = 추가 경로 선택 설정 표시. 원하는대로...
runners-folder = 실행 폴더
dxvks-folder = DXVK 폴더
wine-prefix-folder = Wine 폴더
global-game-installation-folder = 글로벌 게임 설치 폴더
chinese-game-installation-folder = 중국어 게임 설치 폴더
fps-unlocker-folder = FPS 잠금 해제 폴더
components-index = 구성 요소 색인
patch-folder = 패치 폴더
temp-folder = 임시 폴더
migrate = 마이그레이션
select-voice-packages = 음성 패키지 선택
download-components = 구성 요소 다운로드
download-dxvk = DXVK 다운로드
apply-dxvk = DXVK 적용
finish = 완료
finish-title = 모든 작업이 완료되었습니다!
finish-message = 모든 기본 구성 요소가 다운로드되었습니다. 이제 런처를 다시 시작하고 게임을 다운로드할 수 있습니다. 저희 소프트웨어에 오신 것을 환영합니다!

View file

@ -0,0 +1,7 @@
game-sessions = 게임 세션
active-sessions = 활성 세션
active-session-description = 현재 이 게임 세션이 선택되어 있습니다. 각 게임 실행 후 업데이트가 가능합니다
update-session = 현재 Wine 접두사 레지스트리 값을 사용하여 세션을 업데이트합니다
delete-session = 세션 삭제

View file

@ -0,0 +1,13 @@
game-resolution = 게임 해상도
gamescope-resolution = 게임 범위 해상도
upscaling = 업스케일링
integer-scaling = 정수 스케일링
integer-scaling-description = 각 픽셀을 정수로 구성된 정사각형 또는 직사각형의 동일한 색상 픽셀 그룹으로 변환합니다. Full HD에서 4K로 업스케일링할 때 선명도 손실을 방지합니다
gamescope-fsr-description = 더 나은 업스케일링 품질을 위해 AMD에서 개발한 오픈 소스 업스케일링 기술입니다
nis-description = Nvidia가 독점 DLSS 솔루션에 대한 낮은 오버헤드 대안으로 공급업체 간, 낮은 오버헤드로 개발한 오픈 소스 업스케일링 기술입니다. 즉, Nvidia GPU는 물론 AMD 및 Intel GPU에서도 작동합니다
other-settings = 기타 설정
framerate-limit = 프레임 속도 제한
unfocused-framerate-limit = 초점이 맞지 않는 프레임 속도 제한

View 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 패치와 동일합니다. 성능을 향상시키고 CPU 사용을 줄입니다
ask-superuser-permissions = 슈퍼유저 권한 요청
ask-superuser-permissions-description = 런처가 이를 사용하여 호스트 파일을 자동으로 업데이트합니다. Flatpak 에디션에서는 필요하지 않습니다
launcher-behavior = 런처 동작
launcher-behavior-description = 게임을 시작할 때 런처 창이 수행해야 할 작업
wine-tools = Wine 도구
command-line = 명령줄
registry-editor = 레지스트리 편집기
explorer = 탐색기
task-manager = 작업 관리자
configuration = 구성
debugger = 디버거

View file

@ -0,0 +1,75 @@
custom = 사용자 지정
none = 없음
default = 기본값
details = 세부 정보
options = 옵션
width = 너비
height = 높이
# Menu items
launcher-folder = 런처 폴더
game-folder = 게임 폴더
config-file = 구성 파일
debug-file = 디버그 파일
wish-url = Wishes 열기
about = 정보
close = 닫기
hide = 숨기기
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} 음성 확인 중
loading-launcher-state--patch = 런처 상태 로드 중: 설치된 패치 확인 중
checking-free-space = 여유 공간 확인 중
downloading = 다운로드 중
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 = 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 = Version is too outdated and can't be updated
preferences = 버전이 너무 오래되어 업데이트할 수 없습니다
general = 일반
enhancements = 성능

View 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 = 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 = 샌드박스 내부에 원래 경로를 심볼릭 링크합니다

View file

@ -0,0 +1,20 @@
components = Componenten
components-description = Beheer je Wine en DXVK versies
selected-version = Geselecteerde versie
recommended-only = Alleen aanbevolen
wine-version = Wine version
wine-recommended-description = Laat alleen aanbevolen Wine versies zien
wine-options = Wine instellingen
wine-use-shared-libraries = Gebruik Wine shared libraries
wine-use-shared-libraries-description = Stel LD_LIBRARY_PATH variabele in on systeem libraries the gebruiken van de geselecteerde Wine build
gstreamer-use-shared-libraries = Gebruik gstreamer shared libraries
gstreamer-use-shared-libraries-description = Stel GST_PLUGIN_PATH variabele in om gstreamer libraries te gebruiken van de geselecteerde Wine build
dxvk-version = DXVK versie
dxvk-selection-disabled = DXVK selectie is uigeschakeld door je Wine group instellingen
dxvk-recommended-description = Laat alleen aanbevolen DXVK versies zien

View file

@ -0,0 +1,69 @@
game-settings-description = Beheer in-game instelling en account sessies
sandbox-settings-description = Start het spel in een bubblewrap sandbox, net als wat Flatpak doet
environment-settings-description = Stel environment variabelen en spel start commands in
wine = Wine
synchronization = Synchronisatie
wine-sync-description = Technologie die gebruikt wordt om Wine evenementen the synchroniseren
language = Taal
wine-lang-description = Taal die gebruikt wordt in de Wine omgeving. Kan toetsenbord layout problemen oplossen.
system = Systeem
borderless-window = Randloos venster
virtual-desktop = Virtueel bureaublad
map-drive-c = Koppel schijf C:
map-drive-c-description = Automatisch een symbolische koppeling maken tussen de map drive_c van de Wine prefix naar de dosdevices
map-game-folder = Koppel spelmap
map-game-folder-description = Verbind de spelmap automatisch met de dosdevices
game = Spel
hud = HUD
fsr = FSR
fsr-description = Schaalt het spel op naar je monitorformaat. Om dit te gebruiken, selecteer je een lagere resolutie in de spelinstellingen en druk je op Alt+Enter
ultra-quality = Ultra qualiteit
quality = Qualiteit
balanced = Gebalanceerd
performance = Prestatie
gamemode = Gamemode
gamemode-description = Geef het spel een hogere prioriteit dan andere processen
gamescope = Gamescope
gamescope-description = Gamescope is een hulpmiddel van Valve om je programma's te isoleren in een Xwayland omgeving. Het ondersteund AMD, Intel en Nvidia videokaarten
discord-rpc = Discord RPC
discord-rpc-description = Discord RPC laat informatie zien in Discord dat je het spel aan het spelen bent
icon = Icoon
title = Titel
description = Omschrijving
fps-unlocker = FPS Unlocker
enabled = Ingeschakeld
fps-unlocker-description = Haalt het FPS limit weg van het spel door het geheugen aan te passen. Kan gedetecteerd worden door ant-cheat
power-saving = Energiebesparing
power-saving-description = Zet het FPS limit automatisch op 10 en een lage process prioriteit waneer het spel focus verliest (bijvoorbeeld als je niet op het spel gefocust bent)
monitor = Monitor
monitor-description = Nummer van de monitor waar je het spel op wilt starten
window-mode = Venster Mode
borderless = Randloos
popup = Popup
fullscreen = Volledig scherm
priority = Prioriteit
priority-description = Spel process prioriteit
realtime = Realtime
high = Hoog
above-normal = Boven Normaal
normal = Normall
below-normal = Onder Normal
low = Laag

View file

@ -0,0 +1,7 @@
environment = Omgeving
game-command = Spel commando
game-command-description = Commando dat gebruikt wordt om het spel te started. %command% wordt automatisch gegenereerd door de launcher. Bijvoorbeeld: gamemoderun '%command%'
new-variable = Nieuwe variabele
name = Naam
value = Waarde
add = Voeg Toe

View file

@ -0,0 +1,66 @@
launcher-folder-opening-error = Kan de launcher map niet openen
game-folder-opening-error = Kan de spel map niet openen
config-file-opening-error = Kan het configuratiebestand niet openen
debug-file-opening-error = Kan debugbestand niet openen
wish-url-search-failed = Geen wishes URL gevonden
wish-url-opening-error = Kan wishes URL niet openen
wine-run-error = Kan {$executable} niet starten met Wine
game-launching-failed = Kan het spel niet starten
failed-get-selected-wine = Kan de geselecteerde Wine versie niet krijgen
downloading-failed = Downloaden gefaalt
unpacking-failed = Uitpakken gefaalt
kill-game-process-failed = Kan het spel's process niet stoppen
game-file-repairing-error = Kan het spel's bestanden niet repareren
integrity-files-getting-error = Failed to get integrity files
background-downloading-failed = Kan achtergrondfoto's niet downloaden
components-index-sync-failed = Kan de componenten index niet synchroniseren
components-index-verify-failed = Kan de componenten index niet verifiëren
config-update-error = Kan configuratie niet opslaan
wine-prefix-update-failed = Kan de Wine prefix niet updaten
dxvk-install-failed = Kan DXVK niet installeren
voice-package-deletion-error = Kan het spraakpakket niet verwijderen
game-diff-finding-error = Kan speldiff niet vinden
patch-info-fetching-error = Kan patchgegevens niet ophalen
launcher-state-updating-error = Kan de status van de launcher niet updaten
package-not-available = Pakket niet beschikbaar: {$package}
wine-download-error = Kan Wine niet downloaden
wine-unpack-errror = Kan Wine niet uitpakken
wine-install-failed = Kan Wine niet installeren
dxvk-download-error = Kan DXVK niet downloaden
dxvk-unpack-error = Kan DXVK niet uitpakken
dxvk-apply-error = Kan DXVK niet toepassen
downloaded-wine-list-failed = Kan gedownloade Wine versies niet weergeven
patch-sync-failed = Kan de patchmap niet synchroniseren
patch-state-check-failed = Kan de status van de patchmap niet controleren
game-patching-error = Kan het spel niet patchen
# Disable telemetry
telemetry-servers-disabling-error = Kan telemetrieservers niet uitschakelen
# Sandbox
documentation-url-open-failed = Kan de documentatie-URL niet openen
# Game
game-session-add-failed = Kan gamesessie niet toevoegen
game-session-update-failed = Kan de gamesessie niet updaten
game-session-remove-failed = Kan gamesessie niet verwijderen
game-session-set-current-failed = Kan de huidige gamesessie niet instellen
game-session-apply-failed = Kan gamesessie niet toepassen
# Enhancements
discord-rpc-icons-fetch-failed = Kan Discord RPC-pictogrammen niet ophalen
discord-rpc-icon-download-failed = Kan het Discord RPC-pictogram niet downloaden

View file

@ -0,0 +1,64 @@
welcome = Welkon
welcome-page-message =
Hallo! Welkom bij de An Anime Game Launcher
We moeten een aantal dingen voorbereiden en standaardcomponenten downloaden voordat je het spel kunt spelen
tos-violation-warning = Waarschuwing voor overtreding van ToS
tos-violation-warning-message =
Deze launcher is niet officiëel en heeft op geen enkele manier betrekking met {company-name} of {company-alter-name}.
Dit programma is ontworpen om het spelen van {game-name} op Linux makkelijker te maken, en is gemaakt met als enig doel on het spel makkelijiker te installeren en spelen op Linux
Dit gebeurt door bestaande componenten te gebruiken en de ervaring voor de gebruiker eenvoudig te maken.
Sommige hier gebruikte componenten zijn echter waarschijnlijk in strijd met de servicevoorwaarden van {company-name} voor {game-name}.
Als je deze launcher gebruikt, kan je account worden geïdentificeerd als niet-conform met de TOS door {company-name}/{company-alter-name} wijzigen.
Als dit gebeurt, is {company-name}/{company-alter-name} vrij om te doen wat ze willen, omdat je account de Servicevoorwaarden zou schenden. Inclusief een game ban.
Als je het risico snapt om het spel te spelen in een onofficiële manier, druk dan op OK om door te gaan
tos-dialog-title = Weet je zeker dat je begrijpt wat we zeggen?
tos-dialog-message =
1. Publiceer geen informatie over dit project
2. Maak er geen misbruik van door een aantal modded clients en dergelijke te gebruiken
3. Stel uitzonderlijk vragen in onze Discord- of Matrixserver
dependencies = Dependencies
missing-dependencies-title = Je mist een aantal dependencies!
missing-dependencies-message = Je moet enkele pakketten op je systeem installeren voordat je doorgaat met het installatieproces
default-paths = Standaardpaden
choose-default-paths = Kies standaardpaden
show-all-folders = Ik weet wat ik doe
show-all-folders-subtitle = Toon aanvullende padselectie-instellingen. Doe wat ik zeg...
runners-folder = Runners map
dxvks-folder = DXVKs map
wine-prefix-folder = Wine prefix map
global-game-installation-folder = Globale spelversie installatiemap
chinese-game-installation-folder = Chinese spelversie installatiemap
fps-unlocker-folder = FPS Unlocker map
components-index = Componentenindex
patch-folder = Patch map
temp-folder = Tijdelijke map
migrate = Migreer
select-voice-packages = Selecteer spraakpakketten
download-components = Download componenten
download-dxvk = Download DXVK
apply-dxvk = Pas DXVK toe
finish = Maak af
finish-title = Alles is klaar!
finish-message = Alle basiscomponenten zijn gedownload. Nu kun je de launcher opnieuw starten en het spel downloaden. Welkom bij onze club!

View file

@ -0,0 +1,7 @@
game-sessions = Game sessions
active-sessions = Actieve sessie
active-session-description = Momenteel geselecteerde gamesessie. Updates na het opstarten van het spel
update-session = Update de sessie met de huidige registerwaarden voor Wine prefixes
delete-session = Verwijder sessie

View file

@ -0,0 +1,13 @@
game-resolution = Spelresolutie
gamescope-resolution = Gamescope resolutie
upscaling = Opschaling
integer-scaling = Schalen van gehele getallen
integer-scaling-description = Verandert elke pixel in een vierkante of rechthoekige groep van een geheel aantal pixels met dezelfde kleur. Voorkomt scherpteverlies bij het schalen van Full HD naar 4K
gamescope-fsr-description = Een open-source opschalingstechniek ontwikkeld door AMD voor een betere opschalingskwaliteit
nis-description = Een open source opschalingstechniek ontwikkeld door Nvidia als een cross-vendor, low-overhead alternatief voor hun eigen DLSS-oplossing, wat betekent dat het werkt op AMD- en Intel GPU's en Nvidia GPU's
other-settings = Andere instellingen
framerate-limit = Frameratelimiet
unfocused-framerate-limit = Ongefocuste frameratelimiet

View file

@ -0,0 +1,72 @@
appearance = Uiterlijk
modern = Modern
classic = Klassiek
update-background = Achtergrondafbeelding bijwerken
update-background-description = Download de officiële achtergrondafbeelding voor de launcher. Je kunt het uitschakelen om in plaats daarvan je eigen afbeelding te gebruiken
launcher-language = Launcher taal
launcher-language-description = Past toe na opnieuw opstarten
game-edition = Spelversie
global = Globaal
china = China
game-environment = Spelomgeving
game-environment-description = Ontvang specifieke functies zoals extra betaalmethoden
game-voiceovers = Spel voice-over
game-voiceovers-description = Lijst met gedownloade spel voice-overs. Je kunt ze selecteren in de spelinstellingen
english = Engels
japanese = Japans
korean = Koreaans
chinese = Chinees
migrate-installation = Migreer installatie
migrate-installation-description = Open een venster waarin je de installatiemap het spel kunt wijzigen
repair-game = Repareer spel
status = Status
game-version = Spelversie
game-not-installed = niet geïnstalleerd
game-predownload-available = Spel-update vooraf downloaden beschikbaar: {$old} -> {$new}
game-update-available = Spel-update beschikbaar: {$old} -> {$new}
game-outdated = Het spel is te oud en kan niet worden bijgewerkt. Nieuwste versie: {$latest}
player-patch-version = Patchversie voor spel
player-patch-version-description = Main patch waarmee je het spel op Linux kunt spelen
patch-not-available = niet beschikbaar
patch-not-available-tooltip = Patchservers zijn onbereikbaar
patch-outdated = verouderd ({$current})
patch-outdated-tooltip = Patch is oud: {$current} -> {$latest}
patch-preparation = voorbereiding
patch-preparation-tooltip = Patch is in ontwikkeling
patch-testing-tooltip = Testpatch is beschikbaar
patch-not-applied-tooltip = Patch is niet toegepast
apply-main-patch = Breng de main patch aan
apply-main-patch-description = Experimenteel. Als je dit uitschakelt, kun je het spel uitvoeren zonder de patch toe te passen. Dit werkt mogelijk niet, of vereist handmatige bestandsaanpassingen. Gebruik dit als je weet wat je doet
disable-mhypbase = Schakel mhypbase uit
disable-mhypbase-description = Experimenteel. Indien ingeschakeld, zal het opstartprogramma mhypbase.dll uitschakelen tijdens het aanbrengen van de main patch, wat momenteel gelijkwaardig is aan de xlua-patch. Verbetert de prestaties en vermindert het CPU-gebruik
ask-superuser-permissions = Vraag superuser-machtigingen
ask-superuser-permissions-description = Launcher zal ze gebruiken om je hosts-bestand automatisch bij te werken. Dit is niet nodig in de flatpak-editie
launcher-behavior = Launcher gedrag
launcher-behavior-description = Wat moet het laucner-venster doen als het spel wordt gestart?
wine-tools = Wine tools
command-line = Command line
registry-editor = Register-editor
explorer = Explorer
task-manager = Taakbeheer
configuration = Configuratie
debugger = Debugger

View file

@ -0,0 +1,75 @@
custom = Aangepast
none = Geen
default = Standaard
details = Details
options = Instellingen
width = Breedte
height = Hoogte
# Menu items
launcher-folder = Launcher map
game-folder = Spelmap
config-file = Configuratiebestand
debug-file = Debugbestand
wish-url = Open wishes
about = Over
close = Sluit
hide = Verberg
nothing = Niks
save = Opslaan
continue = Hervatten
resume = Doorgaan
exit = Sluit
check = Controleer
restart = Opnieuw opstarten
agree = Mee eens
loading-data = Data aan het laden
downloading-background-picture = Achtergrondafbeelding downloaden
updating-components-index = Componentenindex bijwerken
loading-game-version = Spelversie laden
loading-patch-status = Patchstatus laden
loading-launcher-state = Status de launcher wordt geladen
loading-launcher-state--game = Laadstatus van de launcher: spelversie verifiëren
loading-launcher-state--voice = Laadstatus van de launcher: verificatie van de voice-over van {$locale}
loading-launcher-state--patch = Laadstatus van de launcher: geïnstalleerde patch verifiëren
checking-free-space = Vrije ruimte controleren
downloading = Downloaden
unpacking = Uitpakken
verifying-files = Bestanden verifiëren
repairing-files = Bestanden repareren
migrating-folders = Mappen migreren
applying-hdiff = Toepassen van hdiff patches
removing-outdated = Oude bestanden verwijderen
components-index-updated = Componentenindex is bijgewerkt
launch = Start
migrate-folders = Migreer mappen
migrate-folders-tooltip = Update de structuur van spelmappen
apply-patch = Pas patch toe
disable-telemetry = Schakel telemetrie uit
download-wine = Download Wine
create-prefix = Creër prefix
update = Update
download = Download
predownload-update = Update van {$version} ({$size}) vooraf downloaden
kill-game-process = Stop het spelproces
main-window--patch-unavailable-tooltip = Patchservers zijn niet beschikbaar en de launcher kan de patchstatus van de game niet verifiëren. Je mag het spel op eigen risico uitvoeren
main-window--patch-outdated-tooltip = Patch is oud of in voorbereiding, dus niet beschikbaar voor gebruik. Kom later terug om de status ervan te bekijken
main-window--version-outdated-tooltip = De versie is te oud en kan niet worden bijgewerkt
preferences = Voorkeuren
general = Algemeen
enhancements = Verbeteringen

View file

@ -0,0 +1,28 @@
sandbox = Sandbox
sandbox-description = Voer het spel uit in een geïsoleerde omgeving, zodat het geen toegang heeft tot je persoonlijke gegevens
enable-sandboxing = Schakel sandboxing in
enable-sandboxing-description = Voer het spel uit in een read-only kopie van je root filesysteem
hide-home-directory = Verberg homemap
hide-home-directory-description = Isoleer je /home, /var/home/$USER, en $HOME mappen van het spel
hostname = Hostnaam
additional-arguments = Aanvullende argumenten
private-directories = Privémappen
private-directories-description = Deze mappen worden vervangen door een leeg virtueel bestandssysteem (tmpfs) en hun originele inhoud zal niet beschikbaar zijn voor spellen in de sandbox
path = Pad
shared-directories = Gedeelde mappen
shared-directories-description = Deze mappen worden symbolisch gekoppeld aan mappen in je hostsysteem
original-path = Oorspronkelijk pad
new-path = Nieuw pad
read-only = Read-only
read-only-description = Verbied het spel om gegevens naar deze map te schrijven
symlinks = Symlinks
symlinks-description = Symlink het oorspronkelijke pad naar het nieuwe pad in je sandbox

View file

@ -0,0 +1,20 @@
components = Các thành phần
components-description = Quản lý các phiên bản Wine và DXVK
selected-version = Phiên bản đã chọn
recommended-only = Chỉ được đề xuất
wine-version = Phiên bản Wine
wine-recommended-description = Chỉ hiển thị các phiên bản Wine được đề xuất
wine-options = Tùy chọn Wine
wine-use-shared-libraries = Sử dụng thư viện dùng chung Wine
wine-use-shared-libraries-description = Đặt biến LD_LIBRARY_PATH để tải các thư viện dùng chung từ phiên bản Wine đã chọn
gstreamer-use-shared-libraries = Sử dụng thư viện dùng chung của GStreamer
gstreamer-use-shared-libraries-description = Đặt biến GST_PLUGIN_PATH để tải các thư viện của GStreamer từ phiên bản Wine đã chọn
dxvk-version = Phiên bản DXVK
dxvk-selection-disabled = Lựa chọn DXVK bị tắt theo tùy chọn Wine
dxvk-recommended-description = Chỉ hiển thị các phiên bản DXVK được đề xuất

View file

@ -0,0 +1,68 @@
game-settings-description = Quản lý cài đặt trong trò chơi và phiên tài khoản
sandbox-settings-description = Chạy trò chơi trong bubblewrap sandbox, tựa như Flatpak làm
environment-settings-description = Chỉ định các biến môi trường và lệnh khởi chạy trò chơi
wine = Wine
synchronization = Đồng bộ
wine-sync-description = Công nghệ được sử dụng để đồng bộ hóa các sự kiện Wine
language = Ngôn ngữ
wine-lang-description = Ngôn ngữ được sử dụng trong môi trường Wine. Có thể khắc phục sự cố bố cục bàn phím
system = Hệ thống
borderless-window = Cửa sổ không viền
virtual-desktop = Màn hình ảo
map-drive-c = Ánh xạ ổ C:
map-drive-c-description = Tự động liên kết thư mục drive_c từ tiền tố Wine đến dosdevices
map-game-folder = Ánh xạ thư mục trò chơi
map-game-folder-description = Tự động liên kết thư mục trò chơi với dosdevices
game = Trò chơi
hud = HUD
fsr = FSR
fsr-description = Nâng dộ phân giải trò chơi theo kích thước màn hình. Để sử dụng, chọn độ phân giải thấp hơn trong cài đặt của trò chơi và nhấn Alt+Enter
ultra-quality = Cực cao
quality = Chất lượng
balanced = Cân bằng
performance = Hiệu suất
gamemode = Chế độ trò chơi
gamemode-description = Ưu tiên trò chơi hơn các tiến trình khác
gamescope = Gamescope
gamescope-description = Gamescope là một công cụ của Valve cho phép các trò chơi chạy trong một phiên bản Xwayland bị cô lập và hỗ trợ GPU AMD, Intel và Nvidia
discord-rpc = Discord RPC
discord-rpc-description = Discord RPC giúp Discord biết trò chơi đang chơi để cho bạn bè biết
icon = Biểu tượng
title = Tiêu đề
description = Mô tả
fps-unlocker = Mở khóa FPS
enabled = Đã bật
fps-unlocker-description = Xóa giới hạn FPS bằng cách sửa đổi trò chơi. Có thể bị phát hiện bởi hệ thống chống gian lận
power-saving = Tiết kiệm điện
power-saving-description = Tự động đặt giới hạn FPS thành 10 và mức độ ưu tiên xử lý thấp khi không chơi (ví dụ: ẩn tab)
monitor = Màn hình
monitor-description = Số lượng màn hình muốn chạy trò chơi trên đó
window-mode = Chế độ cửa sổ
borderless = Cửa sổ không viền
popup = Popup
fullscreen = Toàn màn hình
priority = Ưu tiên
priority-description = Mức độ ưu tiên của tiến trình trò chơi
realtime = Thời gian thực
high = Cao
above-normal = Trên mức bình thường
normal = Bình thường
below-normal = Dưới mức bình thường
low = Thấp

View file

@ -0,0 +1,7 @@
environment = Môi trường
game-command = Lệnh trò chơi
game-command-description = Lệnh được sử dụng để khởi chạy trò chơi. Lệnh tạm thời %command% được Launcher tự động tạo. Ví dụ: gamemoderun '%command%'
new-variable = Biến mới
name = Tên
value = Giá trị
add = Thêm

View file

@ -0,0 +1,70 @@
launcher-folder-opening-error = Không mở được thư mục Launcher
game-folder-opening-error = Không mở được thư mục trò chơi
config-file-opening-error = Không thể mở tệp cấu hình
debug-file-opening-error = Không thể mở tệp gỡ lỗi
wish-url-search-failed = Không tìm thấy url lịch sử Cầu Nguyện
wish-url-opening-error = Không thể mở url lịch sử Cầu Nguyện
wine-run-error = Không chạy được tệp thực thi {$executable} bằng Wine
game-launching-failed = Chạy trò chơi không thành công
failed-get-selected-wine = Không tải được phiên bản Wine đã chọn
downloading-failed = Tải xuống thất bại
unpacking-failed = Giải nén thất bại
kill-game-process-failed = Không thể tắt tiến trình trò chơi
game-file-repairing-error = Không thể sửa chữa tệp trò chơi
integrity-files-getting-error = Không thể tải tệp toàn vẹn
background-downloading-failed = Không thể tải xuống ảnh nền
components-index-sync-failed = Không thể đồng bộ chỉ mục thành phần
components-index-verify-failed = Không thể xác minh chỉ mục thành phần
config-update-error = Không thể lưu cấu hình
wine-prefix-update-failed = Không thể cập nhật tiền tố Wine
dxvk-install-failed = Không thể cài đặt DXVK
voice-package-deletion-error = Không thể xóa giọng nói
game-diff-finding-error = Không thể tìm thấy game diff
patch-info-fetching-error = Không thể tìm nạp thông tin bản vá
launcher-state-updating-error = Không thể cập nhật trạng thái Launcher
package-not-available = Gói không khả dụng: {$package}
wine-download-error = Không thể tải xuống Wine
wine-unpack-errror = Không thể giải nén Wine
wine-install-failed = Không thể cài đặt Wine
dxvk-download-error = Không thể tải xuống DXVK
dxvk-unpack-error = Không thể giải nén DXVK
dxvk-apply-error = Không thể áp dụng DXVK
downloaded-wine-list-failed = Không thể hiển thị các phiên bản Wine đã tải
patch-sync-failed = Không thể đồng bộ thư mục bản vá
patch-state-check-failed = Không thể kiểm tra trạng thái thư mục bản vá
game-patching-error = Không thể vá trò chơi
# Update main patch
main-patch-update-failed = Không thể tải bản vá mới nhất
# Disable telemetry
telemetry-servers-disabling-error = Không thể tắt telemetry servers
# Sandbox
documentation-url-open-failed = Không thể mở URL tài liệu
# Game
game-session-add-failed = Không thể thêm phiên trò chơi
game-session-update-failed = Không thể cập nhật phiên trò chơi
game-session-remove-failed = Không thể xóa phiên trò chơi
game-session-set-current-failed = Không thể đặt phiên trò chơi hiện tại
game-session-apply-failed = Không thể áp dụng phiên trò chơi
# Enhancements
discord-rpc-icons-fetch-failed = Không thể tìm nạp Biểu tượng Discord RPC
discord-rpc-icon-download-failed = Không thể tải xuống biểu tượng Discord RPC

View file

@ -0,0 +1,69 @@
welcome = Chào mừng
welcome-page-message =
Chào bạn! Chào mừng đến với Honkers Launcher (thằng dịch chơi Honkai)
Chúng tôi cần chuẩn bị một số thứ và tải xuống các thành phần mặc định trước khi bạn có thể chạy trò chơi
tos-violation-warning = Cảnh báo vi phạm TOS (Điều khoản dịch vụ)
tos-violation-warning-message =
Launcher này là một công cụ không chính thức, hoàn toàn không liên quan đến {company-name} hay {company-alter-name}.
Công cụ này được thiết kế để hỗ trợ việc chơi {game-name} trên Linux và được xây dựng với mục đích duy nhất là cài đặt và chạy trò chơi một cách dễ dàng hơn.
Nó làm được vậy bằng cách sử dụng các thành phần hiện có và làm cho trải nghiệm trở nên đơn giản hơn với người dùng.
Tuy nhiên, một số thành phần được sử dụng ở đây có khả năng vi phạm TOS của {company-name} dành cho {game-name}.
Nếu bạn đang sử dụng Launcher này, tài khoản của bạn có thể bị {company-name}/{company-alter-name} xác định là vi phạm TOS.
Nếu điều này xảy ra, vì tài khoản của bạn sẽ không tuân theo TOS, nên {company-name}/{company-alter-name} được tự do làm những gì họ muốn. Bao gồm cả việc khóa tài khoản
Nếu bạn hiểu những vấn đề khi thử chơi trò chơi bằng cách không chính thức, hãy nhấn OK để tiếp tục
tos-dialog-title = Bạn có chắc là bạn hiểu những gì chúng tôi muốn nói không ?
tos-dialog-message =
1. Không công khai bất kỳ thông tin nào về dự án này
2. Đừng lạm dụng nó bằng cách sử dụng mod clients, v.v.
3. Đặt câu hỏi nâng cao trong Discord hoặc Matrix
dependencies = Phụ thuộc
missing-dependencies-title = Bạn đang thiếu một số phụ thuộc!
missing-dependencies-message = Bạn phải cài đặt một số gói vào hệ thống của mình trước khi tiếp tục quá trình cài đặt
default-paths = Đường dẫn mặc định
choose-default-paths = Chọn đường dẫn mặc định
show-all-folders = Tôi biết mình đang làm gì
show-all-folders-subtitle = Hiển thị cài đặt lựa chọn đường dẫn bổ sung. Làm như tôi chỉ...
runners-folder = Runners folder
dxvks-folder = Thư mục DXVK
wine-prefix-folder = Thư mục tiền tố Wine
global-game-installation-folder = Thư mục cài đặt phiên bản Global
sea-game-installation-folder = Thư mục cài đặt phiên bản Đông Nam Á
chinese-game-installation-folder = Thư mục cài đặt phiên bản Trung Quốc
taiwanese-game-installation-folder = Thư mục cài đặt phiên bản Đài Loan
korean-game-installation-folder = Thư mục cài đặt phiên bản Hàn Quốc
japanese-game-installation-folder = Thư mục cài đặt phiên bản Nhật Bản
fps-unlocker-folder = Thư mục FPS Unlocker
components-index = Chỉ mục thành phần
patch-folder = Thư mục bản vá
temp-folder = Thư mục tạm thời
migrate = Di chuyển
select-voice-packages = Chọn giọng nói
download-components = Tải xuống các thành phần
download-dxvk = Tải xuống DXVK
apply-dxvk = Áp dụng DXVK
finish = Kết thúc
finish-title = Mọi thứ đã xong!
finish-message = Tất cả các thành phần cơ bản đã được tải xuống. Bây giờ bạn có thể khởi động lại Launcher và tải xuống trò chơi. Chào mừng đến với câu lạc bộ của chúng tôi!

View file

@ -0,0 +1,7 @@
game-sessions = Phiên trò chơi
active-sessions = Phiên hoạt động
active-session-description = Phiên trò chơi hiện được chọn. Cập nhật sau mỗi lần chạy trò chơi
update-session = Cập nhật phiên sử dụng các giá trị sử dụng tiền tố Wine hiện tại
delete-session = Xóa phiên

View file

@ -0,0 +1,13 @@
game-resolution = Độ phân giải trò chơi
gamescope-resolution = Độ phân giải của gamescope
upscaling = Nâng độ phận giải
integer-scaling = Tỉ lệ nâng
integer-scaling-description = Biến mỗi pixel thành một nhóm hình vuông hoặc hình chữ nhật có pixel cùng màu. Ngăn mất độ sắc nét khi mở rộng Full HD thành 4K
gamescope-fsr-description = Một kỹ thuật nâng cấp mã nguồn mở do AMD phát triển
nis-description = Một kỹ thuật nâng cấp mã nguồn mở do Nvidia phát triển dưới dạng một giải pháp thay thế chi phí thấp của nhà cung cấp chéo cho giải pháp DLSS độc quyền của họ, nghĩa là nó hoạt động trên GPU AMD và Intel cũng như GPU Nvidia
other-settings = Cài đặt khác
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

View file

@ -0,0 +1,77 @@
appearance = Ngoại hình
modern = Hiện đại
classic = Cổ điển
update-background = Cập nhật ảnh nền
update-background-description = Tải xuống ảnh nền chính thức cho Launcher. Nhưng bạn cũng có thể tắt nó để sử dụng hình ảnh của mình
launcher-language = Ngôn ngữ Launcher
launcher-language-description = Áp dụng sau khi khởi động lại
game-edition = Phiên bản trò chơi
global = Global
sea = Đông Nam Á
china = Trung Quốc
taiwan = Đài Loan
korea = Hàn Quốc
japan = Nhật Bản
game-environment = Môi trường trò chơi
game-environment-description = Nhận các tính năng cụ thể như phương thức thanh toán bổ sung
game-voiceovers = Giọng nói trò chơi
game-voiceovers-description = Danh sách giọng nói đã tải xuống. Bạn có thể chọn chúng trong cài đặt trò chơi
english = Tiếng Anh
japanese = Tiếng Nhật
korean = Tiếng Hàn
chinese = Tiếng Trung
migrate-installation = Di chuyển nơi cài đặt
migrate-installation-description = Mở cửa sổ đặc biệt nơi bạn có thể thay đổi thư mục cài đặt trò chơi của mình
repair-game = Sửa chữa
status = Trạng thái
game-version = Phiên bản trò chơi
game-not-installed = chưa cài đặt
game-predownload-available = Tải xuống trước bản cập nhật trò chơi: {$old} -> {$new}
game-update-available = Đã có bản cập nhật trò chơi: {$old} -> {$new}
game-outdated = Trò chơi đã quá lỗi thời và không thể cập nhật. Phiên bản mới nhất: {$latest}
player-patch-version = Phiên bản vá của người chơi
player-patch-version-description = Bản vá chính cho phép bạn chơi trò chơi trên Linux
mfplat-patch-version = Bản vá Mfplat
mfplat-patch-version-description = Bản vá bổ sung có thể khắc phục sự cố phát video
applied = áp dụng
not-applied = không áp dụng
patch-not-available = không có sẵn
patch-not-available-tooltip = Máy chủ bản vá không thể truy cập
patch-outdated = lỗi thời ({$current})
patch-outdated-tooltip = Bản vá lỗi thời: {$current} -> {$latest}
patch-preparation = chuẩn bị
patch-preparation-tooltip = Bản vá đang được phát triển
patch-testing-tooltip = Đã có bản vá thử nghiệm
patch-not-applied-tooltip = Bản vá không được áp dụng
patch-broken-tooltip = Bản vá hiện tại bị hỏng và không hoạt động bình thường
patch-unsafe-tooltip = Bản vá hiện tại không an toàn và không nên sử dụng
apply-mfplat-patch = Áp dụng bản vá mfplat
ask-superuser-permissions = Hỏi quyền admin
ask-superuser-permissions-description = Launcher sẽ sử dụng chúng để tự động cập nhật tệp máy chủ của bạn, không cần thiết trong phiên bản Flatpak
launcher-behavior = Hành vi của Launcher
launcher-behavior-description = Cửa sổ Launcher nên làm gì khi bắt đầu trò chơi
wine-tools = Công cụ Wine
command-line = Dòng lệnh
registry-editor = Chỉnh sửa Registry
explorer = Duyệt thư mục
task-manager = Trình quản lý tác vụ
configuration = Cấu hình
debugger = Trình gỡ lỗi

View file

@ -0,0 +1,79 @@
custom = Tùy chỉnh
none = Không có
default = Mặc định
details = Chi tiết
options = Tùy chọn
width = Chiều rộng
height = Chiều cao
# Menu items
launcher-folder = Thư mục Launcher
game-folder = Thư mục trò chơi
config-file = Tệp cấu hình
debug-file = Tệp gỡ lỗi
wish-url = Lịch sử Cầu Nguyện
about = Về chúng tôi
close = Đóng
hide = Ẩn
nothing = Không có gì
save = Lưu
continue = Tiếp tục
resume = Tạm dừng
exit = Thoát
check = Kiểm tra
restart = Khởi động lại
agree = Đồng ý
loading-data = Đang tải dữ liệu
downloading-background-picture = Đang tải ảnh nền xuống
updating-components-index = Đang cập nhật chỉ mục thành phần
loading-game-version = Đang tải phiên bản trò chơi
loading-patch-status = Đang tải trạng thái bản vá
loading-launcher-state = Đang tải trạng thái Launcher
loading-launcher-state--game = Đang tải trạng thái Launcher: xác minh phiên bản trò chơi
loading-launcher-state--voice = Đang tải trạng thái Launcher: xác minh giọng nói {$locale}
loading-launcher-state--patch = Đang tải trạng thái launcher: xác minh bản vá đã cài đặt
checking-free-space = Kiểm tra dung lượng trống
downloading = Đang tải xuống
unpacking = Đang giải nén
verifying-files = Đang xác minh tập tin
repairing-files = Sửa chữa tập tin
migrating-folders = Di chuyển thư mục
applying-hdiff = Áp dụng các bản vá lỗi hdiff
removing-outdated = Xóa các tập tin lỗi thời
components-index-updated = Chỉ mục thành phần đã được cập nhật
launch = Khởi chạy
migrate-folders = Di chuyển các thư mục
migrate-folders-tooltip = Cập nhật cấu trúc thư mục trò chơi
apply-patch = Áp dụng bản vá
disable-telemetry = Vô hiệu hóa telemetry
download-wine = Tải xuống Wine
create-prefix = Tạo tiền tố
update = Cập nhật
download = Tải xuống
predownload-update = Tải xuống trước {$version} cập nhật ({$size})
download-patch = Tải xuống bản vá
patch-broken = Bản vá bị hỏng
patch-unsafe = Bản vá không an toàn
kill-game-process = Buộc đóng tiến trình trò chơi
main-window--patch-unavailable-tooltip = Máy chủ vá không khả dụng và Launcher không thể xác minh trạng thái vá. Bạn có thể chơi trò chơi nhưng rất không an toàn
main-window--patch-outdated-tooltip = Bản vá đã lỗi thời hoặc đang ở trạng thái chuẩn bị nên không thể sử dụng. Quay lại sau để xem trạng thái
main-window--version-outdated-tooltip = Phiên bản quá lỗi thời và không thể cập nhật
preferences = Sở thích
general = Tổng quát
enhancements = Cải tiến

View file

@ -0,0 +1,28 @@
sandbox = Sandbox
sandbox-description = Chạy trò chơi trong môi trường biệt lập, ngăn trò chơi truy cập dữ liệu cá nhân của bạn
enable-sandboxing = Kích hoạt Sandbox
enable-sandboxing-description = Chạy trò chơi trong bản sao chỉ đọc của hệ thống tập tin root của bạn
hide-home-directory = Ẩn thư mục home
hide-home-directory-description = Cô lập các thư mục /home, /var/home/$USER và $HOME của bạn khỏi trò chơi
hostname = Tên máy chủ
additional-arguments = Đối số bổ sung
private-directories = Các thư mục riêng tư
private-directories-description = Các thư mục này sẽ được thay thế bằng một hệ thống tệp ảo trống (tmpfs) và nội dung ban đầu của chúng sẽ không có sẵn cho Sandbox
path = Đường dẫn
shared-directories = Thư mục dùng chung
shared-directories-description = Các thư mục này sẽ được liên kết với các thư mục trong hệ thống máy chủ của bạn
original-path = Đường dẫn ban đầu
new-path = Đường dẫn mới
read-only = Chỉ đọc
read-only-description = Chặn trò chơi ghi bất kỳ dữ liệu nào vào thư mục này
symlinks = Liên kết tượng trưng
symlinks-description = Đường dẫn ban đầu của liên kết đến đường dẫn mới bên trong sandbox

View file

@ -12,9 +12,9 @@ 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 环境变量,从选中的 Wine 版本加载 gstreamer 库
gstreamer-use-shared-libraries = 使用 GStreamer 共享库
gstreamer-use-shared-libraries-description = 设置 GST_PLUGIN_PATH 环境变量,从选中的 Wine 版本加载 GStreamer 库
dxvk-version = DXVK 版本
dxvk-selection-disabled = 您的葡萄酒组首选项禁用 DXVK 选择
dxvk-selection-disabled = 您的 Wine 首选项禁用 DXVK 选择
dxvk-recommended-description = 仅显示推荐的 DXVK 版本

View file

@ -14,11 +14,11 @@ system = 系统
borderless-window = 无边框窗口
virtual-desktop = 虚拟桌面
map-drive-c = Map drive C:
map-drive-c-description = Automatically symlink drive_c folder from the wine prefix to the dosdevices
map-drive-c = 映射 C 盘
map-drive-c-description = 自动将 Wine prefix 里的 drive_c 文件夹符号链接至 Wine 的 dosdevices 目录里
map-game-folder = Map game folder
map-game-folder-description = Automatically symlink game folder to the dosdevices
map-game-folder = 映射游戏文件夹
map-game-folder-description = 自动将游戏文件夹映射到 Wine 的 dosdevices 目录里
game = 游戏
@ -39,7 +39,7 @@ gamescope-description = Gamescope 是 Valve 开发的工具,可以让游戏运
discord-rpc = Discord RPC
discord-rpc-description = Discord RPC 可以设置 Discord 状态,让你的好友知道你正在玩游戏
icon = Icon
icon = 图标
title = 标题
description = 描述

View file

@ -6,14 +6,14 @@ debug-file-opening-error = 打开调试文件失败
wish-url-search-failed = 找不到祈愿 URL
wish-url-opening-error = 无法转到祈愿 URL
wine-run-error = 使用 wine 运行 {$executable} 失败
wine-run-error = 使用 Wine 运行 {$executable} 失败
game-launching-failed = 启动游戏失败
failed-get-selected-wine = 选择 Wine 版本失败
downloading-failed = 下载失败
unpacking-failed = 解压缩失败
kill-game-process-failed = Failed to kill the game's process
kill-game-process-failed = 中止游戏进程失败
game-file-repairing-error = 修复游戏文件失败
integrity-files-getting-error = 获取一致性文件失败
@ -22,7 +22,7 @@ background-downloading-failed = 下载背景图片失败
components-index-sync-failed = 同步组件索引失败
components-index-verify-failed = 验证组件索引失败
config-update-error = 保存配置失败
wine-prefix-update-failed = 更新 Wine prefix 失败
wine-prefix-update-failed = 更新 Wine Prefix 失败
dxvk-install-failed = 安装 DXVK 失败
voice-package-deletion-error = 删除语音包失败
@ -50,7 +50,7 @@ main-patch-update-failed = 下载最新补丁版本失败
# Disable telemetry
telemetry-servers-disabling-error = 禁用监测服务器
telemetry-servers-disabling-error = 监测服务器禁用失败
# Sandbox

View file

@ -57,8 +57,8 @@ apply-main-patch-description = 实验性功能。禁用此选项可以允许在
ask-superuser-permissions = 请求超级用户权限
ask-superuser-permissions-description = 启动器需要超级用户权限来修改 hosts 文件。Flatpak 版无需此权限
launcher-behavior = Launcher behavior
launcher-behavior-description = What should launcher window do when it starts the game
launcher-behavior = 启动器行为
launcher-behavior-description = 设定游戏开始后启动器的行为
wine-tools = Wine 工具
command-line = 命令行

View file

@ -18,8 +18,8 @@ about = 关于
close = 关闭
hide = Hide
nothing = Nothing
hide = 隐藏
nothing = 不变
save = 保存
continue = 继续
resume = 恢复
@ -68,7 +68,7 @@ download-patch = 下载补丁
patch-broken = 补丁已损坏
patch-unsafe = 补丁不安全
kill-game-process = Kill game process
kill-game-process = 中止游戏进程
main-window--patch-unavailable-tooltip = 补丁服务器不可用,启动器无法验证游戏补丁状态。你可以运行游戏,但是有出问题的风险
main-window--patch-outdated-tooltip = 补丁版本太旧,新版补丁可能还没制作完成,无法使用。请过段时间再回来查看最新状态

View file

@ -168,7 +168,7 @@ if command == "unused":
output += f"[en/{all_entries[i][0]}]\n [Unused]\n"
output += f" {all_entries[i][1]} | {i} = {every_variable[i].strip()}\n"
output = re.sub("\[en", "\n[en", output)
output = re.sub("\\[en", "\n[en", output)
if not output:
print("Nothing is unused")
@ -187,7 +187,7 @@ elif command == "missing":
output += f"[{missing_entries[i]}]\n [Missing]\n"
output += f" {script_entries[i][1]} | {i}\n"
output = re.sub("\[src/", "\n[src/", output)
output = re.sub("\\[src/", "\n[src/", output)
if not output:
print("Nothing is missing")
sys.exit()

View file

@ -20,10 +20,13 @@ pub const SUPPORTED_LANGUAGES: &[LanguageIdentifier] = &[
langid!("id-id"),
langid!("zh-cn"),
langid!("ja-jp"),
langid!("ko-kr"),
langid!("hu-hu"),
langid!("sv-se"),
langid!("pt-br"),
langid!("pl-pl")
langid!("pl-pl"),
langid!("vi-vn"),
langid!("nl-nl")
];
pub static mut LANG: LanguageIdentifier = langid!("en-us");

View file

@ -98,10 +98,10 @@ fn main() -> anyhow::Result<()> {
// Run the game
let mut run_game = false;
// Forcely run the game
// Force run the game
let mut just_run_game = false;
// Forcely disable verbode tracing output in stdout
// Force disable verbose tracing output in stdout
let mut no_verbose_tracing = false;
let args = std::env::args().collect::<Vec<_>>();

View file

@ -70,16 +70,19 @@ impl SimpleComponent for AboutDialog {
"Deutsch — @caem",
"Français — @zeGolem https://github.com/zeGolem",
"Español — Lautaro Garavano https://github.com/Rattlehead15",
"Português — @kafushy",
"Italiano — @QuazarOmega https://github.com/quazar-omega",
"Türkçe — @Kaozix https://github.com/Kaozix1776",
"Türkçe — Kayra Nachfolger https://github.com/kayranachfolger",
"Italiano — @QuazarOmega https://github.com/quazar-omega",
"Indonesia — @yumekarisu https://github.com/yumekarisu",
"简体中文 — Caibin Chen https://github.com/tigersoldier",
"日本語 — @zozonteq https://github.com/zozonteq",
"Polski — Dominik Opyd https://github.com/oritwoen",
// Hungarian?
"Svenska — Jakob Fridesjö https://github.com/jakobfridesjo",
"Português — @kafushy",
"Polski — Dominik Opyd https://github.com/oritwoen"
"Nederlands — @everlyy https://github.com/everlyy",
"简体中文 — Caibin Chen https://github.com/tigersoldier",
"日本語 — @zozonteq https://github.com/zozonteq",
"한국어 — @project-dy https://github.com/project-dy",
"Indonesia — @yumekarisu https://github.com/yumekarisu",
"Tiếng Việt — Nguyễn Hữu Chánh https://github.com/Chanhnh"
].join("\n"),
set_debug_info: &[
@ -97,28 +100,20 @@ impl SimpleComponent for AboutDialog {
"<p>Added</p>",
"<ul>",
"<li>Added feature to map wine drives</li>",
"<li>Added `%launch_args%` magic word for game launching command</li>",
"<li>Added `--session <name>` flag to switch active session</li>",
"<li>Added Portuguese</li>",
"<li>Added Polish</li>",
"</ul>",
"<p>Fixed</p>",
"<ul>",
"<li>Fixed logo size in the first run window</li>",
"<li>Added Vietnamese</li>",
"<li>Added Korean</li>",
"<li>Added Dutch</li>",
"<li>Made free space checks resolve symlinks</li>",
"<li>Added voiceovers support</li>",
"<li>Added new *Concerning* patch status</li>",
"</ul>",
"<p>Changed</p>",
"<ul>",
"<li>Updated Turkish</li>",
"<li>Updated Italian</li>",
"<li>Updated development libraries versions</li>",
"<li>Updated Japanese</li>",
"<li>Updated Swedish</li>",
"<li>Improved files migration code</li>",
"<li>Updated wishes url extractor to use new cache storage</li>",
"<li>Updated Chinese</li>",
"</ul>",
].join("\n"),
@ -131,7 +126,7 @@ impl SimpleComponent for AboutDialog {
connect_close_request[sender] => move |_| {
sender.input(AboutDialogMsg::Hide);
gtk::Inhibit(false)
gtk::glib::Propagation::Proceed
}
}
}

View file

@ -1,8 +1,6 @@
use std::path::PathBuf;
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use super::ComponentsListMsg;

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use super::ComponentGroupMsg;

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use anime_launcher_sdk::anime_game_core::prelude::*;

View file

@ -1,7 +1,6 @@
use std::path::PathBuf;
use relm4::prelude::*;
use relm4::component::*;
use gtk::prelude::*;
use adw::prelude::*;

View file

@ -1,8 +1,6 @@
use std::path::PathBuf;
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use crate::*;
@ -79,13 +77,16 @@ impl SimpleAsyncComponent for DefaultPathsApp {
adw::ActionRow {
set_title: &tr!("launcher-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.launcher.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Launcher)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Launcher),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
},
@ -117,90 +118,114 @@ impl SimpleAsyncComponent for DefaultPathsApp {
adw::ActionRow {
set_title: &tr!("runners-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.runners.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Runners)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Runners),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("dxvks-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.dxvks.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::DXVK)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::DXVK),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("wine-prefix-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.prefix.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Prefix)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Prefix),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("global-game-installation-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.game_global.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::GameGlobal)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::GameGlobal),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("chinese-game-installation-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.game_china.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::GameChina)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::GameChina),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("components-index"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.components.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Components)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Components),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("patch-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.patch.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Patch)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Patch),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
adw::ActionRow {
set_title: &tr!("temp-folder"),
set_icon_name: Some("folder-symbolic"),
set_activatable: true,
#[watch]
set_subtitle: model.temp.to_str().unwrap(),
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Temp)
connect_activated => DefaultPathsAppMsg::ChoosePath(Folders::Temp),
add_prefix = &gtk::Image {
set_icon_name: Some("folder-symbolic")
}
},
},

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use anime_launcher_sdk::is_available;
@ -69,7 +67,7 @@ impl SimpleAsyncComponent for DependenciesApp {
},
gtk::Entry {
set_text: "sudo pacman -Syu git xdelta3",
set_text: "sudo pacman -Syu git xdelta3 p7zip",
set_editable: false
}
},
@ -86,7 +84,7 @@ impl SimpleAsyncComponent for DependenciesApp {
},
gtk::Entry {
set_text: "sudo apt install git xdelta3",
set_text: "sudo apt install git xdelta3 p7zip-full",
set_editable: false
}
},
@ -103,7 +101,7 @@ impl SimpleAsyncComponent for DependenciesApp {
},
gtk::Entry {
set_text: "sudo dnf install git xdelta",
set_text: "sudo dnf install git xdelta p7zip",
set_editable: false
}
}
@ -185,6 +183,18 @@ impl SimpleAsyncComponent for DependenciesApp {
}
}
// 7z sometimes has different binaries
if !is_available("7z") && !is_available("7za") {
sender.output(Self::Output::Toast {
title: tr!("package-not-available", {
"package" = "7z"
}),
description: None
});
return;
}
sender.output(Self::Output::ScrollToDefaultPaths);
}

View file

@ -1,8 +1,6 @@
use std::path::PathBuf;
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use anime_launcher_sdk::anime_game_core::prelude::*;
@ -163,11 +161,13 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
#[watch]
set_subtitle: &model.downloading_wine_version,
#[watch]
set_icon_name: match model.downloading_wine {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
add_prefix = &gtk::Image {
#[watch]
set_icon_name: match model.downloading_wine {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
}
},
add_prefix = &gtk::Spinner {
@ -184,11 +184,13 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
#[watch]
set_subtitle: &model.creating_prefix_path,
#[watch]
set_icon_name: match model.creating_prefix {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
add_prefix = &gtk::Image {
#[watch]
set_icon_name: match model.creating_prefix {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
}
},
add_prefix = &gtk::Spinner {
@ -205,11 +207,13 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
#[watch]
set_subtitle: &model.downloading_dxvk_version,
#[watch]
set_icon_name: match model.downloading_dxvk {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
add_prefix = &gtk::Image {
#[watch]
set_icon_name: match model.downloading_dxvk {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
}
},
add_prefix = &gtk::Spinner {
@ -223,11 +227,13 @@ impl SimpleAsyncComponent for DownloadComponentsApp {
adw::ActionRow {
set_title: &tr!("apply-dxvk"),
#[watch]
set_icon_name: match model.applying_dxvk {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
add_prefix = &gtk::Image {
#[watch]
set_icon_name: match model.applying_dxvk {
Some(true) => Some("emblem-ok-symbolic"),
Some(false) => None, // Some("process-working"),
None => None
}
},
add_prefix = &gtk::Spinner {

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use crate::*;

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use gtk::prelude::*;
use adw::prelude::*;

View file

@ -0,0 +1,178 @@
use relm4::prelude::*;
use adw::prelude::*;
use anime_launcher_sdk::config::ConfigExt;
use anime_launcher_sdk::genshin::config::Config;
use crate::*;
use super::main::*;
pub struct SelectVoiceoversApp {
english: gtk::Switch,
japanese: gtk::Switch,
korean: gtk::Switch,
chinese: gtk::Switch
}
#[derive(Debug, Clone)]
pub enum SelectVoiceoversAppMsg {
Continue,
Exit
}
#[relm4::component(async, pub)]
impl SimpleAsyncComponent for SelectVoiceoversApp {
type Init = ();
type Input = SelectVoiceoversAppMsg;
type Output = FirstRunAppMsg;
view! {
adw::PreferencesPage {
set_hexpand: true,
add = &adw::PreferencesGroup {
set_valign: gtk::Align::Center,
set_vexpand: true,
gtk::Label {
set_label: &tr!("select-voice-packages"),
add_css_class: "title-1"
}
},
add = &adw::PreferencesGroup {
set_valign: gtk::Align::Center,
set_vexpand: true,
adw::ActionRow {
set_title: &tr!("english"),
#[local_ref]
add_suffix = english -> gtk::Switch {
set_valign: gtk::Align::Center,
set_state: true
}
},
adw::ActionRow {
set_title: &tr!("japanese"),
#[local_ref]
add_suffix = japanese -> gtk::Switch {
set_valign: gtk::Align::Center
}
},
adw::ActionRow {
set_title: &tr!("korean"),
#[local_ref]
add_suffix = korean -> gtk::Switch {
set_valign: gtk::Align::Center
}
},
adw::ActionRow {
set_title: &tr!("chinese"),
#[local_ref]
add_suffix = chinese -> gtk::Switch {
set_valign: gtk::Align::Center
}
}
},
add = &adw::PreferencesGroup {
set_valign: gtk::Align::Center,
set_vexpand: true,
gtk::Box {
set_orientation: gtk::Orientation::Horizontal,
set_halign: gtk::Align::Center,
set_spacing: 8,
gtk::Button {
set_label: &tr!("continue"),
set_css_classes: &["suggested-action", "pill"],
connect_clicked => SelectVoiceoversAppMsg::Continue
},
gtk::Button {
set_label: &tr!("exit"),
add_css_class: "pill",
connect_clicked => SelectVoiceoversAppMsg::Exit
}
}
}
}
}
async fn init(
_init: Self::Init,
root: Self::Root,
_sender: AsyncComponentSender<Self>,
) -> AsyncComponentParts<Self> {
let model = Self {
english: gtk::Switch::new(),
japanese: gtk::Switch::new(),
korean: gtk::Switch::new(),
chinese: gtk::Switch::new()
};
let english = &model.english;
let japanese = &model.japanese;
let korean = &model.korean;
let chinese = &model.chinese;
let widgets = view_output!();
AsyncComponentParts { model, widgets }
}
async fn update(&mut self, msg: Self::Input, sender: AsyncComponentSender<Self>) {
match msg {
#[allow(unused_must_use)]
SelectVoiceoversAppMsg::Continue => {
match self.update_config() {
Ok(_) => sender.output(Self::Output::ScrollToDownloadComponents),
Err(err) => sender.output(Self::Output::Toast {
title: tr!("config-update-error"),
description: Some(err.to_string())
})
};
}
SelectVoiceoversAppMsg::Exit => relm4::main_application().quit()
}
}
}
impl SelectVoiceoversApp {
pub fn update_config(&self) -> anyhow::Result<()> {
let mut config = Config::get()?;
config.game.voices = Vec::new();
if self.english.state() {
config.game.voices.push(String::from("en-us"));
}
if self.japanese.state() {
config.game.voices.push(String::from("ja-jp"));
}
if self.korean.state() {
config.game.voices.push(String::from("ko-kr"));
}
if self.chinese.state() {
config.game.voices.push(String::from("zh-cn"));
}
Config::update_raw(config)
}
}

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use anime_launcher_sdk::is_available;
@ -116,7 +114,7 @@ impl SimpleAsyncComponent for TosWarningApp {
}
});
dialog.show();
dialog.present();
}
TosWarningAppMsg::Exit => relm4::main_application().quit()

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use crate::*;

View file

@ -1,6 +1,5 @@
use relm4::{
prelude::*,
component::*,
actions::*,
MessageBroker
};
@ -304,12 +303,21 @@ impl SimpleComponent for App {
#[watch]
set_tooltip_text: Some(&tr!("predownload-update", {
"version" = match model.state.as_ref() {
Some(LauncherState::PredownloadAvailable { diff, .. }) => diff.latest().to_string(),
Some(LauncherState::PredownloadAvailable { game, .. }) => game.latest().to_string(),
_ => String::from("?")
},
"size" = match model.state.as_ref() {
Some(LauncherState::PredownloadAvailable { diff, .. }) => prettify_bytes(diff.downloaded_size().unwrap_or(0)),
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
let mut size = game.downloaded_size().unwrap_or(0);
for voice in voices {
size += voice.downloaded_size().unwrap_or(0);
}
prettify_bytes(size)
}
_ => String::from("?")
}
})),
@ -319,13 +327,27 @@ impl SimpleComponent for App {
#[watch]
set_sensitive: match model.state.as_ref() {
Some(LauncherState::PredownloadAvailable { diff, .. }) => {
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
let config = Config::get().unwrap();
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
!temp.join(diff.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == diff.downloaded_size())
.unwrap_or(false)
let mut downloaded = temp.join(game.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == game.downloaded_size())
.unwrap_or(false);
if downloaded {
for voice in voices {
downloaded = !temp.join(voice.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == voice.downloaded_size())
.unwrap_or(false);
if downloaded {
break;
}
}
}
!downloaded
}
_ => false
@ -333,14 +355,26 @@ impl SimpleComponent for App {
#[watch]
set_css_classes: match model.state.as_ref() {
Some(LauncherState::PredownloadAvailable { diff, .. }) => {
Some(LauncherState::PredownloadAvailable { game, voices, .. }) => {
let config = Config::get().unwrap();
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
let downloaded = temp.join(diff.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == diff.downloaded_size())
let mut downloaded = temp.join(game.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == game.downloaded_size())
.unwrap_or(false);
if downloaded {
for voice in voices {
downloaded = !temp.join(voice.file_name().unwrap()).metadata()
.map(|metadata| Some(metadata.len()) == voice.downloaded_size())
.unwrap_or(false);
if downloaded {
break;
}
}
}
if downloaded {
&["success", "circular"]
} else {
@ -370,8 +404,10 @@ impl SimpleComponent for App {
set_icon_name: match &model.state {
Some(LauncherState::Launch) |
Some(LauncherState::PatchNotVerified) |
Some(LauncherState::PatchConcerning) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. })
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
=> "media-playback-start-symbolic",
Some(LauncherState::PatchNotInstalled) |
@ -383,9 +419,12 @@ impl SimpleComponent for App {
Some(LauncherState::PrefixNotExists) => "document-save-symbolic",
Some(LauncherState::GameUpdateAvailable(_)) |
Some(LauncherState::GameNotInstalled(_)) => "document-save-symbolic",
Some(LauncherState::GameNotInstalled(_)) |
Some(LauncherState::VoiceUpdateAvailable(_)) |
Some(LauncherState::VoiceNotInstalled(_)) => "document-save-symbolic",
Some(LauncherState::GameOutdated(_)) |
Some(LauncherState::VoiceOutdated(_)) |
Some(LauncherState::PatchBroken) |
Some(LauncherState::PatchUnsafe) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
@ -397,8 +436,10 @@ impl SimpleComponent for App {
set_label: &match &model.state {
Some(LauncherState::Launch) |
Some(LauncherState::PatchNotVerified) |
Some(LauncherState::PatchConcerning) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. })
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
=> tr!("launch"),
Some(LauncherState::PatchNotInstalled) |
@ -418,7 +459,9 @@ impl SimpleComponent for App {
Some(LauncherState::PrefixNotExists) => tr!("create-prefix"),
Some(LauncherState::GameUpdateAvailable(diff)) |
Some(LauncherState::GameOutdated(diff)) => {
Some(LauncherState::GameOutdated(diff)) |
Some(LauncherState::VoiceUpdateAvailable(diff)) |
Some(LauncherState::VoiceOutdated(diff)) => {
match (Config::get(), diff.file_name()) {
(Ok(config), Some(filename)) => {
let temp = config.launcher.temp.unwrap_or_else(std::env::temp_dir);
@ -436,7 +479,8 @@ impl SimpleComponent for App {
}
},
Some(LauncherState::GameNotInstalled(_)) => tr!("download"),
Some(LauncherState::GameNotInstalled(_)) |
Some(LauncherState::VoiceNotInstalled(_)) => tr!("download"),
None => String::from("...")
}
@ -445,6 +489,7 @@ impl SimpleComponent for App {
#[watch]
set_sensitive: !model.disabled_buttons && match &model.state {
Some(LauncherState::GameOutdated { .. }) |
Some(LauncherState::VoiceOutdated(_)) |
Some(LauncherState::PatchBroken) |
Some(LauncherState::PatchUnsafe) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
@ -457,12 +502,15 @@ impl SimpleComponent for App {
#[watch]
set_css_classes: match &model.state {
Some(LauncherState::GameOutdated { .. }) |
Some(LauncherState::VoiceOutdated(_)) |
Some(LauncherState::PatchNotVerified) => &["warning", "pill"],
Some(LauncherState::PatchBroken) |
Some(LauncherState::PatchUnsafe) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) => &["error", "pill"],
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
=> &["error", "pill"],
Some(_) => &["suggested-action", "pill"],
None => &["pill"]
@ -470,7 +518,8 @@ impl SimpleComponent for App {
#[watch]
set_tooltip_text: Some(&match &model.state {
Some(LauncherState::GameOutdated { .. }) => tr!("main-window--version-outdated-tooltip"),
Some(LauncherState::GameOutdated { .. }) |
Some(LauncherState::VoiceOutdated(_)) => tr!("main-window--version-outdated-tooltip"),
Some(LauncherState::PatchNotVerified) => tr!("patch-testing-tooltip"),
@ -478,8 +527,12 @@ impl SimpleComponent for App {
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Broken, .. })
=> tr!("patch-broken-tooltip"),
// TODO: a special tooltip for concerning patch state
Some(LauncherState::PatchUnsafe) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. })
Some(LauncherState::PatchConcerning) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unsafe, .. }) |
Some(LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. })
=> tr!("patch-unsafe-tooltip"),
_ => String::new()
@ -609,7 +662,7 @@ impl SimpleComponent for App {
});
}
gtk::Inhibit::default()
gtk::glib::Propagation::Proceed
}
}
}
@ -966,6 +1019,12 @@ impl SimpleComponent for App {
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--game")))));
}
StateUpdating::Voice(locale) => {
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--voice", {
"locale" = locale.to_name()
})))));
}
StateUpdating::Patch => {
sender.input(AppMsg::SetLoadingStatus(Some(Some(tr!("loading-launcher-state--patch")))));
}
@ -1048,7 +1107,7 @@ impl SimpleComponent for App {
#[allow(unused_must_use)]
AppMsg::PredownloadUpdate => {
if let Some(LauncherState::PredownloadAvailable { mut diff, .. }) = self.state.clone() {
if let Some(LauncherState::PredownloadAvailable { game, mut voices, .. }) = self.state.clone() {
let tmp = Config::get().unwrap().launcher.temp.unwrap_or_else(std::env::temp_dir);
self.downloading = true;
@ -1057,18 +1116,26 @@ impl SimpleComponent for App {
progress_bar_input.send(ProgressBarMsg::UpdateCaption(Some(tr!("downloading"))));
let mut diffs: Vec<VersionDiff> = vec![game];
diffs.append(&mut voices);
std::thread::spawn(move || {
let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| {
progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total));
}));
for mut diff in diffs {
let result = diff.download_to(&tmp, clone!(@strong progress_bar_input => move |curr, total| {
progress_bar_input.send(ProgressBarMsg::UpdateProgress(curr, total));
}));
if let Err(err) = result {
sender.input(AppMsg::Toast {
title: tr!("downloading-failed"),
description: Some(err.to_string())
});
if let Err(err) = result {
sender.input(AppMsg::Toast {
title: tr!("downloading-failed"),
description: Some(err.to_string())
});
tracing::error!("Failed to predownload update: {err}");
tracing::error!("Failed to predownload update: {err}");
break;
}
}
sender.input(AppMsg::SetDownloading(false));
@ -1083,8 +1150,10 @@ impl SimpleComponent for App {
AppMsg::PerformAction => unsafe {
match self.state.as_ref().unwrap_unchecked() {
LauncherState::PatchNotVerified |
LauncherState::PatchConcerning |
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Verified, .. } |
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Unverified, .. } |
LauncherState::PredownloadAvailable { patch: JadeitePatchStatusVariant::Concerning, .. } |
LauncherState::Launch => launch::launch(sender),
LauncherState::PatchNotInstalled |
@ -1096,7 +1165,9 @@ impl SimpleComponent for App {
LauncherState::PrefixNotExists => create_prefix::create_prefix(sender),
LauncherState::GameUpdateAvailable(diff) |
LauncherState::GameNotInstalled(diff) =>
LauncherState::GameNotInstalled(diff) |
LauncherState::VoiceUpdateAvailable(diff) |
LauncherState::VoiceNotInstalled(diff) =>
download_diff::download_diff(sender, self.progress_bar.sender().to_owned(), diff.to_owned()),
_ => ()

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use gtk::prelude::*;
use crate::tr;

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use relm4::factory::*;
use adw::prelude::*;
@ -20,7 +19,6 @@ impl AsyncFactoryComponent for Variable {
type Input = EnvironmentPageMsg;
type Output = EnvironmentPageMsg;
type CommandOutput = ();
type ParentInput = EnvironmentPageMsg;
type ParentWidget = adw::PreferencesGroup;
view! {
@ -34,7 +32,8 @@ impl AsyncFactoryComponent for Variable {
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.output(EnvironmentPageMsg::Remove(index.clone()));
sender.output(EnvironmentPageMsg::Remove(index.clone()))
.unwrap();
}
}
}
@ -50,10 +49,6 @@ impl AsyncFactoryComponent for Variable {
value: init.1
}
}
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
Some(output)
}
}
pub struct EnvironmentPage {
@ -164,7 +159,9 @@ impl SimpleAsyncComponent for EnvironmentPage {
tracing::info!("Initializing environment settings");
let mut model = Self {
variables: AsyncFactoryVecDeque::new(adw::PreferencesGroup::new(), sender.input_sender()),
variables: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
name_entry: adw::EntryRow::new(),
value_entry: adw::EntryRow::new()

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use relm4::factory::*;
use adw::prelude::*;
@ -24,7 +23,6 @@ impl AsyncFactoryComponent for GameSession {
type Input = GamePageMsg;
type Output = GamePageMsg;
type CommandOutput = ();
type ParentInput = GamePageMsg;
type ParentWidget = adw::PreferencesGroup;
view! {
@ -48,7 +46,8 @@ impl AsyncFactoryComponent for GameSession {
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.output(GamePageMsg::UpdateSession(index.current_index()));
sender.output(GamePageMsg::UpdateSession(index.current_index()))
.unwrap();
}
},
@ -61,14 +60,16 @@ impl AsyncFactoryComponent for GameSession {
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.output(GamePageMsg::RemoveSession(index.current_index()));
sender.output(GamePageMsg::RemoveSession(index.current_index()))
.unwrap();
}
},
set_activatable: true,
connect_activated[sender, index] => move |_| {
sender.output(GamePageMsg::SetCurrent(index.current_index()));
sender.output(GamePageMsg::SetCurrent(index.current_index()))
.unwrap();
}
}
}
@ -80,10 +81,6 @@ impl AsyncFactoryComponent for GameSession {
) -> Self {
init
}
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
Some(output)
}
}
pub struct GamePage {
@ -162,7 +159,9 @@ impl SimpleAsyncComponent for GamePage {
tracing::info!("Initializing game settings");
let mut model = Self {
sessions: AsyncFactoryVecDeque::new(adw::PreferencesGroup::new(), sender.input_sender()),
sessions: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
sessions_root_widget: gtk::CheckButton::new(),
session_name_entry: adw::EntryRow::new()

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use relm4::factory::{
AsyncFactoryComponent,
@ -45,7 +44,6 @@ impl AsyncFactoryComponent for DiscordRpcIcon {
type Input = EnhancementsAppMsg;
type Output = EnhancementsAppMsg;
type CommandOutput = ();
type ParentInput = EnhancementsAppMsg;
type ParentWidget = adw::ExpanderRow;
view! {
@ -70,7 +68,8 @@ impl AsyncFactoryComponent for DiscordRpcIcon {
set_activatable: true,
connect_activated[sender, index] => move |_| {
sender.output(EnhancementsAppMsg::SetDiscordRpcIcon(index.clone()));
sender.output(EnhancementsAppMsg::SetDiscordRpcIcon(index.clone()))
.unwrap();
}
}
}
@ -83,11 +82,6 @@ impl AsyncFactoryComponent for DiscordRpcIcon {
) -> Self {
init
}
#[inline]
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
Some(output)
}
}
pub struct EnhancementsApp {
@ -102,7 +96,7 @@ pub struct EnhancementsApp {
#[derive(Debug)]
pub enum EnhancementsAppMsg {
SetGamescopeParent(adw::PreferencesWindow),
SetGamescopeParent,
SetDiscordRpcIcon(DynamicIndex),
@ -569,7 +563,10 @@ impl SimpleAsyncComponent for EnhancementsApp {
tracing::info!("Initializing enhancements settings");
let mut model = Self {
discord_rpc_icons: AsyncFactoryVecDeque::new(adw::ExpanderRow::new(), sender.input_sender()),
discord_rpc_icons: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
discord_rpc_root_check_button: gtk::CheckButton::new(),
gamescope: GamescopeApp::builder()
@ -640,6 +637,7 @@ impl SimpleAsyncComponent for EnhancementsApp {
model.discord_rpc_icons.guard().push_back(DiscordRpcIcon {
check_button,
name: icon.name.clone(),
path: cache_file.clone()
});
@ -666,8 +664,8 @@ impl SimpleAsyncComponent for EnhancementsApp {
async fn update(&mut self, msg: Self::Input, sender: AsyncComponentSender<Self>) {
match msg {
EnhancementsAppMsg::SetGamescopeParent(parent) => {
self.gamescope.widget().set_transient_for(Some(&parent));
EnhancementsAppMsg::SetGamescopeParent => unsafe {
self.gamescope.widget().set_transient_for(super::main::PREFERENCES_WINDOW.as_ref());
}
EnhancementsAppMsg::SetDiscordRpcIcon(index) => {

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use relm4::factory::*;
use adw::prelude::*;
@ -24,7 +23,6 @@ macro_rules! impl_directory {
type Input = SandboxPageMsg;
type Output = SandboxPageMsg;
type CommandOutput = ();
type ParentInput = SandboxPageMsg;
type ParentWidget = adw::PreferencesGroup;
view! {
@ -41,7 +39,8 @@ macro_rules! impl_directory {
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.output($msg(index.clone()));
sender.output($msg(index.clone()))
.unwrap();
}
}
}
@ -57,10 +56,6 @@ macro_rules! impl_directory {
to: init.1
}
}
fn forward_to_parent(output: Self::Output) -> Option<Self::ParentInput> {
Some(output)
}
}
}
}
@ -335,9 +330,17 @@ impl SimpleAsyncComponent for SandboxPage {
tracing::info!("Initializing sandbox settings");
let mut model = Self {
private_paths: AsyncFactoryVecDeque::new(adw::PreferencesGroup::new(), sender.input_sender()),
shared_paths: AsyncFactoryVecDeque::new(adw::PreferencesGroup::new(), sender.input_sender()),
symlink_paths: AsyncFactoryVecDeque::new(adw::PreferencesGroup::new(), sender.input_sender()),
private_paths: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
shared_paths: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
symlink_paths: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
private_path_entry: adw::EntryRow::new(),

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use adw::prelude::*;
use anime_launcher_sdk::config::ConfigExt;

View file

@ -1,6 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use gtk::prelude::*;
use adw::prelude::*;

View file

@ -1,5 +1,10 @@
use relm4::prelude::*;
use relm4::component::*;
use relm4::factory::{
AsyncFactoryVecDeque,
AsyncFactoryComponent,
AsyncFactorySender
};
use gtk::prelude::*;
use adw::prelude::*;
@ -23,7 +28,81 @@ use crate::ui::preferences::main::PreferencesAppMsg;
use crate::i18n::*;
use crate::*;
#[derive(Debug)]
struct VoicePackageComponent {
locale: VoiceLocale,
installed: bool,
sensitive: bool
}
#[relm4::factory(async)]
impl AsyncFactoryComponent for VoicePackageComponent {
type Init = (VoiceLocale, bool);
type Input = GeneralAppMsg;
type Output = GeneralAppMsg;
type CommandOutput = ();
type ParentWidget = adw::ExpanderRow;
view! {
root = adw::ActionRow {
set_title: &tr!(&self.locale.to_name().to_ascii_lowercase()),
add_suffix = &gtk::Button {
#[watch]
set_visible: self.installed,
#[watch]
set_sensitive: self.sensitive,
set_icon_name: "user-trash-symbolic",
add_css_class: "flat",
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.input(GeneralAppMsg::RemoveVoicePackage(index.clone()));
}
},
add_suffix = &gtk::Button {
#[watch]
set_visible: !self.installed,
#[watch]
set_sensitive: self.sensitive,
set_icon_name: "document-save-symbolic",
add_css_class: "flat",
set_valign: gtk::Align::Center,
connect_clicked[sender, index] => move |_| {
sender.input(GeneralAppMsg::AddVoicePackage(index.clone()));
}
}
}
}
async fn init_model(
init: Self::Init,
_index: &DynamicIndex,
_sender: AsyncFactorySender<Self>,
) -> Self {
Self {
locale: init.0,
installed: init.1,
sensitive: true
}
}
async fn update(&mut self, msg: Self::Input, sender: AsyncFactorySender<Self>) {
self.installed = !self.installed;
sender.output(msg)
.unwrap();
}
}
pub struct GeneralApp {
voice_packages: AsyncFactoryVecDeque<VoicePackageComponent>,
migrate_installation: Controller<MigrateInstallationApp>,
components_page: AsyncController<ComponentsPage>,
@ -44,6 +123,13 @@ pub enum GeneralAppMsg {
/// was retrieved from remote repos
SetMainPatch(Option<(Version, JadeitePatchStatusVariant)>),
// If one ever wish to change it to accept VoiceLocale
// I'd recommend to use clone!(@strong self.locale as locale => move |_| { .. })
// in the VoicePackage component
AddVoicePackage(DynamicIndex),
RemoveVoicePackage(DynamicIndex),
SetVoicePackageSensitivity(DynamicIndex, bool),
UpdateDownloadedWine,
UpdateDownloadedDxvk,
@ -217,6 +303,12 @@ impl SimpleAsyncComponent for GeneralApp {
}
},
#[local_ref]
voice_packages -> adw::ExpanderRow {
set_title: &tr!("game-voiceovers"),
set_subtitle: &tr!("game-voiceovers-description")
},
gtk::Box {
set_orientation: gtk::Orientation::Horizontal,
set_spacing: 8,
@ -309,7 +401,8 @@ impl SimpleAsyncComponent for GeneralApp {
JadeitePatchStatusVariant::Verified => &["success"],
JadeitePatchStatusVariant::Unverified => &["warning"],
JadeitePatchStatusVariant::Broken => &["error"],
JadeitePatchStatusVariant::Unsafe => &["error"]
JadeitePatchStatusVariant::Unsafe => &["error"],
JadeitePatchStatusVariant::Concerning => &["error"]
}
None => &[]
@ -322,6 +415,9 @@ impl SimpleAsyncComponent for GeneralApp {
JadeitePatchStatusVariant::Broken => tr!("patch-broken-tooltip"),
JadeitePatchStatusVariant::Unsafe => tr!("patch-unsafe-tooltip"),
// TODO: special tooltip for concerning status
JadeitePatchStatusVariant::Concerning => tr!("patch-unsafe-tooltip"),
_ => String::new()
}
@ -451,7 +547,11 @@ impl SimpleAsyncComponent for GeneralApp {
) -> AsyncComponentParts<Self> {
tracing::info!("Initializing general settings");
let model = Self {
let mut model = Self {
voice_packages: AsyncFactoryVecDeque::builder()
.launch_default()
.forward(sender.input_sender(), std::convert::identity),
migrate_installation: MigrateInstallationApp::builder()
.launch(())
.detach(),
@ -467,6 +567,14 @@ impl SimpleAsyncComponent for GeneralApp {
languages: SUPPORTED_LANGUAGES.iter().map(|lang| tr!(format_lang(lang).as_str())).collect()
};
for package in VoiceLocale::list() {
model.voice_packages.guard().push_back((
*package,
CONFIG.game.voices.iter().any(|voice| VoiceLocale::from_str(voice) == Some(*package))
));
}
let voice_packages = model.voice_packages.widget();
let components_page = model.components_page.widget();
let widgets = view_output!();
@ -486,6 +594,63 @@ impl SimpleAsyncComponent for GeneralApp {
self.main_patch = patch;
}
#[allow(unused_must_use)]
GeneralAppMsg::AddVoicePackage(index) => {
if let Some(package) = self.voice_packages.get(index.current_index()) {
if let Ok(mut config) = Config::get() {
if !config.game.voices.iter().any(|voice| VoiceLocale::from_str(voice) == Some(package.locale)) {
config.game.voices.push(package.locale.to_code().to_string());
Config::update(config);
sender.output(PreferencesAppMsg::UpdateLauncherState);
}
}
}
}
#[allow(unused_must_use)]
GeneralAppMsg::RemoveVoicePackage(index) => {
if let Some(package) = self.voice_packages.guard().get_mut(index.current_index()) {
if let Ok(mut config) = Config::get() {
package.sensitive = false;
config.game.voices.retain(|voice| VoiceLocale::from_str(voice) != Some(package.locale));
Config::update(config.clone());
let package = VoicePackage::with_locale(package.locale, config.launcher.edition).unwrap();
let game_path = config.game.path.for_edition(config.launcher.edition).to_path_buf();
if package.is_installed_in(&game_path) {
std::thread::spawn(move || {
if let Err(err) = package.delete_in(game_path) {
tracing::error!("Failed to delete voice package: {:?}", package.locale());
sender.input(GeneralAppMsg::Toast {
title: tr!("voice-package-deletion-error"),
description: Some(err.to_string())
});
}
sender.input(GeneralAppMsg::SetVoicePackageSensitivity(index, true));
sender.output(PreferencesAppMsg::UpdateLauncherState);
});
}
else {
sender.input(GeneralAppMsg::SetVoicePackageSensitivity(index, true));
}
}
}
}
GeneralAppMsg::SetVoicePackageSensitivity(index, sensitive) => {
if let Some(package) = self.voice_packages.guard().get_mut(index.current_index()) {
package.sensitive = sensitive;
}
}
GeneralAppMsg::UpdateDownloadedWine => {
self.components_page.sender()
.send(ComponentsPageMsg::UpdateDownloadedWine)
@ -503,7 +668,7 @@ impl SimpleAsyncComponent for GeneralApp {
self.migrate_installation.widget().set_transient_for(Some(window.widget()));
}
self.migrate_installation.widget().show();
self.migrate_installation.widget().present();
}
GeneralAppMsg::OpenMainPage => unsafe {

View file

@ -1,5 +1,4 @@
use relm4::prelude::*;
use relm4::component::*;
use gtk::prelude::*;
use adw::prelude::*;
@ -69,7 +68,7 @@ impl SimpleAsyncComponent for PreferencesApp {
});
}
gtk::Inhibit::default()
gtk::glib::Propagation::Proceed
}
}
}
@ -99,12 +98,10 @@ impl SimpleAsyncComponent for PreferencesApp {
PREFERENCES_WINDOW = Some(widgets.preferences_window.clone());
}
#[allow(unused_must_use)] {
model.enhancements.sender().send(EnhancementsAppMsg::SetGamescopeParent(widgets.preferences_window.clone()));
model.enhancements.emit(EnhancementsAppMsg::SetGamescopeParent);
model.general.sender().send(GeneralAppMsg::UpdateDownloadedWine);
model.general.sender().send(GeneralAppMsg::UpdateDownloadedDxvk);
}
model.general.emit(GeneralAppMsg::UpdateDownloadedWine);
model.general.emit(GeneralAppMsg::UpdateDownloadedDxvk);
AsyncComponentParts { model, widgets }
}
@ -113,9 +110,8 @@ impl SimpleAsyncComponent for PreferencesApp {
tracing::debug!("Called preferences window event: {:?}", msg);
match msg {
#[allow(unused_must_use)]
PreferencesAppMsg::SetGameDiff(diff) => {
self.general.sender().send(GeneralAppMsg::SetGameDiff(diff));
self.general.emit(GeneralAppMsg::SetGameDiff(diff));
}
#[allow(unused_must_use)]