├── .gitignore ├── .travis.yml ├── .travis └── build.sh ├── 29.diff ├── Cargo.lock ├── Cargo.toml ├── Justfile ├── LICENSE ├── README.md ├── SECURITY.md ├── banner.png ├── bootstrap.linux.toml ├── bootstrap.macos.toml ├── bootstrap.windows.toml ├── build.rs ├── config.linux.v1.toml ├── config.linux.v2.toml ├── config.windows.v10.toml ├── config.windows.v2.toml ├── config.windows.v3.toml ├── config.windows.v4.toml ├── config.windows.v5.toml ├── config.windows.v6.toml ├── config.windows.v7.toml ├── config.windows.v8.toml ├── config.windows.v9.toml ├── liftinstall.png ├── src ├── archives │ └── mod.rs ├── config.rs ├── frontend │ ├── mod.rs │ ├── rest │ │ ├── assets.rs │ │ ├── mod.rs │ │ ├── server.rs │ │ └── services │ │ │ ├── attributes.rs │ │ │ ├── authentication.rs │ │ │ ├── browser.rs │ │ │ ├── config.rs │ │ │ ├── dark_mode.rs │ │ │ ├── default_path.rs │ │ │ ├── exit.rs │ │ │ ├── install.rs │ │ │ ├── installation_status.rs │ │ │ ├── mod.rs │ │ │ ├── packages.rs │ │ │ ├── static_files.rs │ │ │ ├── uninstall.rs │ │ │ ├── update_updater.rs │ │ │ ├── verify_path.rs │ │ │ └── view_folder.rs │ └── ui │ │ └── mod.rs ├── http.rs ├── installer.rs ├── logging.rs ├── main.rs ├── native │ ├── interop.cpp │ └── mod.rs ├── self_update.rs ├── sources │ ├── github │ │ └── mod.rs │ ├── mod.rs │ ├── patreon.rs │ └── types.rs └── tasks │ ├── check_authorization.rs │ ├── download_pkg.rs │ ├── ensure_only_instance.rs │ ├── install.rs │ ├── install_desktop_shortcut.rs │ ├── install_dir.rs │ ├── install_global_shortcut.rs │ ├── install_pkg.rs │ ├── install_shortcuts.rs │ ├── launch_installed_on_exit.rs │ ├── mod.rs │ ├── remove_target_dir.rs │ ├── resolver.rs │ ├── save_database.rs │ ├── save_executable.rs │ ├── uninstall.rs │ ├── uninstall_global_shortcut.rs │ ├── uninstall_pkg.rs │ └── uninstall_shortcuts.rs └── ui ├── .browserslistrc ├── .editorconfig ├── .eslintrc.js ├── .gitignore ├── README.md ├── babel.config.js ├── merge-strings.js ├── mock-server.js ├── package.json ├── postcss.config.js ├── public ├── favicon.ico ├── index.html ├── thicc_logo_installer__ea_shadow.png └── thicc_logo_installer_shadow.png ├── src ├── App.vue ├── assets │ ├── dark_mode_installer_logo.png │ ├── fonts │ │ ├── roboto-v18-latin-regular.eot │ │ ├── roboto-v18-latin-regular.woff │ │ └── roboto-v18-latin-regular.woff2 │ ├── how-to-open.png │ ├── light_mode_installer_logo.png │ └── logo.png ├── helpers.js ├── locales │ ├── .gitignore │ ├── ca.json │ ├── cs.json │ ├── de.json │ ├── en.json │ ├── es.json │ ├── fr.json │ ├── id.json │ ├── it.json │ ├── ko_KR.json │ ├── nb.json │ ├── pl.json │ ├── pt_BR.json │ ├── pt_PT.json │ ├── ru_RU.json │ ├── tr_TR.json │ ├── vi.json │ ├── vi_VN.json │ ├── zh_CN.json │ └── zh_TW.json ├── main.js ├── router.js └── views │ ├── AuthenticationView.vue │ ├── CompleteView.vue │ ├── DownloadConfig.vue │ ├── ErrorView.vue │ ├── InstallPackages.vue │ ├── MigrateView.vue │ ├── ModifyView.vue │ ├── ReAuthenticationView.vue │ └── SelectPackages.vue ├── unbreak-translations.js ├── vue.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | /.idea/ 3 | 4 | /target/ 5 | **/*.rs.bk 6 | 7 | *.log 8 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | matrix: 2 | include: 3 | - os: linux 4 | language: cpp 5 | sudo: required 6 | dist: trusty 7 | services: docker 8 | install: docker pull rust:1 9 | cache: 10 | directories: 11 | - $HOME/.cargo 12 | - $TRAVIS_BUILD_DIR/ui/node_modules 13 | script: docker run -v $HOME/.cargo:/root/.cargo -v $(pwd):/liftinstall rust:1 /bin/bash -ex /liftinstall/.travis/build.sh 14 | 15 | - os: osx 16 | language: rust 17 | cache: cargo 18 | osx_image: xcode10 19 | script: brew install yarn && cargo build 20 | 21 | - os: windows 22 | language: rust 23 | cache: cargo 24 | script: 25 | - choco install nodejs yarn 26 | - export PATH="$PROGRAMFILES/nodejs/:$PROGRAMFILES (x86)/Yarn/bin/:$PATH" 27 | - cargo build 28 | -------------------------------------------------------------------------------- /.travis/build.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | cd /liftinstall || exit 1 3 | 4 | # setup NodeJS 5 | curl -sL https://deb.nodesource.com/setup_12.x | bash - 6 | # setup Yarn 7 | curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - 8 | echo "deb https://dl.yarnpkg.com/debian/ stable main" > /etc/apt/sources.list.d/yarn.list 9 | 10 | apt-get update 11 | apt-get install -y libwebkit2gtk-4.0-dev libssl-dev nodejs yarn 12 | 13 | yarn --cwd ui 14 | 15 | cargo build 16 | -------------------------------------------------------------------------------- /Cargo.toml: -------------------------------------------------------------------------------- 1 | [package] 2 | name = "liftinstall" 3 | version = "0.2.0" 4 | edition = "2018" 5 | authors = ["James "] 6 | repository = "https://github.com/j-selby/liftinstall.git" 7 | documentation = "https://liftinstall.jselby.net" 8 | description = "An adaptable installer for your application." 9 | build = "build.rs" 10 | resolver = "2" 11 | 12 | [dependencies] 13 | anyhow = "^1" 14 | wry = "0.12" 15 | tinyfiledialogs = "3.8" 16 | 17 | hyper = "0.11.27" 18 | futures = "0.1.29" 19 | mime_guess = "2.0" 20 | url = "2.2" 21 | 22 | reqwest = "0.9.22" 23 | number_prefix = "0.4" 24 | 25 | serde = "1.0" 26 | serde_derive = "1.0" 27 | serde_json = "1.0" 28 | 29 | toml = "0.5" 30 | 31 | semver = {version = "1.0", features = ["serde"]} 32 | regex = "1.4" 33 | 34 | dirs = "^4" 35 | zip = "0.6" 36 | xz2 = "0.1" 37 | tar = "0.4" 38 | 39 | log = "0.4" 40 | fern = "0.6" 41 | chrono = "0.4" 42 | 43 | clap = "2.33" 44 | 45 | # used to open a link to the users default browser 46 | webbrowser = "0.6" 47 | # used in JWT based package authentication 48 | jsonwebtoken = "7" 49 | # used to decode the public key for verifying JWT tokens 50 | base64 = "0.13" 51 | 52 | [build-dependencies] 53 | walkdir = "2.3" 54 | serde = "1.0" 55 | serde_derive = "1.0" 56 | toml = "0.5" 57 | which = "4.0" 58 | image = { version = "0.24", default-features = false, features = ["ico"] } 59 | 60 | [target.'cfg(windows)'.dependencies] 61 | winapi = { version = "0.3", features = ["psapi", "winbase", "winioctl", "winnt"] } 62 | widestring = "0.5" 63 | webview2 = "0.1" 64 | tempfile = "3" 65 | 66 | [target.'cfg(not(windows))'.dependencies] 67 | sysinfo = "0.23" 68 | slug = "0.1" 69 | 70 | [target.'cfg(windows)'.build-dependencies] 71 | winres = "0.1" 72 | cc = "1.0" 73 | 74 | [profile.release] 75 | #panic = "abort" 76 | lto = true 77 | opt-level = "z" 78 | codegen-units = 1 79 | incremental = false 80 | 81 | #[profile.release.overrides."*"] # + 82 | #opt-level = "z" 83 | #codegen-units = 1 84 | #incremental = false 85 | -------------------------------------------------------------------------------- /Justfile: -------------------------------------------------------------------------------- 1 | ui-build: 2 | yarn --cwd {{ justfile_directory() }}/ui/ install 3 | yarn --cwd {{ justfile_directory() }}/ui/ build 4 | 5 | ui-test: 6 | cd {{ justfile_directory() }}/ui/ && node mock-server.js & 7 | yarn --cwd {{ justfile_directory() }}/ui/ serve 8 | 9 | update-i18n: 10 | #!/bin/bash -e 11 | [ -z "${TX_PULL}" ] || tx pull -a --minimum-perc 85 12 | for i in {{ justfile_directory() }}/ui/translations/*.po; do 13 | TARGET_FILE="$(basename $i)" 14 | TARGET_LANG="${TARGET_FILE/.po/}" 15 | OUTPUT="{{ justfile_directory() }}/ui/src/locales/${TARGET_LANG}.json" 16 | i18next-conv -l en -s "$i" -t "$OUTPUT" -K 17 | node {{ justfile_directory() }}/ui/unbreak-translations.js "$OUTPUT" "$OUTPUT" 18 | done 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | [Usage Documentation](https://liftinstall.jselby.net/) 4 | - [Quick Start](https://liftinstall.jselby.net/quick-start) 5 | - [License](LICENSE) 6 | 7 | [![Build Status](https://travis-ci.org/j-selby/liftinstall.svg?branch=master)](https://travis-ci.org/j-selby/liftinstall) 8 | 9 | 10 | An installer for your application. Designed to be customisable to the core, hookable from external 11 | applications, and have a decent UI. 12 | 13 | This is designed to be a more modern interpretation of Qt's Installer Framework, which is hard to develop on, 14 | poorly documented, has a hardcoded package listing format, and isn't supported all that well, with rare updates 15 | and a large list of bugs. 16 | 17 | Building 18 | -------- 19 | 20 | For more detailed instructions, look at the usage documentation above. 21 | 22 | There are are few system dependencies depending on your platform: 23 | - For all platforms, `cargo` should be available on your PATH. [Rustup](https://rustup.rs/) is the 24 | recommended way to achieve this. Stable or Nightly Rust works fine. 25 | - Have node.js and Yarn available on your PATH (for building UI components, not needed at runtime). 26 | - For Windows (MSVC), you need Visual Studio installed. 27 | - For Windows (Mingw), you need `gcc`/`g++` available on the PATH. 28 | - For Mac, you need Xcode installed, and Clang/etc available on the PATH. 29 | - For Linux, you need `gcc`/`g++`, `webkit2gtk`, and `libssl`. For Ubuntu 18.04 this would look like: 30 | 31 | ```bash 32 | apt install -y build-essential libwebkit2gtk-4.0-dev libssl-dev 33 | ``` 34 | 35 | In order to build yourself an installer, as a bare minimum, you need to: 36 | 37 | - Add your favicon to `ui/public/favicon.ico` 38 | - Add your logo to `ui/src/assets/logo.png` 39 | - Modify the bootstrap configuration file as needed (`config.PLATFORM.toml`). 40 | - Have the main configuration file somewhere useful, reachable over HTTP. 41 | - Run: 42 | 43 | ```bash 44 | cargo build --release 45 | ``` 46 | 47 | Contributing 48 | ------------ 49 | 50 | PRs are very welcome. Code should be run through [Rustfmt](https://github.com/rust-lang-nursery/rustfmt) 51 | before submission. 52 | 53 | License 54 | ------- 55 | 56 | LiftInstall is licensed under the Apache 2.0 License, which can be found in [LICENSE](LICENSE). 57 | -------------------------------------------------------------------------------- /SECURITY.md: -------------------------------------------------------------------------------- 1 | # Security Policy 2 | 3 | ## Supported Versions 4 | 5 | As `liftinstall` is a template for your project, no specific versioning is 6 | provided at this time, though a rough version is given in the Cargo file. 7 | 8 | Only the latest version from this file will be supported. 9 | 10 | ## Reporting a Vulnerability 11 | 12 | For any specific security concerns/vulnerabilities, please email me directly 13 | at security *at* jselby.net. 14 | -------------------------------------------------------------------------------- /banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/banner.png -------------------------------------------------------------------------------- /bootstrap.linux.toml: -------------------------------------------------------------------------------- 1 | name = "yuzu" 2 | target_url = "https://raw.githubusercontent.com/yuzu-emu/liftinstall/master/config.linux.v2.toml" 3 | -------------------------------------------------------------------------------- /bootstrap.macos.toml: -------------------------------------------------------------------------------- 1 | # fake configuration for CI purpose only 2 | name = "yuzu" 3 | target_url = "https://raw.githubusercontent.com/j-selby/test-installer/master/config.linux.v2.toml" 4 | -------------------------------------------------------------------------------- /bootstrap.windows.toml: -------------------------------------------------------------------------------- 1 | name = "yuzu" 2 | target_url = "https://raw.githubusercontent.com/pineappleEA/liftinstall/master/config.windows.v10.toml" 3 | -------------------------------------------------------------------------------- /config.linux.v1.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | 4 | [[packages]] 5 | name = "yuzu Nightly" 6 | description = "The nightly build of yuzu contains already reviewed and tested features." 7 | default = true 8 | [packages.source] 9 | name = "github" 10 | match = "^yuzu-linux-[0-9]*-[0-9a-f]*.tar.xz$" 11 | [packages.source.config] 12 | repo = "yuzu-emu/yuzu-nightly" 13 | 14 | [[packages]] 15 | name = "yuzu Canary" 16 | description = "The canary build of yuzu has additional features that are still waiting on review." 17 | [packages.source] 18 | name = "github" 19 | match = "^yuzu-linux-[0-9]*-[0-9a-f]*.tar.xz$" 20 | [packages.source.config] 21 | repo = "yuzu-emu/yuzu-canary" 22 | -------------------------------------------------------------------------------- /config.linux.v2.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | 4 | [authentication] 5 | # Base64 encoded version of the public key for validating the JWT token. Must be in DER format 6 | pub_key_base64 = "MIIBCgKCAQEAs5K6s49JVV9LBMzDrkORsoPSYsv1sCXDtxjp4pn8p0uPSvJAsbNNmdIgCjfSULzbHLM28MblnI4zYP8ZgKtkjdg+Ic5WQbS5iBAkf18zMafpOrotTArLsgZSmUfNYt0SOiN17D+sq/Ov/CKXRM9CttKkEbanBTVqkx7sxsHVbkI6tDvkboSaNeVPHzHlfAbvGrUo5cbAFCB/KnRsoxr+g7jLKTxU1w4xb/pIs91h80AXV/yZPXL6ItPM3/0noIRXjmoeYWf2sFQaFALNB2Kef0p6/hoHYUQP04ZSIL3Q+v13z5X2YJIlI4eLg+iD25QYm9V8oP3+Xro4vd47a0/maQIDAQAB" 7 | # URL to authenticate against. This must return a JWT token with their permissions and a custom claim patreonInfo with the following structure 8 | # "patreonInfo": { "linked": false, "activeSubscription": false } 9 | # If successful, the frontend will use this JWT token as a Bearer Authentication when requesting the binaries to download 10 | auth_url = "https://api.yuzu-emu.org/jwt/installer/" 11 | [authentication.validation] 12 | iss = "citra-core" 13 | aud = "installer" 14 | 15 | [[packages]] 16 | name = "yuzu" 17 | description = "Includes frequent updates to yuzu with all the latest reviewed and tested features." 18 | default = true 19 | [packages.source] 20 | name = "github" 21 | match = "^yuzu-linux-[0-9]*-[0-9a-f]*.tar.xz$" 22 | [packages.source.config] 23 | repo = "yuzu-emu/yuzu-mainline" 24 | [[packages.shortcuts]] 25 | name = "yuzu" 26 | relative_path = "yuzu-windows-msvc/yuzu.exe" 27 | description = "Launch yuzu" 28 | 29 | [[packages]] 30 | name = "yuzu Early Access" 31 | description = "Bonus preview release for project supporters. Thanks for your support!" 32 | # Displayed when the package has no authentication for the user 33 | need_authentication_description = "Click here to sign in with your yuzu account for Early Access" 34 | # Displayed when the package has an authentication, but the user has not linked their account 35 | need_link_description = "You are signed in, but you need to link your Patreon account! Click here for more details" 36 | # Displayed when the package has an authentication, but the user has not linked their account 37 | need_subscription_description = "You are signed in, but you need to link your Patreon account! Click here for more details" 38 | # Displayed when the package has an authentication, but the user has not linked their account 39 | need_reward_tier_description = "You are signed in, but are not backing an eligible reward tier! Click here for more details" 40 | requires_authorization = true 41 | # puts a "new" ribbon the package select 42 | is_new = true 43 | [packages.source] 44 | name = "patreon" 45 | match = "^yuzu-linux-[0-9]*-[0-9a-f]*.tar.xz$" 46 | [packages.source.config] 47 | repo = "earlyaccess" 48 | [[packages.shortcuts]] 49 | name = "yuzu Early Access" 50 | relative_path = "yuzu-linux-earlyaccess/yuzu.exe" 51 | description = "Launch yuzu Early Access" 52 | 53 | -------------------------------------------------------------------------------- /config.windows.v10.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is a bad emulator. Stuff will break!" 2 | hide_advanced = true 3 | 4 | [authentication] 5 | # Base64 encoded version of the public key for validating the JWT token. Must be in DER format 6 | pub_key_base64 = "MIIBCgKCAQEAs5K6s49JVV9LBMzDrkORsoPSYsv1sCXDtxjp4pn8p0uPSvJAsbNNmdIgCjfSULzbHLM28MblnI4zYP8ZgKtkjdg+Ic5WQbS5iBAkf18zMafpOrotTArLsgZSmUfNYt0SOiN17D+sq/Ov/CKXRM9CttKkEbanBTVqkx7sxsHVbkI6tDvkboSaNeVPHzHlfAbvGrUo5cbAFCB/KnRsoxr+g7jLKTxU1w4xb/pIs91h80AXV/yZPXL6ItPM3/0noIRXjmoeYWf2sFQaFALNB2Kef0p6/hoHYUQP04ZSIL3Q+v13z5X2YJIlI4eLg+iD25QYm9V8oP3+Xro4vd47a0/maQIDAQAB" 7 | # URL to authenticate against. This must return a JWT token with their permissions and a custom claim patreonInfo with the following structure 8 | # "patreonInfo": { "linked": false, "activeSubscription": false } 9 | # If successful, the frontend will use this JWT token as a Bearer Authentication when requesting the binaries to download 10 | auth_url = "https://api.yuzu-emu.org/jwt/installer/" 11 | [authentication.validation] 12 | iss = "citra-core" 13 | aud = "installer" 14 | 15 | [[packages]] 16 | name = "yuzu Early Access" 17 | description = "Preview release with the newest features for the supporters. Brought to you by pinEApple" 18 | icon = "thicc_logo_installer__ea_shadow.png" 19 | default = true 20 | # puts a "new" ribbon the package select 21 | [packages.source] 22 | name = "github" 23 | match = "^Windows-Yuzu-EA-[0-9]*.zip$" 24 | [packages.source.config] 25 | repo = "pineappleEA/pineapple-src" 26 | [[packages.shortcuts]] 27 | name = "yuzu Early Access" 28 | relative_path = "yuzu-windows-msvc-early-access/yuzu.exe" 29 | description = "Launch yuzu Early Access" 30 | 31 | 32 | [[packages]] 33 | name = "yuzu" 34 | description = "Includes frequent updates to yuzu with all the latest reviewed and tested features." 35 | icon = "thicc_logo_installer_shadow.png" 36 | [packages.source] 37 | name = "github" 38 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.tar.xz$" 39 | [packages.source.config] 40 | repo = "yuzu-emu/yuzu-mainline" 41 | [[packages.shortcuts]] 42 | name = "yuzu" 43 | relative_path = "yuzu-windows-msvc/yuzu.exe" 44 | description = "Launch yuzu" 45 | 46 | -------------------------------------------------------------------------------- /config.windows.v2.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.4/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | default = true 9 | [packages.source] 10 | name = "github" 11 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 12 | [packages.source.config] 13 | repo = "yuzu-emu/yuzu-nightly" 14 | [[packages.shortcuts]] 15 | name = "yuzu Nightly" 16 | relative_path = "nightly/yuzu.exe" 17 | description = "Launch yuzu (Nightly version)" 18 | 19 | [[packages]] 20 | name = "yuzu Canary" 21 | description = "The canary build of yuzu has additional features that are still waiting on review." 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v3.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.4/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | default = true 9 | [packages.source] 10 | name = "github" 11 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 12 | [packages.source.config] 13 | repo = "yuzu-emu/yuzu-nightly" 14 | [[packages.shortcuts]] 15 | name = "yuzu Nightly" 16 | relative_path = "nightly/yuzu.exe" 17 | description = "Launch yuzu (Nightly version)" 18 | 19 | [[packages]] 20 | name = "yuzu Canary" 21 | description = "The canary build of yuzu has additional features that are still waiting on review." 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v4.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.4/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | [packages.source] 9 | name = "github" 10 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 11 | [packages.source.config] 12 | repo = "yuzu-emu/yuzu-nightly" 13 | [[packages.shortcuts]] 14 | name = "yuzu Nightly" 15 | relative_path = "nightly/yuzu.exe" 16 | description = "Launch yuzu (Nightly version)" 17 | 18 | [[packages]] 19 | name = "yuzu Canary" 20 | description = "The canary build of yuzu has additional features that are still waiting on review." 21 | default = true 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v5.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.4/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | [packages.source] 9 | name = "github" 10 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 11 | [packages.source.config] 12 | repo = "yuzu-emu/yuzu-nightly" 13 | [[packages.shortcuts]] 14 | name = "yuzu Nightly" 15 | relative_path = "nightly/yuzu.exe" 16 | description = "Launch yuzu (Nightly version)" 17 | 18 | [[packages]] 19 | name = "yuzu Canary" 20 | description = "The canary build of yuzu has additional features that are still waiting on review." 21 | default = true 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v6.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.5/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | [packages.source] 9 | name = "github" 10 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 11 | [packages.source.config] 12 | repo = "yuzu-emu/yuzu-nightly" 13 | [[packages.shortcuts]] 14 | name = "yuzu Nightly" 15 | relative_path = "nightly/yuzu.exe" 16 | description = "Launch yuzu (Nightly version)" 17 | 18 | [[packages]] 19 | name = "yuzu Canary" 20 | description = "The canary build of yuzu has additional features that are still waiting on review." 21 | default = true 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v7.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.6/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu Nightly" 7 | description = "The nightly build of yuzu contains already reviewed and tested features." 8 | [packages.source] 9 | name = "github" 10 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 11 | [packages.source.config] 12 | repo = "yuzu-emu/yuzu-nightly" 13 | [[packages.shortcuts]] 14 | name = "yuzu Nightly" 15 | relative_path = "nightly/yuzu.exe" 16 | description = "Launch yuzu (Nightly version)" 17 | 18 | [[packages]] 19 | name = "yuzu Canary" 20 | description = "The canary build of yuzu has additional features that are still waiting on review." 21 | default = true 22 | [packages.source] 23 | name = "github" 24 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.zip$" 25 | [packages.source.config] 26 | repo = "yuzu-emu/yuzu-canary" 27 | [[packages.shortcuts]] 28 | name = "yuzu Canary" 29 | relative_path = "canary/yuzu.exe" 30 | description = "Launch yuzu (Canary version)" 31 | 32 | -------------------------------------------------------------------------------- /config.windows.v8.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | new_tool = "https://github.com/yuzu-emu/liftinstall/releases/download/1.7/yuzu_install.exe" 4 | 5 | [[packages]] 6 | name = "yuzu" 7 | description = "Includes frequent updates to yuzu with all the latest reviewed and tested features." 8 | default = true 9 | [packages.source] 10 | name = "github" 11 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.tar.xz$" 12 | [packages.source.config] 13 | repo = "yuzu-emu/yuzu-mainline" 14 | [[packages.shortcuts]] 15 | name = "yuzu" 16 | relative_path = "yuzu-windows-msvc/yuzu.exe" 17 | description = "Launch yuzu" 18 | -------------------------------------------------------------------------------- /config.windows.v9.toml: -------------------------------------------------------------------------------- 1 | installing_message = "Reminder: yuzu is an experimental emulator. Stuff will break!" 2 | hide_advanced = true 3 | 4 | [authentication] 5 | # Base64 encoded version of the public key for validating the JWT token. Must be in DER format 6 | pub_key_base64 = "MIIBCgKCAQEAs5K6s49JVV9LBMzDrkORsoPSYsv1sCXDtxjp4pn8p0uPSvJAsbNNmdIgCjfSULzbHLM28MblnI4zYP8ZgKtkjdg+Ic5WQbS5iBAkf18zMafpOrotTArLsgZSmUfNYt0SOiN17D+sq/Ov/CKXRM9CttKkEbanBTVqkx7sxsHVbkI6tDvkboSaNeVPHzHlfAbvGrUo5cbAFCB/KnRsoxr+g7jLKTxU1w4xb/pIs91h80AXV/yZPXL6ItPM3/0noIRXjmoeYWf2sFQaFALNB2Kef0p6/hoHYUQP04ZSIL3Q+v13z5X2YJIlI4eLg+iD25QYm9V8oP3+Xro4vd47a0/maQIDAQAB" 7 | # URL to authenticate against. This must return a JWT token with their permissions and a custom claim patreonInfo with the following structure 8 | # "patreonInfo": { "linked": false, "activeSubscription": false } 9 | # If successful, the frontend will use this JWT token as a Bearer Authentication when requesting the binaries to download 10 | auth_url = "https://api.yuzu-emu.org/jwt/installer/" 11 | [authentication.validation] 12 | iss = "citra-core" 13 | aud = "installer" 14 | 15 | [[packages]] 16 | name = "yuzu" 17 | description = "Includes frequent updates to yuzu with all the latest reviewed and tested features." 18 | default = true 19 | [packages.source] 20 | name = "github" 21 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.tar.xz$" 22 | [packages.source.config] 23 | repo = "yuzu-emu/yuzu-mainline" 24 | [[packages.shortcuts]] 25 | name = "yuzu" 26 | relative_path = "yuzu-windows-msvc/yuzu.exe" 27 | description = "Launch yuzu" 28 | 29 | [[packages]] 30 | name = "yuzu Early Access" 31 | description = "Bonus preview release for project supporters. Thanks for your support!" 32 | # Displayed when the package has no authentication for the user 33 | need_authentication_description = "Click here to sign in with your yuzu account for Early Access" 34 | # Displayed when the package has an authentication, but the user has not linked their account 35 | need_link_description = "You are signed in, but you need to link your Patreon account! Click here for more details" 36 | # Displayed when the package has an authentication, but the user has not linked their account 37 | need_subscription_description = "You are signed in, but you need to link your Patreon account! Click here for more details" 38 | # Displayed when the package has an authentication, but the user has not linked their account 39 | need_reward_tier_description = "You are signed in, but are not backing an eligible reward tier! Click here for more details" 40 | requires_authorization = true 41 | # puts a "new" ribbon the package select 42 | is_new = true 43 | [packages.source] 44 | name = "patreon" 45 | match = "^yuzu-windows-msvc-[0-9]*-[0-9a-f]*.tar.xz$" 46 | [packages.source.config] 47 | repo = "earlyaccess" 48 | [[packages.shortcuts]] 49 | name = "yuzu Early Access" 50 | relative_path = "yuzu-windows-msvc-early-access/yuzu.exe" 51 | description = "Launch yuzu Early Access" 52 | 53 | -------------------------------------------------------------------------------- /liftinstall.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/liftinstall.png -------------------------------------------------------------------------------- /src/archives/mod.rs: -------------------------------------------------------------------------------- 1 | //! Provides interfaces to various archives. 2 | 3 | use zip::ZipArchive as UpstreamZipArchive; 4 | 5 | use tar::Archive as UpstreamTarArchive; 6 | use tar::EntryType; 7 | 8 | use std::io::Cursor; 9 | use std::io::Read; 10 | use std::iter::Iterator; 11 | use std::path::PathBuf; 12 | 13 | use xz2::read::XzDecoder; 14 | 15 | pub trait Archive<'a> { 16 | /// func: iterator value, max size, file name, file contents 17 | fn for_each( 18 | &mut self, 19 | func: &mut dyn FnMut(usize, Option, PathBuf, &mut dyn Read) -> Result<(), String>, 20 | ) -> Result<(), String>; 21 | } 22 | 23 | struct ZipArchive<'a> { 24 | archive: UpstreamZipArchive>, 25 | } 26 | 27 | impl<'a> Archive<'a> for ZipArchive<'a> { 28 | fn for_each( 29 | &mut self, 30 | func: &mut dyn FnMut(usize, Option, PathBuf, &mut dyn Read) -> Result<(), String>, 31 | ) -> Result<(), String> { 32 | let max = self.archive.len(); 33 | 34 | for i in 0..max { 35 | let mut archive = self 36 | .archive 37 | .by_index(i) 38 | .map_err(|v| format!("Error while reading from .zip file: {:?}", v))?; 39 | 40 | if archive.name().ends_with('/') || archive.name().ends_with('\\') { 41 | continue; 42 | } 43 | 44 | func(i, Some(max), archive.mangled_name(), &mut archive)?; 45 | } 46 | 47 | Ok(()) 48 | } 49 | } 50 | 51 | struct TarArchive<'a> { 52 | archive: UpstreamTarArchive>, 53 | } 54 | 55 | impl<'a> Archive<'a> for TarArchive<'a> { 56 | fn for_each( 57 | &mut self, 58 | func: &mut dyn FnMut(usize, Option, PathBuf, &mut dyn Read) -> Result<(), String>, 59 | ) -> Result<(), String> { 60 | let entries = self 61 | .archive 62 | .entries() 63 | .map_err(|x| format!("Error while reading .tar file: {:?}", x))?; 64 | 65 | for (i, entry) in entries.enumerate() { 66 | let mut entry = 67 | entry.map_err(|v| format!("Failed to read entry from .tar file: {:?}", v))?; 68 | 69 | if entry.header().entry_type() != EntryType::Regular { 70 | continue; 71 | } 72 | 73 | let path = entry 74 | .path() 75 | .map(PathBuf::from) 76 | .map_err(|v| format!("Failed to read entry from .tar file: {:?}", v))?; 77 | 78 | func(i, None, path, &mut entry)?; 79 | } 80 | 81 | Ok(()) 82 | } 83 | } 84 | 85 | /// Reads the named archive with an archive implementation. 86 | pub fn read_archive<'a>(name: &str, data: &'a [u8]) -> Result + 'a>, String> { 87 | if name.ends_with(".zip") { 88 | // Decompress a .zip file 89 | let archive = UpstreamZipArchive::new(Cursor::new(data)) 90 | .map_err(|x| format!("Error while reading .zip file: {:?}", x))?; 91 | 92 | Ok(Box::new(ZipArchive { archive })) 93 | } else if name.ends_with(".tar.xz") { 94 | // Decompress a .tar.xz file 95 | let mut decompresser = XzDecoder::new(data); 96 | let mut decompressed_data = Vec::new(); 97 | decompresser 98 | .read_to_end(&mut decompressed_data) 99 | .map_err(|x| format!("Failed to decompress data: {:?}", x))?; 100 | 101 | let decompressed_contents: Box = Box::new(Cursor::new(decompressed_data)); 102 | 103 | let tar = UpstreamTarArchive::new(decompressed_contents); 104 | 105 | Ok(Box::new(TarArchive { archive: tar })) 106 | } else { 107 | Err(format!("No decompression handler for {:?}.", name)) 108 | } 109 | } 110 | -------------------------------------------------------------------------------- /src/frontend/mod.rs: -------------------------------------------------------------------------------- 1 | //! frontend/mod.rs 2 | //! 3 | //! Provides the frontend interface, including HTTP server. 4 | 5 | use std::sync::{Arc, RwLock}; 6 | 7 | use crate::installer::InstallerFramework; 8 | use crate::logging::LoggingErrors; 9 | 10 | pub mod rest; 11 | mod ui; 12 | 13 | /// Launches the main web server + UI. Returns when the framework has been consumed + web UI closed. 14 | pub fn launch(app_name: &str, is_launcher: bool, framework: InstallerFramework) { 15 | let framework = Arc::new(RwLock::new(framework)); 16 | 17 | let (servers, address) = rest::server::spawn_servers(framework.clone()); 18 | 19 | ui::start_ui(app_name, &address, is_launcher).log_expect("Failed to start UI"); 20 | 21 | // Explicitly hint that we want the servers instance until here. 22 | drop(servers); 23 | 24 | framework 25 | .write() 26 | .log_expect("Failed to write to framework to finalize") 27 | .shutdown() 28 | .log_expect("Failed to finalize framework"); 29 | } 30 | -------------------------------------------------------------------------------- /src/frontend/rest/assets.rs: -------------------------------------------------------------------------------- 1 | //! Serves static files from a asset directory. 2 | 3 | extern crate mime_guess; 4 | 5 | use self::mime_guess::from_ext; 6 | use self::mime_guess::mime::APPLICATION_OCTET_STREAM; 7 | 8 | macro_rules! include_files_as_assets { 9 | ( $target_match:expr, $( $file_name:expr ),* ) => { 10 | match $target_match { 11 | $( 12 | $file_name => Some(include_bytes!(concat!(concat!(env!("OUT_DIR"), "/static/"), $file_name)).as_ref()), 13 | )* 14 | _ => None 15 | } 16 | } 17 | } 18 | 19 | /// Returns a static file based upon a given String as a Path. 20 | /// 21 | /// file_path: String path, beginning with a / 22 | pub fn file_from_string(file_path: &str) -> Option<(String, &'static [u8])> { 23 | let guessed_mime = match file_path.rfind('.') { 24 | Some(ext_ptr) => { 25 | let ext = &file_path[ext_ptr + 1..]; 26 | 27 | from_ext(ext).first_or_octet_stream() 28 | } 29 | None => APPLICATION_OCTET_STREAM, 30 | }; 31 | 32 | let string_mime = guessed_mime.to_string(); 33 | 34 | let contents = include_files_as_assets!( 35 | file_path, 36 | "/index.html", 37 | "/favicon.ico", 38 | "/img/light_mode_installer_logo.png", 39 | "/img/dark_mode_installer_logo.png", 40 | "/thicc_logo_installer__ea_shadow.png", 41 | "/thicc_logo_installer_shadow.png", 42 | "/img/how-to-open.png", 43 | "/css/app.css", 44 | "/css/chunk-vendors.css", 45 | "/fonts/roboto-v18-latin-regular.eot", 46 | "/fonts/roboto-v18-latin-regular.woff", 47 | "/fonts/roboto-v18-latin-regular.woff2", 48 | "/fonts/materialdesignicons-webfont.eot", 49 | "/fonts/materialdesignicons-webfont.woff", 50 | "/fonts/materialdesignicons-webfont.woff2", 51 | "/js/chunk-vendors.js", 52 | "/js/app.js" 53 | )?; 54 | 55 | Some((string_mime, contents)) 56 | } 57 | -------------------------------------------------------------------------------- /src/frontend/rest/mod.rs: -------------------------------------------------------------------------------- 1 | //! frontend/rest/mod.rs 2 | //! 3 | //! Contains the main web server used within the application. 4 | 5 | mod assets; 6 | pub mod server; 7 | pub mod services; 8 | -------------------------------------------------------------------------------- /src/frontend/rest/server.rs: -------------------------------------------------------------------------------- 1 | //! frontend/rest/server.rs 2 | //! 3 | //! Contains the over-arching server object + methods to manipulate it. 4 | 5 | use crate::frontend::rest::services::WebService; 6 | 7 | use crate::installer::InstallerFramework; 8 | 9 | use crate::logging::LoggingErrors; 10 | 11 | use hyper::server::Http; 12 | 13 | use std::sync::{Arc, RwLock}; 14 | 15 | use std::net::{SocketAddr, TcpListener, ToSocketAddrs}; 16 | 17 | use std::thread; 18 | use std::thread::JoinHandle; 19 | 20 | /// Acts as a communication mechanism between the Hyper WebService and the rest of the 21 | /// application. 22 | pub struct WebServer { 23 | _handle: JoinHandle<()>, 24 | } 25 | 26 | impl WebServer { 27 | /// Creates a new web server with the specified address. 28 | pub fn with_addr( 29 | framework: Arc>, 30 | addr: SocketAddr, 31 | ) -> Result { 32 | let handle = thread::spawn(move || { 33 | let server = Http::new() 34 | .bind(&addr, move || Ok(WebService::new(framework.clone()))) 35 | .log_expect("Failed to bind to port"); 36 | 37 | server.run().log_expect("Failed to run HTTP server"); 38 | }); 39 | 40 | Ok(WebServer { _handle: handle }) 41 | } 42 | } 43 | 44 | /// Spawns a server instance on all local interfaces. 45 | /// 46 | /// Returns server instances + http address of service running. 47 | pub fn spawn_servers(framework: Arc>) -> (Vec, String) { 48 | // Firstly, allocate us an epidermal port 49 | let target_port = { 50 | let listener = TcpListener::bind("127.0.0.1:0") 51 | .log_expect("At least one local address should be free"); 52 | listener 53 | .local_addr() 54 | .log_expect("Should be able to pull address from listener") 55 | .port() 56 | }; 57 | 58 | // Now, iterate over all ports 59 | let addresses = "localhost:0" 60 | .to_socket_addrs() 61 | .log_expect("No localhost address found"); 62 | 63 | let mut instances = Vec::with_capacity(addresses.len()); 64 | let mut http_address = None; 65 | 66 | // Startup HTTP server for handling the web view 67 | for mut address in addresses { 68 | address.set_port(target_port); 69 | 70 | let server = WebServer::with_addr(framework.clone(), address) 71 | .log_expect("Failed to bind to address"); 72 | 73 | info!("Spawning server instance @ {:?}", address); 74 | 75 | http_address = Some(address); 76 | 77 | instances.push(server); 78 | } 79 | 80 | let http_address = http_address.log_expect("No HTTP address found"); 81 | 82 | ( 83 | instances, 84 | format!("http://localhost:{}", http_address.port()), 85 | ) 86 | } 87 | -------------------------------------------------------------------------------- /src/frontend/rest/services/attributes.rs: -------------------------------------------------------------------------------- 1 | //! frontend/rest/services/attributes.rs 2 | //! 3 | //! The /api/attr call returns an executable script containing session variables. 4 | 5 | use crate::frontend::rest::services::default_future; 6 | use crate::frontend::rest::services::Future; 7 | use crate::frontend::rest::services::Request; 8 | use crate::frontend::rest::services::Response; 9 | use crate::frontend::rest::services::WebService; 10 | 11 | use hyper::header::{ContentLength, ContentType}; 12 | 13 | use crate::logging::LoggingErrors; 14 | 15 | pub fn handle(service: &WebService, _req: Request) -> Future { 16 | let framework = service.get_framework_read(); 17 | 18 | let file = framework 19 | .base_attributes 20 | .to_json_str() 21 | .log_expect("Failed to render JSON representation of config"); 22 | 23 | default_future( 24 | Response::new() 25 | .with_header(ContentLength(file.len() as u64)) 26 | .with_header(ContentType::json()) 27 | .with_body(file), 28 | ) 29 | } 30 | -------------------------------------------------------------------------------- /src/frontend/rest/services/browser.rs: -------------------------------------------------------------------------------- 1 | //! frontend/rest/services/browser.rs 2 | //! 3 | //! Launches the user's web browser on request from the frontend. 4 | 5 | use crate::frontend::rest::services::Future as InternalFuture; 6 | use crate::frontend::rest::services::{Request, Response, WebService}; 7 | use crate::logging::LoggingErrors; 8 | use futures::{Future, Stream}; 9 | use hyper::header::ContentType; 10 | 11 | #[derive(Debug, Serialize, Deserialize, Clone)] 12 | struct OpenRequest { 13 | url: String, 14 | } 15 | 16 | pub fn handle(_service: &WebService, req: Request) -> InternalFuture { 17 | Box::new(req.body().concat2().map(move |body| { 18 | let req: OpenRequest = serde_json::from_slice(&body).log_expect("Malformed request"); 19 | if webbrowser::open(&req.url).is_ok() { 20 | Response::new() 21 | .with_status(hyper::Ok) 22 | .with_header(ContentType::json()) 23 | .with_body("{}") 24 | } else { 25 | Response::new() 26 | .with_status(hyper::BadRequest) 27 | .with_header(ContentType::json()) 28 | .with_body("{}") 29 | } 30 | })) 31 | } 32 | -------------------------------------------------------------------------------- /src/frontend/rest/services/config.rs: -------------------------------------------------------------------------------- 1 | //! frontend/rest/services/config.rs 2 | //! 3 | //! The /api/config call returns the current installer framework configuration. 4 | //! 5 | //! This endpoint should be usable directly from a 26 | 27 | 30 | 31 |
32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /ui/public/thicc_logo_installer__ea_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/public/thicc_logo_installer__ea_shadow.png -------------------------------------------------------------------------------- /ui/public/thicc_logo_installer_shadow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/public/thicc_logo_installer_shadow.png -------------------------------------------------------------------------------- /ui/src/assets/dark_mode_installer_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/dark_mode_installer_logo.png -------------------------------------------------------------------------------- /ui/src/assets/fonts/roboto-v18-latin-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/fonts/roboto-v18-latin-regular.eot -------------------------------------------------------------------------------- /ui/src/assets/fonts/roboto-v18-latin-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/fonts/roboto-v18-latin-regular.woff -------------------------------------------------------------------------------- /ui/src/assets/fonts/roboto-v18-latin-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/fonts/roboto-v18-latin-regular.woff2 -------------------------------------------------------------------------------- /ui/src/assets/how-to-open.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/how-to-open.png -------------------------------------------------------------------------------- /ui/src/assets/light_mode_installer_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/light_mode_installer_logo.png -------------------------------------------------------------------------------- /ui/src/assets/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/pineappleEA/liftinstall/587bfb2bc27925a53ff7ee94a717561bbfb89401/ui/src/assets/logo.png -------------------------------------------------------------------------------- /ui/src/helpers.js: -------------------------------------------------------------------------------- 1 | /** 2 | * helpers.js 3 | * 4 | * Additional state-less helper methods. 5 | */ 6 | 7 | /** 8 | * Makes a AJAX request, streaming each line as it arrives. Type should be text/plain, 9 | * each line will be interpreted as JSON separately. 10 | * 11 | * @param path The path to connect to. 12 | * @param callback A callback with a JSON payload. Called for every line as it comes. 13 | * @param successCallback A callback with a raw text payload. 14 | * @param failCallback A fail callback. Optional. 15 | * @param data POST data. Optional. 16 | */ 17 | export function stream_ajax (path, callback, successCallback, failCallback, data) { 18 | const req = new XMLHttpRequest() 19 | 20 | console.log('Making streaming HTTP request to ' + path) 21 | 22 | req.addEventListener('load', function () { 23 | // The server can sometimes return a string error. Make sure we handle this. 24 | if (this.status === 200) { 25 | successCallback(this.responseText) 26 | } else { 27 | failCallback(this.responseText) 28 | } 29 | }) 30 | 31 | let buffer = '' 32 | let seenBytes = 0 33 | 34 | req.onreadystatechange = function () { 35 | if (req.readyState > 2) { 36 | buffer += req.responseText.substr(seenBytes) 37 | 38 | let pointer 39 | while ((pointer = buffer.indexOf('\n')) >= 0) { 40 | const line = buffer.substring(0, pointer).trim() 41 | buffer = buffer.substring(pointer + 1) 42 | 43 | if (line.length === 0) { 44 | continue 45 | } 46 | 47 | const contents = JSON.parse(line) 48 | callback(contents) 49 | } 50 | 51 | seenBytes = req.responseText.length 52 | } 53 | } 54 | 55 | req.addEventListener('error', failCallback) 56 | 57 | req.open(data == null ? 'GET' : 'POST', path + '?nocache=' + Date.now(), true) 58 | // Rocket only currently supports URL encoded forms. 59 | req.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded') 60 | 61 | if (data != null) { 62 | let form = '' 63 | 64 | for (const key in data) { 65 | if (!data[key]) { 66 | continue 67 | } 68 | 69 | if (form !== '') { 70 | form += '&' 71 | } 72 | 73 | form += encodeURIComponent(key) + '=' + encodeURIComponent(data[key]) 74 | } 75 | 76 | req.send(form) 77 | } else { 78 | req.send() 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /ui/src/locales/.gitignore: -------------------------------------------------------------------------------- 1 | messages.json 2 | -------------------------------------------------------------------------------- /ui/src/locales/ca.json: -------------------------------------------------------------------------------- 1 | { 2 | "ca": { 3 | "locale": "Català", 4 | "error": { 5 | "title": "S'ha produït un error", 6 | "exit_error": "{msg}\n\nSi us plau, carregui l'arxiu de registre (a {path}) a l'equip de {name}", 7 | "location_unknown": "la ubicació on està aquest instal·lador" 8 | }, 9 | "complete": { 10 | "thanks": "Gràcies per instal·lar {name}!", 11 | "updated": "{name} s'ha actualitzat.", 12 | "uninstalled": "{name} s'ha desinstal·lat.", 13 | "up_to_date": "{name} ja està actualitzat!", 14 | "where_to_find": "Pot trobar les aplicacions instal·lades al seu menú d'inici. ", 15 | "migration_where_to_find": "Pot trobar les seves aplicacions instal·lades al seu menú d'inici; si es troba al mig d'alguna cosa, torni-ho a provar.", 16 | "migration_finished": "L'hem traslladat a la nova i única versió de {name}." 17 | }, 18 | "modify": { 19 | "title": "Esculli una opció:", 20 | "update": "Actualitzar", 21 | "uninstall": "Desinstal·lar", 22 | "prompt": "Està segur de que vol desinstal·lar {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Veure arxius locals", 25 | "prompt_recover": "Les dades de l'instal·lador per a {name} estan malmeses.
Cal una reparació per restaurar la instal·lació.", 26 | "prompt_confirm": "Desinstal·lar {name}", 27 | "modify": "Modificar", 28 | "repair": "Reparar" 29 | }, 30 | "auth": { 31 | "paste": "Enganxar", 32 | "token": "Token", 33 | "verify": "Verificar token", 34 | "page_header": "El canal de llançament d'accés anticipat li permet provar les últimes funcions experimentals i correccions abans que es fusionin al yuzu. Aquest canal inclou totes les actualitzacions diàries de yuzu, a més d'aquestes funcions exclusives.\n\nPer ser membre d'accés anticipat, ha de ser subscriptor d'accés anticipat a Patreon.", 35 | "page_opened": "Pàgina oberta! Comprovi el seu navegador predeterminat per a la pàgina i segueixi les instruccions que hi ha per enllaçar el seu compte de Patreon.\nQuan hagi acabat, introdueixi el token a continuació.", 36 | "login_failed": "Error a l'iniciar sessió!\n\nComprovi que el teu token sigui correcte i torni-ho a provar" 37 | }, 38 | "back": "Enrere", 39 | "exit": "Sortir", 40 | "yes": "Sí", 41 | "no": "No", 42 | "continue": "Continuar", 43 | "cancel": "Cancel·lar", 44 | "app": { 45 | "installer_title": "Benvingut a l'instal·lador de {name}!", 46 | "maintenance_title": "Benvingut a l'eina de manteniment de {name}.", 47 | "window_title": "Instal·lador de {name}", 48 | "installer_subtitle": "Estarem llestos en uns instants." 49 | }, 50 | "select_packages": { 51 | "title": "Seleccioni quins paquets vol instal·lar:", 52 | "installed": "(Instal·lat)", 53 | "advanced": "Avançat...", 54 | "install": "Instal·lar", 55 | "location": "Ubicació d'instal·lació", 56 | "select": "Seleccionar", 57 | "overwriting": "Sobreescrivint", 58 | "options": "Opcions d'instal·lació", 59 | "title_repair": "Seleccioni quins paquets vol reparar:", 60 | "location_placeholder": "Introdueixi una ruta d'instal·lació aquí", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Si us plau, seleccioni almenys un paquet a instal·lar!", 63 | "nothing_picked": "Res seleccionat", 64 | "option_shortcut": "Crear un accés directe al escriptori" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Desinstal·lant...", 68 | "install": "Instal·lant...", 69 | "check_for_update": "Comprovant actualitzacions...", 70 | "self_update": "Descarregant una auto-actualització...", 71 | "please_wait": "Si us plau, esperi..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Descarregant configuració...", 75 | "error_download_config": "S'ha produït un error mentre descarregàvem la configuració: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/cs.json: -------------------------------------------------------------------------------- 1 | { 2 | "cs": { 3 | "locale": "Česky", 4 | "error": { 5 | "title": "Objevil se error", 6 | "exit_error": "{msg}\n\nProsím nahrajte záznamoví soubor (do {path}) pro {name} tým", 7 | "location_unknown": "místo kde se instalátor nachází" 8 | }, 9 | "complete": { 10 | "thanks": "Děkujeme za instalování {name}!", 11 | "updated": "{name} byl aktualizován.", 12 | "uninstalled": "{name} byl odinstalován.", 13 | "up_to_date": "{name} už je aktuální!", 14 | "where_to_find": "Nainstalované aplikace můžete najít ve vašem start menu.", 15 | "migration_where_to_find": "Nainstalované aplikace můžete najít ve vašem start menu - jestli jste byly uprostřed něčeho, prosím zkuste to znovu.", 16 | "migration_finished": "Byly jste přesunuti do nové, jediné verze {name}." 17 | }, 18 | "modify": { 19 | "title": "Vyberte možnost:", 20 | "update": "Aktualizovat", 21 | "uninstall": "Odinstalovat", 22 | "prompt": "Jste si jistý že chcete odinstalovat {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Zobrazit místní soubory", 25 | "prompt_recover": "Data instalátoru pro {name} jsou poškozený.
Oprava je potřeba pro obnovní instalace.", 26 | "prompt_confirm": "Odinstalovat {name}", 27 | "modify": "Modifikovat", 28 | "repair": "Opravit" 29 | }, 30 | "auth": { 31 | "paste": "Vložit", 32 | "token": "Token", 33 | "verify": "Ověřit Token", 34 | "page_header": "Early Access kanál pro zveřejňovaní vám umožní si vyzkoušet nejnovější experimentální funkce and opravy, před tím než spojeny s yuzu. Tento kanál obsahuje všechny pravidelné denní yuzu aktualizace, k tomu ještě tyto exkluzivní funkce.\n\nAby jste se stal Early Access členem, musíte se jako první stát Patreon Early Access odběratelem.", 35 | "page_opened": "Stránka otevřena! Zkontrolujte váš výchozí prohlížeč pro stránku s instrukcemi a postupujte podle pokynů pro propojení patreon účtu.\nAž budete hotoví, vložte token níže.", 36 | "login_failed": "Přihlášení selhalo!\n\nUjistěte se, že jste zadali token správně a zkuste to znovu." 37 | }, 38 | "back": "Zpět", 39 | "exit": "Opustit", 40 | "yes": "Ano", 41 | "no": "Ne", 42 | "continue": "Pokračovat", 43 | "cancel": "Zrušit", 44 | "app": { 45 | "installer_title": "Vítejte v {name} instalátoru!", 46 | "maintenance_title": "Vítejte v {name} Nástroji pro Údržbu.", 47 | "window_title": "{name} Instalátor", 48 | "installer_subtitle": "Za chvilku vás uvedeme zpátky do provozu." 49 | }, 50 | "select_packages": { 51 | "title": "Vyberte balíček, který si chcete nainstalovat:", 52 | "installed": "(nainstalováno)", 53 | "advanced": "Pokročilé...", 54 | "install": "Nainstalovat", 55 | "location": "Místo Instalace", 56 | "select": "Vyberte", 57 | "overwriting": "Přepisování", 58 | "options": "Možnosti Instalace", 59 | "title_repair": "Vyberte balíček, který chcete opravit:", 60 | "location_placeholder": "Sem zadejte místo instalace", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Prosím vyberte alespoň jeden balíček na instalování!", 63 | "nothing_picked": "Nic nevybráno", 64 | "option_shortcut": "Vytvořit Zástupce na Plochu" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Odinstalovávám...", 68 | "install": "Instaluji...", 69 | "check_for_update": "Hledám nové aktualizace...", 70 | "self_update": "Stahuji samo-aktualizaci...", 71 | "please_wait": "Prosím čekejte..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Stahuji konfigurace...", 75 | "error_download_config": "Error se objevil při stahování konfigurace: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/de.json: -------------------------------------------------------------------------------- 1 | { 2 | "de": { 3 | "locale": "Deutsch", 4 | "error": { 5 | "title": "Ein Fehler ist aufgetreten", 6 | "exit_error": "{msg}\n\nBitte laden sie die Log-Datei (in {path}) für das {name} Team hoch.", 7 | "location_unknown": "der Ort an dem sich der Installer befindet" 8 | }, 9 | "complete": { 10 | "thanks": "Danke fürs installieren {name}!", 11 | "updated": "{name} wurde aktualisiert.", 12 | "uninstalled": "{name} wurde deinstalliert.", 13 | "up_to_date": "{name} ist bereits auf dem neusten Stand", 14 | "where_to_find": "Sie finden Ihre installierten Anwendungen im Startmenü.", 15 | "migration_where_to_find": "Sie finden Ihre installierten Anwendungen in Ihrem Startmenü - wenn Sie gerade mit etwas beschäftigt waren, versuchen Sie es einfach noch einmal.", 16 | "migration_finished": "Sie wurden in die neue, einfache Version von {Name} migriert." 17 | }, 18 | "modify": { 19 | "title": "Wähle eine Option:", 20 | "update": "Aktualisieren", 21 | "uninstall": "Deinstallieren", 22 | "prompt": "Bist du sicher dass du {name} deinstallieren möchtest?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Lokale Dateien anzeigen", 25 | "prompt_recover": "Die Installationsdaten für {name} sind beschädigt.
Eine Reperatur wird benötigt um die Installation wiederherzustellen.", 26 | "prompt_confirm": "{name} deinstallieren", 27 | "modify": "Modifizieren", 28 | "repair": "Reparieren" 29 | }, 30 | "auth": { 31 | "paste": "Einfügen", 32 | "token": "Token", 33 | "verify": "Token verifizieren", 34 | "page_header": "Im Early-Access-Channel können Sie die neuesten experimentellen Funktionen und Korrekturen ausprobieren, bevor sie in yuzu integriert werden. Dieser Kanal enthält alle regulären täglichen Updates von yuzu sowie diese exklusiven Funktionen.\n\nUm ein Early Access-Mitglied zu sein, müssen Sie ein Patreon Early Access-Abonnent sein.", 35 | "page_opened": "Seite geöffnet! Folgen Sie den Anweisungen in ihrem Browser, um Ihr Patreon-Konto zu verknüpfen.\nDanach geben Sie den Token unten ein.", 36 | "login_failed": "Login fehlgeschlagen!\n\nÜberprüfen Sie, ob Ihr Token korrekt ist und versuchen Sie es erneut." 37 | }, 38 | "back": "Zurück", 39 | "exit": "Verlassen", 40 | "yes": "Ja", 41 | "no": "Nein", 42 | "continue": "Fortsetzen", 43 | "cancel": "Abbrechen", 44 | "app": { 45 | "installer_title": "Willkommen zum {name}-Installer!", 46 | "maintenance_title": "Willkommen zum {name}-Wartungstool!", 47 | "window_title": "{name} Installer", 48 | "installer_subtitle": "In nur wenigen Augenblicken sind wir startklar." 49 | }, 50 | "select_packages": { 51 | "title": "Wähle die Pakete aus die du installieren möchtest:", 52 | "installed": "(Installieren)", 53 | "advanced": "Erweitert...", 54 | "install": "Installieren", 55 | "location": "Installationsort", 56 | "select": "Auswählen", 57 | "overwriting": "Überschreiben", 58 | "options": "Installationsoptionen", 59 | "title_repair": "Wählen Sie die Pakete aus, die Sie reparieren möchten:", 60 | "location_placeholder": "Gib hier den Installationspfad an", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Bitte wähle mindestens ein Paket zum installieren aus!", 63 | "nothing_picked": "Nichts ausgewählt", 64 | "option_shortcut": "Desktopverknüpfung erstellen" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Deinstallieren...", 68 | "install": "Installieren...", 69 | "check_for_update": "Suche nach Updates...", 70 | "self_update": "Selbst-Update wird heruntergeladen...", 71 | "please_wait": "Bitte warten..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Konfiguration wird heruntergeladen...", 75 | "error_download_config": "Fehler beim Herunterladen der Konfiguration: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/en.json: -------------------------------------------------------------------------------- 1 | { 2 | "en":{ 3 | "locale":"English", 4 | "app":{ 5 | "installer_title":"Welcome to the {name} installer!", 6 | "installer_subtitle":"We will have you up and running in just a few moments.", 7 | "maintenance_title":"Welcome to the {name} Maintenance Tool.", 8 | "window_title":"{name} Installer" 9 | }, 10 | "download_config":{ 11 | "download_config":"Downloading config...", 12 | "error_download_config":"Got error while downloading config: {msg}" 13 | }, 14 | "select_packages":{ 15 | "title":"Select which packages you want to install:", 16 | "title_repair":"Select which packages you want to repair:", 17 | "installed":"(installed)", 18 | "advanced":"Advanced...", 19 | "install":"Install", 20 | "modify":"Modify", 21 | "repair": "Repair", 22 | "location":"Install Location", 23 | "location_placeholder":"Enter a install path here", 24 | "select":"Select", 25 | "overwriting": "Overwriting", 26 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 27 | "nothing_picked": "Nothing selected", 28 | "nothing_picked_warning": "Please select at least one package to install!", 29 | "options": "Install Options", 30 | "option_shortcut": "Create Desktop Shortcut" 31 | }, 32 | "install_packages":{ 33 | "check_for_update":"Checking for updates...", 34 | "uninstall":"Uninstalling...", 35 | "self_update":"Downloading self-update...", 36 | "install":"Installing...", 37 | "please_wait":"Please wait..." 38 | }, 39 | "error":{ 40 | "title":"An error occurred", 41 | "exit_error":"{msg}\n\nPlease upload the log file (in {path}) to the {name} team", 42 | "location_unknown":"the location where this installer is" 43 | }, 44 | "complete":{ 45 | "thanks":"Thanks for installing {name}!", 46 | "up_to_date":"{name} is already up to date!", 47 | "updated":"{name} has been updated.", 48 | "uninstalled":"{name} has been uninstalled.", 49 | "where_to_find":"You can find your installed applications in your start menu.", 50 | "migration_where_to_find": "You can find your installed applications in your start menu - if you were in the middle of something, just reattempt.", 51 | "migration_finished": "You have been moved to the new, single version of {name}." 52 | }, 53 | "modify":{ 54 | "title":"Choose an option:", 55 | "update":"Update", 56 | "modify":"Modify", 57 | "repair": "Repair", 58 | "uninstall":"Uninstall", 59 | "view_local_files": "View local files", 60 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to continue?", 61 | "prompt_recover": "Installer data for {name} is corrupted.
A repair is required to restore the installation.", 62 | "prompt":"Are you sure you want to uninstall {name}?", 63 | "prompt_confirm":"Uninstall {name}" 64 | }, 65 | "auth":{ 66 | "paste": "Paste", 67 | "token": "Token", 68 | "verify": "Verify Token", 69 | "page_header": "The Early Access release channel lets you try out the latest experimental features and fixes, before they are merged into yuzu. This channel includes all regular yuzu daily updates, plus these exclusive features.\n\nTo be an Early Access member, you must be a Patreon Early Access Subscriber.", 70 | "page_opened": "Page opened! Check your default browser for the page, and follow the instructions there to link your patreon account.\nWhen you are done, enter the token below.", 71 | "login_failed": "Login failed!\n\nDouble check that your token is correct and try again" 72 | }, 73 | "back":"Back", 74 | "exit":"Exit", 75 | "yes":"Yes", 76 | "no":"No", 77 | "continue": "Continue", 78 | "cancel":"Cancel" 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /ui/src/locales/es.json: -------------------------------------------------------------------------------- 1 | { 2 | "es": { 3 | "locale": "Español", 4 | "error": { 5 | "title": "Ha ocurrido un error", 6 | "exit_error": "{msg}\n\nPor favor, suba el archivo del registro (en {path}) al equipo de {name}", 7 | "location_unknown": "la ubicación donde se encuentra el instalador" 8 | }, 9 | "complete": { 10 | "thanks": "¡Gracias por instalar {name}!", 11 | "updated": "{name} ha sido actualizado.", 12 | "uninstalled": "{name} ha sido desinstalado.", 13 | "up_to_date": "¡{name} ya está actualizado!", 14 | "where_to_find": "Puedes encontrar las aplicaciones instaladas en el menú de inicio.", 15 | "migration_where_to_find": "Puedes encontrar tus aplicaciones instaladas en el menú de inicio - si estabas en mitad de algo, reinténtalo.", 16 | "migration_finished": "Se ha actualizado a la nueva y única versión de {name}." 17 | }, 18 | "modify": { 19 | "title": "Elige una opción:", 20 | "update": "Actualizar", 21 | "uninstall": "Desinstalar", 22 | "prompt": "¿Estás seguro que deseas desinstalar {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Ver archivos locales", 25 | "prompt_recover": "Los datos de la instalación de {name} están corruptos.
Se necesita una reparación para restaurar la instalación.", 26 | "prompt_confirm": "Desinstalar {name}", 27 | "modify": "Modificar", 28 | "repair": "Reparar" 29 | }, 30 | "auth": { 31 | "paste": "Pegar", 32 | "token": "Token", 33 | "verify": "Verificar Token", 34 | "page_header": "El canal de acceso Early Access te permitirá probar las últimas características experimentales y arreglos antes de que lleguen a yuzu. Este canal incluye todas las actualizaciones diarias de yuzu, además de las características exclusivas.\n\nPara unirte al Early Access, debes ser un Suscriptor del Early Access en Patreon.", 35 | "page_opened": "¡Página abierta! Comprueba la página en tu explorador por defecto, y sigue las instrucciones para vincular tu cuenta de Patreon.\nCuando termines, introduzca el token abajo.", 36 | "login_failed": "¡Acceso fallido!\n\nComprueba que tu token sea el correcto e inténtelo de nuevo" 37 | }, 38 | "back": "Atrás", 39 | "exit": "Salir", 40 | "yes": "Sí", 41 | "no": "No", 42 | "continue": "Continuar", 43 | "cancel": "Cancelar", 44 | "app": { 45 | "installer_title": "¡Te damos la bienvenida al instalador de {name}!", 46 | "maintenance_title": "Te damos la bienvenida a la Herramienta de Mantenimiento de {name}.", 47 | "window_title": "Instalador de {name}", 48 | "installer_subtitle": "Tendremos todo listo y funcional en unos minutos." 49 | }, 50 | "select_packages": { 51 | "title": "Seleccione los paquetes que desea instalar:", 52 | "installed": "(instalado)", 53 | "advanced": "Avanzado...", 54 | "install": "Instalar", 55 | "location": "Ubicación de la instalación", 56 | "select": "Elegir", 57 | "overwriting": "Sobreescribir", 58 | "options": "Opciones de instalación", 59 | "title_repair": "Seleccione los paquetes que desea reparar:", 60 | "location_placeholder": "Introduce una ruta de instalación aquí", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "¡Por favor, seleccione al menos un paquete para la instalación!", 63 | "nothing_picked": "Nada seleccionado", 64 | "option_shortcut": "Crear acceso directo en el escritorio" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Desinstalando...", 68 | "install": "Instalando...", 69 | "check_for_update": "Comprobando actualizaciones...", 70 | "self_update": "Descargando actualización automática...", 71 | "please_wait": "Por favor, espere..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Descargando config...", 75 | "error_download_config": "Se ha producido un error durante la descarga del config: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/id.json: -------------------------------------------------------------------------------- 1 | { 2 | "id": { 3 | "locale": "Bahasa Indonesia", 4 | "error": { 5 | "title": "Terjadi kesalahan", 6 | "exit_error": "{msg}\n\nHarap unggah file log (di {path}) kepada tim {name}", 7 | "location_unknown": "lokasi dimana penginstal ini berada" 8 | }, 9 | "complete": { 10 | "thanks": "Terima kasih telah menginstal {name}!", 11 | "updated": "{name} telah diperbaharui.", 12 | "uninstalled": "{name} telah di hapus.", 13 | "up_to_date": "{name} sudah up-to-date!", 14 | "where_to_find": "Anda dapat menemukan aplikasi yang terinstal di start menu anda.", 15 | "migration_where_to_find": "Anda dapat menemukan aplikasi yang terinstal di start menu anda - jika anda sedang mengerjakan sesuatu yang lain, coba lagi.", 16 | "migration_finished": "Anda telah dipindahkan ke versi tunggal yang baru dari {name}." 17 | }, 18 | "modify": { 19 | "title": "Pilih opsi:", 20 | "update": "Perbaharui", 21 | "uninstall": "Copot Instalasi", 22 | "prompt": "Apakah anda yakin untuk menghapus {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Lihat file lokal", 25 | "prompt_recover": "Data instalatur untuk {name} rusak.
Diperlukan perbaikan untuk memulihkan instalasi.", 26 | "prompt_confirm": "Hapus {name}", 27 | "modify": "Modifikasi", 28 | "repair": "Perbaiki" 29 | }, 30 | "auth": { 31 | "paste": "Tempel", 32 | "token": "Token", 33 | "verify": "Verifikasi Token", 34 | "page_header": "Saluran rilis Early Access memperbolehkan anda untuk mencoba fitur eksperimental dan perbaikan terbaru sebelum mereka disatukan menjadi yuzu. Saluran ini mencakup semua pembaruan harian yuzu reguler, ditambah fitur-fitur ekslusif ini.\n\nUntuk menjadi anggota Early Access, anda harus menjadi pelanggan Early Access Patreon.", 35 | "page_opened": "Halaman dibuka! Periksa peramban anda untuk halamannya, dan ikuti instruksi yang ada untuk menghubungkan akun patreon anda.\nJika anda sudah selesai, masukkan token di bawah.", 36 | "login_failed": "Login gagal!\n\nPeriksa kembali token anda dan coba lagi" 37 | }, 38 | "back": "Kembali", 39 | "exit": "Keluar", 40 | "yes": "Ya", 41 | "no": "Tidak", 42 | "continue": "Lanjut", 43 | "cancel": "Batalkan", 44 | "app": { 45 | "installer_title": "Selamat datang di instalatur {name}!", 46 | "maintenance_title": "Selamat datang di Maintenance Tool {name}.", 47 | "window_title": "{name} Instalatur", 48 | "installer_subtitle": "Kami akan membuat anda siap dan berjalan hanya dalam beberapa saat." 49 | }, 50 | "select_packages": { 51 | "title": "Pilih paket mana yang ingin Anda install:", 52 | "installed": "(terinstal)", 53 | "advanced": "Lanjutan...", 54 | "install": "Instal", 55 | "location": "Lokasi Instal", 56 | "select": "Pilih", 57 | "overwriting": "Menimpa", 58 | "options": "Opsi Instal", 59 | "title_repair": "Pilih paket mana yang ingin anda perbaiki:", 60 | "location_placeholder": "Masukkan lokasi instal di sini", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Silakan pilih setidaknya satu paket untuk diinstal!", 63 | "nothing_picked": "Tidak ada yang dipilih", 64 | "option_shortcut": "Buat Pintasan Desktop" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Mencopot Instalan...", 68 | "install": "Menginstal...", 69 | "check_for_update": "Memeriksa pembaruan...", 70 | "self_update": "Mengunduh pembaruan diri...", 71 | "please_wait": "Mohon tunggu..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Mengunduh konfigurasi...", 75 | "error_download_config": "Mendapatkan kesalahan saat mengunduh konfigurasi: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/it.json: -------------------------------------------------------------------------------- 1 | { 2 | "it": { 3 | "locale": "Italiano", 4 | "error": { 5 | "title": "Si è verificato un errore", 6 | "exit_error": "{msg}\n\nPer favore carica il file di registro (in {path}) nel {name}", 7 | "location_unknown": "la posizione in cui si trova il programma di installazione è" 8 | }, 9 | "complete": { 10 | "thanks": "Grazie per aver installato {name}!", 11 | "updated": "{name} è stato aggiornato.", 12 | "uninstalled": "{name} è stato disinstallato.", 13 | "up_to_date": "{name} è già aggiornato!", 14 | "where_to_find": "Puoi trovare le applicazioni installate nel tuo menu di avvio.", 15 | "migration_where_to_find": "Puoi trovare le applicazioni installate nel tuo menu di avvio", 16 | "migration_finished": "Sei stato spostato alla nuova versione di {name}." 17 | }, 18 | "modify": { 19 | "title": "Scegli un'opzione:", 20 | "update": "Aggiorna", 21 | "uninstall": "Disinstalla", 22 | "prompt": "Sei sicuro di voler disinstallare {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Visualizza i file locali", 25 | "prompt_recover": "I dati di installazione del programma {name} sono danneggiati.
È necessaria la riparazione per ripristinare l'installazione.", 26 | "prompt_confirm": "Disinstalla {name}", 27 | "modify": "Modifica", 28 | "repair": "Ripara" 29 | }, 30 | "auth": { 31 | "paste": "Incolla", 32 | "token": "Token", 33 | "verify": "Verifica token", 34 | "page_header": "Il canale di rilascio dell'accesso anticipato ti consente di provare le ultime funzionalità e correzioni sperimentali, prima che vengano rilasciate in yuzu. Questo canale include tutti gli aggiornamenti quotidiani regolari di yuzu, oltre ad altre funzionalità esclusive.\nPer essere un membro Early Access, devi essere abbonato a Patreon Early Access.", 35 | "page_opened": "Pagina aperta! Controlla il tuo browser e segui le istruzioni per collegare il tuo account patreon.\nQuando hai finito, inserisci il token qui sotto.", 36 | "login_failed": "Accesso fallito!\n\nRicontrolla che il tuo token sia corretto e riprova" 37 | }, 38 | "back": "Indietro", 39 | "exit": "Esci", 40 | "yes": "Si", 41 | "no": "No", 42 | "continue": "Continua", 43 | "cancel": "Annulla", 44 | "app": { 45 | "installer_title": "Benvenuto nell'installer di {name}!", 46 | "maintenance_title": "Benvenuto nello strumento di manutenzione di {name}.", 47 | "window_title": "Installer di {name}", 48 | "installer_subtitle": "Sarà pronto in pochi istanti." 49 | }, 50 | "select_packages": { 51 | "title": "Seleziona i pacchetti che vuoi installare:", 52 | "installed": "(installato)", 53 | "advanced": "Avanzate", 54 | "install": "Installa", 55 | "location": "Percorso di installazione", 56 | "select": "Seleziona", 57 | "overwriting": "Sovrascrivendo", 58 | "options": "Opzioni di installazione", 59 | "title_repair": "Seleziona i pacchetti da riparare:", 60 | "location_placeholder": "Inserisci un percorso di installazione", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Seleziona almeno un pacchetto da installare!", 63 | "nothing_picked": "Niente di selezionato", 64 | "option_shortcut": "Crea una scorciatoia sul desktop" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Sto disinstallando...", 68 | "install": "Installazione in corso...", 69 | "check_for_update": "Ricerca di aggiornamenti in corso...", 70 | "self_update": "Download dell'aggiornamento in corso...", 71 | "please_wait": "Attendere prego..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Scaricamento della configurazione....", 75 | "error_download_config": "Si è verificato un errore durante il download della configurazione: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/ko_KR.json: -------------------------------------------------------------------------------- 1 | { 2 | "ko-KR": { 3 | "locale": "한국어", 4 | "error": { 5 | "title": "오류가 발생했습니다", 6 | "exit_error": "{msg}\n\n{path}에 있는 로그 파일을 {name} 에 업로드하세요", 7 | "location_unknown": "설치 프로그램이 있는 위치" 8 | }, 9 | "complete": { 10 | "thanks": "{name} 을 설치해 주셔서 감사합니다!", 11 | "updated": "{name} 이 업데이트 되었습니다", 12 | "uninstalled": "{name} 이 제거 되었습니다", 13 | "up_to_date": "{name} 은(는) 이미 최신 버전입니다!", 14 | "where_to_find": "시작 메뉴에서 설치한 프로그램을 찾을 수 있습니다", 15 | "migration_where_to_find": "시작 메뉴에서 설치된 응용 프로그램을 찾을 수 있습니다. 설치중이었다면 다시 시도하십시오.", 16 | "migration_finished": "{name}의 새로운 단일 버전으로 이동되었습니다." 17 | }, 18 | "modify": { 19 | "title": "옵션 선택:", 20 | "update": "업데이트", 21 | "uninstall": "제거", 22 | "prompt": "정말 {name} 을 제거하시겠습니까?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "로컬 파일 보기", 25 | "prompt_recover": "{name}의 설치 프로그램 데이터가 손상되었습니다.
설치를 복원하려면 복구가 필요합니다.", 26 | "prompt_confirm": "{name} 삭제", 27 | "modify": "수정", 28 | "repair": "복구" 29 | }, 30 | "auth": { 31 | "paste": "붙여넣기", 32 | "token": "토큰", 33 | "verify": "검증 토큰", 34 | "page_header": "얼리 엑세스 릴리스 채널을 통해 yuzu에 병합되기 전에 최신 실험 기능 및 수정 사항을 시험해 볼 수 있습니다. 이 채널에는 모든 정기 yuzu 일일 업데이트와 이러한 독점 기능이 포함됩니다.\n\nEarly Access 회원이 되려면 Patreon Early Access 가입자여야 합니다.", 35 | "page_opened": "페이지가 열렸습니다! 페이지의 기본 브라우저를 확인하고 해당 페이지의 지침에 따라 Patreon 계정을 연결하세요.\n완료되면 아래 토큰을 입력하십시오.", 36 | "login_failed": "로그인 실패!\n\n토큰이 올바른지 다시 확인하고 다시 시도하세요" 37 | }, 38 | "back": "뒤로", 39 | "exit": "종료", 40 | "yes": "예", 41 | "no": "아니요", 42 | "continue": "계속", 43 | "cancel": "취소", 44 | "app": { 45 | "installer_title": "{name} 설치 프로그램에 오신 것을 환영합니다!", 46 | "maintenance_title": "{name} 관리 도구에 오신 것을 환영합니다!", 47 | "window_title": "{name} 설치 프로그램", 48 | "installer_subtitle": "몇 분 안에 준비하여 실행할 수 있습니다" 49 | }, 50 | "select_packages": { 51 | "title": "설치할 패키지를 선택하세요:", 52 | "installed": "(설치됨)", 53 | "advanced": "고급...", 54 | "install": "설치", 55 | "location": "설치 위치", 56 | "select": "선택", 57 | "overwriting": "덮어쓰기", 58 | "options": "설치 옵션", 59 | "title_repair": "복구할 패키지 선택:", 60 | "location_placeholder": "여기에 설치 경로를 입력하세요", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "설치할 패키지를 하나 이상 선택하세요!", 63 | "nothing_picked": "아무것도 선택되지 않았습니다", 64 | "option_shortcut": "바탕화면 바로가기 만들기" 65 | }, 66 | "install_packages": { 67 | "uninstall": "제거중...", 68 | "install": "설치중...", 69 | "check_for_update": "업데이트 확인 중...", 70 | "self_update": "수동 업데이트 다운로드중...", 71 | "please_wait": "잠시 기다려 주세요..." 72 | }, 73 | "download_packages": { 74 | "download_config": "설정 파일 다운로드중...", 75 | "error_download_config": "설정 파일 다운로드 중 오류 발생: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/nb.json: -------------------------------------------------------------------------------- 1 | { 2 | "nb": { 3 | "locale": "Bokmål", 4 | "error": { 5 | "title": "En feil oppsto", 6 | "exit_error": "{msg}\n\nVennlist last opp loggfilen (i {path} til {name}-teamet", 7 | "location_unknown": "plasseringen til installasjonsprogrammet" 8 | }, 9 | "complete": { 10 | "thanks": "Takk for at du installerte {name}!", 11 | "updated": "{name} har blitt oppdatert.", 12 | "uninstalled": "{name} har blitt avinstallert.", 13 | "up_to_date": "{name} er allerede oppdatert!", 14 | "where_to_find": "Du kan finne de installerte programmene i startmenyen.", 15 | "migration_where_to_find": "Du kan finne de installerte programmene i startmenyen – hvis du var midt oppi noe, bare prøv på nytt.", 16 | "migration_finished": "Du har blitt flyttet til den nye, forente versjonen av {name}." 17 | }, 18 | "modify": { 19 | "title": "Velg en handling:", 20 | "update": "Oppdatering", 21 | "uninstall": "Avinstaller", 22 | "prompt": "Er du sikker på at du vil avinstallere {navn}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Vis lokale filer", 25 | "prompt_recover": "Installasjonsdata for {name} er korrupt.
Reparasjon er nødvendig for å gjenopprette installasjonen.", 26 | "prompt_confirm": "Avinstaller {name}", 27 | "modify": "Modifiser", 28 | "repair": "Reparer" 29 | }, 30 | "auth": { 31 | "paste": "Lim inn", 32 | "token": "Token", 33 | "verify": "Verifiser token", 34 | "page_header": "Early Access–kanalen lar deg prøve den siste eksperimentelle funksjonaliteten og fiksene, før de kommer inn i yuzu. Denne kanalen inkluderer alle de vanlige daglige yuzu-oppdateringene, i tillegg til denne eksklusive funksjonaliteten.\n\nFor å bli et Early Access–medlem må du være en Patreon Early Access–abonnent.", 35 | "page_opened": "Side åpnet! Se etter siden i standardnettleseren din, og følg instruksjonene der for å koble til Patreon-kontoen din.\nNår du er ferdig, skriv inn token-en under.", 36 | "login_failed": "Innlogging feilet!\n\nDobbeltsjekk at token-en din er korrekt og prøv på nytt" 37 | }, 38 | "back": "Tilbake", 39 | "exit": "Avslutt", 40 | "yes": "Ja", 41 | "no": "Nei", 42 | "continue": "Fortsett", 43 | "cancel": "Avbryt", 44 | "app": { 45 | "installer_title": "Velkommen til installasjonsprogrammet for {navn}!", 46 | "maintenance_title": "Velkommen til vedlikeholdsverktøyet for {navn}.", 47 | "window_title": "Installasjonsprogram for {navn}", 48 | "installer_subtitle": "Vi er klar til å kjøre om noen få øyeblikk." 49 | }, 50 | "select_packages": { 51 | "title": "Velg hvilke pakker du ønsker å installere:", 52 | "installed": "(installert)", 53 | "advanced": "Avansert...", 54 | "install": "Installer", 55 | "location": "Installasjonsdestinasjon", 56 | "select": "Velg", 57 | "overwriting": "Overskriver", 58 | "options": "Installasjonsinnstillinger", 59 | "title_repair": "Velg hvilke pakker du ønsker å reparere:", 60 | "location_placeholder": "Skriv inn en installasjonssti her", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Vennligst velg minst én pakke å installere!", 63 | "nothing_picked": "Ingen ting valgt", 64 | "option_shortcut": "Lag skrivebordssnarvei" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Avinstallerer...", 68 | "install": "Installerer...", 69 | "check_for_update": "Ser etter oppdateringer...", 70 | "self_update": "Laster ned selvoppdatering...", 71 | "please_wait": "Vennligst vent..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Laster ned konfigurasjon...", 75 | "error_download_config": "Mottok feilmelding under nedlasting av konfigurasjon: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/pl.json: -------------------------------------------------------------------------------- 1 | { 2 | "pl": { 3 | "locale": "Polski", 4 | "error": { 5 | "title": "Wystąpił błąd", 6 | "exit_error": "{msg}\n\nPrześlij plik dziennika (w {path}) do zespołu {name}", 7 | "location_unknown": "lokalizacja, w której znajduje się ten instalator" 8 | }, 9 | "complete": { 10 | "thanks": "Dziękujemy za zainstalowanie {name}!", 11 | "updated": "{name} zostało zaktualizowane.", 12 | "uninstalled": "{name} zostało odinstalowane.", 13 | "up_to_date": "{name} jest już aktualne!", 14 | "where_to_find": "Zainstalowane aplikacje można znaleźć w menu Start.", 15 | "migration_where_to_find": "Zainstalowane aplikacje możesz znaleźć w menu Start - jeśli byłeś w trakcie czegoś, po prostu spróbuj ponownie.", 16 | "migration_finished": "Zostałeś przeniesiony do nowej, pojedynczej wersji {name}." 17 | }, 18 | "modify": { 19 | "title": "Wybierz opcję:", 20 | "update": "Zaktualizuj", 21 | "uninstall": "Odinstaluj", 22 | "prompt": "Czy na pewno chcesz odinstalować {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Wyświetl lokalne pliki", 25 | "prompt_recover": "Dane instalatora dla {name} są uszkodzone.
Do przywrócenia instalacji wymagana jest naprawa.", 26 | "prompt_confirm": "Odinstaluj {name}", 27 | "modify": "Modyfikuj", 28 | "repair": "Napraw" 29 | }, 30 | "auth": { 31 | "paste": "Wklej", 32 | "token": "Token", 33 | "verify": "Zweryfikuj Token", 34 | "page_header": "Kanał wersji Early Access pozwala wypróbować najnowsze eksperymentalne funkcje i poprawki, zanim zostaną one połączone z yuzu. Ten kanał zawiera wszystkie regularne codzienne aktualizacje yuzu oraz te ekskluzywne funkcje.\n\nAby zostać członkiem Early Access, musisz być subskrybentem Patreon Early Access.", 35 | "page_opened": "Strona otwarta! Sprawdź domyślną przeglądarkę dla strony i postępuj zgodnie z instrukcjami, aby połączyć swoje konto patreon.\nGdy skończysz, wprowadź poniższy token.", 36 | "login_failed": "Logowanie nie powiodło się!\n\nSprawdź dokładnie, czy Twój Token jest poprawny i spróbuj ponownie." 37 | }, 38 | "back": "Cofnij", 39 | "exit": "Wyjście", 40 | "yes": "Tak", 41 | "no": "Nie", 42 | "continue": "Kontynuuj", 43 | "cancel": "Anuluj", 44 | "app": { 45 | "installer_title": "Witaj w instalatorze {name}!", 46 | "maintenance_title": "Witaj w narzędziu do konserwacji {name}!", 47 | "window_title": "Instalator {name}", 48 | "installer_subtitle": "Już za chwilę będziesz mógł pracować." 49 | }, 50 | "select_packages": { 51 | "title": "Wybierz które pakiety chcesz zainstalować:", 52 | "installed": "(zainstalowano)", 53 | "advanced": "Zaawansowane...", 54 | "install": "Zainstaluj", 55 | "location": "Lokacja instalacji", 56 | "select": "Wybierz", 57 | "overwriting": "Nadpisywanie", 58 | "options": "Opcje instalacji", 59 | "title_repair": "Wybierz które pakiety chcesz naprawić:", 60 | "location_placeholder": "Wybierz miejsce instalacji", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Wybierz co najmniej jeden pakiet do zainstalowania!", 63 | "nothing_picked": "Nic nie wybrano", 64 | "option_shortcut": "Utwórz skrót na pulpicie" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Odinstalowywanie...", 68 | "install": "Instalowanie...", 69 | "check_for_update": "Sprawdzanie aktualizacji...", 70 | "self_update": "Pobieranie samoaktualizacji...", 71 | "please_wait": "Proszę czekać..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Pobieranie konfiguracji...", 75 | "error_download_config": "Wystąpił błąd podczas pobierania konfiguracji: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/pt_PT.json: -------------------------------------------------------------------------------- 1 | { 2 | "pt-PT": { 3 | "locale": "Português", 4 | "error": { 5 | "title": "Ocorreu um erro", 6 | "exit_error": "{msg}\n\nPor favor, carregue o arquivo de registro (em {path}) para a equipe do {name}.", 7 | "location_unknown": "o local onde se encontra este instalador" 8 | }, 9 | "complete": { 10 | "thanks": "Obrigado por instalar o {name}!", 11 | "updated": "O {name} foi atualizado.", 12 | "uninstalled": "O {name} foi desinstalado.", 13 | "up_to_date": "O {name} já está atualizado!", 14 | "where_to_find": "Você pode encontrar suas aplicações instaladas no seu menu inicial.", 15 | "migration_where_to_find": "Você pode encontrar suas aplicações instaladas no seu menu inicial - se estiver no meio de alguma coisa, é só tentar novamente.", 16 | "migration_finished": "Você foi movido para a nova versão única do {name}." 17 | }, 18 | "modify": { 19 | "title": "Escolha uma opção:", 20 | "update": "Actualização", 21 | "uninstall": "Desinstalar", 22 | "prompt": "Você tem certeza de que deseja desinstalar o {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Ver arquivos locais", 25 | "prompt_recover": "Os dados do instalador do {name} estão corrompidos.
Um reparo é necessário para restaurar a instalação.", 26 | "prompt_confirm": "Desinstalar o {name}", 27 | "modify": "Modificar", 28 | "repair": "Reparar" 29 | }, 30 | "auth": { 31 | "paste": "Colar", 32 | "token": "Token", 33 | "verify": "Verificar o Token", 34 | "page_header": "O canal da versão de Acesso Antecipado permite que você experimente as últimas características experimentais e correções, antes que elas sejam fundidas no yuzu. Este canal inclui todas as atualizações diárias regulares do yuzu, além destas características exclusivas.\n\nPara ser um membro do Acesso Antecipado, você deve ser um assinante do Patreon de Acesso Antecipado.", 35 | "page_opened": "Página aberta! Verifique seu navegador padrão com a página, e siga as instruções lá para vincular sua conta do patreon.\nQuando terminar, digite o token abaixo.", 36 | "login_failed": "Falha no login!\n\nVerifique duas vezes se seu token está correto e tente novamente" 37 | }, 38 | "back": "Voltar", 39 | "exit": "Sair", 40 | "yes": "Sim", 41 | "no": "Não", 42 | "continue": "Continuar", 43 | "cancel": "Cancelar", 44 | "app": { 45 | "installer_title": "Bem-vindo ao instalador do {name}!", 46 | "maintenance_title": "Bem-vindo à Ferramenta de Manutenção do {name}.", 47 | "window_title": "Instalador do {name}", 48 | "installer_subtitle": "Em poucos instantes, estaremos prontos para começar." 49 | }, 50 | "select_packages": { 51 | "title": "Selecione quais pacotes você deseja instalar:", 52 | "installed": "(instalado)", 53 | "advanced": "Avançado...", 54 | "install": "Instalar", 55 | "location": "Local de instalação", 56 | "select": "Selecionar", 57 | "overwriting": "Sobrescrever", 58 | "options": "Opções de instalação", 59 | "title_repair": "Selecione quais pacotes você deseja reparar:", 60 | "location_placeholder": "Insira aqui um caminho de instalação", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Por favor, selecione pelo menos um pacote para instalar!", 63 | "nothing_picked": "Nada selecionado", 64 | "option_shortcut": "Criar atalho na Área de Trabalho" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Desinstalando...", 68 | "install": "Instalando...", 69 | "check_for_update": "Verificando se há atualizações...", 70 | "self_update": "Baixando a auto-atualização...", 71 | "please_wait": "Por favor, aguarde..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Baixando configuração...", 75 | "error_download_config": "Houve um erro durante o download da configuração: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/ru_RU.json: -------------------------------------------------------------------------------- 1 | { 2 | "ru-RU": { 3 | "locale": "Русский", 4 | "error": { 5 | "title": "Произошла ошибка", 6 | "exit_error": "{msg}\n\nПожалуйста, загрузите файл журнала (в {path}) и отправьте его команде {name}", 7 | "location_unknown": "расположение, в котором находится установщик" 8 | }, 9 | "complete": { 10 | "thanks": "Спасибо за установку {name}!", 11 | "updated": "{name} был обновлён.", 12 | "uninstalled": "{name} был удалён.", 13 | "up_to_date": "{name} уже обновлён!", 14 | "where_to_find": "Установленные приложения можно найти в меню \"Пуск\".", 15 | "migration_where_to_find": "Установленные приложения можно найти в меню \"Пуск\" - если вы были заняты чем-то, просто повторите попытку.", 16 | "migration_finished": "Вы были переведены на новую, единую версию {name}." 17 | }, 18 | "modify": { 19 | "title": "Выберите вариант:", 20 | "update": "Обновить", 21 | "uninstall": "Удалить", 22 | "prompt": "Вы уверены, что хотите удалить {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Просмотреть локальные файлы", 25 | "prompt_recover": "Файлы установщика {name} повреждены.
Для восстановления установки требуется починка.", 26 | "prompt_confirm": "Удалить {name}", 27 | "modify": "Изменить", 28 | "repair": "Исправить" 29 | }, 30 | "auth": { 31 | "paste": "Вставить", 32 | "token": "Токен", 33 | "verify": "Проверить токен", 34 | "page_header": "Канал выпуска Early Access позволяет вам опробовать последние экспериментальные функции и исправления, прежде чем они будут внедрены в yuzu. Этот канал включает все обычные ежедневные обновления yuzu, а также эти эксклюзивные возможности.\n\nЧтобы стать участником Early Access, вы должны быть подписчиком Patreon Early Access.", 35 | "page_opened": "Страница открыта! Проверьте страницу на вашем браузере по умолчанию, и следуйте инструкциям, чтобы связать свой аккаунт Patreon.\nКогда вы закончите, введите токен ниже.", 36 | "login_failed": "Вход не удался!\n\nПроверьте правильность вашего токена и повторите попытку" 37 | }, 38 | "back": "Назад", 39 | "exit": "Выход", 40 | "yes": "Да", 41 | "no": "Нет", 42 | "continue": "Продолжить", 43 | "cancel": "Отмена", 44 | "app": { 45 | "installer_title": "Добро пожаловать в установщик {name}!", 46 | "maintenance_title": "Добро пожаловать в Инструмент Обслуживания {name}.", 47 | "window_title": "Установщик {name}", 48 | "installer_subtitle": "Мы сейчас всё для вас подготовим." 49 | }, 50 | "select_packages": { 51 | "title": "Выберите пакеты для установки:", 52 | "installed": "(установлено)", 53 | "advanced": "Дополнительно...", 54 | "install": "Установить", 55 | "location": "Расположение установки", 56 | "select": "Выбрать", 57 | "overwriting": "Перезапись", 58 | "options": "Параметры установки", 59 | "title_repair": "Выберите пакеты для починки:", 60 | "location_placeholder": "Введите путь установки здесь", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Пожалуйста, выберите хотя-бы один пакет для установки!", 63 | "nothing_picked": "Ничего не выбрано", 64 | "option_shortcut": "Создать ярлык на Рабочем Столе" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Удаление...", 68 | "install": "Установка...", 69 | "check_for_update": "Проверка обновлений...", 70 | "self_update": "Загрузка самообновления...", 71 | "please_wait": "Пожалуйста, подождите..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Загрузка конфигурации...", 75 | "error_download_config": "Произошла ошибка при загрузке конфигурации: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/tr_TR.json: -------------------------------------------------------------------------------- 1 | { 2 | "tr-TR": { 3 | "locale": "Türkçe", 4 | "error": { 5 | "title": "Bir hata oluştu", 6 | "exit_error": "{msg}\n\nLütfen ({path}'deki) log dosyasını {name} takımına gönderin", 7 | "location_unknown": "bu yükleyicinin bulunduğu konum" 8 | }, 9 | "complete": { 10 | "thanks": "Yüklediğiniz için teşekkür ederiz, {name}!", 11 | "updated": "{name} güncellendi.", 12 | "uninstalled": "{name} kaldırıldı", 13 | "up_to_date": "{name} zaten güncel!", 14 | "where_to_find": "Yüklü uygulamalarınızı start menüsünde bulabilirsiniz.", 15 | "migration_where_to_find": "Yüklü uygulamalarınızı start menüsünde bulabilirsiniz - eğer bir şeyle uğraşıyorduysanız sadece yeniden deneyin.", 16 | "migration_finished": "{name}'in en yeni versiyonuna taşındınız." 17 | }, 18 | "modify": { 19 | "title": "Birini seçin:", 20 | "update": "Güncelle", 21 | "uninstall": "Kaldır", 22 | "prompt": "{name}'i kaldırmak istediğinizden emin misiniz?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Yerel dosyaları görüntüle", 25 | "prompt_recover": "{name} yükleyici dosyaları bozuk.
Yüklemeyi düzeltmek için onarım gerekli.", 26 | "prompt_confirm": "{name}'i kaldır", 27 | "modify": "Düzenle", 28 | "repair": "Onar" 29 | }, 30 | "auth": { 31 | "paste": "Yapıştır", 32 | "token": "Token", 33 | "verify": "Token'i Doğrula", 34 | "page_header": "Erken Erişim Kanalı, en son deneysel özellik ve düzeltmeleri yuzuya eklenmeden denemenizi sağlar. Bu kanal tüm günlük yuzu güncellemelerini ve üstüne bütün özel özellikleri içerir.\n\nBir Erken Erişim üyesi olmak için Patreon Erken Erişim üyesi olmalısınız.", 35 | "page_opened": "Sayfa açıldı! Patreon hesabınızı bağlamak için tarayıcınızda açılan sayfadaki adımları takip edin.\nİşiniz bittiğinde tokeninizi aşağıya girin.", 36 | "login_failed": "Giriş başarısız oldu!\n\nToken'inizin doğruluğunu kontrol edip yeniden deneyin" 37 | }, 38 | "back": "Geri", 39 | "exit": "Çık", 40 | "yes": "Evet", 41 | "no": "Hayır", 42 | "continue": "Devam Et", 43 | "cancel": "İptal", 44 | "app": { 45 | "installer_title": "{name} yükleyicisine hoş geldiniz!", 46 | "maintenance_title": "{name} Bakım Aracına Hoş Geldiniz.", 47 | "window_title": "{name} Yükleyicisi", 48 | "installer_subtitle": "Birazdan hepsi hallolacak." 49 | }, 50 | "select_packages": { 51 | "title": "Yüklemek istediğiniz paketleri seçin:", 52 | "installed": "(Yüklendi)", 53 | "advanced": "Gelişmiş...", 54 | "install": "Yükle", 55 | "location": "Yükleme Konumu", 56 | "select": "Seç", 57 | "overwriting": "Üstüne yazma", 58 | "options": "Yükleme Seçenekleri", 59 | "title_repair": "Onarmak istediğiniz paketleri seçin:", 60 | "location_placeholder": "Bir yükleme konumu belirleyin", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Lütfen yüklemek için en az bir paket seçin!", 63 | "nothing_picked": "Hiçbir şey seçilmedi", 64 | "option_shortcut": "Masaüstü Kısayolu Oluştur" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Kaldırılıyor...", 68 | "install": "Yükleniyor...", 69 | "check_for_update": "Güncellemeler kontrol ediliyor...", 70 | "self_update": "Güncelleme indiriliyor...", 71 | "please_wait": "Lütfen bekleyin..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Yapılandırma indiriliyor...", 75 | "error_download_config": "Yapılandırma indirilirken bir hata oluştu: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/vi.json: -------------------------------------------------------------------------------- 1 | { 2 | "vi": { 3 | "locale": "Tiếng Việt", 4 | "error": { 5 | "title": "Có lỗi xảy ra", 6 | "exit_error": "{msg}\n\nVui lòng tải lên bản báo cáo (in {path}) cho đội {name}", 7 | "location_unknown": "nơi trình cài đặt được đặt" 8 | }, 9 | "complete": { 10 | "thanks": "Cảm ơn bạn đã cài {name}!", 11 | "updated": "{name} đã được cập nhật.", 12 | "uninstalled": "{name} đã được gỡ cài đặt.", 13 | "up_to_date": "{name} đã ở phiên bản mới nhất!", 14 | "where_to_find": "Bạn có thể tìm thấy các ứng dụng đã cài trong menu Start", 15 | "migration_where_to_find": "Bạn có thể tìm thấy các ứng dụng đã cài trong menu Start - nếu đang làm dở việc gì thì cứ thử lại.", 16 | "migration_finished": "Bạn đã được chuyển tới bản mới của {name}" 17 | }, 18 | "modify": { 19 | "title": "Chọn một sự lựa chọn:", 20 | "update": "Cập nhật", 21 | "uninstall": "Gỡ cài đặt", 22 | "prompt": "Bạn có chắc bạn muốn gỡ cài đặt {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Xem các tập tin trên máy", 25 | "prompt_recover": "Dữ liệu cài đặt cho {name} đã bị lỗi.
Bạn cần thực hiện vá lỗi để khôi phục lại bản cài đặt.", 26 | "prompt_confirm": "Gỡ cài đặt {name}", 27 | "modify": "Chỉnh sửa", 28 | "repair": "Sửa chữa" 29 | }, 30 | "auth": { 31 | "paste": "Dán", 32 | "token": "Token", 33 | "verify": "Kiểm tra Token", 34 | "page_header": "Kênh Truy Cập Sớm cho phép bạn thử một số chức năng và vá lỗi trong giai đoạn thử nghiệm trước khi nó được đưa vào yuzu chính thức. Kênh này bao gồm tất cả bản cập nhật yuzu hằng ngày bình thường và một số lợi ích đặc biệt trên.\n\nĐể trở thành một thành viên của kênh Truy Cập Sớm thì bạn phải là một người người ủng hộ và đăng ký kênh Truy Cập Sớm trên Patreon.", 35 | "page_opened": "Trang đã được mở! Kiểm tra trình duyệt mặc định cho trang này, và làm theo hướng dẫn ở đó để liên kết tài khoản Patreon của bạn.\nKhi bạn hoàn thành, hãy nhập token vào bên dưới.", 36 | "login_failed": "Đăng nhập thất bại!\n\nHãy kiểm tra lại token của bạn đã chính xác chưa và thử lại" 37 | }, 38 | "back": "Trở lại", 39 | "exit": "Thoát", 40 | "yes": "Có", 41 | "no": "Không", 42 | "continue": "Tiếp tục", 43 | "cancel": "Hủy bỏ", 44 | "app": { 45 | "installer_title": "Chào mừng tới trình cài đặt {name}!", 46 | "maintenance_title": "Chào mừng tới trình bảo trì {name}.", 47 | "window_title": "Trình cài đặt {name}", 48 | "installer_subtitle": "Chúng ta sẽ hoàn thành trong một vài giây lát." 49 | }, 50 | "select_packages": { 51 | "title": "Chọn các gói mà bạn muốn cài:", 52 | "installed": "(đã cài đặt)", 53 | "advanced": "Nâng cao...", 54 | "install": "Cài đặt", 55 | "location": "Nơi cài đặt", 56 | "select": "Lựa chọn", 57 | "overwriting": "Đang ghi đè", 58 | "options": "Các thiết lập cài đặt", 59 | "title_repair": "Chọn các gói mà bạn muốn vá lỗir:", 60 | "location_placeholder": "Nhập đường dẫn tới nơi bạn muốn cài vào đây", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Vui lòng chọn ít nhất một gói để cài!", 63 | "nothing_picked": "Chưa chọn gì", 64 | "option_shortcut": "Tạo đường dẫn trên màn hình chính" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Đang gỡ cài đặt...", 68 | "install": "Đang cài đặt...", 69 | "check_for_update": "Đang tìm bản cập nhật...", 70 | "self_update": "Đang tải chương trình tự cập nhật...", 71 | "please_wait": "Vui lòng đợi..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Đang tải cấu hình", 75 | "error_download_config": "Có lỗi trong khi tải về cấu hình: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/vi_VN.json: -------------------------------------------------------------------------------- 1 | { 2 | "vi-VN": { 3 | "locale": "Tiếng Anh", 4 | "error": { 5 | "title": "Có lỗi xảy ra", 6 | "exit_error": "{msg}\n\nVui lòng tải lên bản báo cáo (in {path}) cho đội {name}", 7 | "location_unknown": "nơi trình cài đặt được đặt" 8 | }, 9 | "complete": { 10 | "thanks": "Cảm ơn bạn đã cài {name}!", 11 | "updated": "{name} đã được cập nhật.", 12 | "uninstalled": "{name} đã được gỡ cài đặt.", 13 | "up_to_date": "{name} đã ở phiên bản mới nhất!", 14 | "where_to_find": "Bạn có thể tìm thấy các ứng dụng đã cài trong menu Start", 15 | "migration_where_to_find": "Bạn có thể tìm thấy các ứng dụng đã cài trong menu Start - nếu đang làm dở việc gì thì cứ thử lại.", 16 | "migration_finished": "Bạn đã được chuyển tới bản mới của {name}" 17 | }, 18 | "modify": { 19 | "title": "Chọn một sự lựa chọn:", 20 | "update": "Cập nhật", 21 | "uninstall": "Gỡ cài đặt", 22 | "prompt": "Bạn có chắc bạn muốn gỡ cài đặt {name}?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "Xem các tập tin trên máy", 25 | "prompt_recover": "Dữ liệu cài đặt cho {name} đã bị lỗi.
Bạn cần thực hiện vá lỗi để khôi phục lại bản cài đặt.", 26 | "prompt_confirm": "Gỡ cài đặt {name}", 27 | "modify": "Chỉnh sửa", 28 | "repair": "Sửa chữa" 29 | }, 30 | "auth": { 31 | "paste": "Dán", 32 | "token": "Token", 33 | "verify": "Kiểm tra Token", 34 | "page_header": "Kênh Truy Cập Sớm cho phép bạn thử một số chức năng và vá lỗi trong giai đoạn thử nghiệm trước khi nó được đưa vào yuzu chính thức. Kênh này bao gồm tất cả bản cập nhật yuzu hằng ngày bình thường và một số lợi ích đặc biệt trên.\n\nĐể trở thành một thành viên của kênh Truy Cập Sớm thì bạn phải là một người người ủng hộ và đăng ký kênh Truy Cập Sớm trên Patreon.", 35 | "page_opened": "Trang đã được mở! Kiểm tra trình duyệt mặc định cho trang này, và làm theo hướng dẫn ở đó để liên kết tài khoản Patreon của bạn.\nKhi bạn hoàn thành, hãy nhập token vào bên dưới.", 36 | "login_failed": "Đăng nhập thất bại!\n\nHãy kiểm tra lại token của bạn đã chính xác chưa và thử lại" 37 | }, 38 | "back": "Trở lại", 39 | "exit": "Thoát", 40 | "yes": "Có", 41 | "no": "Không", 42 | "continue": "Tiếp tục", 43 | "cancel": "Huỷ", 44 | "app": { 45 | "installer_title": "Chào mừng tới trình cài đặt {name}!", 46 | "maintenance_title": "Chào mừng tới trình bảo trì {name}.", 47 | "window_title": "Trình cài đặt {name}", 48 | "installer_subtitle": "Chúng ta sẽ hoàn thành trong một vài giây lát." 49 | }, 50 | "select_packages": { 51 | "title": "Chọn các gói mà bạn muốn cài:", 52 | "installed": "(đã cài đặt)", 53 | "advanced": "Nâng cao...", 54 | "install": "Cài đặt", 55 | "location": "Nơi cài đặt", 56 | "select": "Lựa chọn", 57 | "overwriting": "Đang ghi đè", 58 | "options": "Các thiết lập cài đặt", 59 | "title_repair": "Chọn các gói mà bạn muốn vá lỗir:", 60 | "location_placeholder": "Nhập đường dẫn tới nơi bạn muốn cài vào đây", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "Vui lòng chọn ít nhất một gói để cài!", 63 | "nothing_picked": "Chưa chọn gì", 64 | "option_shortcut": "Tạo đường dẫn trên màn hình chính" 65 | }, 66 | "install_packages": { 67 | "uninstall": "Đang gỡ cài đặt...", 68 | "install": "Đang cài đặt...", 69 | "check_for_update": "Đang tìm bản cập nhật...", 70 | "self_update": "Đang tải chương trình tự cập nhật...", 71 | "please_wait": "Vui lòng đợi..." 72 | }, 73 | "download_packages": { 74 | "download_config": "Đang tải cấu hình", 75 | "error_download_config": "Có lỗi trong khi tải về cấu hình: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/zh_CN.json: -------------------------------------------------------------------------------- 1 | { 2 | "zh-CN": { 3 | "locale": "简体中文", 4 | "error": { 5 | "title": "发生错误", 6 | "exit_error": "{msg}\n\n请上传日志文件(位于 {path})至 {name} 开发团队。", 7 | "location_unknown": "此安装程序位于" 8 | }, 9 | "complete": { 10 | "thanks": "感谢您安装 {name}!", 11 | "updated": "{name} 已更新。", 12 | "uninstalled": "{name} 已卸载。", 13 | "up_to_date": "{name} 已是最新版本!", 14 | "where_to_find": "您可以在“开始”菜单中找到已安装的应用程序。", 15 | "migration_where_to_find": "稍后您可以在“开始”菜单中找到已安装的应用程序。", 16 | "migration_finished": "您已迁移到另一版本的 {name}。" 17 | }, 18 | "modify": { 19 | "title": "选择一个选项:", 20 | "update": "更新", 21 | "uninstall": "卸载", 22 | "prompt": "您确定要卸载 {name} 吗?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "浏览本地文件", 25 | "prompt_recover": " {name} 的安装数据已损坏。
需要修复才能继续安装。", 26 | "prompt_confirm": "卸载 {name}", 27 | "modify": "更改", 28 | "repair": "修复" 29 | }, 30 | "auth": { 31 | "paste": "粘贴", 32 | "token": "令牌", 33 | "verify": "验证令牌", 34 | "page_header": "Early Access 渠道允许您在最新的实验性功能和修复程序合并到主线版 yuzu 之前试用它们。该渠道包括 yuzu 每日更新,以及这些独家功能。\n\n要想成为 Early Access 用户,您需要成为 Early Access 的捐献者(通过 Patreon 平台)。", 35 | "page_opened": "相关网页已打开。请检查打开的网页,并按照提示关联您的 patreon 帐户。\n完成后,请在下方输入您的令牌。", 36 | "login_failed": "验证失败!\n\n请确保您的令牌无误后再试。" 37 | }, 38 | "back": "上一步", 39 | "exit": "退出", 40 | "yes": "确定", 41 | "no": "取消", 42 | "continue": "继续", 43 | "cancel": "取消", 44 | "app": { 45 | "installer_title": "欢迎使用 {name} 安装程序!", 46 | "maintenance_title": "欢迎使用 {name} 维护工具。", 47 | "window_title": "{name} 安装程序", 48 | "installer_subtitle": "只需要几分钟,我们将很快完成安装。" 49 | }, 50 | "select_packages": { 51 | "title": "选择要安装的软件包:", 52 | "installed": "(已安装)", 53 | "advanced": "高级...", 54 | "install": "安装", 55 | "location": "安装位置", 56 | "select": "选择", 57 | "overwriting": "正在覆盖", 58 | "options": "安装选项", 59 | "title_repair": "选择要修复的软件包:", 60 | "location_placeholder": "输入安装路径", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "请至少选择一个软件包进行安装。", 63 | "nothing_picked": "未选择任何项目", 64 | "option_shortcut": "创建桌面快捷方式" 65 | }, 66 | "install_packages": { 67 | "uninstall": "正在卸载...", 68 | "install": "安装中...", 69 | "check_for_update": "正在检查更新...", 70 | "self_update": "正在下载更新...", 71 | "please_wait": "请稍等..." 72 | }, 73 | "download_packages": { 74 | "download_config": "正在下载配置...", 75 | "error_download_config": "下载配置时出错: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/locales/zh_TW.json: -------------------------------------------------------------------------------- 1 | { 2 | "zh-TW": { 3 | "locale": "繁體中文", 4 | "error": { 5 | "title": "發生錯誤", 6 | "exit_error": "{msg}\n\n請上傳紀錄檔(位於 {path})至 {name} 開發團隊。", 7 | "location_unknown": "此安裝程式位於" 8 | }, 9 | "complete": { 10 | "thanks": "感謝您安裝 {name}!", 11 | "updated": "{name} 已更新。", 12 | "uninstalled": "{name} 已解除安裝。", 13 | "up_to_date": "{name} 已是最新版本!", 14 | "where_to_find": "您可以在「開始」選單中找到已安裝的應用程式。", 15 | "migration_where_to_find": "您可以在「開始」選單中找到已安裝的應用程式。", 16 | "migration_finished": "您已轉換到另一版本的 {name}。" 17 | }, 18 | "modify": { 19 | "title": "選擇一個選項:", 20 | "update": "更新", 21 | "uninstall": "解除安裝", 22 | "prompt": "您確定要解除安裝 {name} 嗎?", 23 | "prompt_repair": "WARNING: All the files under {path} will be deleted as part of the repair process!
Do you wish to proceed?", 24 | "view_local_files": "瀏覽本機檔案", 25 | "prompt_recover": " {name} 的安裝資料已損毀。
需要修復才能繼續安裝。", 26 | "prompt_confirm": "解除安裝 {name}", 27 | "modify": "修改", 28 | "repair": "修復" 29 | }, 30 | "auth": { 31 | "paste": "貼上", 32 | "token": "Token", 33 | "verify": "驗證 Token", 34 | "page_header": "Early Access 通道允許您在最新的實驗性功能和修復檔合併到 yuzu 主要通道之前先行體驗。此通道包含 yuzu 每日更新及以上獨家功能。\n\n欲成為 Early Access 成員,您需要至Patreon 平台贊助 Early Access。", 35 | "page_opened": "已開啟網頁。請檢視網頁並依照指示連結您的 patreon 帳號。\n完成後請在下方輸入您的 token。", 36 | "login_failed": "驗證失敗!\n\n請確定您的 token 正確後再重試。" 37 | }, 38 | "back": "上一步", 39 | "exit": "退出", 40 | "yes": "確定", 41 | "no": "取消", 42 | "continue": "繼續", 43 | "cancel": "取消", 44 | "app": { 45 | "installer_title": "歡迎使用 {name} 安裝程式!", 46 | "maintenance_title": "歡迎使用 {name} 維護工具!", 47 | "window_title": "{name} 安裝程式", 48 | "installer_subtitle": "安裝過程將在幾分鐘內完成。" 49 | }, 50 | "select_packages": { 51 | "title": "選擇要安裝的軟體包:", 52 | "installed": "(已安裝)", 53 | "advanced": "進階...", 54 | "install": "安裝", 55 | "location": "安裝位置", 56 | "select": "選擇", 57 | "overwriting": "正在覆寫檔案", 58 | "options": "安裝選項", 59 | "title_repair": "選擇要修復的軟體包:", 60 | "location_placeholder": "輸入安裝路徑", 61 | "overwriting_warning": "Directory {path} already exists.
Are you sure you want to overwrite the contents inside?", 62 | "nothing_picked_warning": "請至少選擇一個軟體包進行安裝。", 63 | "nothing_picked": "未選擇任何選項", 64 | "option_shortcut": "新增捷徑到桌面" 65 | }, 66 | "install_packages": { 67 | "uninstall": "正在解除安裝...", 68 | "install": "正在安裝...", 69 | "check_for_update": "正在檢查更新...", 70 | "self_update": "正在下載更新...", 71 | "please_wait": "請稍後..." 72 | }, 73 | "download_packages": { 74 | "download_config": "正在下載設定...", 75 | "error_download_config": "下載設定時出錯: {msg}" 76 | } 77 | } 78 | } -------------------------------------------------------------------------------- /ui/src/router.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import Router from 'vue-router' 3 | import DownloadConfig from './views/DownloadConfig.vue' 4 | import MigrateView from './views/MigrateView.vue' 5 | import SelectPackages from './views/SelectPackages.vue' 6 | import ErrorView from './views/ErrorView.vue' 7 | import InstallPackages from './views/InstallPackages.vue' 8 | import CompleteView from './views/CompleteView.vue' 9 | import ModifyView from './views/ModifyView.vue' 10 | import AuthenticationView from './views/AuthenticationView.vue' 11 | import ReAuthenticationView from './views/ReAuthenticationView.vue' 12 | 13 | Vue.use(Router) 14 | 15 | export default new Router({ 16 | routes: [ 17 | { 18 | path: '/config', 19 | name: 'config', 20 | component: DownloadConfig 21 | }, 22 | { 23 | path: '/migrate', 24 | name: 'migrate', 25 | component: MigrateView 26 | }, 27 | { 28 | path: '/packages', 29 | name: 'packages', 30 | component: SelectPackages 31 | }, 32 | { 33 | path: '/install/:kind/:desktop_shortcut', 34 | name: 'install', 35 | component: InstallPackages 36 | }, 37 | { 38 | path: '/showerr', 39 | name: 'showerr', 40 | component: ErrorView 41 | }, 42 | { 43 | path: '/complete/:uninstall/:update/:migrate/:packages_installed', 44 | name: 'complete', 45 | component: CompleteView 46 | }, 47 | { 48 | path: '/modify', 49 | name: 'modify', 50 | component: ModifyView 51 | }, 52 | { 53 | path: '/authentication', 54 | name: 'authentication', 55 | component: AuthenticationView 56 | }, 57 | { 58 | path: '/reauthenticate', 59 | name: 'reauthenticate', 60 | component: ReAuthenticationView 61 | }, 62 | { 63 | path: '/', 64 | redirect: '/config' 65 | } 66 | ] 67 | }) 68 | -------------------------------------------------------------------------------- /ui/src/views/CompleteView.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 69 | -------------------------------------------------------------------------------- /ui/src/views/DownloadConfig.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 101 | -------------------------------------------------------------------------------- /ui/src/views/ErrorView.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 33 | 34 | 60 | -------------------------------------------------------------------------------- /ui/src/views/MigrateView.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 106 | -------------------------------------------------------------------------------- /ui/src/views/ModifyView.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 94 | 95 | 110 | -------------------------------------------------------------------------------- /ui/src/views/ReAuthenticationView.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /ui/unbreak-translations.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | const fs = require('fs') 3 | 4 | const input_file = process.argv[2] 5 | const output_file = process.argv[3] 6 | 7 | const mappings = { 8 | select: 'select_packages', 9 | install: 'install_packages', 10 | download: 'download_packages' 11 | } 12 | 13 | console.info(`Fixing ${input_file} ...`) 14 | const lang = path.basename(input_file).replace('.json', '').replace('_', '-') 15 | const translations = require(path.resolve(input_file)) 16 | 17 | translations[lang] = translations.en 18 | delete translations.en 19 | 20 | translations[lang].modify.modify = translations[lang].select['modify en'].modify.modify 21 | delete translations[lang].select['modify en'] 22 | translations[lang].modify.repair = translations[lang].select['repair en'].modify.repair 23 | delete translations[lang].select['repair en'] 24 | 25 | for (const i of Object.keys(mappings)) { 26 | translations[lang][mappings[i]] = translations[lang][i] 27 | delete translations[lang][i] 28 | } 29 | 30 | fs.writeFileSync(output_file, JSON.stringify(translations, null, 2)) 31 | -------------------------------------------------------------------------------- /ui/vue.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | devServer: { 3 | proxy: 'http://127.0.0.1:3000' 4 | }, 5 | filenameHashing: false 6 | } 7 | --------------------------------------------------------------------------------