Compare commits
87 Commits
Author | SHA1 | Date | |
---|---|---|---|
690a14b77c | |||
![]() |
07f7392ed1 | ||
![]() |
24a8b2b0bc | ||
63800eac77 | |||
![]() |
a8dfcd3fe1 | ||
![]() |
5ac3f4d385 | ||
![]() |
b7e6929405 | ||
dd189f31b1 | |||
27680626fa | |||
cffa8f79ff | |||
109e3dc25a | |||
db6dc65791 | |||
e8d6a19d03 | |||
811e2ef01f | |||
4a08bd47cd | |||
f29964be53 | |||
1af938decd | |||
a4679be043 | |||
7caa7775ff | |||
07579d7361 | |||
9b4addc8a5 | |||
![]() |
a1bfcd5f8b | ||
c748400cd3 | |||
d3653e3138 | |||
![]() |
3588b3cc54 | ||
![]() |
c8737ad507 | ||
f76ad67108 | |||
2557ad236e | |||
a4ee311d73 | |||
0bf0880b84 | |||
5a8439906a | |||
69299ad956 | |||
bc8592178c | |||
1ee30146e5 | |||
![]() |
3a6ef23fb9 | ||
![]() |
8e87f6b067 | ||
0e7dd5815e | |||
0eb003d599 | |||
4b0a03cc97 | |||
![]() |
674b1b0106 | ||
![]() |
40acae51ea | ||
db9b0d665d | |||
782191b60b | |||
51529c2d3b | |||
0a458a80e0 | |||
2b4a8a97e1 | |||
d5cddfc4c0 | |||
6997ba759f | |||
917b9f665a | |||
249ba861ff | |||
5a42cc5bd7 | |||
4f993a3a62 | |||
a3d8dc7887 | |||
bcb86bc4b0 | |||
![]() |
1e0fda7407 | ||
e96d8932d0 | |||
dcb1cdebca | |||
33bea6a560 | |||
d1570711ac | |||
449a680d32 | |||
![]() |
35989d038a | ||
bf313eedf3 | |||
f2ae4b26ba | |||
![]() |
adea7ad35f | ||
87905eab2b | |||
5e37dce4e3 | |||
![]() |
748123d190 | ||
18f351c481 | |||
49e53bf064 | |||
![]() |
102e741a4e | ||
![]() |
0edff8e5e9 | ||
![]() |
76ee01c07d | ||
588b44381c | |||
9dcaa22e89 | |||
20439f8785 | |||
4ec15d0eb3 | |||
2142dbad7e | |||
31f47f2acd | |||
87da32d62e | |||
6660e129a8 | |||
62fa5ef7b1 | |||
c1eb80fbb6 | |||
![]() |
08c2bd27f5 | ||
dadcc02701 | |||
c716291c2d | |||
![]() |
7c35e2090d | ||
1ae712918e |
68
.github/workflows/python-build.yml
vendored
@ -1,5 +1,4 @@
|
||||
# This workflow will install Python dependencies, run tests and lint with a single version of Python
|
||||
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
|
||||
# This workflow will install Python dependencies and then build NUSGet for all platforms
|
||||
|
||||
name: Python application
|
||||
|
||||
@ -20,18 +19,19 @@ jobs:
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Install ccache for Nuitka
|
||||
run: sudo apt update && sudo apt install -y ccache libicu70
|
||||
- name: Set up Python 3.11
|
||||
run: |
|
||||
sudo apt update && \
|
||||
sudo apt install -y ccache patchelf
|
||||
- name: Set up Python 3.12
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
python-version: "3.12"
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
- name: Build Package
|
||||
run: |
|
||||
make linux
|
||||
run: make all
|
||||
- name: Prepare Package for Upload
|
||||
run: |
|
||||
mv NUSGet ~/NUSGet
|
||||
@ -41,26 +41,24 @@ jobs:
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ~/NUSGet.tar
|
||||
name: NUSGet-linux-bin
|
||||
name: NUSGet-Linux-bin
|
||||
|
||||
build-macos:
|
||||
build-macos-x86:
|
||||
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python 3.11
|
||||
- name: Set up Python 3.12
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
python-version: "3.12"
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
- name: Build Package
|
||||
run: |
|
||||
python build_translations.py
|
||||
python -m nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --standalone --plugin-enable=pyside6 NUSGet.py --macos-create-app-bundle --macos-app-icon=resources/icon.png
|
||||
run: ARCH_FLAGS=--macos-target-arch=x86_64 make all
|
||||
- name: Prepare Package for Upload
|
||||
run: |
|
||||
mv NUSGet.app ~/NUSGet.app
|
||||
@ -70,7 +68,34 @@ jobs:
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ~/NUSGet.tar
|
||||
name: NUSGet-macos-bin
|
||||
name: NUSGet-macOS-x86_64-bin
|
||||
|
||||
build-macos-arm64:
|
||||
|
||||
runs-on: macos-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Set up Python 3.12
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.12"
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
- name: Build Package
|
||||
run: ARCH_FLAGS=--macos-target-arch=arm64 make all
|
||||
- name: Prepare Package for Upload
|
||||
run: |
|
||||
mv NUSGet.app ~/NUSGet.app
|
||||
cd ~
|
||||
tar cvf NUSGet.tar NUSGet.app
|
||||
- name: Upload Package
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: ~/NUSGet.tar
|
||||
name: NUSGet-macOS-arm64-bin
|
||||
|
||||
build-windows:
|
||||
|
||||
@ -80,26 +105,23 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Enable Developer Command Prompt
|
||||
uses: ilammy/msvc-dev-cmd@v1.13.0
|
||||
- name: Set up Python 3.11
|
||||
- name: Set up Python 3.12
|
||||
uses: actions/setup-python@v5
|
||||
with:
|
||||
python-version: "3.11"
|
||||
python-version: "3.12"
|
||||
- name: Install Dependencies
|
||||
run: |
|
||||
python -m pip install --upgrade pip
|
||||
pip install -r requirements.txt
|
||||
- name: Build Package
|
||||
run: |
|
||||
python build_translations.py
|
||||
python -m nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --windows-icon-from-ico=resources/icon.png --plugin-enable=pyside6 NUSGet.py --windows-console-mode=disable
|
||||
run: .\Build.ps1
|
||||
- name: Upload Package
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: D:\a\NUSGet\NUSGet\NUSGet.dist
|
||||
name: NUSGet-windows-bin
|
||||
name: NUSGet-Windows-bin
|
||||
- name: Upload Onefile Package
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
path: D:\a\NUSGet\NUSGet\NUSGet.exe
|
||||
name: NUSGet-windows-onefile-bin
|
||||
|
||||
name: NUSGet-Windows-onefile-bin
|
||||
|
1
.gitignore
vendored
@ -28,6 +28,7 @@ NUSGet.build/
|
||||
NUSGet.dist/
|
||||
NUSGet.onefile-build/
|
||||
NUSGet
|
||||
NUSGet.app/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
33
Build.ps1
Normal file
@ -0,0 +1,33 @@
|
||||
# Build.ps1 for NUSGet
|
||||
|
||||
# Default option is to run build, like a Makefile
|
||||
param(
|
||||
[string]$Task = "build"
|
||||
)
|
||||
|
||||
$buildNUSGet = {
|
||||
Write-Host "Building NUSGet..."
|
||||
python build_translations.py
|
||||
python -m nuitka --show-progress --assume-yes-for-downloads NUSGet.py
|
||||
}
|
||||
|
||||
$cleanNUSGet = {
|
||||
Write-Host "Cleaning..."
|
||||
Remove-Item -Recurse -Force NUSGet.exe, ./NUSGet.build/, ./NUSGet.dist/, ./NUSGet.onefile-build/
|
||||
}
|
||||
|
||||
switch ($Task.ToLower()) {
|
||||
"build" {
|
||||
& $buildNUSGet
|
||||
break
|
||||
}
|
||||
"clean" {
|
||||
& $cleanNUSGet
|
||||
break
|
||||
}
|
||||
default {
|
||||
Write-Host "Unknown task: $Task" -ForegroundColor Red
|
||||
Write-Host "Available tasks: build, clean"
|
||||
break
|
||||
}
|
||||
}
|
11
Makefile
@ -1,12 +1,15 @@
|
||||
CC=python -m nuitka
|
||||
ARCH_FLAGS?=
|
||||
|
||||
linux:
|
||||
all:
|
||||
python build_translations.py
|
||||
$(CC) --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --plugin-enable=pyside6 NUSGet.py -o NUSGet
|
||||
$(CC) --show-progress --assume-yes-for-downloads NUSGet.py $(ARCH_FLAGS) -o NUSGet
|
||||
|
||||
linux-install:
|
||||
install:
|
||||
rm -rd /opt/NUSGet/
|
||||
install -d /opt/NUSGet
|
||||
install NUSGet /opt/NUSGet/
|
||||
cp -r ./NUSGet.dist/* /opt/NUSGet/
|
||||
chmod 755 /opt/NUSGet/
|
||||
install ./packaging/icon.png /opt/NUSGet/NUSGet.png
|
||||
install ./packaging/NUSGet.desktop /usr/share/applications
|
||||
|
||||
|
756
NUSGet.py
@ -1,26 +1,44 @@
|
||||
# "NUSGet.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah and Contributors
|
||||
|
||||
# Nuitka options. These determine compilation settings based on the current OS.
|
||||
# nuitka-project-if: {OS} == "Darwin":
|
||||
# nuitka-project: --standalone
|
||||
# nuitka-project: --macos-create-app-bundle
|
||||
# nuitka-project: --macos-app-icon={MAIN_DIRECTORY}/resources/icon.png
|
||||
# nuitka-project-if: {OS} == "Windows":
|
||||
# nuitka-project: --onefile
|
||||
# nuitka-project: --windows-icon-from-ico={MAIN_DIRECTORY}/resources/icon.png
|
||||
# nuitka-project: --windows-console-mode=disable
|
||||
# nuitka-project-if: {OS} in ("Linux", "FreeBSD", "OpenBSD"):
|
||||
# nuitka-project: --onefile
|
||||
|
||||
# These are standard options that are needed on all platforms.
|
||||
# nuitka-project: --plugin-enable=pyside6
|
||||
# nuitka-project: --include-data-dir={MAIN_DIRECTORY}/data=data
|
||||
# nuitka-project: --include-data-dir={MAIN_DIRECTORY}/resources=resources
|
||||
|
||||
import os
|
||||
import sys
|
||||
import json
|
||||
import pathlib
|
||||
import platform
|
||||
import webbrowser
|
||||
from importlib.metadata import version
|
||||
|
||||
from PySide6.QtGui import QIcon
|
||||
from PySide6.QtWidgets import (QApplication, QMainWindow, QMessageBox, QTreeWidgetItem, QHeaderView, QStyle,
|
||||
QStyleFactory, QFileDialog)
|
||||
from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo, QTranslator, QLocale
|
||||
from PySide6.QtGui import QActionGroup, QIcon
|
||||
from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox, QFileDialog, QListView
|
||||
from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo
|
||||
|
||||
from qt.py.ui_AboutDialog import AboutNUSGet
|
||||
from qt.py.ui_MainMenu import Ui_MainWindow
|
||||
|
||||
from modules.config import *
|
||||
from modules.core import *
|
||||
from modules.download_wii import run_nus_download_wii, run_nus_download_wii_batch
|
||||
from modules.download_dsi import run_nus_download_dsi, run_nus_download_dsi_batch
|
||||
from modules.language import *
|
||||
from modules.theme import *
|
||||
from modules.tree import NUSGetTreeModel, TIDFilterProxyModel
|
||||
from modules.download_batch import run_nus_download_batch
|
||||
from modules.download_wii import run_nus_download_wii
|
||||
from modules.download_dsi import run_nus_download_dsi
|
||||
|
||||
nusget_version = "1.2.0"
|
||||
nusget_version = "1.4.1"
|
||||
|
||||
regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"],
|
||||
"Australia/NZ": ["55"]}
|
||||
@ -29,7 +47,7 @@ regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": [
|
||||
# Signals needed for the worker used for threading the downloads.
|
||||
class WorkerSignals(QObject):
|
||||
result = Signal(object)
|
||||
progress = Signal(str)
|
||||
progress = Signal(int, int, str)
|
||||
|
||||
|
||||
# Worker class used to thread the downloads.
|
||||
@ -64,107 +82,210 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.threadpool = QThreadPool()
|
||||
self.ui.download_btn.clicked.connect(self.download_btn_pressed)
|
||||
self.ui.script_btn.clicked.connect(self.script_btn_pressed)
|
||||
self.ui.pack_archive_chkbox.clicked.connect(self.pack_wad_chkbox_toggled)
|
||||
self.ui.custom_out_dir_btn.clicked.connect(self.choose_output_dir)
|
||||
self.ui.pack_archive_checkbox.toggled.connect(
|
||||
lambda: connect_is_enabled_to_checkbox([self.ui.archive_file_entry], self.ui.pack_archive_checkbox))
|
||||
self.ui.custom_out_dir_checkbox.toggled.connect(
|
||||
lambda: connect_is_enabled_to_checkbox([self.ui.custom_out_dir_entry, self.ui.custom_out_dir_btn],
|
||||
self.ui.custom_out_dir_checkbox))
|
||||
# Load auto-update settings, and initialize them if they don't exist.
|
||||
try:
|
||||
self.ui.auto_update_checkbox.setChecked(config_data["auto_update"])
|
||||
except KeyError:
|
||||
update_setting(config_data, "auto_update", self.ui.auto_update_checkbox.isChecked())
|
||||
self.ui.auto_update_checkbox.toggled.connect(
|
||||
lambda: update_setting(config_data, "auto_update", self.ui.auto_update_checkbox.isChecked()))
|
||||
# Load custom output directory if one is saved and it is valid. Only enable the checkbox to actually use the
|
||||
# custom dir if "use_out_path" is set to true.
|
||||
try:
|
||||
out_dir = pathlib.Path(config_data["out_path"])
|
||||
if out_dir.exists() and out_dir.is_dir():
|
||||
self.ui.custom_out_dir_entry.setText(str(out_dir))
|
||||
if config_data["use_out_path"]:
|
||||
self.ui.custom_out_dir_checkbox.setChecked(True)
|
||||
except KeyError:
|
||||
pass
|
||||
# Register this callback after the previous check to avoid an extra config write.
|
||||
self.ui.custom_out_dir_checkbox.toggled.connect(
|
||||
lambda: update_setting(config_data, "use_out_path", self.ui.custom_out_dir_checkbox.isChecked()))
|
||||
self.ui.tid_entry.textChanged.connect(self.tid_updated)
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.ui.wii_title_tree.header().setSectionResizeMode(QHeaderView.ResizeToContents)
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.ui.vwii_title_tree.header().setSectionResizeMode(QHeaderView.ResizeToContents)
|
||||
# noinspection PyUnresolvedReferences
|
||||
self.ui.dsi_title_tree.header().setSectionResizeMode(QHeaderView.ResizeToContents)
|
||||
self.ui.custom_out_dir_entry.textChanged.connect(self.custom_output_dir_changed)
|
||||
# Basic intro text set to automatically show when the app loads. This may be changed in the future.
|
||||
libwiipy_version = "v" + version("libWiiPy")
|
||||
libtwlpy_version = "v" + version("libTWLPy")
|
||||
self.log_text = (app.translate("MainWindow", "NUSGet v{nusget_version}\nDeveloped by NinjaCheetah\nPowered by libWiiPy "
|
||||
"{libwiipy_version}\nDSi support provided by libTWLPy {libtwlpy_version}\n\n"
|
||||
"Select a title from the list on the left, or enter a Title ID to begin.\n\n"
|
||||
"Titles marked with a checkmark are free and have a ticket available, and can"
|
||||
" be decrypted and/or packed into a WAD or TAD. Titles with an X do not have "
|
||||
"a ticket, and only their encrypted contents can be saved.\n\nTitles will be "
|
||||
"downloaded to a folder named \"NUSGet\" inside your downloads folder.")
|
||||
.format(nusget_version=nusget_version, libwiipy_version=libwiipy_version,
|
||||
libtwlpy_version=libtwlpy_version))
|
||||
self.log_text = app.translate("MainWindow", "Select a title from the list on the left, or enter a "
|
||||
"Title ID to begin.\n\nTitles marked with a checkmark are free and have a ticket "
|
||||
"available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not"
|
||||
" have a ticket, and only their encrypted contents can be saved.\n\nBy default, titles "
|
||||
"will be downloaded to a folder named \"NUSGet Downloads\" inside your downloads folder.")
|
||||
self.ui.log_text_browser.setText(self.log_text)
|
||||
# Add console entries to dropdown and attach on change signal.
|
||||
self.ui.console_select_dropdown.addItem("Wii")
|
||||
self.ui.console_select_dropdown.addItem("vWii")
|
||||
self.ui.console_select_dropdown.addItem("DSi")
|
||||
self.ui.console_select_dropdown.addItems(["Wii", "vWii", "DSi"])
|
||||
list_view = QListView()
|
||||
list_view.setMouseTracking(True)
|
||||
self.ui.console_select_dropdown.setView(list_view)
|
||||
dropdown_delegate = ComboBoxItemDelegate()
|
||||
self.ui.console_select_dropdown.setItemDelegate(dropdown_delegate)
|
||||
self.ui.console_select_dropdown.currentIndexChanged.connect(self.selected_console_changed)
|
||||
# Title tree building code.
|
||||
wii_tree = self.ui.wii_title_tree
|
||||
vwii_tree = self.ui.vwii_title_tree
|
||||
dsi_tree = self.ui.dsi_title_tree
|
||||
self.trees = [[wii_tree, wii_database], [vwii_tree, vwii_database], [dsi_tree, dsi_database]]
|
||||
for tree in self.trees:
|
||||
self.tree_categories = []
|
||||
global regions
|
||||
# Iterate over each category in the database file.
|
||||
for key in tree[1]:
|
||||
new_category = QTreeWidgetItem()
|
||||
new_category.setText(0, key)
|
||||
# Iterate over each title in the current category.
|
||||
for title in tree[1][key]:
|
||||
new_title = QTreeWidgetItem()
|
||||
new_title.setText(0, title["TID"] + " - " + title["Name"])
|
||||
# Build the list of regions and what versions are offered for each region.
|
||||
for region in title["Versions"]:
|
||||
new_region = QTreeWidgetItem()
|
||||
new_region.setText(0, region)
|
||||
for title_version in title["Versions"][region]:
|
||||
new_version = QTreeWidgetItem()
|
||||
new_version.setText(0, "v" + str(title_version))
|
||||
new_region.addChild(new_version)
|
||||
new_title.addChild(new_region)
|
||||
# Set an indicator icon to show if a ticket is offered for this title or not.
|
||||
if title["Ticket"] is True:
|
||||
new_title.setIcon(0, self.style().standardIcon(QStyle.StandardPixmap.SP_DialogApplyButton))
|
||||
# ------------
|
||||
# Options Menu
|
||||
# ------------
|
||||
# Fix the annoying background on the option menu items and submenus.
|
||||
fixup_qmenu_background(self.ui.menu_options)
|
||||
fixup_qmenu_background(self.ui.menu_options_language)
|
||||
fixup_qmenu_background(self.ui.menu_options_theme)
|
||||
# Build a QActionGroup so that the language options function like radio buttons, because selecting multiple
|
||||
# languages at once makes no sense.
|
||||
language_group = QActionGroup(self)
|
||||
language_group.setExclusive(True)
|
||||
current_language = ""
|
||||
try:
|
||||
current_language = config_data["language"]
|
||||
except KeyError:
|
||||
pass
|
||||
for action in self.ui.menu_options_language.actions():
|
||||
language_group.addAction(action)
|
||||
if current_language != "":
|
||||
if LANGS[current_language] == action.text():
|
||||
action.setChecked(True)
|
||||
# There is no language set, so check the system language option.
|
||||
if current_language == "":
|
||||
self.ui.action_language_system.setChecked(True)
|
||||
language_group.triggered.connect(lambda lang=action: self.change_language(lang.text()))
|
||||
# Another QActionGroup used for the theme selector.
|
||||
theme_group = QActionGroup(self)
|
||||
theme_group.setExclusive(True)
|
||||
for action in self.ui.menu_options_theme.actions():
|
||||
theme_group.addAction(action)
|
||||
self.ui.action_theme_system.triggered.connect(lambda: self.change_theme("system"))
|
||||
self.ui.action_theme_light.triggered.connect(lambda: self.change_theme("light"))
|
||||
self.ui.action_theme_dark.triggered.connect(lambda: self.change_theme("dark"))
|
||||
try:
|
||||
match config_data["theme"]:
|
||||
case "light":
|
||||
self.ui.action_theme_light.setChecked(True)
|
||||
case "dark":
|
||||
self.ui.action_theme_dark.setChecked(True)
|
||||
case _:
|
||||
self.ui.action_theme_system.setChecked(True)
|
||||
except KeyError:
|
||||
self.ui.action_theme_system.setChecked(True)
|
||||
# ---------
|
||||
# Help Menu
|
||||
# ---------
|
||||
# Same fix for help menu items.
|
||||
fixup_qmenu_background(self.ui.menu_help)
|
||||
self.ui.action_about.triggered.connect(self.about_nusget)
|
||||
self.ui.action_about_qt.triggered.connect(lambda: QMessageBox.aboutQt(self))
|
||||
# Save some light/dark theme values for later, including the appropriately colored info icon.
|
||||
if is_dark_theme(config_data):
|
||||
bg_color = "#2b2b2b"
|
||||
icon = QIcon(os.path.join(os.path.dirname(__file__), "resources", "information_white.svg"))
|
||||
else:
|
||||
new_title.setIcon(0, self.style().standardIcon(QStyle.StandardPixmap.SP_DialogCancelButton))
|
||||
new_category.addChild(new_title)
|
||||
self.tree_categories.append(new_category)
|
||||
tree[0].insertTopLevelItems(0, self.tree_categories)
|
||||
# Connect the double click signal for handling when titles are selected.
|
||||
tree[0].itemDoubleClicked.connect(self.onItemClicked)
|
||||
|
||||
# Prevent resizing, Qt makes us look stupid here
|
||||
bg_color = "#e3e3e3"
|
||||
icon = QIcon(os.path.join(os.path.dirname(__file__), "resources", "information_black.svg"))
|
||||
self.ui.action_about.setIcon(icon)
|
||||
self.ui.action_about_qt.setIcon(icon)
|
||||
# Title tree loading code. Now powered by Models:tm:
|
||||
wii_model = NUSGetTreeModel(wii_database, root_name="Wii Titles")
|
||||
vwii_model = NUSGetTreeModel(vwii_database, root_name="vWii Titles")
|
||||
dsi_model = NUSGetTreeModel(dsi_database, root_name="DSi Titles")
|
||||
self.tree_models = [wii_model, vwii_model, dsi_model]
|
||||
self.trees = [self.ui.wii_title_tree, self.ui.vwii_title_tree, self.ui.dsi_title_tree]
|
||||
# Build proxy models required for searching
|
||||
self.proxy_models = [TIDFilterProxyModel(self.ui.wii_title_tree), TIDFilterProxyModel(self.ui.vwii_title_tree),
|
||||
TIDFilterProxyModel(self.ui.dsi_title_tree)]
|
||||
for model in range(len(self.proxy_models)):
|
||||
self.proxy_models[model].setSourceModel(self.tree_models[model])
|
||||
self.proxy_models[model].setFilterKeyColumn(0)
|
||||
self.ui.tree_filter_input.textChanged.connect(lambda: self.filter_text_updated(self.ui.platform_tabs.currentIndex()))
|
||||
self.ui.tree_filter_reset_btn.clicked.connect(lambda: self.ui.tree_filter_input.setText(""))
|
||||
for tree in range(len(self.trees)):
|
||||
self.trees[tree].setModel(self.proxy_models[tree])
|
||||
self.trees[tree].doubleClicked.connect(self.title_double_clicked)
|
||||
self.trees[tree].expanded.connect(lambda: self.resize_tree(self.ui.platform_tabs.currentIndex()))
|
||||
self.trees[tree].collapsed.connect(lambda: self.resize_tree(self.ui.platform_tabs.currentIndex()))
|
||||
# This stylesheet patch allows me to add the correct padding above the scrollbar so that it doesn't overlap
|
||||
# the QTreeView's header.
|
||||
self.trees[tree].setStyleSheet(self.trees[tree].styleSheet() + f"""
|
||||
QTreeView QScrollBar::sub-line:vertical {{
|
||||
border: 0;
|
||||
background: {bg_color};
|
||||
height: {self.trees[tree].header().sizeHint().height()}px;
|
||||
}}""")
|
||||
# Prevent resizing.
|
||||
self.setFixedSize(self.size())
|
||||
|
||||
# Do a quick check to see if there's a newer release available, and inform the user if there is.
|
||||
# These connections allow for clicking the checkbox labels to toggle the checkboxes, if they're enabled. This is
|
||||
# required because checkboxes can't word wrap, so regular labels must be used in their place.
|
||||
self.ui.pack_archive_checkbox.label.setText(app.translate("MainWindow", "Pack installable archive (WAD/TAD)"))
|
||||
self.ui.pack_archive_checkbox.setChecked(True)
|
||||
self.ui.keep_enc_checkbox.label.setText(app.translate("MainWindow", "Keep encrypted contents"))
|
||||
self.ui.keep_enc_checkbox.setChecked(True)
|
||||
self.ui.create_dec_checkbox.label.setText(app.translate("MainWindow", "Create decrypted contents (*.app)"))
|
||||
self.ui.use_local_checkbox.label.setText(app.translate("MainWindow", "Use local files, if they exist"))
|
||||
self.ui.use_wiiu_nus_checkbox.label.setText(app.translate("MainWindow", "Use the Wii U NUS (faster, only affects Wii/vWii)"))
|
||||
self.ui.use_wiiu_nus_checkbox.setChecked(True)
|
||||
self.ui.patch_ios_checkbox.label.setText(app.translate("MainWindow", "Apply patches to IOS (Applies to WADs only)"))
|
||||
self.ui.pack_vwii_mode_checkbox.label.setText(app.translate("MainWindow", "Re-encrypt title using the Wii Common Key"))
|
||||
self.ui.auto_update_checkbox.label.setText(app.translate("MainWindow", "Check for updates on startup"))
|
||||
self.ui.custom_out_dir_checkbox.label.setText(app.translate("MainWindow", "Use a custom download directory"))
|
||||
try:
|
||||
auto_update = config_data["auto_update"]
|
||||
except KeyError:
|
||||
auto_update = True
|
||||
config_data["auto_update"] = True
|
||||
save_config(config_data)
|
||||
if auto_update:
|
||||
# Do a quick check to see if there's a newer release available if auto-updates are enabled.
|
||||
worker = Worker(check_nusget_updates, app, nusget_version)
|
||||
worker.signals.result.connect(self.prompt_for_update)
|
||||
worker.signals.progress.connect(self.update_log_text)
|
||||
self.threadpool.start(worker)
|
||||
|
||||
@Slot(QTreeWidgetItem, int)
|
||||
def onItemClicked(self, item, col):
|
||||
def title_double_clicked(self, index):
|
||||
if self.ui.download_btn.isEnabled() is True:
|
||||
# Check to make sure that this is a version and nothing higher. If you've doubled clicked on anything other
|
||||
# than a version, this returns an AttributeError and the click can be ignored.
|
||||
try:
|
||||
category = item.parent().parent().parent().text(0)
|
||||
except AttributeError:
|
||||
return
|
||||
tree = self.trees[self.ui.platform_tabs.currentIndex()]
|
||||
for title in tree[1][category]:
|
||||
# Check to see if the current title matches the selected one, and if it does, pass that info on.
|
||||
if item.parent().parent().text(0) == (title["TID"] + " - " + title["Name"]):
|
||||
# Need to map the proxy index to the source index because we're using a proxy model for searching. If we
|
||||
# don't, this for some reason isn't handled by PySide and causes a segfault.
|
||||
source_index = self.proxy_models[self.ui.platform_tabs.currentIndex()].mapToSource(index)
|
||||
title = source_index.internalPointer().metadata
|
||||
if title is not None:
|
||||
self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex())
|
||||
try:
|
||||
danger_text = title["Danger"]
|
||||
except KeyError:
|
||||
danger_text = ""
|
||||
selected_title = SelectedTitle(title["TID"], title["Name"], title["Archive Name"], item.text(0)[1:],
|
||||
title["Ticket"], item.parent().text(0), category,
|
||||
self.ui.console_select_dropdown.currentText(), danger_text)
|
||||
selected_title = TitleData(title.tid, title.name, title.version, title.ticket,
|
||||
title.region, title.category, title.danger)
|
||||
self.load_title_data(selected_title)
|
||||
|
||||
def filter_text_updated(self, target: int):
|
||||
text = self.ui.tree_filter_input.text()
|
||||
if text != "":
|
||||
self.trees[target].expandToDepth(0)
|
||||
else:
|
||||
self.trees[target].collapseAll()
|
||||
self.proxy_models[target].setFilterRegularExpression(text)
|
||||
self.trees[target].resizeColumnToContents(0)
|
||||
|
||||
def resize_tree(self, target: int):
|
||||
text = self.ui.tree_filter_input.text()
|
||||
if text == "":
|
||||
tree = self.trees[target]
|
||||
tree.resizeColumnToContents(0)
|
||||
|
||||
def tid_updated(self):
|
||||
tid = self.ui.tid_entry.text()
|
||||
if len(tid) == 16:
|
||||
if tid[:8] == "00000001" and int(tid[-2:], 16) > 2:
|
||||
self.ui.patch_ios_chkbox.setEnabled(True)
|
||||
self.ui.patch_ios_checkbox.setEnabled(True)
|
||||
return
|
||||
self.ui.patch_ios_chkbox.setEnabled(False)
|
||||
self.ui.patch_ios_checkbox.setEnabled(False)
|
||||
|
||||
def download_progress_update(self, done, total, log_text):
|
||||
if done == 0 and total == 0:
|
||||
self.ui.progress_bar.setRange(0, 0)
|
||||
elif done == -1 and total == -1:
|
||||
pass
|
||||
else:
|
||||
self.ui.progress_bar.setRange(0, total)
|
||||
self.ui.progress_bar.setValue(done)
|
||||
# Pass the text on to the log text updater, if it was provided.
|
||||
if log_text:
|
||||
self.update_log_text(log_text)
|
||||
|
||||
def update_log_text(self, new_text):
|
||||
# This method primarily exists to be the handler for the progress signal emitted by the worker thread.
|
||||
@ -182,7 +303,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Yes | QMessageBox.StandardButton.No)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Yes)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "NUSGet Update Available"))
|
||||
msg_box.setText(app.translate("MainWindow", "There's a newer version of NUSGet available!"))
|
||||
msg_box.setText(app.translate("MainWindow", "<b>There's a newer version of NUSGet available!</b>"))
|
||||
msg_box.setInformativeText(app.translate("MainWindow", "You're currently running v{nusget_version}, "
|
||||
"but v{new_version} is available on GitHub. Would you like to view"
|
||||
" the latest version?"
|
||||
@ -191,7 +312,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
if ret == QMessageBox.StandardButton.Yes:
|
||||
webbrowser.open("https://github.com/NinjaCheetah/NUSGet/releases/latest")
|
||||
|
||||
def load_title_data(self, selected_title: SelectedTitle):
|
||||
def load_title_data(self, selected_title: TitleData):
|
||||
# Use the information passed from the double click callback to prepare a title for downloading.
|
||||
# If the last two characters are "XX", then this title has multiple regions, and each region uses its own
|
||||
# two-digit code. Use the region info passed to load the correct code.
|
||||
@ -203,29 +324,25 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
tid = selected_title.tid
|
||||
# Load the TID and version into the entry boxes.
|
||||
self.ui.tid_entry.setText(tid)
|
||||
self.ui.version_entry.setText(selected_title.version)
|
||||
# Load the WAD name, assuming it exists. This shouldn't ever be able to fail as the database has a WAD name
|
||||
# for every single title, regardless of whether it can be packed or not.
|
||||
try:
|
||||
archive_name = f"{selected_title.archive_name}"
|
||||
if selected_title.category != "System" and selected_title.category != "IOS":
|
||||
self.ui.version_entry.setText(str(selected_title.version))
|
||||
# Create the WAD name by deriving it from the title name (basically just replace " " with "-").
|
||||
archive_name = selected_title.name.replace(" ", "-")
|
||||
if selected_title.category not in ["System", "IOS"]:
|
||||
archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}"
|
||||
archive_name += f"-v{selected_title.version}"
|
||||
if selected_title.region != "World":
|
||||
archive_name += f"-{selected_title.region.split('/')[0]}"
|
||||
if self.ui.console_select_dropdown.currentText() == "DSi":
|
||||
archive_name += ".tad"
|
||||
elif self.ui.console_select_dropdown.currentText() == "vWii":
|
||||
else:
|
||||
if self.ui.console_select_dropdown.currentText() == "vWii":
|
||||
if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
|
||||
archive_name += "-vWii"
|
||||
archive_name += ".wad"
|
||||
else:
|
||||
if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
|
||||
archive_name += "-Wii"
|
||||
archive_name += ".wad"
|
||||
self.ui.archive_file_entry.setText(archive_name)
|
||||
except KeyError:
|
||||
pass
|
||||
danger_text = selected_title.danger
|
||||
# Add warning text to the log if the selected title has no ticket.
|
||||
if selected_title.ticket is False:
|
||||
@ -235,28 +352,54 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
self.log_text = f"{tid} - {selected_title.name}\nVersion: {selected_title.version}\n\n{danger_text}\n"
|
||||
self.ui.log_text_browser.setText(self.log_text)
|
||||
|
||||
def lock_ui_for_download(self):
|
||||
def lock_ui(self):
|
||||
# Lock the UI prior to the download beginning to avoid spawning multiple threads or changing info part way in.
|
||||
# Also resets the log.
|
||||
self.ui.tid_entry.setEnabled(False)
|
||||
self.ui.version_entry.setEnabled(False)
|
||||
self.ui.download_btn.setEnabled(False)
|
||||
self.ui.script_btn.setEnabled(False)
|
||||
self.ui.pack_archive_chkbox.setEnabled(False)
|
||||
self.ui.keep_enc_chkbox.setEnabled(False)
|
||||
self.ui.create_dec_chkbox.setEnabled(False)
|
||||
self.ui.use_local_chkbox.setEnabled(False)
|
||||
self.ui.use_wiiu_nus_chkbox.setEnabled(False)
|
||||
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
|
||||
self.ui.pack_archive_checkbox.setEnabled(False)
|
||||
self.ui.keep_enc_checkbox.setEnabled(False)
|
||||
self.ui.create_dec_checkbox.setEnabled(False)
|
||||
self.ui.use_local_checkbox.setEnabled(False)
|
||||
self.ui.patch_ios_checkbox.setEnabled(False)
|
||||
self.ui.use_wiiu_nus_checkbox.setEnabled(False)
|
||||
self.ui.pack_vwii_mode_checkbox.setEnabled(False)
|
||||
self.ui.archive_file_entry.setEnabled(False)
|
||||
self.ui.console_select_dropdown.setEnabled(False)
|
||||
self.ui.auto_update_checkbox.setEnabled(False)
|
||||
self.ui.custom_out_dir_checkbox.setEnabled(False)
|
||||
self.ui.custom_out_dir_entry.setEnabled(False)
|
||||
self.ui.custom_out_dir_btn.setEnabled(False)
|
||||
self.log_text = ""
|
||||
self.ui.log_text_browser.setText(self.log_text)
|
||||
|
||||
def unlock_ui(self):
|
||||
# Unlock the UI again after the current download finishes.
|
||||
self.ui.tid_entry.setEnabled(True)
|
||||
self.ui.version_entry.setEnabled(True)
|
||||
self.ui.download_btn.setEnabled(True)
|
||||
self.ui.script_btn.setEnabled(True)
|
||||
self.ui.pack_archive_checkbox.setEnabled(True)
|
||||
self.ui.keep_enc_checkbox.setEnabled(True)
|
||||
self.ui.create_dec_checkbox.setEnabled(True)
|
||||
self.ui.use_local_checkbox.setEnabled(True)
|
||||
self.ui.patch_ios_checkbox.setEnabled(True)
|
||||
self.ui.use_wiiu_nus_checkbox.setEnabled(True)
|
||||
self.ui.console_select_dropdown.setEnabled(True)
|
||||
if self.ui.pack_archive_checkbox.isChecked() is True:
|
||||
self.ui.archive_file_entry.setEnabled(True)
|
||||
self.ui.auto_update_checkbox.setEnabled(True)
|
||||
self.ui.custom_out_dir_checkbox.setEnabled(True)
|
||||
if self.ui.custom_out_dir_checkbox.isChecked() is True:
|
||||
self.ui.custom_out_dir_entry.setEnabled(True)
|
||||
self.ui.custom_out_dir_btn.setEnabled(True)
|
||||
|
||||
def download_btn_pressed(self):
|
||||
# Throw an error and make a message box appear if you haven't selected any options to output the title.
|
||||
if (self.ui.pack_archive_chkbox.isChecked() is False and self.ui.keep_enc_chkbox.isChecked() is False and
|
||||
self.ui.create_dec_chkbox.isChecked() is False):
|
||||
if (self.ui.pack_archive_checkbox.isChecked() is False and self.ui.keep_enc_checkbox.isChecked() is False and
|
||||
self.ui.create_dec_checkbox.isChecked() is False):
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Critical)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
@ -267,24 +410,39 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
"like the download to be saved."))
|
||||
msg_box.exec()
|
||||
return
|
||||
|
||||
self.lock_ui_for_download()
|
||||
|
||||
self.lock_ui()
|
||||
# Check for a custom output directory, and ensure that it's valid. If it is, then use that.
|
||||
if self.ui.custom_out_dir_checkbox.isChecked() and self.ui.custom_out_dir_entry.text() != "":
|
||||
out_path = pathlib.Path(self.ui.custom_out_dir_entry.text())
|
||||
if not out_path.exists() or not out_path.is_dir():
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Critical)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Invalid Download Directory"))
|
||||
msg_box.setText(app.translate("MainWindow", "The specified download directory does not exist!"))
|
||||
msg_box.setInformativeText(app.translate("MainWindow",
|
||||
"Please make sure the specified download directory exists,"
|
||||
" and that you have permission to access it."))
|
||||
msg_box.exec()
|
||||
return
|
||||
else:
|
||||
out_path = out_folder
|
||||
# Create a new worker object to handle the download in a new thread.
|
||||
if self.ui.console_select_dropdown.currentText() == "DSi":
|
||||
worker = Worker(run_nus_download_dsi, out_folder, self.ui.tid_entry.text(),
|
||||
self.ui.version_entry.text(), self.ui.pack_archive_chkbox.isChecked(),
|
||||
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
|
||||
self.ui.use_local_chkbox.isChecked(), self.ui.archive_file_entry.text())
|
||||
worker = Worker(run_nus_download_dsi, out_path, self.ui.tid_entry.text(),
|
||||
self.ui.version_entry.text(), self.ui.pack_archive_checkbox.isChecked(),
|
||||
self.ui.keep_enc_checkbox.isChecked(), self.ui.create_dec_checkbox.isChecked(),
|
||||
self.ui.use_local_checkbox.isChecked(), self.ui.archive_file_entry.text())
|
||||
else:
|
||||
worker = Worker(run_nus_download_wii, out_folder, self.ui.tid_entry.text(),
|
||||
self.ui.version_entry.text(), self.ui.pack_archive_chkbox.isChecked(),
|
||||
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
|
||||
self.ui.use_wiiu_nus_chkbox.isChecked(), self.ui.use_local_chkbox.isChecked(),
|
||||
self.ui.pack_vwii_mode_chkbox.isChecked(), self.ui.patch_ios_chkbox.isChecked(),
|
||||
worker = Worker(run_nus_download_wii, out_path, self.ui.tid_entry.text(),
|
||||
self.ui.version_entry.text(), self.ui.pack_archive_checkbox.isChecked(),
|
||||
self.ui.keep_enc_checkbox.isChecked(), self.ui.create_dec_checkbox.isChecked(),
|
||||
self.ui.use_wiiu_nus_checkbox.isChecked(), self.ui.use_local_checkbox.isChecked(),
|
||||
self.ui.pack_vwii_mode_checkbox.isChecked(), self.ui.patch_ios_checkbox.isChecked(),
|
||||
self.ui.archive_file_entry.text())
|
||||
worker.signals.result.connect(self.check_download_result)
|
||||
worker.signals.progress.connect(self.update_log_text)
|
||||
worker.signals.progress.connect(self.download_progress_update)
|
||||
self.threadpool.start(worker)
|
||||
|
||||
def check_download_result(self, result):
|
||||
@ -295,30 +453,30 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
if result == -1:
|
||||
window_title = app.translate("MainWindow", "Invalid Title ID")
|
||||
title_text = app.translate("MainWindow", "The Title ID you have entered is not in a valid format!")
|
||||
title_text = app.translate("MainWindow", "<b>The Title ID you have entered is not in a valid format!</b>")
|
||||
body_text = app.translate("MainWindow", "Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly "
|
||||
"formatted Title ID, or select one from the menu on the left.")
|
||||
elif result == -2:
|
||||
window_title = app.translate("MainWindow", "Title ID/Version Not Found")
|
||||
title_text = app.translate("MainWindow", "No title with the provided Title ID or version could be found!")
|
||||
title_text = app.translate("MainWindow", "<b>No title with the provided Title ID or version could be found!</b>")
|
||||
body_text = app.translate("MainWindow", "Please make sure that you have entered a valid Title ID, or selected one from the "
|
||||
"title database, and that the provided version exists for the title you are attempting to download.")
|
||||
elif result == -3:
|
||||
window_title = app.translate("MainWindow", "Content Decryption Failed")
|
||||
title_text = app.translate("MainWindow", "Content decryption was not successful! Decrypted contents could not be created.")
|
||||
title_text = app.translate("MainWindow", "<b>Content decryption was not successful! Decrypted contents could not be created.</b>")
|
||||
body_text = app.translate("MainWindow", "Your TMD or Ticket may be damaged, or they may not correspond with the content being "
|
||||
"decrypted. If you have checked \"Use local files, if they exist\", try disabling that "
|
||||
"option before trying the download again to fix potential issues with local data.")
|
||||
elif result == 1:
|
||||
msg_box.setIcon(QMessageBox.Icon.Warning)
|
||||
window_title = app.translate("MainWindow", "Ticket Not Available")
|
||||
title_text = app.translate("MainWindow", "No Ticket is Available for the Requested Title!")
|
||||
title_text = app.translate("MainWindow", "<b>No Ticket is Available for the Requested Title!</b>")
|
||||
body_text = app.translate("MainWindow", "A ticket could not be downloaded for the requested title, but you have selected \"Pack"
|
||||
" installable archive\" or \"Create decrypted contents\". These options are not "
|
||||
"available for titles without a ticket. Only encrypted contents have been saved.")
|
||||
else:
|
||||
window_title = app.translate("MainWindow", "Unknown Error")
|
||||
title_text = app.translate("MainWindow", "An Unknown Error has Occurred!")
|
||||
title_text = app.translate("MainWindow", "<b>An Unknown Error has Occurred!</b>")
|
||||
body_text = app.translate("MainWindow", "Please try again. If this issue persists, please open a new issue on GitHub detailing"
|
||||
" what you were trying to do when this error occurred.")
|
||||
if result != 0:
|
||||
@ -326,131 +484,203 @@ class MainWindow(QMainWindow, Ui_MainWindow):
|
||||
msg_box.setText(title_text)
|
||||
msg_box.setInformativeText(body_text)
|
||||
msg_box.exec()
|
||||
# Now that the thread has closed, unlock the UI to allow for the next download.
|
||||
self.ui.tid_entry.setEnabled(True)
|
||||
self.ui.version_entry.setEnabled(True)
|
||||
self.ui.download_btn.setEnabled(True)
|
||||
self.ui.script_btn.setEnabled(True)
|
||||
self.ui.pack_archive_chkbox.setEnabled(True)
|
||||
self.ui.keep_enc_chkbox.setEnabled(True)
|
||||
self.ui.create_dec_chkbox.setEnabled(True)
|
||||
self.ui.use_local_chkbox.setEnabled(True)
|
||||
self.ui.use_wiiu_nus_chkbox.setEnabled(True)
|
||||
self.ui.console_select_dropdown.setEnabled(True)
|
||||
if self.ui.pack_archive_chkbox.isChecked() is True:
|
||||
self.ui.archive_file_entry.setEnabled(True)
|
||||
self.unlock_ui()
|
||||
# Call the dropdown callback because this will automagically handle setting console-specific settings based
|
||||
# on the currently selected console, and saves on duplicate code.
|
||||
self.selected_console_changed()
|
||||
|
||||
def pack_wad_chkbox_toggled(self):
|
||||
# Simple function to catch when the WAD/TAD checkbox is toggled and enable/disable the file name entry box
|
||||
# accordingly.
|
||||
if self.ui.pack_archive_chkbox.isChecked() is True:
|
||||
self.ui.archive_file_entry.setEnabled(True)
|
||||
def check_batch_result(self, result: BatchResults):
|
||||
if result.code != 0:
|
||||
msg_box = QMessageBox()
|
||||
if result.failed_titles:
|
||||
msg_box.setIcon(QMessageBox.Icon.Critical)
|
||||
else:
|
||||
self.ui.archive_file_entry.setEnabled(False)
|
||||
msg_box.setIcon(QMessageBox.Icon.Warning)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Script Issues Occurred"))
|
||||
msg_box.setText(app.translate("MainWindow", "<b>Some issues occurred while running the download script.</b>"))
|
||||
msg_box.setInformativeText(
|
||||
app.translate("MainWindow", "Check the log for more details about what issues were encountered."))
|
||||
msg_box.exec()
|
||||
self.log_text = ""
|
||||
if result.failed_titles:
|
||||
self.update_log_text(app.translate("MainWindow",
|
||||
"The following titles could not be downloaded due to an error. "
|
||||
"Please ensure that the Title ID and version listed in the script "
|
||||
"are valid."))
|
||||
for title in result.failed_titles:
|
||||
self.update_log_text(f" - {title}")
|
||||
if result.warning_titles:
|
||||
if result.failed_titles:
|
||||
self.update_log_text("")
|
||||
self.update_log_text(app.translate("MainWindow",
|
||||
"You enabled \"Create decrypted contents\" or \"Pack installable "
|
||||
"archive\", but the following titles in the script do not have "
|
||||
"tickets available. If enabled, encrypted contents were still "
|
||||
"downloaded."))
|
||||
for title in result.warning_titles:
|
||||
self.update_log_text(f" - {title}")
|
||||
self.unlock_ui()
|
||||
|
||||
def selected_console_changed(self):
|
||||
# Callback function to enable or disable console-specific settings based on the selected console.
|
||||
if self.ui.console_select_dropdown.currentText() == "vWii":
|
||||
self.ui.pack_vwii_mode_chkbox.setEnabled(True)
|
||||
self.ui.pack_vwii_mode_checkbox.setEnabled(True)
|
||||
elif self.ui.console_select_dropdown.currentText() == "Wii":
|
||||
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
|
||||
self.ui.pack_vwii_mode_checkbox.setEnabled(False)
|
||||
elif self.ui.console_select_dropdown.currentText() == "DSi":
|
||||
self.ui.pack_vwii_mode_chkbox.setEnabled(False)
|
||||
self.ui.pack_vwii_mode_checkbox.setEnabled(False)
|
||||
|
||||
def script_btn_pressed(self):
|
||||
file_name = QFileDialog.getOpenFileName(self, caption=app.translate("MainWindow", "Open NUS script"), filter=app.translate("MainWindow", "NUS Scripts (*.nus *.txt)"), options=QFileDialog.Option.ReadOnly)
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Critical)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Script Download Failed"))
|
||||
file_name = QFileDialog.getOpenFileName(self, caption=app.translate("MainWindow", "Open NUS Script"),
|
||||
filter=app.translate("MainWindow", "NUS Scripts (*.nus *.json)"),
|
||||
options=QFileDialog.Option.ReadOnly)
|
||||
# The old plaintext script format is no longer supported in NUSGet v1.3.0 and later. This script parsing code
|
||||
# is for the new JSON script format, which is much easier to use and is cleaner.
|
||||
if len(file_name[0]) == 0:
|
||||
return
|
||||
|
||||
try:
|
||||
file = open(file_name[0], "r")
|
||||
except:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Failed to open the script."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
with open(file_name[0]) as script_file:
|
||||
script_data = json.load(script_file)
|
||||
except json.JSONDecodeError as e:
|
||||
msg_box.setText(app.translate("MainWindow", "<b>An error occurred while parsing the script file!</b>"))
|
||||
msg_box.setInformativeText(app.translate("MainWindow", "Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.")
|
||||
.format(lineno=e.lineno, colno=e.colno))
|
||||
msg_box.exec()
|
||||
return
|
||||
|
||||
content = file.readlines()
|
||||
|
||||
# Decoding NUS Scripts
|
||||
# NUS Scripts are plaintext UTF-8 files that list a title per line, terminated with newlines.
|
||||
# Every title is its u64 TID, a space and its u16 version, *both* written in hexadecimal.
|
||||
# NUS itself expects versions as decimal notation, so they need to be decoded first, but TIDs are always written in hexadecimal notation.
|
||||
|
||||
# Build a list of the titles we need to download.
|
||||
titles = []
|
||||
|
||||
for index, title in enumerate(content):
|
||||
decoded = title.replace("\n", "").split(" ", 1)
|
||||
if len(decoded[0]) != 16:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The TID for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
return
|
||||
elif len(decoded[1]) != 4:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
return
|
||||
|
||||
tid = decoded[0]
|
||||
|
||||
for title in script_data:
|
||||
try:
|
||||
version = int(decoded[1], 16)
|
||||
except:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n is not valid.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
tid = title["Title ID"]
|
||||
except KeyError:
|
||||
msg_box.setText(app.translate("MainWindow", "<b>An error occurred while parsing Title IDs!</b>"))
|
||||
msg_box.setInformativeText(app.translate("MainWindow", "The title at index {index} does not have a Title ID!")
|
||||
.format(index=script_data.index(title)))
|
||||
msg_box.exec()
|
||||
return
|
||||
|
||||
title = None
|
||||
for category in self.trees[self.ui.platform_tabs.currentIndex()][1]:
|
||||
for title_ in self.trees[self.ui.platform_tabs.currentIndex()][1][category]:
|
||||
# The last two digits are either identifying the title type (e.g IOS slot, BC type, etc) or a region code; in case of the latter, skip the region here to match it
|
||||
if not ((title_["TID"][-2:] == "XX" and title_["TID"][:-2] == tid[:-2]) or title_["TID"] == tid):
|
||||
continue
|
||||
|
||||
found_ver = False
|
||||
for region in title_["Versions"]:
|
||||
for db_version in title_["Versions"][region]:
|
||||
if db_version == version:
|
||||
found_ver = True
|
||||
break
|
||||
|
||||
if not found_ver:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "The version for title #%n could not be discovered in the database.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
return
|
||||
|
||||
title = title_
|
||||
break
|
||||
|
||||
if title == None:
|
||||
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Title #%n could not be discovered in the database.", "", index+1), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok)
|
||||
return
|
||||
|
||||
titles.append((title["TID"], str(version), title["Archive Name"]))
|
||||
|
||||
self.lock_ui_for_download()
|
||||
|
||||
self.update_log_text(f"Found {len(titles)} titles, starting batch download.")
|
||||
|
||||
if self.ui.console_select_dropdown.currentText() == "DSi":
|
||||
worker = Worker(run_nus_download_dsi_batch, out_folder, titles, self.ui.pack_archive_chkbox.isChecked(),
|
||||
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
|
||||
self.ui.use_local_chkbox.isChecked(), self.ui.archive_file_entry.text())
|
||||
# No version key is acceptable, just treat it as latest.
|
||||
try:
|
||||
title_version = int(title["Version"])
|
||||
except KeyError:
|
||||
title_version = -1
|
||||
# If no console was specified, assume Wii.
|
||||
try:
|
||||
console = title["Console"]
|
||||
except KeyError:
|
||||
console = "Wii"
|
||||
# Look up the title, and load the archive name for it if one can be found.
|
||||
archive_name = ""
|
||||
if console == "vWii":
|
||||
target_database = vwii_database
|
||||
elif console == "DSi":
|
||||
target_database = dsi_database
|
||||
else:
|
||||
worker = Worker(run_nus_download_wii_batch, out_folder, titles, self.ui.pack_archive_chkbox.isChecked(),
|
||||
self.ui.keep_enc_chkbox.isChecked(), self.ui.create_dec_chkbox.isChecked(),
|
||||
self.ui.use_wiiu_nus_chkbox.isChecked(), self.ui.use_local_chkbox.isChecked(),
|
||||
self.ui.pack_vwii_mode_chkbox.isChecked(), self.ui.patch_ios_chkbox.isChecked())
|
||||
|
||||
worker.signals.result.connect(self.check_download_result)
|
||||
worker.signals.progress.connect(self.update_log_text)
|
||||
target_database = wii_database
|
||||
for category in target_database:
|
||||
for t in target_database[category]:
|
||||
if t["TID"][-2:] == "XX":
|
||||
for r in regions:
|
||||
if f"{t['TID'][:-2]}{regions[r][0]}" == tid:
|
||||
try:
|
||||
archive_name = t["Name"].replace(" ", "-")
|
||||
break
|
||||
except KeyError:
|
||||
archive_name = ""
|
||||
break
|
||||
else:
|
||||
if t["TID"] == tid:
|
||||
try:
|
||||
archive_name = t["Name"].replace(" ", "-")
|
||||
break
|
||||
except KeyError:
|
||||
archive_name = ""
|
||||
break
|
||||
titles.append(BatchTitleData(tid, title_version, console, archive_name))
|
||||
self.lock_ui()
|
||||
worker = Worker(run_nus_download_batch, out_folder, titles, self.ui.pack_archive_checkbox.isChecked(),
|
||||
self.ui.keep_enc_checkbox.isChecked(), self.ui.create_dec_checkbox.isChecked(),
|
||||
self.ui.use_wiiu_nus_checkbox.isChecked(), self.ui.use_local_checkbox.isChecked(),
|
||||
self.ui.pack_vwii_mode_checkbox.isChecked(), self.ui.patch_ios_checkbox.isChecked())
|
||||
worker.signals.result.connect(self.check_batch_result)
|
||||
worker.signals.progress.connect(self.download_progress_update)
|
||||
self.threadpool.start(worker)
|
||||
|
||||
def choose_output_dir(self):
|
||||
# Use this handy convenience method to prompt the user to select a directory. Then we just need to validate
|
||||
# that the directory does indeed exist and is a directory, and we can save it as the output directory.
|
||||
selected_dir = QFileDialog.getExistingDirectory(self, app.translate("MainWindow", "Open Directory"),
|
||||
"", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)
|
||||
if selected_dir == "":
|
||||
return
|
||||
out_path = pathlib.Path(selected_dir)
|
||||
if not out_path.exists() or not out_path.is_dir():
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Critical)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Invalid Download Directory"))
|
||||
msg_box.setText(app.translate("MainWindow", "<b>The specified download directory does not exist!</b>"))
|
||||
msg_box.setInformativeText(app.translate("MainWindow",
|
||||
"Please make sure the download directory you want to use exists, and "
|
||||
"that you have permission to access it."))
|
||||
msg_box.exec()
|
||||
return
|
||||
self.ui.custom_out_dir_entry.setText(str(out_path))
|
||||
config_data["out_path"] = str(out_path.absolute())
|
||||
save_config(config_data)
|
||||
|
||||
def custom_output_dir_changed(self):
|
||||
# Callback method for when the custom output dir is changed manually. Check if the current path exists, and
|
||||
# save it if it does.
|
||||
if self.ui.custom_out_dir_entry.text() == "":
|
||||
config_data["out_path"] = ""
|
||||
save_config(config_data)
|
||||
return
|
||||
out_path = pathlib.Path(self.ui.custom_out_dir_entry.text())
|
||||
if out_path.exists() and out_path.is_dir():
|
||||
config_data["out_path"] = str(out_path.absolute())
|
||||
save_config(config_data)
|
||||
|
||||
def about_nusget(self):
|
||||
about_box = AboutNUSGet([nusget_version, version("libWiiPy"), version("libTWLPy")])
|
||||
about_box.exec()
|
||||
|
||||
def change_language(self, new_lang):
|
||||
set_language(config_data, new_lang)
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Warning)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Restart Required"))
|
||||
msg_box.setText(app.translate("MainWindow", "NUSGet must be restarted for the selected language to take effect."))
|
||||
msg_box.exec()
|
||||
|
||||
def change_theme(self, new_theme):
|
||||
set_theme(config_data, new_theme)
|
||||
msg_box = QMessageBox()
|
||||
msg_box.setIcon(QMessageBox.Icon.Warning)
|
||||
msg_box.setStandardButtons(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setDefaultButton(QMessageBox.StandardButton.Ok)
|
||||
msg_box.setWindowTitle(app.translate("MainWindow", "Restart Required"))
|
||||
msg_box.setText(app.translate("MainWindow", "NUSGet must be restarted for the selected theme to take effect."))
|
||||
msg_box.exec()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app = QApplication(sys.argv)
|
||||
# Load the database files, this will work for both the raw Python file and compiled standalone/onefile binaries.
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data/wii-database.json"))
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data", "wii-database.json"))
|
||||
wii_database = json.load(database_file)
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data/vwii-database.json"))
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data", "vwii-database.json"))
|
||||
vwii_database = json.load(database_file)
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data/dsi-database.json"))
|
||||
database_file = open(os.path.join(os.path.dirname(__file__), "data", "dsi-database.json"))
|
||||
dsi_database = json.load(database_file)
|
||||
# Load the user's Downloads directory, which of course requires different steps on Windows vs macOS/Linux.
|
||||
if os.name == 'nt':
|
||||
@ -460,37 +690,73 @@ if __name__ == "__main__":
|
||||
with winreg.OpenKey(winreg.HKEY_CURRENT_USER, sub_key) as key:
|
||||
location = pathlib.Path(winreg.QueryValueEx(key, downloads_guid)[0])
|
||||
else:
|
||||
# Silence a false linter warning about redeclaration, since this is actually only ever assigned once.
|
||||
# noinspection PyRedeclaration
|
||||
location = pathlib.Path(os.path.expanduser('~')).joinpath('Downloads')
|
||||
# Build the path by combining the path to the Downloads photo with "NUSGet".
|
||||
out_folder = location.joinpath("NUSGet")
|
||||
# Create the "NUSGet" directory if it doesn't exist. In the future, this will be user-customizable, but this works
|
||||
# for now, and avoids the issues from when it used to use a directory next to the binary (mostly on macOS).
|
||||
out_folder = location.joinpath("NUSGet Downloads")
|
||||
# Create the "NUSGet Downloads" directory if it doesn't exist. In the future, this will be user-customizable, but
|
||||
# this works for now, and avoids using a directory next to the binary (mostly an issue on macOS/Linux).
|
||||
if not out_folder.is_dir():
|
||||
out_folder.mkdir()
|
||||
|
||||
# Load the system plugins directory on Linux for system styles, if it exists. Try using Breeze if available, because
|
||||
# it looks nice, but fallback on kvantum if it isn't, since kvantum is likely to exist. If all else fails, fusion.
|
||||
if platform.system() == "Linux":
|
||||
if os.path.isdir("/usr/lib/qt6/plugins"):
|
||||
app.addLibraryPath("/usr/lib/qt6/plugins")
|
||||
if "Breeze" in QStyleFactory.keys():
|
||||
app.setStyle("Breeze")
|
||||
elif "kvantum" in QStyleFactory.keys():
|
||||
app.setStyle("kvantum")
|
||||
# Load the config path and then the configuration data, if it exists. If not, then we should initialize it and write
|
||||
# it out.
|
||||
config_file = get_config_file()
|
||||
if config_file.exists():
|
||||
config_data: dict = json.load(open(config_file))
|
||||
else:
|
||||
config_data: dict = {"auto_update": True}
|
||||
save_config(config_data)
|
||||
|
||||
# Load qtbase translations, and then apps-specific translations.
|
||||
# This is essentially obsolete now with the addition of the custom stylesheet, but I'm keeping it just in case.
|
||||
# # Load the system plugins directory on Linux for system styles, if it exists. Try using Breeze if available, because
|
||||
# # it looks nice, but fallback on kvantum if it isn't, since kvantum is likely to exist. If all else fails, fusion.
|
||||
# if platform.system() == "Linux":
|
||||
# if os.path.isdir("/usr/lib/qt6/plugins"):
|
||||
# import subprocess
|
||||
# try:
|
||||
# # This CANNOT be the best way to get the system Qt version, but it's what I came up with for now.
|
||||
# result = subprocess.run(['/usr/lib/qt6/bin/qtdiag'], stdout=subprocess.PIPE)
|
||||
# result_str = result.stdout.decode("utf-8").split("\n")[0]
|
||||
# sys_qt_ver = result_str.split(" ")[1].split(".")
|
||||
# pyside_qt_ver = version("PySide6").split(".")
|
||||
# if sys_qt_ver[0:2] == pyside_qt_ver[0:2]:
|
||||
# app.addLibraryPath("/usr/lib/qt6/plugins")
|
||||
# if "Breeze" in QStyleFactory.keys():
|
||||
# app.setStyle("Breeze")
|
||||
# elif "kvantum" in QStyleFactory.keys():
|
||||
# app.setStyle("kvantum")
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
|
||||
# Load Fusion because that's objectively the best base theme, and then load the fancy stylesheet on top to make
|
||||
# NUSGet look nice and pretty.
|
||||
app.setStyle("fusion")
|
||||
theme_sheet = "style_dark.qss"
|
||||
if is_dark_theme(config_data):
|
||||
theme_sheet = "style_dark.qss"
|
||||
else:
|
||||
theme_sheet = "style_light.qss"
|
||||
stylesheet = open(os.path.join(os.path.dirname(__file__), "resources", theme_sheet)).read()
|
||||
image_path_prefix = pathlib.Path(os.path.join(os.path.dirname(__file__), "resources")).resolve().as_posix()
|
||||
stylesheet = stylesheet.replace("{IMAGE_PREFIX}", image_path_prefix)
|
||||
app.setStyleSheet(stylesheet)
|
||||
|
||||
# Load base Qt translations, and then app-specific translations.
|
||||
path = QLibraryInfo.path(QLibraryInfo.LibraryPath.TranslationsPath)
|
||||
translator = QTranslator(app)
|
||||
if translator.load(QLocale.system(), 'qtbase', '_', path):
|
||||
app.installTranslator(translator)
|
||||
translator = QTranslator(app)
|
||||
path = os.path.join(os.path.dirname(__file__), "resources/translations")
|
||||
if translator.load(QLocale.system(), 'nusget', '_', path):
|
||||
# Get the translation path, and call get_language() to find the appropriate translations to load based on the
|
||||
# settings and system language.
|
||||
path = os.path.join(os.path.dirname(__file__), "resources", "translations")
|
||||
translator = get_language(QTranslator(app), config_data, path)
|
||||
app.installTranslator(translator)
|
||||
|
||||
window = MainWindow()
|
||||
window.setWindowTitle("NUSGet")
|
||||
window.setWindowIcon(QIcon(os.path.join(os.path.dirname(__file__), "resources/icon.png")))
|
||||
app.setWindowIcon(QIcon(os.path.join(os.path.dirname(__file__), "resources", "icon.png")))
|
||||
window.show()
|
||||
|
||||
sys.exit(app.exec())
|
||||
|
@ -3,12 +3,14 @@
|
||||
"NUSGet.py",
|
||||
"./modules/core.py",
|
||||
"./qt/ui/MainMenu.ui",
|
||||
"./qt/py/ui_AboutDialog.py",
|
||||
"./resources/translations/nusget_es.ts",
|
||||
"./resources/translations/nusget_no.ts",
|
||||
"./resources/translations/nusget_nb.ts",
|
||||
"./resources/translations/nusget_fr.ts",
|
||||
"./resources/translations/nusget_it.ts",
|
||||
"./resources/translations/nusget_de.ts",
|
||||
"./resources/translations/nusget_ro.ts"
|
||||
"./resources/translations/nusget_ro.ts",
|
||||
"./resources/translations/nusget_ko.ts"
|
||||
]
|
||||
}
|
||||
|
77
README.md
@ -1,9 +1,14 @@
|
||||
# NUSGet
|
||||
A modern and supercharged NUS downloader built with Python and Qt6. Powered by libWiiPy and libTWLPy.
|
||||
<div align="center">
|
||||
<img src="https://github.com/user-attachments/assets/156eb949-93aa-4453-b7a0-99b784ec0c8c" alt="The icon for NUSGet" width=256 height=256>
|
||||
<h1>NUSGet</h1>
|
||||
<p>A modern and supercharged NUS downloader built with Python and Qt6.</p>
|
||||
<p>Powered by libWiiPy and libTWLPy.</p>
|
||||
<a href="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml">
|
||||
<img src="https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml/badge.svg">
|
||||
</a>
|
||||
</div>
|
||||
|
||||
[](https://github.com/NinjaCheetah/NUSGet/actions/workflows/python-build.yml)
|
||||
|
||||
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
|
||||

|
||||
|
||||
## Features
|
||||
NUSGet allows you to download any content from the Nintendo Update Servers. Free content (content with a Ticket freely available on the servers) can be decrypted or packed directly into an installable archive (WAD/TAD).
|
||||
@ -13,6 +18,7 @@ NUSGet also offers the ability to create vWii WADs that can be installed from wi
|
||||
The following features are available for all supported consoles:
|
||||
- Downloading encrypted contents (files like `00000000`, `00000001`, etc.) directly from the update servers for any title.
|
||||
- Creating decrypted contents (*.app files) from the encrypted contents on the servers. Only supported for free titles.
|
||||
- Scripting support, allowing you to perform batch downloads of any titles for the Wii, vWii, or DSi in one script. (See `example-script.json` for an example of the scripting format.)
|
||||
|
||||
**For Wii and vWii titles only:**
|
||||
- "Pack installable archive (WAD/TAD)": Pack the encrypted contents, TMD, and Ticket into a WAD file that can be installed on a Wii or in Dolphin Emulator. Only supported for free titles.
|
||||
@ -33,51 +39,48 @@ For basic usage on all platforms, you can download the latest release for your o
|
||||
|
||||
## Building
|
||||
### System Requirements
|
||||
- **Windows:** Python 3.11 (Requires Windows 8.1 or later)
|
||||
- **Linux:** Python 3.11
|
||||
- **macOS:** Python 3.11 (Requires macOS 10.9 or later, however macOS 11.0 or later may be required for library support)
|
||||
- **Windows:** Python 3.12 (Requires Windows 8.1 or later)
|
||||
- **Linux:** Python 3.12
|
||||
- **macOS:** Python 3.12 (Requires macOS 10.9 or later, however macOS 11.0 or later may be required for library support)
|
||||
|
||||
**Python 3.12 may be supported now, however it is not tested at this time.**
|
||||
|
||||
First, install the required dependencies:
|
||||
```
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
Then, use the command for your platform to build an executable with Nuitka:
|
||||
|
||||
**Windows**
|
||||
First, make sure you're inside a venv, and then install the required dependencies:
|
||||
```shell
|
||||
python -m nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --windows-icon-from-ico=resources/icon.png --plugin-enable=pyside6 NUSGet.py --windows-console-mode=disable
|
||||
pip install --upgrade -r requirements.txt
|
||||
```
|
||||
After that, follow the directions for your platform.
|
||||
|
||||
**Linux**
|
||||
### Linux and macOS
|
||||
A Makefile is available to build NUSGet on Linux and macOS. **On Linux**, this will give you an executable named `NUSGet` in the root of the project directory. **On macOS**, you'll instead get an application bundle named `NUSGet.app`.
|
||||
```shell
|
||||
python -m nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --plugin-enable=pyside6 NUSGet.py -o NUSGet
|
||||
make all
|
||||
```
|
||||
|
||||
**macOS**
|
||||
Optionally, **on Linux**, you can install NUSGet so that it's available system-wide. This will install it into `/opt/NUSGet/`.
|
||||
```shell
|
||||
python -m nuitka --show-progress --include-data-dir=data=data --include-data-dir=resources=resources --assume-yes-for-downloads --onefile --plugin-enable=pyside6 NUSGet.py --macos-create-app-bundle --macos-app-icon=resources/icon.png
|
||||
sudo make install
|
||||
```
|
||||
On macOS, you can instead put the application bundle in `/Applications/` just like any other program.
|
||||
|
||||
The result will be a single binary named `NUSGet` that contains everything required to run NUSGet. No dependencies are needed on the target system. On Windows and macOS, this will also embed the icon in the program.
|
||||
|
||||
|
||||
### For Linux Users:
|
||||
A Makefile has been included to both build and install NUSGet on Linux. This will automatically set up NUSGet under `/opt/` and install a .desktop file to `/usr/share/applications/` so you can use it like any other application.
|
||||
|
||||
First, use make to build NUSGet (this automates the step above):
|
||||
### Windows
|
||||
On Windows, you can use the PowerShell script `Build.ps1` in place of the Makefile. This will give you an executable named `NUSGet.exe` in the root of the project directory.
|
||||
```shell
|
||||
make linux
|
||||
.\Build.ps1
|
||||
```
|
||||
|
||||
Then, run the install command with `sudo` (or your favorite alternative):
|
||||
```shell
|
||||
sudo make linux-install
|
||||
```
|
||||
## Translations
|
||||
A huge thanks to all the wonderful translators who've helped make NUSGet available to more people!
|
||||
- **French:** [@rougets](https://github.com/rougets)
|
||||
- **German:** [@yeah-its-gloria](https://github.com/yeah-its-gloria)
|
||||
- **Italian:** [@LNLenost](https://github.com/LNLenost)
|
||||
- **Korean:** [@DDinghoya](https://github.com/DDinghoya)
|
||||
- **Norwegian:** [@Rolfie](https://github.com/rolfiee)
|
||||
- **Romanian:** [@NotImplementedLife](https://github.com/NotImplementedLife)
|
||||
- **Spanish:** [@DarkMatterCore](https://github.com/DarkMatterCore)
|
||||
|
||||
If your language isn't present or is out of date, and you'd like to contribute, you can check out [TRANSLATING.md](https://github.com/NinjaCheetah/NUSGet/blob/main/TRANSLATING.md) for directions on how to translate NUSGet.
|
||||
|
||||
|
||||
## Why this and not NUSD?
|
||||
NUS Downloader (Nintendo Update Server Downloader), is an old tool for downloading titles from the Nintendo Update Servers for the Wii and DSi. Originally released in 2009, and effectively last updated in 2011, it stills works today, however it definitely shows its age, and is in need of a refresh. One of the major shortcomings of NUSD is that it only supports Windows, as most of the tools for the Wii from that era are written in C# and use the .NET Framework, especially since they tend to rely on the C# library libWiiSharp. NUSD also has far more limited support for DSi titles, and no support whatsoever for vWii titles.
|
||||
## Additional Thanks
|
||||
The name is a play on NuGet, the .NET package manager. Thank you [@Janni9009](https://github.com/Janni9009) for the name idea!
|
||||
|
||||
With my introduction of [libWiiPy](https://github.com/NinjaCheetah/libWiiPy), there's now a work-in-progress Python library designed to eventually have feature parity with libWiiSharp. At this point in time, the library is featured enough that every piece of libWiiSharp that NUSD relied on is now available in libWiiPy, so I decided to put that to use and create a replacement for it. NUSGet offers nearly all the same features as NUSD (currently there is no support for the DSi servers or for scripting), but is built on top of a modern library with a modern graphical framework, that being Qt6. A major benefit of this rewrite is that its fully cross-platform, and is natively compiled for Windows, Linux, and macOS.
|
||||
Thanks to all those who contributed to libWiiSharp and NUSD, without which this project would not exist.
|
||||
|
@ -1,35 +1,78 @@
|
||||
# Translating NUSGet
|
||||
Since v1.2.0, NUSGet has support for loading Qt translation files. If you'd like to translate NUSGet into your language, see the following directions.
|
||||
To translate NUSGet into your language, first make sure that you have NUSGet's dependencies installed:
|
||||
- [Git](https://git-scm.com/)
|
||||
- [Python](https://python.org) (make sure to install a version listed as compatible in the README)
|
||||
|
||||
### 1. Get Qt Linguist
|
||||
The first thing you'll need to get is Qt Linguist.
|
||||
### Step 1: Fork and Prepare the Repository
|
||||
To fork the repository, either click the "Fork" button on the repository's main page, or [click here](https://github.com/NinjaCheetah/NUSGet/fork).
|
||||
|
||||
For Windows and macOS users, this comes included with a normal Qt install. You'll want to get the official online Qt installer for open-source development, which is free and can be obtained [here](https://www.qt.io/download-qt-installer-oss). You do **not** need the paid/commercial version of Qt, as NUSGet is free software and is developed with the OSS version of Qt.
|
||||
|
||||
For Linux users, you'll likely be able to get Qt's development tools, including Qt Linguist, via your system package manager. You **must** get the Qt 6 version of the development tools, not the Qt 5 version. On Arch, for example, the package you'll need is `qt6-tools`. Depending on how the package is handled, Linguist may not appear in your application menu. If that's the case, you can start it by running `linguist6`.
|
||||
|
||||
|
||||
### 2. Load Your Translation
|
||||
NUSGet's raw translation files are stored in `resources/translations/`.
|
||||
|
||||
If your language doesn't already exist, open up `NUSGet.pyproject` and add a new line for your language. These files must follow the standard two-letter language codes, and you must provide the full path to the file, like with the existing entries. An example entry for Spanish would look like this:
|
||||
```json
|
||||
"./resources/translations/nusget_es.ts"
|
||||
Then, you'll need to clone your new fork locally and enter it:
|
||||
```shell
|
||||
git clone https://github.com/<your-username>/NUSGet
|
||||
cd NUSGet/
|
||||
```
|
||||
|
||||
If your language already exists, or if you just added it, run `python update_translations.py` to generate any new translation files and update existing ones.
|
||||
Then, create and activate a venv (depending on your platform, you may need to specify `python3` rather than `python`):
|
||||
```shell
|
||||
python -m venv .venv
|
||||
|
||||
Once your translation file is ready, open it up in Qt Linguist. You should see NUSGet's interface on the right, so you have the context of where these strings are being used.
|
||||
# Windows
|
||||
.venv\Scripts\activate
|
||||
|
||||
# macOS, Linux, and other Unix-likes
|
||||
source .venv/bin/activate
|
||||
```
|
||||
|
||||
### 3. Translate
|
||||
Qt Linguist will show you a list of all strings that need to be translated, along with their status. For strings that are part of the UI, the corresponding UI element will be shown so that you know what you're translating. For strings only present in the code, the code will be shown instead, which can generally be ignored.
|
||||
Finally, install NUSGet's dependencies:
|
||||
```shell
|
||||
pip install --upgrade -r requirements.txt
|
||||
```
|
||||
|
||||
When you've finished with your translations (or if you just want to test them), head back to the project and run `python build_translations.py`, which will build the translations to QM files in the same directory as the original TS files. These files are packaged as part of the executable when you build NUSGet, and are the actual resources that Qt loads the translations from at runtime.
|
||||
### Step 2: Add Your Language
|
||||
Open `NUSGet.pyproject` in your editor of choice, and check for your language in it. If a line for your language doesn't exist, create a new entry following the format `"./resources/translations/nusget_XX.ts"`, where `XX` is the two-letter code that represents your language.
|
||||
|
||||
### Step 3: Update Translation Files
|
||||
To update the `.ts` files that store the translations and to create them for any newly added languages, run:
|
||||
```shell
|
||||
python update_translations.py
|
||||
```
|
||||
This ensures that you're working on an up-to-date version of the strings in the app.
|
||||
|
||||
### 4. Submit Your Changes
|
||||
Once you've finished with your translations, open a new pull request on NUSGet's repo with your changes, and make sure to use the `translations` label. Please **do not** submit any unrelated changes as part of a translation pull request. Other changes should be submitted separately.
|
||||
### Step 4: Launch Qt Linguist and Load the Translations
|
||||
Qt Linguist is included as part of the `PySide6` package you installed during Step 1. To launch Qt Linguist, use the appropriate command for your platform, replacing `<ver>` with the version of Python you installed (for example, `3.12`).
|
||||
|
||||
```shell
|
||||
# Windows
|
||||
.venv\lib\python<ver>\site-packages\PySide6\linguist.exe
|
||||
|
||||
If you have any questions about translations, feel free to reach out and ask for help.
|
||||
# macOS
|
||||
open .venv/lib/python<ver>/site-packages/PySide6/Linguist.app
|
||||
|
||||
# Linux and other Unix-likes
|
||||
./.venv/lib/python<ver>/site-packages/PySide6/linguist
|
||||
```
|
||||
If you have Qt Linguist installed system-wide already, you can use that instead. These steps are included primarily for those who don't, since installing the Qt Platform Tools on Windows or macOS requires having a Qt account.
|
||||
|
||||
Once you've launched Qt Linguist, you can open the `.ts` file for your language in it.
|
||||
|
||||
### Step 5: Translate!
|
||||
|
||||
### Step 6: Test Your Translations
|
||||
If your current system language is the one you're NUSGet translating into, then you can just run:
|
||||
```shell
|
||||
python NUSGet.py
|
||||
```
|
||||
and the app should open in your language.
|
||||
|
||||
If your system language does not match the language you're translating to, you can specify a language override, like this:
|
||||
```shell
|
||||
LANG=xx_XX.UTF-8 python NUSGet.py
|
||||
```
|
||||
where `xx` is the two-letter language code, such as `ko` for Korean, and `XX` is the country code, such as `KR` for Korea. All together, that would give you:
|
||||
```shell
|
||||
LANG=ko_KR.UTF-8 python NUSGet.py
|
||||
```
|
||||
which would open NUSGet with the Korean translations loaded.
|
||||
|
||||
### Step 7: Push and Merge Your Translations
|
||||
When you're done translating, commit your translations and push them to GitHub. Then, open a pull request on the original repository, and you're all done!
|
||||
|
@ -1,5 +1,5 @@
|
||||
# "build_translations.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah
|
||||
# This script exists to work around an issue in PySide6 where the "pyside6-project build" command incorrectly places
|
||||
# translation files in the root of the project directory while building.
|
||||
|
||||
|
@ -6,11 +6,10 @@
|
||||
"Versions": {
|
||||
"World": [256, 512]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DS-Cartridge-Whitelist"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Launcher (System Menu)",
|
||||
"Name": "Launcher",
|
||||
"TID": "00030017484E41XX",
|
||||
"Versions": {
|
||||
"USA/NTSC": [512, 768, 1024, 1280, 1536, 1792],
|
||||
@ -21,7 +20,6 @@
|
||||
"Australia/NZ": [512, 768, 1024, 1280, 1536, 1792]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Launcher",
|
||||
"Danger": "The Launcher (DSi Menu) is a critical part of the DSi's operation, and should not be modified unless you have Unlaunch installed."
|
||||
},
|
||||
{
|
||||
@ -35,8 +33,7 @@
|
||||
"China": [4, 5, 6, 7, 8, 9],
|
||||
"Australia/NZ": [3, 4, 5, 6, 7, 8, 9]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Version-Data"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "WiFi Firmware",
|
||||
@ -45,7 +42,6 @@
|
||||
"World": [256, 512]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "WiFi-Firmware",
|
||||
"Danger": "The WiFi Firmware is the firmware that runs on the DSi's WiFi chip, and should not be modified. Your console WILL be bricked if this title is damaged or missing."
|
||||
}
|
||||
],
|
||||
@ -56,8 +52,7 @@
|
||||
"Versions": {
|
||||
"World": [256]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "DS-Download-Play"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Flipnote Studio",
|
||||
@ -67,8 +62,7 @@
|
||||
"Europe/PAL": [0],
|
||||
"Japan": [512]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Flipnote-Studio"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo 3DS Transfer Tool",
|
||||
@ -80,8 +74,7 @@
|
||||
"Korea": [256],
|
||||
"Australia/NZ": [512, 768]
|
||||
},
|
||||
"Ticket": false,
|
||||
"Archive Name": "Nintendo-3DS-Transfer-Tool"
|
||||
"Ticket": false
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo DSi Browser",
|
||||
@ -91,8 +84,7 @@
|
||||
"Europe/PAL": [768],
|
||||
"Japan": [768]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DSi-Browser"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo DSi Camera",
|
||||
@ -103,8 +95,7 @@
|
||||
"Japan": [256, 768, 1024],
|
||||
"Australia/NZ": [768, 1024]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DSi-Camera"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo DSi Shop",
|
||||
@ -117,8 +108,7 @@
|
||||
"China": [768],
|
||||
"Australia/NZ": [1536, 1792, 2048, 2304, 2560, 2816, 3072]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DSi-Shop"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo DSi Sound",
|
||||
@ -129,8 +119,7 @@
|
||||
"Japan": [256, 512],
|
||||
"Australia/NZ": [256, 512]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DSi-Sound"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Nintendo Zone",
|
||||
@ -141,8 +130,7 @@
|
||||
"Japan": [512, 768],
|
||||
"Australia/NZ": [512, 768]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Nintendo-DSi-Sound"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "System Settings",
|
||||
@ -155,8 +143,7 @@
|
||||
"China": [768],
|
||||
"Australia/NZ": [512, 768]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "System-Settings"
|
||||
"Ticket": true
|
||||
}
|
||||
],
|
||||
"DSiWare": [
|
||||
|
@ -7,7 +7,6 @@
|
||||
"World": [6, 7]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "BC-NAND",
|
||||
"Danger": "BC-NAND is required for the Wii U to boot Wii titles. DO NOT modify it, or your Wii U will no longer be able to enter Wii mode."
|
||||
},
|
||||
{
|
||||
@ -17,7 +16,6 @@
|
||||
"World": [1]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "BC-WFS",
|
||||
"Danger": "BC-WFS is required for the Wii U to be able to boot Dragon Quest X Online. Do NOT modify it, or your Wii U may experience issues with Wii mode."
|
||||
},
|
||||
{
|
||||
@ -29,8 +27,18 @@
|
||||
"Japan": [512, 544, 608]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "System-Menu",
|
||||
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii."
|
||||
"Danger": "The System Menu is a critical part of the vWii's operation, and should not be modified. If you intend to modify it, you should have Preloader installed, or else you may not be able to use the vWii.",
|
||||
"Public Versions": {
|
||||
"512": "4.3J - Wii U v1.0.0J",
|
||||
"513": "4.3U - Wii U v1.0.0U",
|
||||
"514": "4.3E - Wii U v1.0.0E",
|
||||
"544": "4.3J - Wii U v4.0.0J",
|
||||
"545": "4.3U - Wii U v4.0.0U",
|
||||
"546": "4.3E - Wii U v4.0.0E",
|
||||
"608": "4.3J - Wii U v5.2.0J",
|
||||
"609": "4.3U - Wii U v5.2.0U",
|
||||
"610": "4.3E - Wii U v5.2.0E"
|
||||
}
|
||||
}
|
||||
],
|
||||
"System Channels": [
|
||||
@ -40,8 +48,7 @@
|
||||
"Versions": {
|
||||
"World": [6]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Mii-Channel"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Shopping Channel",
|
||||
@ -49,8 +56,7 @@
|
||||
"Versions": {
|
||||
"World": [21]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Shopping-Channel"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "Return to Wii U Menu",
|
||||
@ -59,7 +65,6 @@
|
||||
"World": [0]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Return-to-Wii-U-Menu",
|
||||
"Danger": "\"Return to Wii U Menu\" is the channel launched from the vWii menu to reboot your console back into Wii U mode. While it generally should not be modified, modifying or removing it will not prevent the vWii from working."
|
||||
},
|
||||
{
|
||||
@ -70,8 +75,7 @@
|
||||
"Europe/PAL": [0, 1, 2, 3, 4, 5],
|
||||
"Japan": [0, 1, 2, 3, 5]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Wii-Electronic-Manual"
|
||||
"Ticket": true
|
||||
}
|
||||
],
|
||||
"Hidden Channels": [
|
||||
@ -84,8 +88,7 @@
|
||||
"Japan": [2]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Region-Select",
|
||||
"Danger": "\"Region Select\" is a hidden channel used during the Wii's initial setup. If this title is damaged or missing, you will not be able to set up your Wii again after a factory reset."
|
||||
"Danger": "\"Region Select\" is a hidden channel used by WiiConnect24 services such as Everybody Votes Channel, for the user regions."
|
||||
},
|
||||
{
|
||||
"Name": "Wii System Transfer (WagonCompat)",
|
||||
@ -96,7 +99,6 @@
|
||||
"Japan": [29, 31]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "Wii-System-Transfer-WC",
|
||||
"Danger": "Note: It is currently unknown how this channel works, but it is involved somehow in the Wii to vWii transfer process. It is recommended to not modify it. Also note that this is separate from the normal, non-hidden channel \"Wii System Transfer Tool\" that works alongside \"Wii U Transfer Tool\" on a source Wii."
|
||||
}
|
||||
],
|
||||
@ -109,8 +111,7 @@
|
||||
"Europe/PAL": [516],
|
||||
"Japan": [516]
|
||||
},
|
||||
"Ticket": false,
|
||||
"Archive Name": "Wii-System-Transfer-Tool-WNP"
|
||||
"Ticket": false
|
||||
}
|
||||
],
|
||||
"IOS": [
|
||||
@ -120,8 +121,7 @@
|
||||
"Versions": {
|
||||
"World": [1290]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS9"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 12",
|
||||
@ -129,8 +129,7 @@
|
||||
"Versions": {
|
||||
"World": [782]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS12"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 13",
|
||||
@ -138,8 +137,7 @@
|
||||
"Versions": {
|
||||
"World": [1288]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS13"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 14",
|
||||
@ -147,8 +145,7 @@
|
||||
"Versions": {
|
||||
"World": [1288]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS14"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 15",
|
||||
@ -156,8 +153,7 @@
|
||||
"Versions": {
|
||||
"World": [1288]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS15"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 17",
|
||||
@ -165,8 +161,7 @@
|
||||
"Versions": {
|
||||
"World": [1288]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS17"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 21",
|
||||
@ -174,8 +169,7 @@
|
||||
"Versions": {
|
||||
"World": [1295]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS21"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 22",
|
||||
@ -183,8 +177,7 @@
|
||||
"Versions": {
|
||||
"World": [1550]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS22"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 28",
|
||||
@ -192,8 +185,7 @@
|
||||
"Versions": {
|
||||
"World": [2063]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS28"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 31",
|
||||
@ -201,8 +193,7 @@
|
||||
"Versions": {
|
||||
"World": [3864]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS31"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 33",
|
||||
@ -210,8 +201,7 @@
|
||||
"Versions": {
|
||||
"World": [3864]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS33"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 34",
|
||||
@ -219,8 +209,7 @@
|
||||
"Versions": {
|
||||
"World": [3864]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS34"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 35",
|
||||
@ -228,8 +217,7 @@
|
||||
"Versions": {
|
||||
"World": [3864]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS35"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 36",
|
||||
@ -237,8 +225,7 @@
|
||||
"Versions": {
|
||||
"World": [3864]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS36"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 37",
|
||||
@ -246,8 +233,7 @@
|
||||
"Versions": {
|
||||
"World": [5919]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS37"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 38",
|
||||
@ -255,8 +241,7 @@
|
||||
"Versions": {
|
||||
"World": [4380]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS38"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 41",
|
||||
@ -264,8 +249,7 @@
|
||||
"Versions": {
|
||||
"World": [3863]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS41"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 43",
|
||||
@ -273,8 +257,7 @@
|
||||
"Versions": {
|
||||
"World": [3863]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS43"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 45",
|
||||
@ -282,8 +265,7 @@
|
||||
"Versions": {
|
||||
"World": [3863]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS45"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 46",
|
||||
@ -291,8 +273,7 @@
|
||||
"Versions": {
|
||||
"World": [3863]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS46"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 48",
|
||||
@ -300,8 +281,7 @@
|
||||
"Versions": {
|
||||
"World": [4380]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS48"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 53",
|
||||
@ -309,8 +289,7 @@
|
||||
"Versions": {
|
||||
"World": [5919]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS53"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 55",
|
||||
@ -318,8 +297,7 @@
|
||||
"Versions": {
|
||||
"World": [5919]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS55"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 56",
|
||||
@ -327,8 +305,7 @@
|
||||
"Versions": {
|
||||
"World": [5918]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS56"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 57",
|
||||
@ -336,8 +313,7 @@
|
||||
"Versions": {
|
||||
"World": [6175]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS57"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 58",
|
||||
@ -345,8 +321,7 @@
|
||||
"Versions": {
|
||||
"World": [6432]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS58"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 59",
|
||||
@ -354,8 +329,7 @@
|
||||
"Versions": {
|
||||
"World": [7201, 8737, 9249]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS59"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 62",
|
||||
@ -363,8 +337,7 @@
|
||||
"Versions": {
|
||||
"World": [6430, 6686, 6942]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS62"
|
||||
"Ticket": true
|
||||
},
|
||||
{
|
||||
"Name": "IOS 80",
|
||||
@ -372,8 +345,7 @@
|
||||
"Versions": {
|
||||
"World": [7200]
|
||||
},
|
||||
"Ticket": true,
|
||||
"Archive Name": "IOS80"
|
||||
"Ticket": true
|
||||
}
|
||||
]
|
||||
}
|
11091
data/wii-database.json
16
example-script.json
Normal file
@ -0,0 +1,16 @@
|
||||
[
|
||||
{
|
||||
"Title ID": "0000000100000050",
|
||||
"Console": "Wii"
|
||||
},
|
||||
{
|
||||
"Title ID": "0000000100000002",
|
||||
"Version": 518,
|
||||
"Console": "Wii"
|
||||
},
|
||||
{
|
||||
"Title ID": "00030017484E4145",
|
||||
"Version": 1792,
|
||||
"Console": "DSi"
|
||||
}
|
||||
]
|
32
modules/config.py
Normal file
@ -0,0 +1,32 @@
|
||||
# "modules/config.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah & Contributors
|
||||
|
||||
import os
|
||||
import json
|
||||
import pathlib
|
||||
import platform
|
||||
|
||||
|
||||
def get_config_file() -> pathlib.Path:
|
||||
if platform.system() == "Windows":
|
||||
config_dir = pathlib.Path(os.environ.get('APPDATA'), "NUSGet")
|
||||
elif platform.system() == "Darwin":
|
||||
config_dir = pathlib.Path(os.environ['HOME'], "Library", "Application Support", "NUSGet")
|
||||
else:
|
||||
if os.environ.get('XDG_CONFIG_HOME'):
|
||||
config_dir = pathlib.Path(os.environ.get('XDG_CONFIG_HOME'), "NUSGet")
|
||||
else:
|
||||
config_dir = pathlib.Path(os.environ['HOME'], ".config", "NUSGet")
|
||||
config_dir.mkdir(exist_ok=True, parents=True)
|
||||
return config_dir.joinpath("config.json")
|
||||
|
||||
|
||||
def save_config(config_data: dict) -> None:
|
||||
config_file = get_config_file()
|
||||
print(f"writing data: {config_data}")
|
||||
open(config_file, "w").write(json.dumps(config_data, indent=4))
|
||||
|
||||
|
||||
def update_setting(config_data: dict, setting: str, value: any) -> None:
|
||||
config_data[setting] = value
|
||||
save_config(config_data)
|
@ -1,24 +1,72 @@
|
||||
# "modules/core.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah & Contributors
|
||||
|
||||
import requests
|
||||
from dataclasses import dataclass
|
||||
from typing import List
|
||||
|
||||
from PySide6.QtCore import Qt, QSize
|
||||
from PySide6.QtWidgets import QStyledItemDelegate
|
||||
|
||||
|
||||
# This is required to make the dropdown look correct with the custom styling. A little fuzzy on the why, but it has to
|
||||
# do with how Qt handles rendering the dropdown items. The sizing has to be overridden so that they don't overlap.
|
||||
class ComboBoxItemDelegate(QStyledItemDelegate):
|
||||
def sizeHint(self, option, index):
|
||||
return QSize(option.rect.width(), 33)
|
||||
|
||||
|
||||
@dataclass
|
||||
class SelectedTitle:
|
||||
# Class to store all components of a selected title to make tracking it easier.
|
||||
class TitleData:
|
||||
# Class to store all data for a Title.
|
||||
tid: str
|
||||
name: str
|
||||
archive_name: str
|
||||
version: str
|
||||
ticket: bool
|
||||
region: str
|
||||
category: str
|
||||
console: str
|
||||
danger: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class BatchTitleData:
|
||||
# Class to store all data for a Title in a batch operation.
|
||||
tid: str
|
||||
version: int
|
||||
console: str
|
||||
archive_name: str
|
||||
|
||||
|
||||
@dataclass
|
||||
class BatchResults:
|
||||
# Class to store the results of a batch download.
|
||||
code: int
|
||||
warning_titles: List[str]
|
||||
failed_titles: List[str]
|
||||
|
||||
|
||||
def connect_label_to_checkbox(label, checkbox):
|
||||
def toggle_checkbox(event):
|
||||
if checkbox.isEnabled() and event.button() == Qt.LeftButton:
|
||||
checkbox.toggle()
|
||||
label.mousePressEvent = toggle_checkbox
|
||||
|
||||
|
||||
def connect_is_enabled_to_checkbox(items, chkbox):
|
||||
for item in items:
|
||||
if chkbox.isChecked():
|
||||
item.setEnabled(True)
|
||||
else:
|
||||
item.setEnabled(False)
|
||||
|
||||
|
||||
def fixup_qmenu_background(menu):
|
||||
# These fixes are required to not have a square background poking out from behind the rounded corners of a QMenu.
|
||||
menu.setWindowFlags(menu.windowFlags() | Qt.FramelessWindowHint)
|
||||
menu.setWindowFlags(menu.windowFlags() | Qt.NoDropShadowWindowHint)
|
||||
menu.setAttribute(Qt.WA_TranslucentBackground)
|
||||
|
||||
|
||||
def check_nusget_updates(app, current_version: str, progress_callback=None) -> str | None:
|
||||
# Simple function to make a request to the GitHub API and then check if the latest available version is newer.
|
||||
gh_api_request = requests.get(url="https://api.github.com/repos/NinjaCheetah/NUSGet/releases/latest", stream=True)
|
||||
@ -30,7 +78,9 @@ def check_nusget_updates(app, current_version: str, progress_callback=None) -> s
|
||||
new_version_split = new_version.split('.')
|
||||
current_version_split = current_version.split('.')
|
||||
for place in range(len(new_version_split)):
|
||||
if new_version_split[place] > current_version_split[place]:
|
||||
if new_version_split[place] < current_version_split[place]:
|
||||
return None
|
||||
elif new_version_split[place] > current_version_split[place]:
|
||||
progress_callback.emit(app.translate("MainWindow", "\n\nThere's a newer version of NUSGet available!"))
|
||||
return new_version
|
||||
progress_callback.emit(app.translate("MainWindow", "\n\nYou're running the latest release of NUSGet."))
|
||||
|
57
modules/download_batch.py
Normal file
@ -0,0 +1,57 @@
|
||||
# "modules/download_batch.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah
|
||||
|
||||
import pathlib
|
||||
from typing import List
|
||||
from modules.core import BatchTitleData, BatchResults
|
||||
from modules.download_dsi import run_nus_download_dsi
|
||||
from modules.download_wii import run_nus_download_wii
|
||||
|
||||
|
||||
def run_nus_download_batch(out_folder: pathlib.Path, titles: List[BatchTitleData], pack_wad_chkbox: bool,
|
||||
keep_enc_chkbox: bool, decrypt_contents_chkbox: bool, wiiu_nus_chkbox: bool,
|
||||
use_local_chkbox: bool, repack_vwii_chkbox: bool, patch_ios: bool,
|
||||
progress_callback=None) -> BatchResults:
|
||||
result = 0
|
||||
warning_titles = []
|
||||
failed_titles = []
|
||||
for title in titles:
|
||||
if title.version == -1:
|
||||
version_str = "Latest"
|
||||
else:
|
||||
version_str = str(title.version)
|
||||
if title.console == "Wii" or title.console == "vWii":
|
||||
if title.archive_name != "":
|
||||
archive_name = f"{title.archive_name}-v{version_str}-{title.console}.wad"
|
||||
else:
|
||||
archive_name = f"{title.tid}-v{version_str}-{title.console}.wad"
|
||||
code = run_nus_download_wii(out_folder, title.tid, version_str, pack_wad_chkbox, keep_enc_chkbox,
|
||||
decrypt_contents_chkbox, wiiu_nus_chkbox, use_local_chkbox, repack_vwii_chkbox,
|
||||
patch_ios, archive_name, progress_callback)
|
||||
if code == 1:
|
||||
# Code 1 means no ticket available, so mark that as a warning title.
|
||||
result = 1
|
||||
warning_titles.append(title.tid)
|
||||
elif code != 0:
|
||||
# Any other non-zero return code means that an error occurred during the download, so mark that as a
|
||||
# failed title.
|
||||
result = 1
|
||||
failed_titles.append(title.tid)
|
||||
elif title.console == "DSi":
|
||||
if title.archive_name != "":
|
||||
archive_name = f"{title.archive_name}-v{version_str}-{title.console}.tad"
|
||||
else:
|
||||
archive_name = f"{title.tid}-v{version_str}-{title.console}.tad"
|
||||
code = run_nus_download_dsi(out_folder, title.tid, version_str, pack_wad_chkbox, keep_enc_chkbox,
|
||||
decrypt_contents_chkbox, use_local_chkbox, archive_name, progress_callback)
|
||||
if code == 1:
|
||||
# Code 1 means no ticket available, so mark that as a warning title.
|
||||
result = 1
|
||||
warning_titles.append(title.tid)
|
||||
elif code != 0:
|
||||
# Any other non-zero return code means that an error occurred during the download, so mark that as a
|
||||
# failed title.
|
||||
result = 1
|
||||
failed_titles.append(title.tid)
|
||||
progress_callback.emit(0, 1, f"Batch download finished.")
|
||||
return BatchResults(result, warning_titles, failed_titles)
|
@ -1,9 +1,7 @@
|
||||
# "modules/download_dsi.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
from typing import List, Tuple
|
||||
|
||||
import libTWLPy
|
||||
|
||||
@ -27,15 +25,14 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
|
||||
# Create a new libTWLPy Title.
|
||||
title = libTWLPy.Title()
|
||||
# Make a directory for this title if it doesn't exist.
|
||||
title_dir = pathlib.Path(os.path.join(out_folder, tid))
|
||||
if not title_dir.is_dir():
|
||||
title_dir.mkdir()
|
||||
title_dir = out_folder.joinpath(tid)
|
||||
title_dir.mkdir(exist_ok=True)
|
||||
# Announce the title being downloaded, and the version if applicable.
|
||||
if title_version is not None:
|
||||
progress_callback.emit("Downloading title " + tid + " v" + str(title_version) + ", please wait...")
|
||||
progress_callback.emit(0, 0, f"Downloading title {tid} v{title_version}, please wait...")
|
||||
else:
|
||||
progress_callback.emit("Downloading title " + tid + " vLatest, please wait...")
|
||||
progress_callback.emit(" - Downloading and parsing TMD...")
|
||||
progress_callback.emit(0, 0, f"Downloading title {tid} vLatest, please wait...")
|
||||
progress_callback.emit(-1, -1, " - Downloading and parsing TMD...")
|
||||
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
|
||||
try:
|
||||
if title_version is not None:
|
||||
@ -47,65 +44,48 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
|
||||
except ValueError:
|
||||
return -2
|
||||
# Make a directory for this version if it doesn't exist.
|
||||
version_dir = pathlib.Path(os.path.join(title_dir, str(title_version)))
|
||||
if not version_dir.is_dir():
|
||||
version_dir.mkdir()
|
||||
version_dir = title_dir.joinpath(str(title_version))
|
||||
version_dir.mkdir(exist_ok=True)
|
||||
# Write out the TMD to a file.
|
||||
tmd_out = open(os.path.join(version_dir, "tmd." + str(title_version)), "wb")
|
||||
tmd_out.write(title.tmd.dump())
|
||||
tmd_out.close()
|
||||
version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
|
||||
# Use a local ticket, if one exists and "use local files" is enabled.
|
||||
if use_local_chkbox is True and os.path.exists(os.path.join(version_dir, "tik")):
|
||||
progress_callback.emit(" - Parsing local copy of Ticket...")
|
||||
local_ticket = open(os.path.join(version_dir, "tik"), "rb")
|
||||
title.load_ticket(local_ticket.read())
|
||||
if use_local_chkbox and version_dir.joinpath("tik").exists():
|
||||
progress_callback.emit(-1, -1, " - Parsing local copy of Ticket...")
|
||||
title.load_ticket(version_dir.joinpath("tik").read_bytes())
|
||||
else:
|
||||
progress_callback.emit(" - Downloading and parsing Ticket...")
|
||||
progress_callback.emit(-1, -1, " - Downloading and parsing Ticket...")
|
||||
try:
|
||||
title.load_ticket(libTWLPy.download_ticket(tid))
|
||||
ticket_out = open(os.path.join(version_dir, "tik"), "wb")
|
||||
ticket_out.write(title.ticket.dump())
|
||||
ticket_out.close()
|
||||
version_dir.joinpath("tik").write_bytes(title.ticket.dump())
|
||||
except ValueError:
|
||||
# If libTWLPy returns an error, then no ticket is available. Log this, and disable options requiring a
|
||||
# ticket so that they aren't attempted later.
|
||||
progress_callback.emit(" - No Ticket is available!")
|
||||
progress_callback.emit(-1, -1, " - No Ticket is available!")
|
||||
pack_tad_enabled = False
|
||||
decrypt_contents_enabled = False
|
||||
# Load the content record from the TMD, and download the content it lists. DSi titles only have one content.
|
||||
title.load_content_records()
|
||||
content_file_name = hex(title.tmd.content_record.content_id)[2:]
|
||||
while len(content_file_name) < 8:
|
||||
content_file_name = "0" + content_file_name
|
||||
content_file_name = f"{title.tmd.content_record.content_id:08X}"
|
||||
# Check for a local copy of the current content if "use local files" is enabled, and use it.
|
||||
if use_local_chkbox is True and os.path.exists(os.path.join(version_dir, content_file_name)):
|
||||
progress_callback.emit(" - Using local copy of content")
|
||||
local_file = open(os.path.join(version_dir, content_file_name), "rb")
|
||||
content = local_file.read()
|
||||
if use_local_chkbox and version_dir.joinpath(content_file_name).exists():
|
||||
progress_callback.emit(-1, -1, " - Using local copy of content")
|
||||
content = version_dir.joinpath(content_file_name).read_bytes()
|
||||
else:
|
||||
progress_callback.emit(" - Downloading content (Content ID: " + str(title.tmd.content_record.content_id) +
|
||||
", Size: " + str(title.tmd.content_record.content_size) + " bytes)...")
|
||||
progress_callback.emit(-1, -1, f" - Downloading content (Content ID: {title.tmd.content_record.content_id}, Size: "
|
||||
f"{title.tmd.content_record.content_size} bytes)...")
|
||||
content = libTWLPy.download_content(tid, title.tmd.content_record.content_id)
|
||||
progress_callback.emit(" - Done!")
|
||||
# If keep encrypted contents is on, write out each content after its downloaded.
|
||||
progress_callback.emit(-1, -1, " - Done!")
|
||||
# If keep encrypted contents is on, write out the content after its downloaded.
|
||||
if keep_enc_chkbox is True:
|
||||
enc_content_out = open(os.path.join(version_dir, content_file_name), "wb")
|
||||
enc_content_out.write(content)
|
||||
enc_content_out.close()
|
||||
version_dir.joinpath(content_file_name).write_bytes(content)
|
||||
title.content.content = content
|
||||
# If decrypt local contents is still true, decrypt each content and write out the decrypted file.
|
||||
# If decrypt local contents is still true, decrypt the content and write out the decrypted file.
|
||||
if decrypt_contents_enabled is True:
|
||||
try:
|
||||
progress_callback.emit(" - Decrypting content (Content ID: " + str(title.tmd.content_record.content_id)
|
||||
+ ")...")
|
||||
progress_callback.emit(-1, -1, f" - Decrypting content (Content ID: {title.tmd.content_record.content_id})...")
|
||||
dec_content = title.get_content()
|
||||
content_file_name = hex(title.tmd.content_record.content_id)[2:]
|
||||
while len(content_file_name) < 8:
|
||||
content_file_name = "0" + content_file_name
|
||||
content_file_name = content_file_name + ".app"
|
||||
dec_content_out = open(os.path.join(version_dir, content_file_name), "wb")
|
||||
dec_content_out.write(dec_content)
|
||||
dec_content_out.close()
|
||||
content_file_name = f"{title.tmd.content_record.content_id:08X}.app"
|
||||
version_dir.joinpath(content_file_name).write_bytes(dec_content)
|
||||
except ValueError:
|
||||
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using
|
||||
# local encrypted contents that have been altered at present.
|
||||
@ -113,33 +93,27 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
|
||||
# If pack TAD is still true, pack the TMD, ticket, and content into a TAD.
|
||||
if pack_tad_enabled is True:
|
||||
# Get the TAD certificate chain, courtesy of libTWLPy.
|
||||
progress_callback.emit(" - Building certificate...")
|
||||
progress_callback.emit(-1, -1, " - Building certificate...")
|
||||
title.tad.set_cert_data(libTWLPy.download_cert())
|
||||
# Use a typed TAD name if there is one, and auto generate one based on the TID and version if there isn't.
|
||||
progress_callback.emit("Packing TAD...")
|
||||
progress_callback.emit(-1, -1, "Packing TAD...")
|
||||
if tad_file_name != "" and tad_file_name is not None:
|
||||
if tad_file_name[-4:] != ".tad":
|
||||
tad_file_name = tad_file_name + ".tad"
|
||||
# Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
|
||||
tad_file_name = tad_file_name.replace("-vLatest", f"-v{title_version}")
|
||||
if tad_file_name[-4:].lower() != ".tad":
|
||||
tad_file_name += ".tad"
|
||||
else:
|
||||
tad_file_name = tid + "-v" + str(title_version) + ".tad"
|
||||
tad_file_name = f"{tid}-v{title_version}.tad"
|
||||
# Certain special characters are prone to breaking things, so strip them from the file name before actually
|
||||
# opening the file for writing. On some platforms (like macOS), invalid characters get replaced automatically,
|
||||
# but on Windows the file will just fail to be written out at all.
|
||||
tad_file_name = tad_file_name.translate({ord(c): None for c in '/\\:*"?<>|'})
|
||||
# Have libTWLPy dump the TAD, and write that data out.
|
||||
file = open(os.path.join(version_dir, tad_file_name), "wb")
|
||||
file.write(title.dump_tad())
|
||||
file.close()
|
||||
progress_callback.emit("Download complete!")
|
||||
version_dir.joinpath(tad_file_name).write_bytes(title.dump_tad())
|
||||
progress_callback.emit(0, 1, "Download complete!")
|
||||
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this
|
||||
# point, it means that they enabled decryption or TAD packing for a title that doesn't have a ticket. Return
|
||||
# code 1 so that a warning popup is shown informing them of this.
|
||||
if (not pack_tad_enabled and pack_tad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def run_nus_download_dsi_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str, str]], pack_tad_chkbox: bool, keep_enc_chkbox: bool,
|
||||
decrypt_contents_chkbox: bool, use_local_chkbox: bool, progress_callback=None):
|
||||
for title in titles:
|
||||
result = run_nus_download_dsi(out_folder, title[0], title[1], pack_tad_chkbox, keep_enc_chkbox, decrypt_contents_chkbox, use_local_chkbox, f"{title[2]}-{title[1]}.tad", progress_callback)
|
||||
if result != 0:
|
||||
return result
|
||||
|
||||
progress_callback.emit(f"Batch download finished.")
|
||||
return 0
|
||||
|
@ -1,9 +1,7 @@
|
||||
# "modules/download_wii.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah & Contributors
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
from typing import List, Tuple
|
||||
|
||||
import libWiiPy
|
||||
|
||||
@ -11,6 +9,8 @@ import libWiiPy
|
||||
def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_wad_chkbox: bool, keep_enc_chkbox: bool,
|
||||
decrypt_contents_chkbox: bool, wiiu_nus_chkbox: bool, use_local_chkbox: bool,
|
||||
repack_vwii_chkbox: bool, patch_ios: bool, wad_file_name: str, progress_callback=None):
|
||||
def progress_update(done, total):
|
||||
progress_callback.emit(done, total, None)
|
||||
# Actual NUS download function that runs in a separate thread.
|
||||
# Immediately knock out any invalidly formatted Title IDs.
|
||||
if len(tid) != 16:
|
||||
@ -29,96 +29,74 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
|
||||
# Create a new libWiiPy Title.
|
||||
title = libWiiPy.title.Title()
|
||||
# Make a directory for this title if it doesn't exist.
|
||||
title_dir = pathlib.Path(os.path.join(out_folder, tid))
|
||||
if not title_dir.is_dir():
|
||||
title_dir.mkdir()
|
||||
title_dir = out_folder.joinpath(tid)
|
||||
title_dir.mkdir(exist_ok=True)
|
||||
# Announce the title being downloaded, and the version if applicable.
|
||||
if title_version is not None:
|
||||
progress_callback.emit("Downloading title " + tid + " v" + str(title_version) + ", please wait...")
|
||||
progress_callback.emit(0, 0, f"Downloading title {tid} v{title_version}, please wait...")
|
||||
else:
|
||||
progress_callback.emit("Downloading title " + tid + " vLatest, please wait...")
|
||||
progress_callback.emit(" - Downloading and parsing TMD...")
|
||||
progress_callback.emit(-1, -1, f"Downloading title {tid} vLatest, please wait...")
|
||||
progress_callback.emit(-1, -1, " - Downloading and parsing TMD...")
|
||||
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
|
||||
try:
|
||||
if title_version is not None:
|
||||
title.load_tmd(libWiiPy.title.download_tmd(tid, title_version, wiiu_endpoint=wiiu_nus_enabled))
|
||||
title.load_tmd(libWiiPy.title.download_tmd(tid, title_version, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
|
||||
else:
|
||||
title.load_tmd(libWiiPy.title.download_tmd(tid, wiiu_endpoint=wiiu_nus_enabled))
|
||||
title.load_tmd(libWiiPy.title.download_tmd(tid, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
|
||||
title_version = title.tmd.title_version
|
||||
# If libWiiPy returns an error, that means that either the TID or version doesn't exist, so return code -2.
|
||||
except ValueError:
|
||||
return -2
|
||||
# Make a directory for this version if it doesn't exist.
|
||||
version_dir = pathlib.Path(os.path.join(title_dir, str(title_version)))
|
||||
if not version_dir.is_dir():
|
||||
version_dir.mkdir()
|
||||
version_dir = title_dir.joinpath(str(title_version))
|
||||
version_dir.mkdir(exist_ok=True)
|
||||
# Write out the TMD to a file.
|
||||
tmd_out = open(os.path.join(version_dir, "tmd." + str(title_version)), "wb")
|
||||
tmd_out.write(title.tmd.dump())
|
||||
tmd_out.close()
|
||||
version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
|
||||
# Use a local ticket, if one exists and "use local files" is enabled.
|
||||
if use_local_chkbox is True and os.path.exists(os.path.join(version_dir, "tik")):
|
||||
progress_callback.emit(" - Parsing local copy of Ticket...")
|
||||
local_ticket = open(os.path.join(version_dir, "tik"), "rb")
|
||||
title.load_ticket(local_ticket.read())
|
||||
if use_local_chkbox and version_dir.joinpath("tik").exists():
|
||||
progress_callback.emit(-1, -1, " - Parsing local copy of Ticket...")
|
||||
title.load_ticket(version_dir.joinpath("tik").read_bytes())
|
||||
else:
|
||||
progress_callback.emit(" - Downloading and parsing Ticket...")
|
||||
progress_callback.emit(-1, -1, " - Downloading and parsing Ticket...")
|
||||
try:
|
||||
title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled))
|
||||
ticket_out = open(os.path.join(version_dir, "tik"), "wb")
|
||||
ticket_out.write(title.ticket.dump())
|
||||
ticket_out.close()
|
||||
title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
|
||||
version_dir.joinpath("tik").write_bytes(title.ticket.dump())
|
||||
except ValueError:
|
||||
# If libWiiPy returns an error, then no ticket is available. Log this, and disable options requiring a
|
||||
# ticket so that they aren't attempted later.
|
||||
progress_callback.emit(" - No Ticket is available!")
|
||||
progress_callback.emit(0, 0, " - No Ticket is available!")
|
||||
pack_wad_enabled = False
|
||||
decrypt_contents_enabled = False
|
||||
# Load the content records from the TMD, and begin iterating over the records.
|
||||
title.load_content_records()
|
||||
content_list = []
|
||||
for content in range(len(title.tmd.content_records)):
|
||||
# Generate the correct file name by converting the content ID into hex, minus the 0x, and then appending
|
||||
# that to the end of 000000. I refuse to believe there isn't a better way to do this here and in libWiiPy.
|
||||
content_file_name = hex(title.tmd.content_records[content].content_id)[2:]
|
||||
while len(content_file_name) < 8:
|
||||
content_file_name = "0" + content_file_name
|
||||
# Generate the correct file name by converting the content ID into hex.
|
||||
content_file_name = f"{title.tmd.content_records[content].content_id:08X}"
|
||||
# Check for a local copy of the current content if "use local files" is enabled, and use it.
|
||||
if use_local_chkbox is True and os.path.exists(os.path.join(version_dir,
|
||||
content_file_name)):
|
||||
progress_callback.emit(" - Using local copy of content " + str(content + 1) + " of " +
|
||||
str(len(title.tmd.content_records)))
|
||||
local_file = open(os.path.join(version_dir, content_file_name), "rb")
|
||||
content_list.append(local_file.read())
|
||||
if use_local_chkbox is True and version_dir.joinpath(content_file_name).exists():
|
||||
progress_callback.emit(-1, -1, f" - Using local copy of content {content + 1} of {len(title.tmd.content_records)}")
|
||||
content_list.append(version_dir.joinpath(content_file_name).read_bytes())
|
||||
else:
|
||||
progress_callback.emit(" - Downloading content " + str(content + 1) + " of " +
|
||||
str(len(title.tmd.content_records)) + " (Content ID: " +
|
||||
str(title.tmd.content_records[content].content_id) + ", Size: " +
|
||||
str(title.tmd.content_records[content].content_size) + " bytes)...")
|
||||
progress_callback.emit(0, 0, f" - Downloading content {content + 1} of {len(title.tmd.content_records)} "
|
||||
f"(Content ID: {title.tmd.content_records[content].content_id}, Size: "
|
||||
f"{title.tmd.content_records[content].content_size} bytes)...")
|
||||
content_list.append(libWiiPy.title.download_content(tid, title.tmd.content_records[content].content_id,
|
||||
wiiu_endpoint=wiiu_nus_enabled))
|
||||
progress_callback.emit(" - Done!")
|
||||
wiiu_endpoint=wiiu_nus_enabled, progress=progress_update))
|
||||
progress_callback.emit(-1, -1, " - Done!")
|
||||
# If keep encrypted contents is on, write out each content after its downloaded.
|
||||
if keep_enc_chkbox is True:
|
||||
enc_content_out = open(os.path.join(version_dir, content_file_name), "wb")
|
||||
enc_content_out.write(content_list[content])
|
||||
enc_content_out.close()
|
||||
version_dir.joinpath(content_file_name).write_bytes(content_list[content])
|
||||
title.content.content_list = content_list
|
||||
# If decrypt local contents is still true, decrypt each content and write out the decrypted file.
|
||||
if decrypt_contents_enabled is True:
|
||||
try:
|
||||
for content in range(len(title.tmd.content_records)):
|
||||
progress_callback.emit(" - Decrypting content " + str(content + 1) + " of " +
|
||||
str(len(title.tmd.content_records)) + " (Content ID: " +
|
||||
str(title.tmd.content_records[content].content_id) + ")...")
|
||||
progress_callback.emit(-1, -1, f" - Decrypting content {content + 1} of {len(title.tmd.content_records)} "
|
||||
f"(Content ID: {title.tmd.content_records[content].content_id})...")
|
||||
dec_content = title.get_content_by_index(content)
|
||||
content_file_name = hex(title.tmd.content_records[content].content_id)[2:]
|
||||
while len(content_file_name) < 8:
|
||||
content_file_name = "0" + content_file_name
|
||||
content_file_name = content_file_name + ".app"
|
||||
dec_content_out = open(os.path.join(version_dir, content_file_name), "wb")
|
||||
dec_content_out.write(dec_content)
|
||||
dec_content_out.close()
|
||||
content_file_name = f"{title.tmd.content_records[content].content_id:08X}.app"
|
||||
version_dir.joinpath(content_file_name).write_bytes(dec_content)
|
||||
except ValueError:
|
||||
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using
|
||||
# local encrypted contents that have been altered at present.
|
||||
@ -129,51 +107,45 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
|
||||
# re-encrypted with the common key instead of the vWii key, so that the title can be installed from within
|
||||
# vWii mode. (vWii mode does not have access to the vWii key, only Wii U mode has that.)
|
||||
if repack_vwii_chkbox is True and (tid[3] == "7" or tid[7] == "7"):
|
||||
progress_callback.emit(" - Re-encrypting Title Key with the common key...")
|
||||
title_key_dec = title.ticket.get_title_key()
|
||||
title_key_common = libWiiPy.title.encrypt_title_key(title_key_dec, 0, title.tmd.title_id)
|
||||
progress_callback.emit(-1, -1, " - Re-encrypting Title Key with the common key...")
|
||||
title_key_common = libWiiPy.title.encrypt_title_key(title.ticket.get_title_key(), 0, title.tmd.title_id)
|
||||
title.ticket.common_key_index = 0
|
||||
title.ticket.title_key_enc = title_key_common
|
||||
# Get the WAD certificate chain, courtesy of libWiiPy.
|
||||
progress_callback.emit(" - Building certificate...")
|
||||
title.wad.set_cert_data(libWiiPy.title.download_cert(wiiu_endpoint=wiiu_nus_enabled))
|
||||
progress_callback.emit(-1, -1, " - Building certificate...")
|
||||
title.load_cert_chain(libWiiPy.title.download_cert_chain(wiiu_endpoint=wiiu_nus_enabled))
|
||||
# Use a typed WAD name if there is one, and auto generate one based on the TID and version if there isn't.
|
||||
progress_callback.emit(" - Packing WAD...")
|
||||
progress_callback.emit(-1, -1, " - Packing WAD...")
|
||||
if wad_file_name != "" and wad_file_name is not None:
|
||||
if wad_file_name[-4:] != ".wad":
|
||||
wad_file_name = wad_file_name + ".wad"
|
||||
# Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
|
||||
wad_file_name = wad_file_name.replace("-vLatest", f"-v{title_version}")
|
||||
if wad_file_name[-4:].lower() != ".wad":
|
||||
wad_file_name += ".wad"
|
||||
else:
|
||||
wad_file_name = tid + "-v" + str(title_version) + ".wad"
|
||||
wad_file_name = f"{tid}-v{title_version}.wad"
|
||||
# If enabled (after we make sure it's an IOS), apply all main IOS patches.
|
||||
if patch_ios and (tid[:8] == "00000001" and int(tid[-2:], 16) > 2):
|
||||
progress_callback.emit(" - Patching IOS...")
|
||||
progress_callback.emit(-1, -1, " - Patching IOS...")
|
||||
ios_patcher = libWiiPy.title.IOSPatcher()
|
||||
ios_patcher.load(title)
|
||||
patch_count = ios_patcher.patch_all()
|
||||
if patch_count > 0:
|
||||
progress_callback.emit(f" - Applied {patch_count} patches!")
|
||||
progress_callback.emit(-1, -1, f" - Applied {patch_count} patches!")
|
||||
else:
|
||||
progress_callback.emit(" - No patches could be applied! Is this a stub IOS?")
|
||||
progress_callback.emit(-1, -1, " - No patches could be applied! Is this a stub IOS?")
|
||||
title = ios_patcher.dump()
|
||||
# Append "-PATCHED" to the end of the WAD file name to make it clear that it was modified.
|
||||
wad_file_name = wad_file_name[:-4] + "-PATCHED" + wad_file_name[-4:]
|
||||
# Certain special characters are prone to breaking things, so strip them from the file name before actually
|
||||
# opening the file for writing. On some platforms (like macOS), invalid characters get replaced automatically,
|
||||
# but on Windows the file will just fail to be written out at all.
|
||||
wad_file_name = wad_file_name.translate({ord(c): None for c in '/\\:*"?<>|'})
|
||||
# Have libWiiPy dump the WAD, and write that data out.
|
||||
file = open(os.path.join(version_dir, wad_file_name), "wb")
|
||||
file.write(title.dump_wad())
|
||||
file.close()
|
||||
progress_callback.emit("Download complete!")
|
||||
version_dir.joinpath(wad_file_name).write_bytes(title.dump_wad())
|
||||
progress_callback.emit(0, 1, "Download complete!")
|
||||
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this
|
||||
# point, it means that they enabled decryption or WAD packing for a title that doesn't have a ticket. Return
|
||||
# code 1 so that a warning popup is shown informing them of this.
|
||||
if (not pack_wad_enabled and pack_wad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
|
||||
return 1
|
||||
return 0
|
||||
|
||||
def run_nus_download_wii_batch(out_folder: pathlib.Path, titles: List[Tuple[str, str, str]], pack_wad_chkbox: bool, keep_enc_chkbox: bool,
|
||||
decrypt_contents_chkbox: bool, wiiu_nus_chkbox: bool, use_local_chkbox: bool,
|
||||
repack_vwii_chkbox: bool, patch_ios: bool, progress_callback=None):
|
||||
for title in titles:
|
||||
result = run_nus_download_wii(out_folder, title[0], title[1], pack_wad_chkbox, keep_enc_chkbox, decrypt_contents_chkbox, wiiu_nus_chkbox, use_local_chkbox, repack_vwii_chkbox, patch_ios, f"{title[2]}-{title[1]}.wad", progress_callback)
|
||||
if result != 0:
|
||||
return result
|
||||
|
||||
progress_callback.emit(f"Batch download finished.")
|
||||
return 0
|
||||
|
79
modules/language.py
Normal file
@ -0,0 +1,79 @@
|
||||
# "modules/language.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah & Contributors
|
||||
|
||||
from modules.config import update_setting
|
||||
|
||||
from PySide6.QtCore import QLocale, QTranslator
|
||||
|
||||
|
||||
LANGS = {
|
||||
"en": "English",
|
||||
"es": "Español",
|
||||
"de": "Deutsch",
|
||||
"fr": "Français",
|
||||
"it": "Italiano",
|
||||
"no": "Norsk",
|
||||
"ro": "Românǎ",
|
||||
"ko": "한국어",
|
||||
}
|
||||
|
||||
|
||||
def set_language(config_data: dict, lang: str) -> None:
|
||||
# Match the selected language. These names will NOT be translated since they represent each language in that
|
||||
# language, but the "System (Default)" option will, so that will match the default case.
|
||||
match lang:
|
||||
case "English":
|
||||
print("setting language to English")
|
||||
update_setting(config_data, "language", "en")
|
||||
case "Español":
|
||||
print("setting language to Spanish")
|
||||
update_setting(config_data, "language", "es")
|
||||
case "Deutsch":
|
||||
print("setting language to German")
|
||||
update_setting(config_data, "language", "de")
|
||||
case "Français":
|
||||
print("setting language to French")
|
||||
update_setting(config_data, "language", "fr")
|
||||
case "Italiano":
|
||||
print("setting language to Italian")
|
||||
update_setting(config_data, "language", "it")
|
||||
case "Norsk":
|
||||
print("setting language to Norwegian")
|
||||
update_setting(config_data, "language", "no")
|
||||
case "Română":
|
||||
print("setting language to Romanian")
|
||||
update_setting(config_data, "language", "ro")
|
||||
case "한국어":
|
||||
print("setting language to Korean")
|
||||
update_setting(config_data, "language", "ko")
|
||||
case _:
|
||||
print("setting language to system (default)")
|
||||
update_setting(config_data, "language", "")
|
||||
|
||||
|
||||
def get_language(translator: QTranslator, config_data: dict, path: str) -> QTranslator:
|
||||
try:
|
||||
lang = config_data["language"]
|
||||
except KeyError:
|
||||
lang = ""
|
||||
# A specific language was set in the app's settings.
|
||||
if lang != "":
|
||||
# If the target language is English, then return an empty translator because that's the default.
|
||||
if lang == "en":
|
||||
return translator
|
||||
if translator.load(QLocale(lang), 'nusget', '_', path):
|
||||
return translator
|
||||
else:
|
||||
# If we get here, then the saved language is invalid, so clear it and run again to use the system language.
|
||||
update_setting(config_data, "language", "")
|
||||
return get_language(translator, config_data, path)
|
||||
else:
|
||||
# Unix-likes and Windows handle this differently, apparently. Unix-likes will try `nusget_xx_XX.qm` and then
|
||||
# fall back on just `nusget_xx.qm` if the region-specific translation for the language can't be found. On
|
||||
# Windows, no such fallback exists, and so this code manually implements that fallback, since for languages like
|
||||
# Spanish NUSGet doesn't use region-specific translations.
|
||||
locale = QLocale.system()
|
||||
if not translator.load(QLocale.system(), 'nusget', '_', path):
|
||||
base_locale = QLocale(locale.language())
|
||||
translator.load(base_locale, 'nusget', '_', path)
|
||||
return translator
|
100
modules/theme.py
Normal file
@ -0,0 +1,100 @@
|
||||
# "modules/theme.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah & Contributors
|
||||
|
||||
import os
|
||||
import platform
|
||||
import subprocess
|
||||
|
||||
from modules.config import update_setting
|
||||
|
||||
|
||||
def is_dark_theme_windows():
|
||||
# This has to be here so that Python doesn't try to import it on non-Windows.
|
||||
import winreg
|
||||
try:
|
||||
registry = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
|
||||
key = winreg.OpenKey(registry, r"Software\Microsoft\Windows\CurrentVersion\Themes\Personalize")
|
||||
# This value is "AppsUseLightTheme" so a "1" is light and a "0" is dark. Side note: I hate the Windows registry.
|
||||
value, _ = winreg.QueryValueEx(key, "AppsUseLightTheme")
|
||||
return value == 0
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def is_dark_theme_macos():
|
||||
# macOS is weird. If the dark theme is on, then `defaults read -g AppleInterfaceStyle` returns "Dark". If the light
|
||||
# theme is on, then trying to read this key fails and returns an error instead.
|
||||
try:
|
||||
result = subprocess.run(
|
||||
["defaults", "read", "-g", "AppleInterfaceStyle"],
|
||||
capture_output=True, text=True
|
||||
)
|
||||
return "Dark" in result.stdout
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def is_dark_theme_linux():
|
||||
try:
|
||||
import subprocess
|
||||
result = subprocess.run(
|
||||
["gsettings", "get", "org.gnome.desktop.interface", "gtk-theme"],
|
||||
capture_output=True, text=True
|
||||
)
|
||||
# Looking for *not* "Light", because I want any theme that isn't light to be dark. An example of this is my own
|
||||
# KDE Plasma setup on my desktop, where I use the "Breeze" GTK theme and want dark NUSGet to be used in that
|
||||
# case.
|
||||
return not "light" in result.stdout.lower()
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def is_dark_theme(config_data: dict):
|
||||
# Theming priority order:
|
||||
# 1. `THEME` environment variable
|
||||
# 2. Theme saved in config.json
|
||||
# 3. The system theme
|
||||
# 4. Light, if all else fails (though personally I'd prefer dark)
|
||||
#
|
||||
# First, check for an environment variable overriding the theme, and use that if it exists.
|
||||
try:
|
||||
if os.environ["THEME"].lower() == "light":
|
||||
return False
|
||||
elif os.environ["THEME"].lower() == "dark":
|
||||
return True
|
||||
else:
|
||||
print(f"Unknown theme specified: \"{os.environ['THEME']}\"")
|
||||
except KeyError:
|
||||
pass
|
||||
# If the theme wasn't overridden, read the user's preference in config.json.
|
||||
try:
|
||||
match config_data["theme"]:
|
||||
case "light":
|
||||
return False
|
||||
case "dark":
|
||||
return True
|
||||
case _:
|
||||
pass
|
||||
except KeyError:
|
||||
pass
|
||||
# If a theme wasn't set (or the theme is "system"), then check for the system theme.
|
||||
system = platform.system()
|
||||
if system == "Windows":
|
||||
return is_dark_theme_windows()
|
||||
elif system == "Darwin":
|
||||
return is_dark_theme_macos()
|
||||
else:
|
||||
return is_dark_theme_linux()
|
||||
|
||||
|
||||
def set_theme(config_data: dict, theme: str) -> None:
|
||||
match theme:
|
||||
case "light":
|
||||
print("setting theme to light")
|
||||
update_setting(config_data, "theme", "light")
|
||||
case "dark":
|
||||
print("setting theme to dark")
|
||||
update_setting(config_data, "theme", "dark")
|
||||
case _:
|
||||
print("setting theme to system (default)")
|
||||
update_setting(config_data, "theme", "")
|
161
modules/tree.py
Normal file
@ -0,0 +1,161 @@
|
||||
# "modules/tree.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah
|
||||
|
||||
from modules.core import TitleData
|
||||
from PySide6.QtCore import QAbstractItemModel, QModelIndex, Qt, QSortFilterProxyModel
|
||||
from PySide6.QtGui import QIcon
|
||||
|
||||
|
||||
class TreeItem:
|
||||
def __init__(self, data, parent=None, metadata=None):
|
||||
self.data = data
|
||||
self.parent = parent
|
||||
self.children = []
|
||||
self.metadata = metadata
|
||||
|
||||
def add_child(self, item):
|
||||
self.children.append(item)
|
||||
|
||||
def child(self, row):
|
||||
return self.children[row]
|
||||
|
||||
def child_count(self):
|
||||
return len(self.children)
|
||||
|
||||
def column_count(self):
|
||||
return len(self.data)
|
||||
|
||||
def data_at(self, column):
|
||||
if 0 <= column < len(self.data):
|
||||
return self.data[column]
|
||||
return None
|
||||
|
||||
def row(self):
|
||||
if self.parent:
|
||||
return self.parent.children.index(self)
|
||||
return 0
|
||||
|
||||
|
||||
class NUSGetTreeModel(QAbstractItemModel):
|
||||
def __init__(self, data, parent=None, root_name=""):
|
||||
super().__init__(parent)
|
||||
self.root_item = TreeItem([root_name])
|
||||
self.setup_model_data(data, self.root_item)
|
||||
|
||||
def setup_model_data(self, title, parent):
|
||||
if isinstance(title, dict):
|
||||
for key, value in title.items():
|
||||
if isinstance(value, list):
|
||||
key_item = TreeItem([key, ""], parent)
|
||||
parent.add_child(key_item)
|
||||
for entry in value:
|
||||
tid = entry.get("TID")
|
||||
name = entry.get("Name")
|
||||
versions = entry.get("Versions", {})
|
||||
if tid:
|
||||
tid_item = TreeItem([f"{tid} - {name}", ""], key_item, entry.get("Ticket"))
|
||||
key_item.add_child(tid_item)
|
||||
for region, version_list in versions.items():
|
||||
region_item = TreeItem([region, ""], tid_item)
|
||||
tid_item.add_child(region_item)
|
||||
for version in version_list:
|
||||
danger = entry.get("Danger") if entry.get("Danger") is not None else ""
|
||||
metadata = TitleData(entry.get("TID"), entry.get("Name"), version,
|
||||
entry.get("Ticket"), region, key, danger)
|
||||
public_versions = entry.get("Public Versions")
|
||||
if public_versions is not None:
|
||||
try:
|
||||
public_ver = public_versions[str(version)]
|
||||
version_str = f"v{version} ({public_ver})"
|
||||
except KeyError:
|
||||
version_str = f"v{version}"
|
||||
else:
|
||||
version_str = f"v{version}"
|
||||
version_item = TreeItem([version_str, ""], region_item, metadata)
|
||||
region_item.add_child(version_item)
|
||||
|
||||
def rowCount(self, parent=QModelIndex()):
|
||||
if parent.isValid():
|
||||
parent_item = parent.internalPointer()
|
||||
else:
|
||||
parent_item = self.root_item
|
||||
return parent_item.child_count()
|
||||
|
||||
def columnCount(self, parent=QModelIndex()):
|
||||
return self.root_item.column_count()
|
||||
|
||||
def data(self, index, role=Qt.DisplayRole):
|
||||
if not index.isValid():
|
||||
return None
|
||||
|
||||
item = index.internalPointer()
|
||||
|
||||
if role == Qt.DisplayRole:
|
||||
item = index.internalPointer()
|
||||
return item.data_at(index.column())
|
||||
|
||||
if role == Qt.DecorationRole and index.column() == 0:
|
||||
# Check for icons based on the "Ticket" metadata only at the TID level
|
||||
if item.metadata is not None and isinstance(item.metadata, bool):
|
||||
if item.metadata is True:
|
||||
return QIcon.fromTheme("dialog-ok")
|
||||
else:
|
||||
return QIcon.fromTheme("dialog-cancel")
|
||||
return None
|
||||
|
||||
def headerData(self, section, orientation, role=Qt.DisplayRole):
|
||||
if orientation == Qt.Horizontal and role == Qt.DisplayRole:
|
||||
return self.root_item.data_at(section)
|
||||
return None
|
||||
|
||||
def index(self, row, column, parent=QModelIndex()):
|
||||
if not self.hasIndex(row, column, parent):
|
||||
return QModelIndex()
|
||||
|
||||
if not parent.isValid():
|
||||
parent_item = self.root_item
|
||||
else:
|
||||
parent_item = parent.internalPointer()
|
||||
|
||||
child_item = parent_item.child(row)
|
||||
if child_item:
|
||||
return self.createIndex(row, column, child_item)
|
||||
return QModelIndex()
|
||||
|
||||
def parent(self, index):
|
||||
if not index.isValid():
|
||||
return QModelIndex()
|
||||
|
||||
child_item = index.internalPointer()
|
||||
parent_item = child_item.parent
|
||||
|
||||
if parent_item == self.root_item:
|
||||
return QModelIndex()
|
||||
|
||||
return self.createIndex(parent_item.row(), 0, parent_item)
|
||||
|
||||
class TIDFilterProxyModel(QSortFilterProxyModel):
|
||||
def filterAcceptsRow(self, source_row, source_parent):
|
||||
source_model = self.sourceModel()
|
||||
index = source_model.index(source_row, 0, source_parent)
|
||||
item = index.internalPointer()
|
||||
|
||||
filter_text = self.filterRegularExpression().pattern().lower()
|
||||
# If the item matches what the user searched for.
|
||||
if item and filter_text in item.data_at(0).lower():
|
||||
return True
|
||||
# Check if children match, though I don't think this matters because the children of a title will always just
|
||||
# be regions.
|
||||
for i in range(source_model.rowCount(index)):
|
||||
if self.filterAcceptsRow(i, index):
|
||||
return True
|
||||
# Keep the regions and versions under those for any titles that matched, so you can actually download from the
|
||||
# search results.
|
||||
parent_item = index.parent().internalPointer() if index.parent().isValid() else None
|
||||
if parent_item and filter_text in parent_item.data_at(0).lower():
|
||||
return True
|
||||
else:
|
||||
grandparent_item = index.parent().parent().internalPointer() if index.parent().parent().isValid() else None
|
||||
if grandparent_item and filter_text in grandparent_item.data_at(0).lower():
|
||||
return True
|
||||
return False
|
@ -1,6 +1,6 @@
|
||||
[Desktop Entry]
|
||||
Name=NUSGet
|
||||
Exec=/opt/NUSGet/NUSGet %U
|
||||
Exec=/opt/NUSGet/NUSGet.bin %U
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Icon=/opt/NUSGet/NUSGet.png
|
||||
|
113
qt/py/ui_AboutDialog.py
Normal file
@ -0,0 +1,113 @@
|
||||
# "qt/py/ui_AboutDialog.py", licensed under the MIT license
|
||||
# Copyright 2024-2025 NinjaCheetah and Contributors
|
||||
# Thanks Isla and Alex for making such a nice about dialog that I could then "borrow" :p
|
||||
|
||||
import os
|
||||
import pathlib
|
||||
import webbrowser
|
||||
|
||||
from PySide6.QtCore import Qt, QCoreApplication
|
||||
from PySide6.QtWidgets import QDialog, QLabel, QVBoxLayout, QPushButton
|
||||
from PySide6.QtGui import QIcon
|
||||
|
||||
class AboutNUSGet(QDialog):
|
||||
def __init__(self, versions):
|
||||
super().__init__()
|
||||
self.setWindowTitle(self.tr("About NUSGet"))
|
||||
self.setFixedWidth(450)
|
||||
self.setFixedHeight(500)
|
||||
|
||||
# Create main layout
|
||||
self.layout = QVBoxLayout()
|
||||
self.layout.setSpacing(4)
|
||||
self.layout.setContentsMargins(30, 20, 30, 20)
|
||||
|
||||
# Logo
|
||||
logo_label = QLabel()
|
||||
icon = QIcon(str(pathlib.Path(os.path.dirname(__file__)).parents[1].joinpath("resources", "icon.png")))
|
||||
logo_pixmap = icon.pixmap(96, 96)
|
||||
logo_label.setPixmap(logo_pixmap)
|
||||
logo_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# Title
|
||||
title_label = QLabel(self.tr("NUSGet"))
|
||||
title_label.setProperty("class", "title")
|
||||
title_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# NUSGet Version
|
||||
version_label = QLabel(self.tr("Version {nusget_version}").format(nusget_version=versions[0]))
|
||||
version_label.setProperty("class", "version")
|
||||
version_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# Library Versions
|
||||
libraries_label = QLabel(self.tr("Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}")
|
||||
.format(libwiipy_version=versions[1], libtwlpy_version=versions[2]))
|
||||
libraries_label.setProperty("class", "version")
|
||||
libraries_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# Copyright
|
||||
copyright_label = QLabel(self.tr("© 2024-2025 NinjaCheetah & Contributors"))
|
||||
copyright_label.setProperty("class", "copyright")
|
||||
copyright_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
||||
|
||||
# Add header section
|
||||
self.layout.addWidget(logo_label)
|
||||
self.layout.addWidget(title_label)
|
||||
self.layout.addWidget(version_label)
|
||||
self.layout.addWidget(libraries_label)
|
||||
self.layout.addWidget(copyright_label)
|
||||
self.layout.addSpacing(15)
|
||||
|
||||
# External links layout
|
||||
links_layout = QVBoxLayout()
|
||||
|
||||
# GitHub button
|
||||
self.github_button = QPushButton(self.tr("View Project on GitHub"))
|
||||
self.github_button.clicked.connect(lambda: webbrowser.open("https://github.com/NinjaCheetah/NUSGet"))
|
||||
links_layout.addWidget(self.github_button)
|
||||
|
||||
# Add the links layout to main layout
|
||||
self.layout.addLayout(links_layout)
|
||||
self.layout.addSpacing(15)
|
||||
|
||||
# Add a horizontal line
|
||||
line = QLabel()
|
||||
line.setStyleSheet("background-color: #444444; height: 1px;")
|
||||
line.setFixedHeight(1)
|
||||
self.layout.addWidget(line)
|
||||
self.layout.addSpacing(10)
|
||||
|
||||
# Team members header
|
||||
team_header = QLabel(self.tr("Translations"))
|
||||
team_header.setProperty("class", "header")
|
||||
self.layout.addWidget(team_header)
|
||||
self.layout.addSpacing(5)
|
||||
|
||||
# Team members with roles
|
||||
self.people = {
|
||||
"rougets": QLabel(self.tr(
|
||||
"French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a>")),
|
||||
"yeah-its-gloria": QLabel(self.tr(
|
||||
"German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a>")),
|
||||
"LNLenost": QLabel(self.tr(
|
||||
"Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a>")),
|
||||
"DDinghoya": QLabel(self.tr(
|
||||
"Korean (\ud55c\uad6d\uc5b4): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a>")),
|
||||
"rolfiee": QLabel(self.tr(
|
||||
"Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a>")),
|
||||
"NotImplementedLife": QLabel(self.tr(
|
||||
"Romanian (Rom\u00e2n\u0103): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a>")),
|
||||
"DarkMatterCore": QLabel(self.tr(
|
||||
"Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a>"))
|
||||
}
|
||||
|
||||
# Add team members to layout
|
||||
for credit in self.people.values():
|
||||
credit.setOpenExternalLinks(True)
|
||||
credit.setContentsMargins(15, 0, 0, 0)
|
||||
self.layout.addWidget(credit)
|
||||
|
||||
# Add spacer at the bottom
|
||||
self.layout.addStretch()
|
||||
|
||||
self.setLayout(self.layout)
|
@ -3,7 +3,7 @@
|
||||
################################################################################
|
||||
## Form generated from reading UI file 'MainMenu.ui'
|
||||
##
|
||||
## Created by: Qt User Interface Compiler version 6.8.0
|
||||
## Created by: Qt User Interface Compiler version 6.9.0
|
||||
##
|
||||
## WARNING! All changes made in this file will be lost when recompiling UI file!
|
||||
################################################################################
|
||||
@ -11,23 +11,80 @@
|
||||
from PySide6.QtCore import (QCoreApplication, QDate, QDateTime, QLocale,
|
||||
QMetaObject, QObject, QPoint, QRect,
|
||||
QSize, QTime, QUrl, Qt)
|
||||
from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
|
||||
QFont, QFontDatabase, QGradient, QIcon,
|
||||
QImage, QKeySequence, QLinearGradient, QPainter,
|
||||
QPalette, QPixmap, QRadialGradient, QTransform)
|
||||
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QHBoxLayout,
|
||||
QHeaderView, QLabel, QLayout, QLineEdit,
|
||||
QMainWindow, QMenuBar, QPushButton, QSizePolicy,
|
||||
QSpacerItem, QTabWidget, QTextBrowser, QTreeWidget,
|
||||
QTreeWidgetItem, QVBoxLayout, QWidget)
|
||||
from PySide6.QtGui import (QAction, QBrush, QColor, QConicalGradient,
|
||||
QCursor, QFont, QFontDatabase, QGradient,
|
||||
QIcon, QImage, QKeySequence, QLinearGradient,
|
||||
QPainter, QPalette, QPixmap, QRadialGradient,
|
||||
QTransform)
|
||||
from PySide6.QtWidgets import (QApplication, QComboBox, QHBoxLayout, QHeaderView,
|
||||
QLabel, QLayout, QLineEdit, QMainWindow,
|
||||
QMenu, QMenuBar, QProgressBar, QPushButton,
|
||||
QSizePolicy, QSpacerItem, QTabWidget, QTextBrowser,
|
||||
QTreeView, QVBoxLayout, QWidget)
|
||||
|
||||
from qt.py.ui_WrapCheckboxWidget import WrapCheckboxWidget
|
||||
|
||||
class Ui_MainWindow(object):
|
||||
def setupUi(self, MainWindow):
|
||||
if not MainWindow.objectName():
|
||||
MainWindow.setObjectName(u"MainWindow")
|
||||
MainWindow.resize(1010, 625)
|
||||
MainWindow.setMinimumSize(QSize(1010, 625))
|
||||
MainWindow.setMaximumSize(QSize(1010, 625))
|
||||
MainWindow.resize(1010, 675)
|
||||
MainWindow.setMinimumSize(QSize(1010, 675))
|
||||
MainWindow.setMaximumSize(QSize(1010, 675))
|
||||
self.action_about = QAction(MainWindow)
|
||||
self.action_about.setObjectName(u"action_about")
|
||||
icon = QIcon(QIcon.fromTheme(QIcon.ThemeIcon.HelpAbout))
|
||||
self.action_about.setIcon(icon)
|
||||
self.action_about.setMenuRole(QAction.MenuRole.ApplicationSpecificRole)
|
||||
self.action_about_qt = QAction(MainWindow)
|
||||
self.action_about_qt.setObjectName(u"action_about_qt")
|
||||
self.action_about_qt.setIcon(icon)
|
||||
self.action_about_qt.setMenuRole(QAction.MenuRole.ApplicationSpecificRole)
|
||||
self.action_language_system = QAction(MainWindow)
|
||||
self.action_language_system.setObjectName(u"action_language_system")
|
||||
self.action_language_system.setCheckable(True)
|
||||
self.action_language_system.setChecked(False)
|
||||
self.action_language_english = QAction(MainWindow)
|
||||
self.action_language_english.setObjectName(u"action_language_english")
|
||||
self.action_language_english.setCheckable(True)
|
||||
self.action_language_english.setText(u"English")
|
||||
self.action_language_spanish = QAction(MainWindow)
|
||||
self.action_language_spanish.setObjectName(u"action_language_spanish")
|
||||
self.action_language_spanish.setCheckable(True)
|
||||
self.action_language_spanish.setText(u"Espa\u00f1ol")
|
||||
self.action_language_german = QAction(MainWindow)
|
||||
self.action_language_german.setObjectName(u"action_language_german")
|
||||
self.action_language_german.setCheckable(True)
|
||||
self.action_language_german.setText(u"Deutsch")
|
||||
self.action_language_french = QAction(MainWindow)
|
||||
self.action_language_french.setObjectName(u"action_language_french")
|
||||
self.action_language_french.setCheckable(True)
|
||||
self.action_language_french.setText(u"Fran\u00e7ais")
|
||||
self.action_language_italian = QAction(MainWindow)
|
||||
self.action_language_italian.setObjectName(u"action_language_italian")
|
||||
self.action_language_italian.setCheckable(True)
|
||||
self.action_language_italian.setText(u"Italiano")
|
||||
self.action_language_norwegian = QAction(MainWindow)
|
||||
self.action_language_norwegian.setObjectName(u"action_language_norwegian")
|
||||
self.action_language_norwegian.setCheckable(True)
|
||||
self.action_language_norwegian.setText(u"Norsk")
|
||||
self.action_language_romanian = QAction(MainWindow)
|
||||
self.action_language_romanian.setObjectName(u"action_language_romanian")
|
||||
self.action_language_romanian.setCheckable(True)
|
||||
self.action_language_romanian.setText(u"Rom\u00e2n\u0103")
|
||||
self.action_language_korean = QAction(MainWindow)
|
||||
self.action_language_korean.setObjectName(u"action_language_korean")
|
||||
self.action_language_korean.setCheckable(True)
|
||||
self.action_language_korean.setText(u"\ud55c\uad6d\uc5b4")
|
||||
self.action_theme_system = QAction(MainWindow)
|
||||
self.action_theme_system.setObjectName(u"action_theme_system")
|
||||
self.action_theme_system.setCheckable(True)
|
||||
self.action_theme_light = QAction(MainWindow)
|
||||
self.action_theme_light.setObjectName(u"action_theme_light")
|
||||
self.action_theme_light.setCheckable(True)
|
||||
self.action_theme_dark = QAction(MainWindow)
|
||||
self.action_theme_dark.setObjectName(u"action_theme_dark")
|
||||
self.action_theme_dark.setCheckable(True)
|
||||
self.centralwidget = QWidget(MainWindow)
|
||||
self.centralwidget.setObjectName(u"centralwidget")
|
||||
self.horizontalLayout_3 = QHBoxLayout(self.centralwidget)
|
||||
@ -35,37 +92,46 @@ class Ui_MainWindow(object):
|
||||
self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
|
||||
self.vertical_layout_trees = QVBoxLayout()
|
||||
self.vertical_layout_trees.setObjectName(u"vertical_layout_trees")
|
||||
self.label_2 = QLabel(self.centralwidget)
|
||||
self.label_2.setObjectName(u"label_2")
|
||||
font = QFont()
|
||||
font.setBold(True)
|
||||
self.label_2.setFont(font)
|
||||
self.tree_filter_layout = QHBoxLayout()
|
||||
self.tree_filter_layout.setObjectName(u"tree_filter_layout")
|
||||
self.tree_filter_input = QLineEdit(self.centralwidget)
|
||||
self.tree_filter_input.setObjectName(u"tree_filter_input")
|
||||
sizePolicy = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.tree_filter_input.sizePolicy().hasHeightForWidth())
|
||||
self.tree_filter_input.setSizePolicy(sizePolicy)
|
||||
|
||||
self.vertical_layout_trees.addWidget(self.label_2)
|
||||
self.tree_filter_layout.addWidget(self.tree_filter_input)
|
||||
|
||||
self.tree_filter_reset_btn = QPushButton(self.centralwidget)
|
||||
self.tree_filter_reset_btn.setObjectName(u"tree_filter_reset_btn")
|
||||
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy1.setHorizontalStretch(0)
|
||||
sizePolicy1.setVerticalStretch(0)
|
||||
sizePolicy1.setHeightForWidth(self.tree_filter_reset_btn.sizePolicy().hasHeightForWidth())
|
||||
self.tree_filter_reset_btn.setSizePolicy(sizePolicy1)
|
||||
|
||||
self.tree_filter_layout.addWidget(self.tree_filter_reset_btn)
|
||||
|
||||
|
||||
self.vertical_layout_trees.addLayout(self.tree_filter_layout)
|
||||
|
||||
self.platform_tabs = QTabWidget(self.centralwidget)
|
||||
self.platform_tabs.setObjectName(u"platform_tabs")
|
||||
sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding)
|
||||
sizePolicy.setHorizontalStretch(0)
|
||||
sizePolicy.setVerticalStretch(0)
|
||||
sizePolicy.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth())
|
||||
self.platform_tabs.setSizePolicy(sizePolicy)
|
||||
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding)
|
||||
sizePolicy2.setHorizontalStretch(0)
|
||||
sizePolicy2.setVerticalStretch(0)
|
||||
sizePolicy2.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth())
|
||||
self.platform_tabs.setSizePolicy(sizePolicy2)
|
||||
self.platform_tabs.setMinimumSize(QSize(410, 0))
|
||||
self.platform_tabs.setMaximumSize(QSize(410, 16777215))
|
||||
self.wii_tab = QWidget()
|
||||
self.wii_tab.setObjectName(u"wii_tab")
|
||||
self.verticalLayout_2 = QVBoxLayout(self.wii_tab)
|
||||
self.verticalLayout_2.setObjectName(u"verticalLayout_2")
|
||||
self.wii_title_tree = QTreeWidget(self.wii_tab)
|
||||
__qtreewidgetitem = QTreeWidgetItem()
|
||||
__qtreewidgetitem.setText(0, u"1");
|
||||
self.wii_title_tree.setHeaderItem(__qtreewidgetitem)
|
||||
self.wii_title_tree = QTreeView(self.wii_tab)
|
||||
self.wii_title_tree.setObjectName(u"wii_title_tree")
|
||||
self.wii_title_tree.setColumnCount(1)
|
||||
self.wii_title_tree.header().setVisible(False)
|
||||
self.wii_title_tree.header().setMinimumSectionSize(49)
|
||||
self.wii_title_tree.header().setDefaultSectionSize(100)
|
||||
self.wii_title_tree.header().setStretchLastSection(False)
|
||||
|
||||
self.verticalLayout_2.addWidget(self.wii_title_tree)
|
||||
|
||||
@ -74,16 +140,8 @@ class Ui_MainWindow(object):
|
||||
self.vwii_tab.setObjectName(u"vwii_tab")
|
||||
self.verticalLayout_4 = QVBoxLayout(self.vwii_tab)
|
||||
self.verticalLayout_4.setObjectName(u"verticalLayout_4")
|
||||
self.vwii_title_tree = QTreeWidget(self.vwii_tab)
|
||||
__qtreewidgetitem1 = QTreeWidgetItem()
|
||||
__qtreewidgetitem1.setText(0, u"1");
|
||||
self.vwii_title_tree.setHeaderItem(__qtreewidgetitem1)
|
||||
self.vwii_title_tree = QTreeView(self.vwii_tab)
|
||||
self.vwii_title_tree.setObjectName(u"vwii_title_tree")
|
||||
self.vwii_title_tree.setColumnCount(1)
|
||||
self.vwii_title_tree.header().setVisible(False)
|
||||
self.vwii_title_tree.header().setMinimumSectionSize(49)
|
||||
self.vwii_title_tree.header().setDefaultSectionSize(100)
|
||||
self.vwii_title_tree.header().setStretchLastSection(False)
|
||||
|
||||
self.verticalLayout_4.addWidget(self.vwii_title_tree)
|
||||
|
||||
@ -92,14 +150,8 @@ class Ui_MainWindow(object):
|
||||
self.dsi_tab.setObjectName(u"dsi_tab")
|
||||
self.verticalLayout = QVBoxLayout(self.dsi_tab)
|
||||
self.verticalLayout.setObjectName(u"verticalLayout")
|
||||
self.dsi_title_tree = QTreeWidget(self.dsi_tab)
|
||||
__qtreewidgetitem2 = QTreeWidgetItem()
|
||||
__qtreewidgetitem2.setText(0, u"1");
|
||||
self.dsi_title_tree.setHeaderItem(__qtreewidgetitem2)
|
||||
self.dsi_title_tree = QTreeView(self.dsi_tab)
|
||||
self.dsi_title_tree.setObjectName(u"dsi_title_tree")
|
||||
self.dsi_title_tree.setHeaderHidden(True)
|
||||
self.dsi_title_tree.header().setMinimumSectionSize(49)
|
||||
self.dsi_title_tree.header().setStretchLastSection(False)
|
||||
|
||||
self.verticalLayout.addWidget(self.dsi_title_tree)
|
||||
|
||||
@ -150,21 +202,18 @@ class Ui_MainWindow(object):
|
||||
self.horizontalLayout.setObjectName(u"horizontalLayout")
|
||||
self.download_btn = QPushButton(self.centralwidget)
|
||||
self.download_btn.setObjectName(u"download_btn")
|
||||
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy1.setHorizontalStretch(0)
|
||||
sizePolicy1.setVerticalStretch(0)
|
||||
sizePolicy1.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth())
|
||||
self.download_btn.setSizePolicy(sizePolicy1)
|
||||
sizePolicy3 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy3.setHorizontalStretch(0)
|
||||
sizePolicy3.setVerticalStretch(0)
|
||||
sizePolicy3.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth())
|
||||
self.download_btn.setSizePolicy(sizePolicy3)
|
||||
|
||||
self.horizontalLayout.addWidget(self.download_btn)
|
||||
|
||||
self.script_btn = QPushButton(self.centralwidget)
|
||||
self.script_btn.setObjectName(u"script_btn")
|
||||
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy2.setHorizontalStretch(0)
|
||||
sizePolicy2.setVerticalStretch(0)
|
||||
sizePolicy2.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
|
||||
self.script_btn.setSizePolicy(sizePolicy2)
|
||||
sizePolicy.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
|
||||
self.script_btn.setSizePolicy(sizePolicy)
|
||||
|
||||
self.horizontalLayout.addWidget(self.script_btn)
|
||||
|
||||
@ -175,171 +224,59 @@ class Ui_MainWindow(object):
|
||||
self.horizontalLayout_5.setObjectName(u"horizontalLayout_5")
|
||||
self.horizontalLayout_5.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
|
||||
self.verticalLayout_7 = QVBoxLayout()
|
||||
self.verticalLayout_7.setSpacing(5)
|
||||
self.verticalLayout_7.setSpacing(4)
|
||||
self.verticalLayout_7.setObjectName(u"verticalLayout_7")
|
||||
self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
|
||||
self.label_3 = QLabel(self.centralwidget)
|
||||
self.label_3.setObjectName(u"label_3")
|
||||
font = QFont()
|
||||
font.setBold(True)
|
||||
self.label_3.setFont(font)
|
||||
|
||||
self.verticalLayout_7.addWidget(self.label_3)
|
||||
|
||||
self.pack_archive_row = QHBoxLayout()
|
||||
self.pack_archive_row.setSpacing(10)
|
||||
self.pack_archive_row.setObjectName(u"pack_archive_row")
|
||||
self.pack_archive_chkbox = QCheckBox(self.centralwidget)
|
||||
self.pack_archive_chkbox.setObjectName(u"pack_archive_chkbox")
|
||||
sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
|
||||
sizePolicy3.setHorizontalStretch(0)
|
||||
sizePolicy3.setVerticalStretch(0)
|
||||
sizePolicy3.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.pack_archive_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.pack_archive_chkbox.setText(u"")
|
||||
self.pack_archive_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.pack_archive_checkbox.setObjectName(u"pack_archive_checkbox")
|
||||
|
||||
self.pack_archive_row.addWidget(self.pack_archive_chkbox)
|
||||
|
||||
self.label_7 = QLabel(self.centralwidget)
|
||||
self.label_7.setObjectName(u"label_7")
|
||||
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding)
|
||||
sizePolicy4.setHorizontalStretch(0)
|
||||
sizePolicy4.setVerticalStretch(0)
|
||||
sizePolicy4.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth())
|
||||
self.label_7.setSizePolicy(sizePolicy4)
|
||||
self.label_7.setWordWrap(True)
|
||||
|
||||
self.pack_archive_row.addWidget(self.label_7)
|
||||
|
||||
|
||||
self.verticalLayout_7.addLayout(self.pack_archive_row)
|
||||
self.verticalLayout_7.addWidget(self.pack_archive_checkbox)
|
||||
|
||||
self.archive_file_entry = QLineEdit(self.centralwidget)
|
||||
self.archive_file_entry.setObjectName(u"archive_file_entry")
|
||||
self.archive_file_entry.setEnabled(False)
|
||||
self.archive_file_entry.setEnabled(True)
|
||||
|
||||
self.verticalLayout_7.addWidget(self.archive_file_entry)
|
||||
|
||||
self.keep_enc_row = QHBoxLayout()
|
||||
self.keep_enc_row.setSpacing(10)
|
||||
self.keep_enc_row.setObjectName(u"keep_enc_row")
|
||||
self.keep_enc_chkbox = QCheckBox(self.centralwidget)
|
||||
self.keep_enc_chkbox.setObjectName(u"keep_enc_chkbox")
|
||||
sizePolicy3.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.keep_enc_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.keep_enc_chkbox.setText(u"")
|
||||
self.keep_enc_chkbox.setChecked(True)
|
||||
self.keep_enc_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.keep_enc_checkbox.setObjectName(u"keep_enc_checkbox")
|
||||
|
||||
self.keep_enc_row.addWidget(self.keep_enc_chkbox)
|
||||
self.verticalLayout_7.addWidget(self.keep_enc_checkbox)
|
||||
|
||||
self.label_6 = QLabel(self.centralwidget)
|
||||
self.label_6.setObjectName(u"label_6")
|
||||
sizePolicy4.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth())
|
||||
self.label_6.setSizePolicy(sizePolicy4)
|
||||
self.label_6.setWordWrap(True)
|
||||
self.create_dec_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.create_dec_checkbox.setObjectName(u"create_dec_checkbox")
|
||||
|
||||
self.keep_enc_row.addWidget(self.label_6)
|
||||
self.verticalLayout_7.addWidget(self.create_dec_checkbox)
|
||||
|
||||
self.use_local_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.use_local_checkbox.setObjectName(u"use_local_checkbox")
|
||||
|
||||
self.verticalLayout_7.addLayout(self.keep_enc_row)
|
||||
self.verticalLayout_7.addWidget(self.use_local_checkbox)
|
||||
|
||||
self.create_dec_row = QHBoxLayout()
|
||||
self.create_dec_row.setSpacing(10)
|
||||
self.create_dec_row.setObjectName(u"create_dec_row")
|
||||
self.create_dec_chkbox = QCheckBox(self.centralwidget)
|
||||
self.create_dec_chkbox.setObjectName(u"create_dec_chkbox")
|
||||
sizePolicy3.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.create_dec_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.create_dec_chkbox.setText(u"")
|
||||
self.use_wiiu_nus_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.use_wiiu_nus_checkbox.setObjectName(u"use_wiiu_nus_checkbox")
|
||||
|
||||
self.create_dec_row.addWidget(self.create_dec_chkbox)
|
||||
self.verticalLayout_7.addWidget(self.use_wiiu_nus_checkbox)
|
||||
|
||||
self.create_dec_chkbox_lbl = QLabel(self.centralwidget)
|
||||
self.create_dec_chkbox_lbl.setObjectName(u"create_dec_chkbox_lbl")
|
||||
sizePolicy4.setHeightForWidth(self.create_dec_chkbox_lbl.sizePolicy().hasHeightForWidth())
|
||||
self.create_dec_chkbox_lbl.setSizePolicy(sizePolicy4)
|
||||
self.create_dec_chkbox_lbl.setWordWrap(True)
|
||||
self.patch_ios_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.patch_ios_checkbox.setObjectName(u"patch_ios_checkbox")
|
||||
self.patch_ios_checkbox.setEnabled(False)
|
||||
|
||||
self.create_dec_row.addWidget(self.create_dec_chkbox_lbl)
|
||||
self.verticalLayout_7.addWidget(self.patch_ios_checkbox)
|
||||
|
||||
|
||||
self.verticalLayout_7.addLayout(self.create_dec_row)
|
||||
|
||||
self.use_local_row = QHBoxLayout()
|
||||
self.use_local_row.setSpacing(10)
|
||||
self.use_local_row.setObjectName(u"use_local_row")
|
||||
self.use_local_chkbox = QCheckBox(self.centralwidget)
|
||||
self.use_local_chkbox.setObjectName(u"use_local_chkbox")
|
||||
self.use_local_chkbox.setEnabled(True)
|
||||
sizePolicy3.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.use_local_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.use_local_chkbox.setText(u"")
|
||||
|
||||
self.use_local_row.addWidget(self.use_local_chkbox)
|
||||
|
||||
self.use_local_chkbox_lbl = QLabel(self.centralwidget)
|
||||
self.use_local_chkbox_lbl.setObjectName(u"use_local_chkbox_lbl")
|
||||
sizePolicy4.setHeightForWidth(self.use_local_chkbox_lbl.sizePolicy().hasHeightForWidth())
|
||||
self.use_local_chkbox_lbl.setSizePolicy(sizePolicy4)
|
||||
self.use_local_chkbox_lbl.setWordWrap(True)
|
||||
|
||||
self.use_local_row.addWidget(self.use_local_chkbox_lbl)
|
||||
|
||||
|
||||
self.verticalLayout_7.addLayout(self.use_local_row)
|
||||
|
||||
self.use_wiiu_nus_row = QHBoxLayout()
|
||||
self.use_wiiu_nus_row.setSpacing(10)
|
||||
self.use_wiiu_nus_row.setObjectName(u"use_wiiu_nus_row")
|
||||
self.use_wiiu_nus_row.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
|
||||
self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget)
|
||||
self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox")
|
||||
sizePolicy.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy)
|
||||
self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
|
||||
self.use_wiiu_nus_chkbox.setText(u"")
|
||||
self.use_wiiu_nus_chkbox.setChecked(True)
|
||||
|
||||
self.use_wiiu_nus_row.addWidget(self.use_wiiu_nus_chkbox)
|
||||
|
||||
self.use_wiiu_nus_chkbox_lbl = QLabel(self.centralwidget)
|
||||
self.use_wiiu_nus_chkbox_lbl.setObjectName(u"use_wiiu_nus_chkbox_lbl")
|
||||
sizePolicy4.setHeightForWidth(self.use_wiiu_nus_chkbox_lbl.sizePolicy().hasHeightForWidth())
|
||||
self.use_wiiu_nus_chkbox_lbl.setSizePolicy(sizePolicy4)
|
||||
self.use_wiiu_nus_chkbox_lbl.setWordWrap(True)
|
||||
|
||||
self.use_wiiu_nus_row.addWidget(self.use_wiiu_nus_chkbox_lbl)
|
||||
|
||||
|
||||
self.verticalLayout_7.addLayout(self.use_wiiu_nus_row)
|
||||
|
||||
self.patch_ios_row = QHBoxLayout()
|
||||
self.patch_ios_row.setSpacing(10)
|
||||
self.patch_ios_row.setObjectName(u"patch_ios_row")
|
||||
self.patch_ios_chkbox = QCheckBox(self.centralwidget)
|
||||
self.patch_ios_chkbox.setObjectName(u"patch_ios_chkbox")
|
||||
self.patch_ios_chkbox.setEnabled(False)
|
||||
sizePolicy3.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.patch_ios_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.patch_ios_chkbox.setText(u"")
|
||||
|
||||
self.patch_ios_row.addWidget(self.patch_ios_chkbox)
|
||||
|
||||
self.patch_ios_lbl = QLabel(self.centralwidget)
|
||||
self.patch_ios_lbl.setObjectName(u"patch_ios_lbl")
|
||||
self.patch_ios_lbl.setEnabled(True)
|
||||
sizePolicy4.setHeightForWidth(self.patch_ios_lbl.sizePolicy().hasHeightForWidth())
|
||||
self.patch_ios_lbl.setSizePolicy(sizePolicy4)
|
||||
self.patch_ios_lbl.setWordWrap(True)
|
||||
|
||||
self.patch_ios_row.addWidget(self.patch_ios_lbl)
|
||||
|
||||
|
||||
self.verticalLayout_7.addLayout(self.patch_ios_row)
|
||||
|
||||
self.verticalSpacer_2 = QSpacerItem(20, 40, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Ignored)
|
||||
self.verticalSpacer_2 = QSpacerItem(20, 200, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred)
|
||||
|
||||
self.verticalLayout_7.addItem(self.verticalSpacer_2)
|
||||
|
||||
self.horizontalSpacer = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
|
||||
self.horizontalSpacer = QSpacerItem(300, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||
|
||||
self.verticalLayout_7.addItem(self.horizontalSpacer)
|
||||
|
||||
@ -347,6 +284,7 @@ class Ui_MainWindow(object):
|
||||
self.horizontalLayout_5.addLayout(self.verticalLayout_7)
|
||||
|
||||
self.verticalLayout_8 = QVBoxLayout()
|
||||
self.verticalLayout_8.setSpacing(4)
|
||||
self.verticalLayout_8.setObjectName(u"verticalLayout_8")
|
||||
self.verticalLayout_8.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
|
||||
self.label_4 = QLabel(self.centralwidget)
|
||||
@ -355,37 +293,55 @@ class Ui_MainWindow(object):
|
||||
|
||||
self.verticalLayout_8.addWidget(self.label_4)
|
||||
|
||||
self.pack_vwii_mode_row = QHBoxLayout()
|
||||
self.pack_vwii_mode_row.setObjectName(u"pack_vwii_mode_row")
|
||||
self.pack_vwii_mode_chkbox = QCheckBox(self.centralwidget)
|
||||
self.pack_vwii_mode_chkbox.setObjectName(u"pack_vwii_mode_chkbox")
|
||||
self.pack_vwii_mode_chkbox.setEnabled(False)
|
||||
sizePolicy3.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth())
|
||||
self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy3)
|
||||
self.pack_vwii_mode_chkbox.setText(u"")
|
||||
self.pack_vwii_mode_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.pack_vwii_mode_checkbox.setObjectName(u"pack_vwii_mode_checkbox")
|
||||
self.pack_vwii_mode_checkbox.setEnabled(False)
|
||||
|
||||
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox)
|
||||
self.verticalLayout_8.addWidget(self.pack_vwii_mode_checkbox)
|
||||
|
||||
self.pack_vwii_mode_lbl = QLabel(self.centralwidget)
|
||||
self.pack_vwii_mode_lbl.setObjectName(u"pack_vwii_mode_lbl")
|
||||
self.pack_vwii_mode_lbl.setEnabled(True)
|
||||
sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
|
||||
sizePolicy5.setHorizontalStretch(0)
|
||||
sizePolicy5.setVerticalStretch(0)
|
||||
sizePolicy5.setHeightForWidth(self.pack_vwii_mode_lbl.sizePolicy().hasHeightForWidth())
|
||||
self.pack_vwii_mode_lbl.setSizePolicy(sizePolicy5)
|
||||
self.pack_vwii_mode_lbl.setWordWrap(True)
|
||||
self.label_2 = QLabel(self.centralwidget)
|
||||
self.label_2.setObjectName(u"label_2")
|
||||
self.label_2.setFont(font)
|
||||
|
||||
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_lbl)
|
||||
self.verticalLayout_8.addWidget(self.label_2)
|
||||
|
||||
self.auto_update_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.auto_update_checkbox.setObjectName(u"auto_update_checkbox")
|
||||
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
|
||||
sizePolicy4.setHorizontalStretch(0)
|
||||
sizePolicy4.setVerticalStretch(0)
|
||||
sizePolicy4.setHeightForWidth(self.auto_update_checkbox.sizePolicy().hasHeightForWidth())
|
||||
self.auto_update_checkbox.setSizePolicy(sizePolicy4)
|
||||
|
||||
self.verticalLayout_8.addWidget(self.auto_update_checkbox)
|
||||
|
||||
self.custom_out_dir_checkbox = WrapCheckboxWidget(self.centralwidget)
|
||||
self.custom_out_dir_checkbox.setObjectName(u"custom_out_dir_checkbox")
|
||||
|
||||
self.verticalLayout_8.addWidget(self.custom_out_dir_checkbox)
|
||||
|
||||
self.custom_out_dir_entry_row = QHBoxLayout()
|
||||
self.custom_out_dir_entry_row.setObjectName(u"custom_out_dir_entry_row")
|
||||
self.custom_out_dir_entry = QLineEdit(self.centralwidget)
|
||||
self.custom_out_dir_entry.setObjectName(u"custom_out_dir_entry")
|
||||
self.custom_out_dir_entry.setEnabled(False)
|
||||
|
||||
self.custom_out_dir_entry_row.addWidget(self.custom_out_dir_entry)
|
||||
|
||||
self.custom_out_dir_btn = QPushButton(self.centralwidget)
|
||||
self.custom_out_dir_btn.setObjectName(u"custom_out_dir_btn")
|
||||
self.custom_out_dir_btn.setEnabled(False)
|
||||
|
||||
self.custom_out_dir_entry_row.addWidget(self.custom_out_dir_btn)
|
||||
|
||||
|
||||
self.verticalLayout_8.addLayout(self.pack_vwii_mode_row)
|
||||
self.verticalLayout_8.addLayout(self.custom_out_dir_entry_row)
|
||||
|
||||
self.verticalSpacer = QSpacerItem(20, 50, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.MinimumExpanding)
|
||||
self.verticalSpacer = QSpacerItem(20, 200, QSizePolicy.Policy.Minimum, QSizePolicy.Policy.Preferred)
|
||||
|
||||
self.verticalLayout_8.addItem(self.verticalSpacer)
|
||||
|
||||
self.horizontalSpacer_2 = QSpacerItem(40, 20, QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Minimum)
|
||||
self.horizontalSpacer_2 = QSpacerItem(300, 0, QSizePolicy.Policy.Fixed, QSizePolicy.Policy.Minimum)
|
||||
|
||||
self.verticalLayout_8.addItem(self.horizontalSpacer_2)
|
||||
|
||||
@ -397,19 +353,55 @@ class Ui_MainWindow(object):
|
||||
|
||||
self.log_text_browser = QTextBrowser(self.centralwidget)
|
||||
self.log_text_browser.setObjectName(u"log_text_browser")
|
||||
self.log_text_browser.setMinimumSize(QSize(0, 247))
|
||||
self.log_text_browser.setMinimumSize(QSize(0, 222))
|
||||
|
||||
self.vertical_layout_controls.addWidget(self.log_text_browser)
|
||||
|
||||
self.progress_bar = QProgressBar(self.centralwidget)
|
||||
self.progress_bar.setObjectName(u"progress_bar")
|
||||
self.progress_bar.setMinimumSize(QSize(0, 25))
|
||||
self.progress_bar.setMaximumSize(QSize(16777215, 30))
|
||||
self.progress_bar.setValue(0)
|
||||
|
||||
self.vertical_layout_controls.addWidget(self.progress_bar)
|
||||
|
||||
|
||||
self.horizontalLayout_3.addLayout(self.vertical_layout_controls)
|
||||
|
||||
MainWindow.setCentralWidget(self.centralwidget)
|
||||
self.menubar = QMenuBar(MainWindow)
|
||||
self.menubar.setObjectName(u"menubar")
|
||||
self.menubar.setGeometry(QRect(0, 0, 1010, 30))
|
||||
self.menubar.setGeometry(QRect(0, 0, 1010, 21))
|
||||
self.menu_help = QMenu(self.menubar)
|
||||
self.menu_help.setObjectName(u"menu_help")
|
||||
self.menu_options = QMenu(self.menubar)
|
||||
self.menu_options.setObjectName(u"menu_options")
|
||||
self.menu_options_language = QMenu(self.menu_options)
|
||||
self.menu_options_language.setObjectName(u"menu_options_language")
|
||||
self.menu_options_theme = QMenu(self.menu_options)
|
||||
self.menu_options_theme.setObjectName(u"menu_options_theme")
|
||||
MainWindow.setMenuBar(self.menubar)
|
||||
|
||||
self.menubar.addAction(self.menu_options.menuAction())
|
||||
self.menubar.addAction(self.menu_help.menuAction())
|
||||
self.menu_help.addAction(self.action_about)
|
||||
self.menu_help.addAction(self.action_about_qt)
|
||||
self.menu_help.addSeparator()
|
||||
self.menu_options.addAction(self.menu_options_language.menuAction())
|
||||
self.menu_options.addAction(self.menu_options_theme.menuAction())
|
||||
self.menu_options_language.addAction(self.action_language_system)
|
||||
self.menu_options_language.addAction(self.action_language_english)
|
||||
self.menu_options_language.addAction(self.action_language_spanish)
|
||||
self.menu_options_language.addAction(self.action_language_german)
|
||||
self.menu_options_language.addAction(self.action_language_french)
|
||||
self.menu_options_language.addAction(self.action_language_italian)
|
||||
self.menu_options_language.addAction(self.action_language_norwegian)
|
||||
self.menu_options_language.addAction(self.action_language_romanian)
|
||||
self.menu_options_language.addAction(self.action_language_korean)
|
||||
self.menu_options_theme.addAction(self.action_theme_system)
|
||||
self.menu_options_theme.addAction(self.action_theme_light)
|
||||
self.menu_options_theme.addAction(self.action_theme_dark)
|
||||
|
||||
self.retranslateUi(MainWindow)
|
||||
|
||||
self.platform_tabs.setCurrentIndex(0)
|
||||
@ -421,7 +413,14 @@ class Ui_MainWindow(object):
|
||||
|
||||
def retranslateUi(self, MainWindow):
|
||||
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
|
||||
self.label_2.setText(QCoreApplication.translate("MainWindow", u"Available Titles", None))
|
||||
self.action_about.setText(QCoreApplication.translate("MainWindow", u"About NUSGet", None))
|
||||
self.action_about_qt.setText(QCoreApplication.translate("MainWindow", u"About Qt", None))
|
||||
self.action_language_system.setText(QCoreApplication.translate("MainWindow", u"System (Default)", None))
|
||||
self.action_theme_system.setText(QCoreApplication.translate("MainWindow", u"System (Default)", None))
|
||||
self.action_theme_light.setText(QCoreApplication.translate("MainWindow", u"Light", None))
|
||||
self.action_theme_dark.setText(QCoreApplication.translate("MainWindow", u"Dark", None))
|
||||
self.tree_filter_input.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Search", None))
|
||||
self.tree_filter_reset_btn.setText(QCoreApplication.translate("MainWindow", u"Clear", None))
|
||||
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.wii_tab), QCoreApplication.translate("MainWindow", u"Wii", None))
|
||||
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.vwii_tab), QCoreApplication.translate("MainWindow", u"vWii", None))
|
||||
self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.dsi_tab), QCoreApplication.translate("MainWindow", u"DSi", None))
|
||||
@ -434,15 +433,11 @@ class Ui_MainWindow(object):
|
||||
self.download_btn.setText(QCoreApplication.translate("MainWindow", u"Start Download", None))
|
||||
self.script_btn.setText(QCoreApplication.translate("MainWindow", u"Run Script", None))
|
||||
self.label_3.setText(QCoreApplication.translate("MainWindow", u"General Settings", None))
|
||||
self.label_7.setText(QCoreApplication.translate("MainWindow", u"Pack installable archive (WAD/TAD)", None))
|
||||
self.archive_file_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"File Name", None))
|
||||
self.label_6.setText(QCoreApplication.translate("MainWindow", u"Keep encrypted contents", None))
|
||||
self.create_dec_chkbox_lbl.setText(QCoreApplication.translate("MainWindow", u"Create decrypted contents (*.app)", None))
|
||||
self.use_local_chkbox_lbl.setText(QCoreApplication.translate("MainWindow", u"Use local files, if they exist", None))
|
||||
self.use_wiiu_nus_chkbox_lbl.setText(QCoreApplication.translate("MainWindow", u"Use the Wii U NUS (faster, only effects Wii/vWii)", None))
|
||||
self.patch_ios_lbl.setText(QCoreApplication.translate("MainWindow", u"Apply patches to IOS (Applies to WADs only)", None))
|
||||
self.label_4.setText(QCoreApplication.translate("MainWindow", u"vWii Title Settings", None))
|
||||
self.pack_vwii_mode_lbl.setText(QCoreApplication.translate("MainWindow", u"Re-encrypt title using the Wii Common Key", None))
|
||||
self.label_2.setText(QCoreApplication.translate("MainWindow", u"App Settings", None))
|
||||
self.custom_out_dir_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"Output Path", None))
|
||||
self.custom_out_dir_btn.setText(QCoreApplication.translate("MainWindow", u"Select...", None))
|
||||
self.log_text_browser.setMarkdown("")
|
||||
self.log_text_browser.setHtml(QCoreApplication.translate("MainWindow", u"<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0//EN\" \"http://www.w3.org/TR/REC-html40/strict.dtd\">\n"
|
||||
"<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"
|
||||
@ -450,7 +445,11 @@ class Ui_MainWindow(object):
|
||||
"hr { height: 1px; border-width: 0; }\n"
|
||||
"li.unchecked::marker { content: \"\\2610\"; }\n"
|
||||
"li.checked::marker { content: \"\\2612\"; }\n"
|
||||
"</style></head><body style=\" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;\">\n"
|
||||
"</style></head><body style=\" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;\">\n"
|
||||
"<p style=\"-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;\"><br /></p></body></html>", None))
|
||||
self.menu_help.setTitle(QCoreApplication.translate("MainWindow", u"Help", None))
|
||||
self.menu_options.setTitle(QCoreApplication.translate("MainWindow", u"Options", None))
|
||||
self.menu_options_language.setTitle(QCoreApplication.translate("MainWindow", u"Language", None))
|
||||
self.menu_options_theme.setTitle(QCoreApplication.translate("MainWindow", u"Theme", None))
|
||||
# retranslateUi
|
||||
|
||||
|
47
qt/py/ui_WrapCheckboxWidget.py
Normal file
@ -0,0 +1,47 @@
|
||||
from PySide6.QtCore import Qt
|
||||
from PySide6.QtWidgets import QCheckBox, QHBoxLayout, QLabel, QWidget, QSizePolicy, QLayout
|
||||
|
||||
class WrapCheckboxWidget(QWidget):
|
||||
def __init__(self, text, parent=None):
|
||||
super().__init__(parent)
|
||||
self.setAttribute(Qt.WA_StyledBackground, True)
|
||||
self.setSizePolicy(QSizePolicy.Preferred, QSizePolicy.Maximum)
|
||||
|
||||
self.checkbox = QCheckBox("")
|
||||
size_policy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed)
|
||||
size_policy.setHorizontalStretch(0)
|
||||
size_policy.setVerticalStretch(0)
|
||||
size_policy.setHeightForWidth(self.checkbox.sizePolicy().hasHeightForWidth())
|
||||
self.checkbox.setSizePolicy(size_policy)
|
||||
|
||||
self.label = QLabel(text)
|
||||
self.label.setAlignment(Qt.AlignVCenter | Qt.AlignLeft)
|
||||
self.label.setWordWrap(True)
|
||||
self.label.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Preferred)
|
||||
self.label.setContentsMargins(0, 0, 0, 0)
|
||||
|
||||
layout = QHBoxLayout(self)
|
||||
layout.setContentsMargins(5, 5, 5, 5)
|
||||
layout.setSizeConstraint(QLayout.SetMinimumSize)
|
||||
layout.addWidget(self.checkbox)
|
||||
layout.addWidget(self.label)
|
||||
|
||||
# Connect signals so that clicking the label still changes the state of the checkbox.
|
||||
def toggle_checkbox(event):
|
||||
if self.checkbox.isEnabled() and event.button() == Qt.LeftButton:
|
||||
self.checkbox.toggle()
|
||||
self.label.mousePressEvent = toggle_checkbox
|
||||
|
||||
# Bind checkbox stuff for easier access.
|
||||
self.toggled = self.checkbox.toggled
|
||||
|
||||
def isChecked(self):
|
||||
return self.checkbox.isChecked()
|
||||
|
||||
def setChecked(self, checked):
|
||||
self.checkbox.setChecked(checked)
|
||||
|
||||
def setEnabled(self, enabled):
|
||||
super().setEnabled(enabled)
|
||||
self.checkbox.setEnabled(enabled)
|
||||
self.label.setEnabled(enabled)
|
185
qt/ui/AboutNUSGet.ui
Normal file
@ -0,0 +1,185 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<ui version="4.0">
|
||||
<class>AboutNUSGet</class>
|
||||
<widget class="QDialog" name="AboutNUSGet">
|
||||
<property name="geometry">
|
||||
<rect>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>400</width>
|
||||
<height>300</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
<string>Dialog</string>
|
||||
</property>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="outer_layout">
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="icon_layout">
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QLabel" name="icon_lbl">
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>75</width>
|
||||
<height>75</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="details_layout">
|
||||
<item>
|
||||
<widget class="QLabel" name="about_title_lbl">
|
||||
<property name="font">
|
||||
<font>
|
||||
<pointsize>15</pointsize>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>About NUSGet</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="version_lbl">
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Placeholder Version String</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="detail_text_lbl">
|
||||
<property name="text">
|
||||
<string>Copyright (c) 2024-2025 NinjaCheetah & Contributors</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTextBrowser" name="textBrowser">
|
||||
<property name="html">
|
||||
<string><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><span style=" font-weight:700;">Translations</span></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">German (Deutsch): <a href="https://github.com/yeah-its-gloria"><span style=" text-decoration: underline; color:#3586ff;">yeah-its-gloria</span></a></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Italian (Italiano): <a href="https://github.com/LNLenost"><span style=" text-decoration: underline; color:#3586ff;">LNLenost</span></a></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Korean (한국어): <a href="https://github.com/DDinghoya"><span style=" text-decoration: underline; color:#3586ff;">DDinghoya</span></a></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Norwegian (Norsk): <a href="https://github.com/rolfiee"><span style=" text-decoration: underline; color:#3586ff;">rolfiee</span></a></p>
|
||||
<p style=" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;">Romanian (Română): <a href="https://github.com/NotImplementedLife"><span style=" text-decoration: underline; color:#3586ff;">NotImplementedLife</span></a></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="horizontalSpacer">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QDialogButtonBox" name="buttonBox">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="standardButtons">
|
||||
<set>QDialogButtonBox::StandardButton::Close</set>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
<resources/>
|
||||
<connections>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>accepted()</signal>
|
||||
<receiver>AboutNUSGet</receiver>
|
||||
<slot>accept()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>248</x>
|
||||
<y>254</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>157</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
<connection>
|
||||
<sender>buttonBox</sender>
|
||||
<signal>rejected()</signal>
|
||||
<receiver>AboutNUSGet</receiver>
|
||||
<slot>reject()</slot>
|
||||
<hints>
|
||||
<hint type="sourcelabel">
|
||||
<x>316</x>
|
||||
<y>260</y>
|
||||
</hint>
|
||||
<hint type="destinationlabel">
|
||||
<x>286</x>
|
||||
<y>274</y>
|
||||
</hint>
|
||||
</hints>
|
||||
</connection>
|
||||
</connections>
|
||||
</ui>
|
@ -7,19 +7,19 @@
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1010</width>
|
||||
<height>625</height>
|
||||
<height>675</height>
|
||||
</rect>
|
||||
</property>
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>1010</width>
|
||||
<height>625</height>
|
||||
<height>675</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>1010</width>
|
||||
<height>625</height>
|
||||
<height>675</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="windowTitle">
|
||||
@ -33,17 +33,35 @@
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="vertical_layout_trees">
|
||||
<item>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
<layout class="QHBoxLayout" name="tree_filter_layout">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="tree_filter_input">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Available Titles</string>
|
||||
<property name="placeholderText">
|
||||
<string>Search</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="tree_filter_reset_btn">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Clear</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QTabWidget" name="platform_tabs">
|
||||
<property name="sizePolicy">
|
||||
@ -73,28 +91,7 @@
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="wii_title_tree">
|
||||
<property name="columnCount">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="headerMinimumSectionSize">
|
||||
<number>49</number>
|
||||
</attribute>
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>100</number>
|
||||
</attribute>
|
||||
<attribute name="headerStretchLastSection">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
<widget class="QTreeView" name="wii_title_tree"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
@ -104,28 +101,7 @@
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_4">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="vwii_title_tree">
|
||||
<property name="columnCount">
|
||||
<number>1</number>
|
||||
</property>
|
||||
<attribute name="headerVisible">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<attribute name="headerMinimumSectionSize">
|
||||
<number>49</number>
|
||||
</attribute>
|
||||
<attribute name="headerDefaultSectionSize">
|
||||
<number>100</number>
|
||||
</attribute>
|
||||
<attribute name="headerStretchLastSection">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
<widget class="QTreeView" name="vwii_title_tree"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
@ -135,22 +111,7 @@
|
||||
</attribute>
|
||||
<layout class="QVBoxLayout" name="verticalLayout">
|
||||
<item>
|
||||
<widget class="QTreeWidget" name="dsi_title_tree">
|
||||
<property name="headerHidden">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<attribute name="headerMinimumSectionSize">
|
||||
<number>49</number>
|
||||
</attribute>
|
||||
<attribute name="headerStretchLastSection">
|
||||
<bool>false</bool>
|
||||
</attribute>
|
||||
<column>
|
||||
<property name="text">
|
||||
<string notr="true">1</string>
|
||||
</property>
|
||||
</column>
|
||||
</widget>
|
||||
<widget class="QTreeView" name="dsi_title_tree"/>
|
||||
</item>
|
||||
</layout>
|
||||
</widget>
|
||||
@ -261,7 +222,7 @@
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_7">
|
||||
<property name="spacing">
|
||||
<number>5</number>
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
|
||||
@ -279,45 +240,12 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="pack_archive_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="pack_archive_chkbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_7">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Pack installable archive (WAD/TAD)</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="WrapCheckboxWidget" name="pack_archive_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLineEdit" name="archive_file_entry">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="placeholderText">
|
||||
<string>File Name</string>
|
||||
@ -325,218 +253,36 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="keep_enc_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="keep_enc_chkbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="WrapCheckboxWidget" name="keep_enc_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="label_6">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Keep encrypted contents</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="WrapCheckboxWidget" name="create_dec_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="create_dec_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="create_dec_chkbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
<widget class="WrapCheckboxWidget" name="use_local_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="create_dec_chkbox_lbl">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Create decrypted contents (*.app)</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
<widget class="WrapCheckboxWidget" name="use_wiiu_nus_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="use_local_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="use_local_chkbox">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="use_local_chkbox_lbl">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use local files, if they exist</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="use_wiiu_nus_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetDefaultConstraint</enum>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="use_wiiu_nus_chkbox">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Expanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="layoutDirection">
|
||||
<enum>Qt::LayoutDirection::LeftToRight</enum>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="use_wiiu_nus_chkbox_lbl">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Use the Wii U NUS (faster, only effects Wii/vWii)</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="patch_ios_row">
|
||||
<property name="spacing">
|
||||
<number>10</number>
|
||||
</property>
|
||||
<item>
|
||||
<widget class="QCheckBox" name="patch_ios_chkbox">
|
||||
<widget class="WrapCheckboxWidget" name="patch_ios_checkbox" native="true">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="patch_ios_lbl">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Apply patches to IOS (Applies to WADs only)</string>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
<item>
|
||||
<spacer name="verticalSpacer_2">
|
||||
<property name="orientation">
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Policy::Ignored</enum>
|
||||
<enum>QSizePolicy::Policy::Preferred</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>40</height>
|
||||
<height>200</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
@ -547,12 +293,12 @@
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
|
||||
<enum>QSizePolicy::Policy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
@ -561,6 +307,9 @@
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QVBoxLayout" name="verticalLayout_8">
|
||||
<property name="spacing">
|
||||
<number>4</number>
|
||||
</property>
|
||||
<property name="sizeConstraint">
|
||||
<enum>QLayout::SizeConstraint::SetMinimumSize</enum>
|
||||
</property>
|
||||
@ -577,39 +326,56 @@
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="pack_vwii_mode_row">
|
||||
<item>
|
||||
<widget class="QCheckBox" name="pack_vwii_mode_chkbox">
|
||||
<widget class="WrapCheckboxWidget" name="pack_vwii_mode_checkbox" native="true">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Maximum" vsizetype="Fixed">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true"/>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QLabel" name="pack_vwii_mode_lbl">
|
||||
<property name="enabled">
|
||||
<bool>true</bool>
|
||||
<widget class="QLabel" name="label_2">
|
||||
<property name="font">
|
||||
<font>
|
||||
<bold>true</bold>
|
||||
</font>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>App Settings</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="WrapCheckboxWidget" name="auto_update_checkbox" native="true">
|
||||
<property name="sizePolicy">
|
||||
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
|
||||
<horstretch>0</horstretch>
|
||||
<verstretch>0</verstretch>
|
||||
</sizepolicy>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Re-encrypt title using the Wii Common Key</string>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="WrapCheckboxWidget" name="custom_out_dir_checkbox" native="true"/>
|
||||
</item>
|
||||
<item>
|
||||
<layout class="QHBoxLayout" name="custom_out_dir_entry_row">
|
||||
<item>
|
||||
<widget class="QLineEdit" name="custom_out_dir_entry">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="wordWrap">
|
||||
<bool>true</bool>
|
||||
<property name="placeholderText">
|
||||
<string>Output Path</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QPushButton" name="custom_out_dir_btn">
|
||||
<property name="enabled">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Select...</string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
@ -621,12 +387,12 @@
|
||||
<enum>Qt::Orientation::Vertical</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
|
||||
<enum>QSizePolicy::Policy::Preferred</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>20</width>
|
||||
<height>50</height>
|
||||
<height>200</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
@ -637,12 +403,12 @@
|
||||
<enum>Qt::Orientation::Horizontal</enum>
|
||||
</property>
|
||||
<property name="sizeType">
|
||||
<enum>QSizePolicy::Policy::MinimumExpanding</enum>
|
||||
<enum>QSizePolicy::Policy::Fixed</enum>
|
||||
</property>
|
||||
<property name="sizeHint" stdset="0">
|
||||
<size>
|
||||
<width>40</width>
|
||||
<height>20</height>
|
||||
<width>300</width>
|
||||
<height>0</height>
|
||||
</size>
|
||||
</property>
|
||||
</spacer>
|
||||
@ -656,7 +422,7 @@
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>247</height>
|
||||
<height>222</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="markdown">
|
||||
@ -669,11 +435,30 @@ p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></string>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
<item>
|
||||
<widget class="QProgressBar" name="progress_bar">
|
||||
<property name="minimumSize">
|
||||
<size>
|
||||
<width>0</width>
|
||||
<height>25</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="maximumSize">
|
||||
<size>
|
||||
<width>16777215</width>
|
||||
<height>30</height>
|
||||
</size>
|
||||
</property>
|
||||
<property name="value">
|
||||
<number>0</number>
|
||||
</property>
|
||||
</widget>
|
||||
</item>
|
||||
</layout>
|
||||
</item>
|
||||
</layout>
|
||||
@ -684,11 +469,179 @@ li.checked::marker { content: "\2612"; }
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<width>1010</width>
|
||||
<height>30</height>
|
||||
<height>21</height>
|
||||
</rect>
|
||||
</property>
|
||||
<widget class="QMenu" name="menu_help">
|
||||
<property name="title">
|
||||
<string>Help</string>
|
||||
</property>
|
||||
<addaction name="action_about"/>
|
||||
<addaction name="action_about_qt"/>
|
||||
<addaction name="separator"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_options">
|
||||
<property name="title">
|
||||
<string>Options</string>
|
||||
</property>
|
||||
<widget class="QMenu" name="menu_options_language">
|
||||
<property name="title">
|
||||
<string>Language</string>
|
||||
</property>
|
||||
<addaction name="action_language_system"/>
|
||||
<addaction name="action_language_english"/>
|
||||
<addaction name="action_language_spanish"/>
|
||||
<addaction name="action_language_german"/>
|
||||
<addaction name="action_language_french"/>
|
||||
<addaction name="action_language_italian"/>
|
||||
<addaction name="action_language_norwegian"/>
|
||||
<addaction name="action_language_romanian"/>
|
||||
<addaction name="action_language_korean"/>
|
||||
</widget>
|
||||
<widget class="QMenu" name="menu_options_theme">
|
||||
<property name="title">
|
||||
<string>Theme</string>
|
||||
</property>
|
||||
<addaction name="action_theme_system"/>
|
||||
<addaction name="action_theme_light"/>
|
||||
<addaction name="action_theme_dark"/>
|
||||
</widget>
|
||||
<addaction name="menu_options_language"/>
|
||||
<addaction name="menu_options_theme"/>
|
||||
</widget>
|
||||
<addaction name="menu_options"/>
|
||||
<addaction name="menu_help"/>
|
||||
</widget>
|
||||
<action name="action_about">
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::HelpAbout"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>About NUSGet</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::MenuRole::ApplicationSpecificRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_about_qt">
|
||||
<property name="icon">
|
||||
<iconset theme="QIcon::ThemeIcon::HelpAbout"/>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>About Qt</string>
|
||||
</property>
|
||||
<property name="menuRole">
|
||||
<enum>QAction::MenuRole::ApplicationSpecificRole</enum>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_system">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="checked">
|
||||
<bool>false</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>System (Default)</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_english">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">English</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_spanish">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Español</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_german">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Deutsch</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_french">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Français</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_italian">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Italiano</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_norwegian">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Norsk</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_romanian">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">Română</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_language_korean">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string notr="true">한국어</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_theme_system">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>System (Default)</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_theme_light">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Light</string>
|
||||
</property>
|
||||
</action>
|
||||
<action name="action_theme_dark">
|
||||
<property name="checkable">
|
||||
<bool>true</bool>
|
||||
</property>
|
||||
<property name="text">
|
||||
<string>Dark</string>
|
||||
</property>
|
||||
</action>
|
||||
</widget>
|
||||
<customwidgets>
|
||||
<customwidget>
|
||||
<class>WrapCheckboxWidget</class>
|
||||
<extends>QWidget</extends>
|
||||
<header>qt/py/ui_WrapCheckboxWidget</header>
|
||||
<container>1</container>
|
||||
</customwidget>
|
||||
</customwidgets>
|
||||
<resources/>
|
||||
<connections/>
|
||||
</ui>
|
||||
|
@ -1,6 +1,6 @@
|
||||
pyside6
|
||||
nuitka
|
||||
libWiiPy
|
||||
nuitka~=2.6.0
|
||||
git+https://github.com/NinjaCheetah/libWiiPy
|
||||
libTWLPy
|
||||
zstandard
|
||||
requests
|
||||
|
3
resources/check.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
|
||||
<polyline points="20 6 9 17 4 12"></polyline>
|
||||
</svg>
|
After Width: | Height: | Size: 263 B |
59
resources/down_arrow_black.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
|
||||
sodipodi:docname="down_arrow_black.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="57.72"
|
||||
inkscape:cx="8.0128205"
|
||||
inkscape:cy="8.3939709"
|
||||
inkscape:window-width="1512"
|
||||
inkscape:window-height="834"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="38"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="5.0945272"
|
||||
sodipodi:cy="5.9900498"
|
||||
sodipodi:r1="1.9104478"
|
||||
sodipodi:r2="0.95522392"
|
||||
sodipodi:arg1="1.5707963"
|
||||
sodipodi:arg2="2.6179939"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
|
||||
inkscape:transform-center-y="0.68257261"
|
||||
transform="matrix(2.3912596,0,0,1.4291353,-4.1823371,-1.2431638)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
59
resources/down_arrow_white.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
|
||||
sodipodi:docname="down_arrow.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="57.72"
|
||||
inkscape:cx="8.004158"
|
||||
inkscape:cy="8.4026334"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="5.0945272"
|
||||
sodipodi:cy="5.9900498"
|
||||
sodipodi:r1="1.9104478"
|
||||
sodipodi:r2="0.95522392"
|
||||
sodipodi:arg1="1.5707963"
|
||||
sodipodi:arg2="2.6179939"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
|
||||
inkscape:transform-center-y="0.68257261"
|
||||
transform="matrix(2.3912596,0,0,1.4291353,-4.1823371,-1.2431638)" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
46
resources/information_black.svg
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
|
||||
sodipodi:docname="information_black.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="25.125"
|
||||
inkscape:cx="16.139303"
|
||||
inkscape:cy="16.835821"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path1"
|
||||
style="fill:#000000;stroke:#000000;stroke-width:1.306;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
|
||||
d="M 16 1.6523438 A 14.346852 14.346854 0 0 0 1.6523438 16 A 14.346852 14.346854 0 0 0 16 30.347656 A 14.346852 14.346854 0 0 0 30.347656 16 A 14.346852 14.346854 0 0 0 16 1.6523438 z M 15.992188 4.7265625 C 16.642424 4.7265625 17.197259 4.94079 17.65625 5.3710938 C 18.124803 5.8013975 18.359375 6.3235594 18.359375 6.9355469 C 18.359375 7.5475344 18.124803 8.0677432 17.65625 8.4980469 C 17.197259 8.9283506 16.642424 9.1445312 15.992188 9.1445312 C 15.341951 9.1445312 14.787116 8.9283506 14.328125 8.4980469 C 13.869134 8.0677432 13.640625 7.5475344 13.640625 6.9355469 C 13.640625 6.3235594 13.869134 5.8013975 14.328125 5.3710938 C 14.787116 4.94079 15.341951 4.7265625 15.992188 4.7265625 z M 13.841797 11.238281 L 18.144531 11.238281 L 18.144531 27.273438 L 13.841797 27.273438 L 13.841797 11.238281 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
46
resources/information_white.svg
Normal file
@ -0,0 +1,46 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="32"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4.1 (93de688d07, 2025-03-30)"
|
||||
sodipodi:docname="information.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="25.125"
|
||||
inkscape:cx="16.139303"
|
||||
inkscape:cy="16.79602"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
id="path1"
|
||||
style="fill:#ffffff;stroke:#ffffff;stroke-width:1.3063;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;fill-opacity:1"
|
||||
d="M 16 1.6523438 A 14.346852 14.346854 0 0 0 1.6523438 16 A 14.346852 14.346854 0 0 0 16 30.347656 A 14.346852 14.346854 0 0 0 30.347656 16 A 14.346852 14.346854 0 0 0 16 1.6523438 z M 15.992188 4.7265625 C 16.642424 4.7265625 17.197259 4.94079 17.65625 5.3710938 C 18.124803 5.8013975 18.359375 6.3235594 18.359375 6.9355469 C 18.359375 7.5475344 18.124803 8.0677432 17.65625 8.4980469 C 17.197259 8.9283506 16.642424 9.1445312 15.992188 9.1445312 C 15.341951 9.1445312 14.787116 8.9283506 14.328125 8.4980469 C 13.869134 8.0677432 13.640625 7.5475344 13.640625 6.9355469 C 13.640625 6.3235594 13.869134 5.8013975 14.328125 5.3710938 C 14.787116 4.94079 15.341951 4.7265625 15.992188 4.7265625 z M 13.841797 11.238281 L 18.144531 11.238281 L 18.144531 27.273438 L 13.841797 27.273438 L 13.841797 11.238281 z " />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.2 KiB |
59
resources/right_arrow_black.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
|
||||
sodipodi:docname="right_arrow_black.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="57.72"
|
||||
inkscape:cx="6.8866944"
|
||||
inkscape:cy="7.52772"
|
||||
inkscape:window-width="1512"
|
||||
inkscape:window-height="834"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="38"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="5.0945272"
|
||||
sodipodi:cy="5.9900498"
|
||||
sodipodi:r1="1.9104478"
|
||||
sodipodi:r2="0.95522392"
|
||||
sodipodi:arg1="1.5707963"
|
||||
sodipodi:arg2="2.6179939"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
|
||||
transform="matrix(0,-2.3912596,1.4291353,0,-0.56059112,19.499764)"
|
||||
inkscape:transform-center-x="-0.68257261" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
59
resources/right_arrow_white.svg
Normal file
@ -0,0 +1,59 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
width="16"
|
||||
height="16"
|
||||
viewBox="0 0 16 16"
|
||||
version="1.1"
|
||||
id="svg1"
|
||||
inkscape:version="1.4 (e7c3feb1, 2024-10-09)"
|
||||
sodipodi:docname="right_arrow.svg"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg">
|
||||
<sodipodi:namedview
|
||||
id="namedview1"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#999999"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="2"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#d1d1d1"
|
||||
inkscape:document-units="px"
|
||||
inkscape:zoom="57.72"
|
||||
inkscape:cx="6.8693694"
|
||||
inkscape:cy="7.52772"
|
||||
inkscape:window-width="1512"
|
||||
inkscape:window-height="836"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="38"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="layer1" />
|
||||
<defs
|
||||
id="defs1" />
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1">
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.154168;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1"
|
||||
id="path1"
|
||||
inkscape:flatsided="false"
|
||||
sodipodi:sides="3"
|
||||
sodipodi:cx="5.0945272"
|
||||
sodipodi:cy="5.9900498"
|
||||
sodipodi:r1="1.9104478"
|
||||
sodipodi:r2="0.95522392"
|
||||
sodipodi:arg1="1.5707963"
|
||||
sodipodi:arg2="2.6179939"
|
||||
inkscape:rounded="0"
|
||||
inkscape:randomized="0"
|
||||
d="M 5.0945273,7.9004977 4.2672791,6.4676618 3.4400309,5.034826 l 1.6544964,-10e-8 1.6544963,0 -0.8272482,1.4328359 z"
|
||||
transform="matrix(0,-2.3912596,1.4291353,0,-0.56059112,19.499764)"
|
||||
inkscape:transform-center-x="-0.68257261" />
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
3
resources/rounded_square.svg
Normal file
@ -0,0 +1,3 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="3" stroke-linecap="round" stroke-linejoin="round">
|
||||
<rect x="2" y="2" width="20" height="20" rx="3"></rect>
|
||||
</svg>
|
After Width: | Height: | Size: 273 B |
436
resources/style_dark.qss
Normal file
@ -0,0 +1,436 @@
|
||||
/* "resources/style.qss" from NUSGet by NinjaCheetah & Contributors */
|
||||
/* Much of this QSS was written by Alex (https://github.com/Humanoidear) */
|
||||
/* from WiiLink for the fancy new WiiLink Patcher GUI. Used with permission. */
|
||||
|
||||
QMainWindow, QDialog {
|
||||
background-color: #222222;
|
||||
}
|
||||
|
||||
QMainWindow QLabel {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QDialog QLabel {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="title"] {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="version"] {
|
||||
font-size: 13px;
|
||||
color: #aaaaaa;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="copyright"] {
|
||||
font-size: 12px;
|
||||
color: #888888;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="header"] {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #444444;
|
||||
padding-bottom: 4px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
QMenuBar {
|
||||
background-color: #2b2b2b;
|
||||
}
|
||||
|
||||
QMenuBar::item:selected {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
color: white;
|
||||
}
|
||||
|
||||
QMenuBar::item:pressed {
|
||||
background-color: #1a73e8;
|
||||
color: white;
|
||||
}
|
||||
|
||||
QMenu {
|
||||
background-color: #2b2b2b;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 6px 2px;
|
||||
margin: 4px 0;
|
||||
color: white;
|
||||
}
|
||||
|
||||
QMenu::item {
|
||||
padding: 6px 16px 6px 4px;
|
||||
margin: 2px;
|
||||
border-radius: 4px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
QMenu::item:selected {
|
||||
background-color: #1a73e8;
|
||||
color: white;
|
||||
}
|
||||
|
||||
QMenu::icon {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
QRadioButton {
|
||||
background-color: transparent;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 8px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QRadioButton:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QRadioButton:checked {
|
||||
background-color: rgba(26, 115, 232, 0.08);
|
||||
border: 1px solid #1a73e8;
|
||||
color: #1a73e8;
|
||||
}
|
||||
|
||||
QRadioButton::indicator {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #5f6368;
|
||||
margin-right: 8px;
|
||||
subcontrol-position: left center;
|
||||
}
|
||||
|
||||
QRadioButton::indicator:checked {
|
||||
background-color: #1a73e8;
|
||||
border: 1px solid #1a73e8;
|
||||
image: url("{IMAGE_PREFIX}/rounded_square.svg");
|
||||
}
|
||||
|
||||
QRadioButton::indicator:hover {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit {
|
||||
background-color: transparent;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
color: #ffffff;
|
||||
selection-background-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit:focus {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit:disabled {
|
||||
background-color: rgba(70, 70, 70, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
QTabWidget::pane {
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-top-right-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
background-color: #2b2b2b;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
QTabBar::tab {
|
||||
background-color: transparent;
|
||||
border-top: 1px solid rgba(70, 70, 70, 1);
|
||||
border-left: 1px solid rgba(70, 70, 70, 1);
|
||||
border-right: 1px solid rgba(70, 70, 70, 1);
|
||||
border-top-left-radius: 6px;
|
||||
border-top-right-radius: 6px;
|
||||
padding: 6px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QTabBar::tab:selected, QTabBar::tab:hover {
|
||||
background-color: #2b2b2b;
|
||||
}
|
||||
|
||||
QTreeView {
|
||||
show-decoration-selected: 1;
|
||||
outline: 0;
|
||||
background-color: #1a1a1a;
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
QTreeView QHeaderView::section {
|
||||
color: white;
|
||||
background-color: #2b2b2b;
|
||||
border: 0;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
QTreeView::item {
|
||||
color: white;
|
||||
}
|
||||
|
||||
QTreeView::item:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
}
|
||||
|
||||
QTreeView::item:focus {
|
||||
background-color: rgba(26, 115, 232, 0.08);
|
||||
}
|
||||
|
||||
QTreeView::item:selected {
|
||||
background-color: #1a73e8;
|
||||
}
|
||||
|
||||
QTreeView QScrollBar:vertical {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
image: url("{IMAGE_PREFIX}/right_arrow_white.svg");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
image: url("{IMAGE_PREFIX}/down_arrow_white.svg");
|
||||
}
|
||||
|
||||
QTextBrowser {
|
||||
color: white;
|
||||
background-color: #1a1a1a;
|
||||
selection-background-color: #1a73e8;
|
||||
}
|
||||
|
||||
QPushButton {
|
||||
outline: 0;
|
||||
show-decoration-selected: 1;
|
||||
background-color: transparent;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QPushButton:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QPushButton:focus {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QPushButton:pressed {
|
||||
background-color: rgba(26, 115, 232, 0.15);
|
||||
border: 1px solid #1a73e8;
|
||||
}
|
||||
|
||||
QPushButton:disabled {
|
||||
background-color: rgba(70, 70, 70, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
QComboBox {
|
||||
background-color: transparent;
|
||||
combobox-popup: 0;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QComboBox:on {
|
||||
background-color: rgba(26, 115, 232, 0.15);
|
||||
border: 1px solid #1a73e8;
|
||||
}
|
||||
|
||||
QComboBox:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QComboBox:focus {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QComboBox::drop-down {
|
||||
border: 0;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
QComboBox::down-arrow {
|
||||
image: url("{IMAGE_PREFIX}/down_arrow_white.svg");
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView {
|
||||
background-color: #2b2b2b;
|
||||
border: 1px solid #444444;
|
||||
border-radius: 8px;
|
||||
padding: 4px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item {
|
||||
height: 25px;
|
||||
border-radius: 4px;
|
||||
padding: 4px 8px;
|
||||
margin: 2px 0px;
|
||||
color: white;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
background-color: #1a73e8;
|
||||
}
|
||||
|
||||
QScrollBar:vertical {
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
padding: 2px 0 2px 0;
|
||||
background-color: #222222;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
margin: 0px 2px 0px 2px;
|
||||
width: 10px;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical:hover {
|
||||
background-color: rgba(26, 115, 232, 0.4);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:vertical {
|
||||
height: 0;
|
||||
subcontrol-position: bottom;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar::sub-line:vertical {
|
||||
height: 0;
|
||||
subcontrol-position: top;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar:horizontal {
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
padding: 2px 0 2px 0;
|
||||
background-color: #222222;
|
||||
}
|
||||
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
margin: 0px 2px 0px 2px;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:horizontal:hover {
|
||||
background-color: rgba(26, 115, 232, 0.4);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:horizontal {
|
||||
height: 0;
|
||||
subcontrol-position: bottom;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar::sub-line:horizontal {
|
||||
height: 0;
|
||||
subcontrol-position: top;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QMessageBox QLabel {
|
||||
color: white;
|
||||
}
|
||||
|
||||
QProgressBar {
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
background-color: #1a1a1a;
|
||||
text-align: center;
|
||||
color: white;
|
||||
padding-left: 1px;
|
||||
}
|
||||
|
||||
QProgressBar::chunk {
|
||||
background-color: qlineargradient(
|
||||
x1: 0, y1: 0, x2: 1, y2: 0,
|
||||
stop: 0 #1a73e8, stop: 1 #5596f4
|
||||
);
|
||||
border-radius: 5px;
|
||||
margin: 0.5px;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget {
|
||||
show-decoration-selected: 1;
|
||||
outline: 0;
|
||||
background-color: transparent;
|
||||
border: 1px solid rgba(70, 70, 70, 1);
|
||||
border-radius: 8px;
|
||||
padding: 12px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget:disabled {
|
||||
background-color: rgba(70, 70, 70, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QLabel:disabled {
|
||||
color: #919191;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #5f6368;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator:checked {
|
||||
background-color: #1a73e8;
|
||||
border: 1px solid #1a73e8;
|
||||
image: url("{IMAGE_PREFIX}/check.svg");
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator:hover {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox:checked {
|
||||
color: #1a73e8;
|
||||
}
|
444
resources/style_light.qss
Normal file
@ -0,0 +1,444 @@
|
||||
/* "resources/style.qss" from NUSGet by NinjaCheetah & Contributors */
|
||||
/* Much of this QSS was written by Alex (https://github.com/Humanoidear) */
|
||||
/* from WiiLink for the fancy new WiiLink Patcher GUI. Used with permission. */
|
||||
|
||||
QMainWindow, QDialog {
|
||||
background-color: #ffffff;
|
||||
}
|
||||
|
||||
QMainWindow QLabel {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QDialog QLabel {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="title"] {
|
||||
font-size: 20px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="version"] {
|
||||
font-size: 13px;
|
||||
color: #777777;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="copyright"] {
|
||||
font-size: 12px;
|
||||
color: #444444;
|
||||
}
|
||||
|
||||
QDialog QLabel[class="header"] {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
border-bottom: 1px solid #111111;
|
||||
padding-bottom: 4px;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
QMenuBar {
|
||||
background-color: #e3e3e3;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QMenuBar::item:selected {
|
||||
background-color: rgb(195, 195, 195);
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QMenuBar::item:pressed {
|
||||
background-color: #1a73e8;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QMenu {
|
||||
background-color: #ffffff;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 6px 2px;
|
||||
margin: 4px 0;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QMenu::item {
|
||||
padding: 6px 16px 6px 4px;
|
||||
margin: 2px;
|
||||
border-radius: 4px;
|
||||
background-color: transparent;
|
||||
}
|
||||
|
||||
QMenu::item:selected {
|
||||
background-color: #1a73e8;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QMenu::icon {
|
||||
padding: 4px;
|
||||
}
|
||||
|
||||
QRadioButton {
|
||||
background-color: transparent;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 8px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QRadioButton:hover {
|
||||
background-color: rgba(60, 60, 60, 1);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QRadioButton:checked {
|
||||
background-color: rgba(26, 115, 232, 0.08);
|
||||
border: 1px solid #1a73e8;
|
||||
color: #1a73e8;
|
||||
}
|
||||
|
||||
QRadioButton::indicator {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 5px;
|
||||
border: 1px solid #5f6368;
|
||||
margin-right: 8px;
|
||||
subcontrol-position: left center;
|
||||
}
|
||||
|
||||
QRadioButton::indicator:checked {
|
||||
background-color: #1a73e8;
|
||||
border: 1px solid #1a73e8;
|
||||
image: url("{IMAGE_PREFIX}/rounded_square.svg");
|
||||
}
|
||||
|
||||
QRadioButton::indicator:hover {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit {
|
||||
background-color: transparent;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
color: #000000;
|
||||
selection-background-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit:focus {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
QLineEdit:disabled {
|
||||
background-color: rgba(182, 182, 182, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(143, 143, 143, 0.3);
|
||||
}
|
||||
|
||||
QTabWidget::pane {
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-top-right-radius: 8px;
|
||||
border-bottom-right-radius: 8px;
|
||||
border-bottom-left-radius: 8px;
|
||||
background-color: #e3e3e3;
|
||||
top: -1px;
|
||||
}
|
||||
|
||||
QTabBar::tab {
|
||||
background-color: transparent;
|
||||
border-top: 1px solid rgb(163, 163, 163);
|
||||
border-left: 1px solid rgb(163, 163, 163);
|
||||
border-right: 1px solid rgb(163, 163, 163);
|
||||
border-top-left-radius: 6px;
|
||||
border-top-right-radius: 6px;
|
||||
padding: 6px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QTabBar::tab:selected, QTabBar::tab:hover {
|
||||
background-color: #e3e3e3;
|
||||
}
|
||||
|
||||
QTreeView {
|
||||
show-decoration-selected: 1;
|
||||
outline: 0;
|
||||
background-color: #ffffff;
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
QTreeView QHeaderView::section {
|
||||
color: #000000;
|
||||
background-color: #e3e3e3;
|
||||
border: 0;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
QTreeView::item {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QTreeView::item:hover {
|
||||
background-color: rgb(195, 195, 195);
|
||||
}
|
||||
|
||||
QTreeView::item:focus {
|
||||
background-color: rgba(26, 115, 232, 0.08);
|
||||
}
|
||||
|
||||
QTreeView::item:selected {
|
||||
background-color: rgb(127, 182, 255);
|
||||
}
|
||||
|
||||
QTreeView::branch:selected {
|
||||
background-color: rgb(127, 182, 255);
|
||||
}
|
||||
|
||||
QTreeView QScrollBar:vertical {
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
QTreeView::branch:has-children:!has-siblings:closed,
|
||||
QTreeView::branch:closed:has-children:has-siblings {
|
||||
image: url("{IMAGE_PREFIX}/right_arrow_black.svg");
|
||||
}
|
||||
|
||||
QTreeView::branch:open:has-children:!has-siblings,
|
||||
QTreeView::branch:open:has-children:has-siblings {
|
||||
image: url("{IMAGE_PREFIX}/down_arrow_black.svg");
|
||||
}
|
||||
|
||||
QTextBrowser {
|
||||
color: #000000;
|
||||
background-color: #ececec;
|
||||
selection-background-color: #1a73e8;
|
||||
selection-color: #ffffff;
|
||||
}
|
||||
|
||||
QPushButton {
|
||||
outline: 0;
|
||||
show-decoration-selected: 1;
|
||||
background-color: transparent;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QPushButton:hover {
|
||||
background-color: rgb(195, 195, 195);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QPushButton:focus {
|
||||
background-color: rgb(195, 195, 195);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QPushButton:pressed {
|
||||
background-color: rgba(26, 115, 232, 0.15);
|
||||
border: 1px solid #1a73e8;
|
||||
}
|
||||
|
||||
QPushButton:disabled {
|
||||
background-color: rgba(182, 182, 182, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(143, 143, 143, 0.3);
|
||||
}
|
||||
|
||||
QComboBox {
|
||||
background-color: transparent;
|
||||
combobox-popup: 0;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 6px 10px;
|
||||
margin: 4px 0px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QComboBox:on {
|
||||
background-color: rgba(26, 115, 232, 0.15);
|
||||
border: 1px solid #1a73e8;
|
||||
}
|
||||
|
||||
QComboBox:hover {
|
||||
background-color: rgb(195, 195, 195);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QComboBox:focus {
|
||||
background-color: rgb(195, 195, 195);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
QComboBox::drop-down {
|
||||
border: 0;
|
||||
width: 24px;
|
||||
}
|
||||
|
||||
QComboBox::down-arrow {
|
||||
image: url("{IMAGE_PREFIX}/down_arrow_black.svg");
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView {
|
||||
background-color: #ffffff;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 4px;
|
||||
outline: none;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item {
|
||||
height: 25px;
|
||||
border-radius: 4px;
|
||||
padding: 4px 8px;
|
||||
margin: 2px 0px;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QComboBox QAbstractItemView::item:hover {
|
||||
background-color: #1a73e8;
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
QScrollBar:vertical {
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
padding: 2px 0 2px 0;
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical {
|
||||
background-color: #e3e3e3;
|
||||
margin: 0 2px 0 2px;
|
||||
width: 10px;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:vertical:hover {
|
||||
background-color: rgba(26, 115, 232, 0.4);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:vertical {
|
||||
height: 0;
|
||||
subcontrol-position: bottom;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar::sub-line:vertical {
|
||||
height: 0;
|
||||
subcontrol-position: top;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar:horizontal {
|
||||
border: 0;
|
||||
border-radius: 8px;
|
||||
padding: 2px 0 2px 0;
|
||||
background-color: #f1f1f1;
|
||||
}
|
||||
|
||||
QScrollBar::handle:horizontal {
|
||||
background-color: #e3e3e3;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
margin: 0px 2px 0px 2px;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
QScrollBar::handle:horizontal:hover {
|
||||
background-color: rgba(26, 115, 232, 0.4);
|
||||
}
|
||||
|
||||
QScrollBar::add-line:horizontal {
|
||||
height: 0;
|
||||
subcontrol-position: bottom;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QScrollBar::sub-line:horizontal {
|
||||
height: 0;
|
||||
subcontrol-position: top;
|
||||
subcontrol-origin: margin;
|
||||
}
|
||||
|
||||
QMessageBox QLabel {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
QProgressBar {
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
background-color: #ececec;
|
||||
text-align: center;
|
||||
padding: 1px;
|
||||
color: black;
|
||||
}
|
||||
|
||||
QProgressBar::chunk {
|
||||
background-color: qlineargradient(
|
||||
x1: 0, y1: 0, x2: 1, y2: 0,
|
||||
stop: 0 #1a73e8, stop: 1 #5596f4
|
||||
);
|
||||
border-radius: 5px;
|
||||
margin: 0.5px;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget {
|
||||
show-decoration-selected: 1;
|
||||
outline: 0;
|
||||
background-color: transparent;
|
||||
border: 1px solid rgb(163, 163, 163);
|
||||
border-radius: 8px;
|
||||
padding: 12px 10px;
|
||||
font-size: 13px;
|
||||
font-weight: 500;
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget:hover {
|
||||
background-color: rgb(195, 195, 195);
|
||||
border-color: #4a86e8;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget:disabled {
|
||||
background-color: rgba(182, 182, 182, 0.5);
|
||||
border: 1px solid rgba(100, 100, 100, 0.3);
|
||||
color: rgba(255, 255, 255, 0.3);
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QLabel:disabled {
|
||||
color: rgba(143, 143, 143, 0.3);
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator {
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
border-radius: 4px;
|
||||
border: 1px solid #5f6368;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator:checked {
|
||||
background-color: #1a73e8;
|
||||
border: 1px solid #1a73e8;
|
||||
image: url("{IMAGE_PREFIX}/check.svg");
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox::indicator:hover {
|
||||
border-color: #1a73e8;
|
||||
}
|
||||
|
||||
WrapCheckboxWidget QCheckBox:checked {
|
||||
color: #1a73e8;
|
||||
}
|
@ -1,164 +1,353 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="de_DE">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Über NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translatorcomment>Translating the name probably doesn't make much sense, I think</translatorcomment>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Version {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Mit libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & Mitwirkende</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Dieses Projekt auf GitHub öffnen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Übersetzungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Französisch (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Deutsch: <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italienisch (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Koreanisch (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norwegisch (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Rumänisch (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Spanisch (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translatorcomment>"Downloads" in German copies of Windows and macOS isn't translated
|
||||
Specified that the tickets for titles with a checkmark are publicly available, for clarity in the translation</translatorcomment>
|
||||
<translation>NUSGet v{nusget_version}
|
||||
Entwickelt von NinjaCheetah
|
||||
Nutzt libWiiPy {libwiipy_version}
|
||||
Unterstützung für DSi bereitgestelt durch libTWLPy {libtwlpy_version}
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translatorcomment>Windows and macOS don't translate Downloads, and most Linux distributions (with xdg-home-dirs I guess?) don't either, so we keep it the same</translatorcomment>
|
||||
<translation>Wähle einen Titel aus der Liste links aus oder gebe eine Title-ID an, um zu beginnen.
|
||||
|
||||
Wähle einen Titel aus der Liste auf der linken Seite oder gebe eine Title-ID ein, um zu beginnen.
|
||||
Titel, welche in der Liste mit einem Haken markiert sind, haben ein frei verfügbares Ticket und können so entschlüsselt gespeichert und auch in eine WAD oder TAD gepackt werden. Bei anderen Titeln können nur verschlüsselte Inhalte heruntergeladen werden.
|
||||
|
||||
Titel, welche mit einem Häkchen markiert sind, sind frei verfügbar und haben ein öffentliches Ticket, und können daher entschlüsselt und/oder in eine WAD/TAD verpackt werden. Titel mit einem Kreuz haben kein öffentlich verfügbares Ticket und können nur verschlüsselt heruntergeladen werden.
|
||||
|
||||
Titel werden in einem "NUSGet" Ordner innerhalb des Downloads-Ordners gespeichert.</translation>
|
||||
Standartmäßig werden alle Inhalte und Archive in einen "NUSGet Downloads"-Ordner im Downloads-Order gespeichert.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Als installierbares Archiv verpacken (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translatorcomment>"speichern" is more like "save" than "keep", but "behalten" would sound stupid</translatorcomment>
|
||||
<translation>Verschlüsselte Inhalte speichern</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translatorcomment>Similar situation as with "Keep encrypted contents", means more like "Decrypt contents" because it sounds better</translatorcomment>
|
||||
<translation>Inhalte entschlüsseln (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Vorhandene Dateien nutzen, sofern verfügbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Wii U-NUS benutzen (schneller, betrifft nur Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation>Patches für IOS anwenden (Betrifft nur WADs)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Inhalte des Titels mit dem Wii Common-Key neu verschlüsseln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Beim Start nach Updates suchen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Benutzerspezifischen Downloads-Ordner nutzen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation>NUSGet-Update verfügbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation>Eine neuere Version von NUSGet ist verfügbar.</translation>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>Eine neue version von NUSGet ist verfügbar!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translatorcomment>Changed from "output" to "packaging" for clarity</translatorcomment>
|
||||
<translation>Keine Verpackmethode ausgewählt</translation>
|
||||
<translatorcomment>"Output" is quite difficult to translate into anything sensical, so I added "format" to make it specifically refer to the type of output the user wants, which keeps it consistent with the rest of the text</translatorcomment>
|
||||
<translation>Kein Ausgabeformat ausgewählt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>Es wurde keine Methode zum Verpacken der Inhalte ausgewählt.</translation>
|
||||
<translation>Es wurde kein Ausgabeformat für die Inhalte ausgewählt!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translatorcomment>Explicitly mentions options for clarity</translatorcomment>
|
||||
<translation>Es muss mindestens "verschlüsselte Inhalte speichern", "entschlüsselte Inhalte speichern" oder "Verpacke als WAD/TAD" ausgewählt worden sein.</translation>
|
||||
<translation>Bitte wählen Sie mindestens ein Format aus für den herunterzuladenen Titel.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Fehlerhafter Downloads-Ordner</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>Der ausgewählte Downloads-Ordner konnte nicht gefunden werden!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Bitte stellen Sie sicher, dass der Downloads-Ordner existiert und dass Sie Zugriff auf diesen haben.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>Fehlerhafte Title-ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation>Die eingegebene Title-ID ist nicht korrekt.</translation>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>Die angegebene Title-ID ist fehlerhaft!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Die Title-ID muss mindestens 16 alphanumerische Zeichen enthalten.</translation>
|
||||
<translation>Title-IDs müssen aus 16 alphanumerischen Zeichen bestehen. Bitte geben Sie eine korrekte Title-ID ein oder wählen Sie einen Titel aus der Liste links.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>Title-ID/Version nicht gefunden</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translatorcomment>The title was moved into the body, and the title was made less of a mouthful, for ease of translation</translatorcomment>
|
||||
<translation>Es konnte kein Titel mit der gegebenen Title-ID oder Version gefunden werden.</translation>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Es konnte kein Titel mit der gegebenen Title-ID bzw. Version gefunden werden!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Die Title-ID könnte möglicherweise fehlerhaft sein.</translation>
|
||||
<translation>Bitte stellen Sie sicher, dass Sie eine korrekte Title-ID eingegeben haben und dass die Version auch existiert. Alternativ können Sie diese auch in der Liste links finden.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Entschlüsselung fehlgeschlagen</translation>
|
||||
<translation>Inhaltsentschlüsselung fehlgeschlagen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation>Die Inhalte des Titels konnten nicht korrekt entschlüsselt werden.</translation>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>Die Inhalte konnten nicht entschlüsselt werden.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>Die gespeicherte TMD oder das Ticket könnten möglicherweise fehlerhaft sein. "Lokale Dateien nutzen" kann ausgeschaltet werden, um diese erneut herunterzuladen.</translation>
|
||||
<translation>Das TMD oder Ticket könnten wohlmöglich beschädigt sein oder stimmen nicht mit dem ausgewählten Titel überein, sofern "Vorhandene Dateien nutzen, sofern verfügbar" aktiviert wurde. Im letzteren Fall sollten Sie versuchen, diese Option auszuschalten und die Inhalte neu herunterzuladen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Ticket nicht verfügbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation>Kein Ticket konnte für den geforderten Titel gefunden werden.</translation>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Es konnte kein Ticket für den angegebenen TItel gefunden werden!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>Es wurden nur verschlüsselte Inhalte gespeichert.</translation>
|
||||
<translation>Es konnte kein Ticket für den ausgewählten Titel heruntergeladen werden, jedoch wurde "Als installierbares Archiv verpacken" bzw. "Inhalte entschlüsseln" ausgewählt. Diese Optionen erfordern ein Ticket. Es wurden nur verschlüsselte Inhalte gespeichert.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Unbekannter Fehler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation>Ein unbekannter Fehler ist aufgetreten.</translation>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>Ein unbekannter Fehler ist aufgetreten!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Versuchen Sie es erneut. Sofern das Problem bestehen bleibt, können Sie ein Issue auf GitHub öffnen, um den Fehler zu berichten.</translation>
|
||||
<translation>Bitte versuchen Sie noch einmal. Sofern das Problem weiter besteht, wenden Sie sich bitte an den Issue-Tracker auf GitHub mit Details dazu, was Sie versucht haben.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translatorcomment>Translating the file type is pointless, since it's not an actual "script"</translatorcomment>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Script-Fehler aufgetreten</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Fehler sind während der Ausführung von Scripten aufgetreten.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Bitte schauen Sie im Log nach, welche Fehler aufgetreten sind.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Die angegebenen Titel konnten wegen Fehlern nicht heruntergeladen werden. Bitte stellen Sie sicher, dass die Title-IDs und Versionen im Script korrekt sind.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Sie haben "Inhalte entschlüsseln" bzw. "Als installierbares Archiv verpacken" ausgewählt, aber die angegebenen Titel im Script haben kein verfügbares Ticket. Sofern "Verschlüsselte Inhalte speichern" aktiv ist, wurden verschlüsselte Daten noch gespeichert.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Script-Download fehlgeschlagen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>NUS-Script öffnen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation>NUS Script (*.nus *.txt)</translation>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>NUS-Scripts (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation>Script-Fehler</translation>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>Ein Fehler ist beim Lesen des Scripts aufgetreten!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation>Konnte das NUS-Script nicht öffnen.</translation>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>Der Fehler ist bei Linie {lineno}, Zeile {colno} aufgetreten. Bitte überprüfen Sie ihr Script und versuchen Sie es erneut.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>Ein Fehler ist beim Lesen der Title-IDs aufgetreten!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Der Titel an Stelle {index} hat keine Title-ID!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Ordner öffnen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>Der angegebene Downloads-Ordner konnte nicht gefunden werden!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Bitte stellen Sie sicher, dass der Downloads-Ordner, den Sie nutzen möchten, existiert und dass Sie darauf auch Zugriffen haben.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Neustart erforderlich</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet muss erneut gestartet werden, um die ausgewählte Sprache zu nutzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet muss erneut gestartet werden, um die ausgewählte Darstellung zu nutzen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
@ -167,146 +356,178 @@ Could not check for updates.</source>
|
||||
Konnte nicht nach Updates suchen.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation>
|
||||
|
||||
Eine neuere Version von NUSGet ist verfügbar.</translation>
|
||||
Eine neuere Version von NUSGet ist verfügbar!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translatorcomment>Like previously, we're trying to refer to the user less directly (since it sounds awkard in German)</translatorcomment>
|
||||
<translation>
|
||||
|
||||
Die neuste Version von NUSGet ist bereits aktiv.</translation>
|
||||
Sie nutzen bereits die neuste Version von NUSGet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
|
||||
<source>MainWindow</source>
|
||||
<translatorcomment>This title isn't shown</translatorcomment>
|
||||
<translation>Hauptmenü</translation>
|
||||
<translatorcomment>This isn't shown to the user</translatorcomment>
|
||||
<translation>MainWindow</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation>Verfügbare Titel</translation>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Suche</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Leeren</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation></translation>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation></translation>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation></translation>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translatorcomment>We do not translate "Title ID" beyond making it grammatically correct (hence the dash), since it refers to a NUS specific component</translatorcomment>
|
||||
<translation>Title-ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translatorcomment>Since vNNNNN is a common way of referring to versions across the Wii both by Nintendo and modders, we keep it identical</translatorcomment>
|
||||
<translation></translation>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translatorcomment>The same word is used in German</translatorcomment>
|
||||
<translation></translation>
|
||||
<translation>Version</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation>Konsole:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation>Herunterladen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation>Script starten</translation>
|
||||
<translation>Script ausführen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation>Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Installierbar verpacken (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Dateiname</translation>
|
||||
<translation>Datei-Name</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Verschlüsselte Inhalte speichern</translation>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWii-Titeleinstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Entschlüsselte Inhalte speichern (*.app)</translation>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>App-Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>Downloads-Ordner</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Auswählen...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Lokale Dateien nutzen, sofern verfügbar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation>Wii U-NUS nutzen (schneller, gilt nur für Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translatorcomment>"Patch" does not have a good translation into German, and in most modding forums, it's used as is</translatorcomment>
|
||||
<translation>Patches für IOS anwenden (Gilt nur für WAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWii Titel-Einstellungen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translatorcomment>Common key does not get translated</translatorcomment>
|
||||
<translation>Titel mit dem Common-Key der Wii neu verschlüsseln</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation></translation>
|
||||
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Hilfe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Optionen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Sprache</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Darstellung</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Über NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Über Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>System (Standart)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Hell</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Dunkel</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -2,27 +2,101 @@
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="es_ES">
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<source>Wii</source>
|
||||
<translatorcomment>Does not change.</translatorcomment>
|
||||
<translation type="unfinished">Wii</translation>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Acerca de NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Versión {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Usando libWiiPy {libwiipy_version} y libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah y colaboradores</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Ver proyecto en GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Traducciones</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Francés (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Alemán (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translatorcomment>"Italiano" is spelled the same way in both Italian and Spanish.</translatorcomment>
|
||||
<translation>Italiano: <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Coreano (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Noruego (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Rumano (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Español: <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translatorcomment>Does not change.</translatorcomment>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translatorcomment>Does not change.</translatorcomment>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translatorcomment>Does not change.</translatorcomment>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translatorcomment>Does not change.</translatorcomment>
|
||||
<translation>v</translation>
|
||||
@ -30,259 +104,427 @@
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
|
||||
<source>MainWindow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>VentanaPrincipal</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Buscar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Limpiar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ID de título</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Versión</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Consola:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Iniciar descarga</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ejecutar script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<source>File Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Configuración general</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Opciones</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Idioma</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Tema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Acerca de NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>Sistema (por defecto)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Claro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Oscuro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Generar paquete de instalación (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Nombre de archivo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Mantener contenidos encriptados</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Crear contenidos desencriptados (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Usar archivos locales, si existen</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>Configuración de títulos de vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Reencriptar título usando la clave común de Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Configuración de aplicación</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Buscar actualizaciones al inicio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Usar ruta de descarga personalizada</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Seleccionar...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Ayuda</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Acerca de Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>Ruta de descarga</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Aplicar parches a IOS (sólo aplica a WADs)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation>Actualización de NUSGet disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation>Formato de salida no escogido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>¡No has escogido un formato de salida para los datos!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation>Por favor, selecciona al menos un formato de salida para la descarga.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Directorio de descarga inválido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>¡El directorio de descarga especificado no existe!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Por favor, asegúrate de que el directorio de descarga especificado existe, y de que tengas permisos para acceder a él.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>ID de título inválido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>¡El ID de título introducido no tiene un formato válido!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>¡No se encontró un título que coincida con el ID de título y/o versión proporcionados!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>¡El desencriptado de contenidos falló! No se han podido crear los contenidos desencriptados.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translatorcomment>"Ticket" may be translated as "billete", "boleto" or even "tique", but it is preferable to use the English term here for consistency's sake.</translatorcomment>
|
||||
<translation><b>¡No existe un ticket disponible para el título solicitado!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>¡Ha ocurrido un error desconocido!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Ocurrieron algunos problemas durante la ejecución del script de descarga.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>¡Ocurrió un error mientras se analizaba el archivo de script!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>¡Ocurrió un error mientras se analizaban los IDs de títulos!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Los IDs de títulos tienen que ser cadenas alfanuméricas de 16 dígitos. Por favor, introduce un ID de título con el formato apropiado, o selecciona uno desde el menú a la izquierda.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translatorcomment>"Ticket" may be translated as "billete", "boleto" or even "tique", but it is preferable to use the English term here for consistency's sake.</translatorcomment>
|
||||
<translation>Selecciona un título desde la lista a la izquierda, o introduce un ID de título para empezar.
|
||||
|
||||
Los títulos con una marca de verificación son gratuitos, tienen un ticket disponible y pueden ser desencriptados y/o empaquetados a un WAD o TAD. Los títulos con una "X" no cuentan con un ticket, y sólo pueden guardarse sus contenidos encriptados.
|
||||
|
||||
Por defecto, los títulos serán descargados a una carpeta llamada "NUSGet Downloads" dentro de tu directorio de descargas.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Usar NUS de Wii U (más rápido, sólo afecta a Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>¡Hay una nueva versión de NUSGet disponible!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>ID de título / versión no disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Por favor, asegúrate de haber introducido un ID de título válido o de seleccionar uno de la base de datos de títulos, y que la versión proporcionada existe para el título que estás tratando de descargar.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>El desencriptado de contenidos falló</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translatorcomment>"Ticket" may be translated as "billete", "boleto" or even "tique", but it is preferable to use the English term here for consistency's sake.</translatorcomment>
|
||||
<translation>Tu TMD o ticket puede estar dañado, o puede que no correspondan al contenido que está siendo desencriptado. Si marcaste la casilla "Usar archivos locales, si existen", prueba con desactivar dicha opción antes de intentar nuevamente la descarga para corregir posibles problemas con los datos locales.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translatorcomment>"Ticket" may be translated as "billete", "boleto" or even "tique", but it is preferable to use the English term here for consistency's sake.</translatorcomment>
|
||||
<translation>Ticket no disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translatorcomment>"Ticket" may be translated as "billete", "boleto" or even "tique", but it is preferable to use the English term here for consistency's sake.</translatorcomment>
|
||||
<translation>No se pudo descargar un ticket para el título solicitado, pero has marcado la casilla "Generar paquete de instalación" o "Crear contenidos desencriptados". Estas opciones no están disponibles para títulos sin un ticket. Sólo se han guardado los contenidos encriptados.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Error desconocido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Por favor, intenta de nuevo. Si el problema persiste, por favor abre un reporte de problema en GitHub detallando lo que intentabas hacer cuando ocurrió este error.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Ocurrieron problemas con el script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Lee el registro para obtener más detalles sobre los problemas que se encontraron.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Los siguientes títulos no pudieron ser descargados debido a un error. Por favor, asegúrate de que el ID de título y la versión listados en el script son válidos.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Marcaste la casilla "Crear contenidos desencriptados" o "Generar paquete de instalación", pero los siguientes títulos del script no tienen un ticket disponible. Si se marcó su opción, los contenidos encriptados fueron descargados de todas maneras.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>La descarga del script falló</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Abrir script de NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>Scripts de NUS (*.nus, *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>Error encontrado en la línea {lineno}, columna {colno}. Por favor, verifica el script e intenta nuevamente.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>¡El título con índice {index} no tiene un ID de título!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Abrir directorio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>¡El directorio de descarga especificado no existe!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Por favor, asegúrate de que el directorio de descarga especificado existe, y de que tengas permisos para acceder a él.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Reinicio requerido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet tiene que reiniciarse para aplicar el idioma seleccionado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet tiene que reiniciarse para aplicar el tema seleccionado.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
No se pudo buscar actualizaciones.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
¡Hay una nueva versión de NUSGet disponible!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Estás usando el lanzamiento más reciente de NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -1,10 +1,83 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="fr_FR">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>À propos de NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Utilise libWiiPy {libwiipy_version} et libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translatorcomment>In French, we need to translate both genders for Contributors, just because.</translatorcomment>
|
||||
<translation>© 2024-2025 NinjaCheetah, contributeurs et contributrices</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Voir le projet sur GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Traductions</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Français: <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Allemand (Deutsch) : <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italien (Italiano) : <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Coréen (한국어) : <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norvégien (Norsk) : <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Roumain (Română) : <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Espagnol (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
@ -14,271 +87,497 @@ Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Développé par NinjaCheetah
|
||||
Alimenté par libWiiPy {libwiipy_version}
|
||||
Support DSi fourni par libTWLPy {libtwlpy_version}
|
||||
|
||||
Choisissez un titre depuis la liste à gauche, ou saisissez un ID de titre pour commencer.
|
||||
|
||||
Les titres marqués d'une coche sont gratuits et ont un billet disponible, et peuvent être décryptés et/ou empaquetés dans un fichier WAD ou TAD. Les titres marqués d'une croix n'ont pas de billets, et seul leur contenu crypté peut être enregistré.
|
||||
|
||||
Les titres seront téléchargés dans un dossier "NUSGet Downloads", à l'intérieur de votre dossier de téléchargements.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Mise à jour NUSGet disponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="vanished">Une nouvelle version de NUSGet est disponible !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>Choisissez un titre depuis la liste à gauche, ou saisissez un ID de titre pour commencer.
|
||||
|
||||
Les titres marqués d'une coche sont gratuits et ont un billet disponible, et peuvent être décryptés et/ou empaquetés dans un fichier WAD ou TAD. Les titres marqués d'une croix n'ont pas de billets, et seul leur contenu crypté peut être enregistré.
|
||||
|
||||
Les titres seront téléchargés dans un dossier "NUSGet Downloads", à l'intérieur de votre dossier de téléchargements.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Utiliser le NUS Wii U (plus rapide, n'affecte que Wii / vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>Une nouvelle version de NUSGet est disponible !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation>Aucun format sélectionné</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>Veuillez sélectionner un format de sortie pour les données !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation>Veuillez sélectionner au moins une option de téléchargement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Dossier de téléchargement invalide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>Le dossier de téléchargement choisi n'existe pas !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Assurez-vous que votre dossier de téléchargement existe, et que vous avez les droits suffisants pour y accéder.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>ID de titre invalide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>L'ID de titre que vous avez saisi a un format invalide !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Aucun titre trouvé pour l'ID ou la version fourni !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>Le décryptage du contenu a échoué ! Le contenu décrypté ne peut être créé.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Aucun billet disponible pour le titre demandé !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>Une erreur inconnue est survenue !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Des erreurs sont survenues pendant l'exécution du script de téléchargement.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>Une erreur est survenue pendant la lecture du script !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>Une erreur est survenue à la lecture d'un ID de titre !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Redémarrage requis</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet doit redémarrer pour appliquer la langue choisie.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet doit redémarrer pour appliquer le thème choisi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">L'ID de titre que vous avez saisi a un format invalide !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Les ID de titre doivent être composés de 16 caractères alphanumériques. Veuillez saisir un ID formaté correctement, ou sélectionnez-en un depuis le menu de gauche.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>ID de titre / Version introuvable</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="vanished">Aucun titre trouvé pour l'ID ou la version fourni !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Veuillez vous assurez que vous avez saisi un ID valide, ou sélectionnez-en un depuis la base de données, et que la version fournie existe pour le titre que vous souhaitez télécharger.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Échec du décryptage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="vanished">Le décryptage du contenu a échoué ! Le contenu décrypté ne peut être créé.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>Vos métadonnées (TMD) ou le billet sont probablement endommagés, ou ils ne correspondent pas au contenu décrypté. Si vous avez coché "Utiliser des fichiers locaux, s'ils existent", essayez de désactiver cette option avant d'essayer à nouveau pour résoudre les éventuelles erreurs avec les données locales.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Billet indisponible</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="vanished">Aucun billet disponible pour le titre demandé !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>Un billet ne peut être téléchargé pour le titre demandé, mais vous avez sélectionné "Empaqueter une archive d'installation" ou "Décrypter le contenu". Ces options sont indisponibles pour les titres sans billet. Seul le contenu crypté a été enregistré.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Erreur inconnue</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="vanished">Une erreur inconnue est survenue !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Veuillez essayer à nouveau. Si le problème persiste, déclarez un problème sur GitHub en décrivant les actions qui ont provoqué l'erreur.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Erreurs survenues dans le script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">Des erreurs sont survenues pendant l'exécution du script de téléchargement.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Vérifiez le journal pour plus de détails à propos des erreurs rencontrées.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Le téléchargement des titres suivants a échoué. Assurez-vous que les ID de titre et version du script soient valides.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Vous avez activé "Décrypter le contenu" ou "Empaqueter une archive d'installation", mais les billets des titres suivants sont indisponibles. Si activé(s), le contenu crypté a été téléchargé.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Échec du script de téléchargement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Ouvrir un script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>Scripts NUS (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">Une erreur est survenue pendant la lecture du script !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>Erreur recontrée ligne {lineno}, colonne {colno}. Vérifiez le script et réessayez.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">Une erreur est survenue à la lecture d'un ID de titre !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Le titre à l'index {index} n'a pas d'ID !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Ouvrir un dossier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>Le dossier de téléchargement choisi n'existe pas !</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Assurez-vous que votre dossier de téléchargement existe, et que vous avez les droits suffisants pour y accéder.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
|
||||
<source>MainWindow</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>FenetrePrincipale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Rechercher</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Effacer</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>ID du titre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Console :</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Télécharger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Exécuter le script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<source>File Name</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Configuration</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Langue</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Thème</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>À propos de NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>Système (par défaut)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Clair</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Sombre</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Empaqueter une archive d'installation (WAD / TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Nom du fichier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Conserver le contenu crypté</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Décrypter le contenu (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Utiliser des fichiers locaux, s'ils existent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="vanished">Utiliser le NUS Wii U (plus rapide, n'affecte que Wii / vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation>Appliquer des modifications aux IOS (WAD uniquement)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>Titres vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Encrypter le titre avec la clé commune Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Paramètres</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Vérifier les mises à jour au démarrage</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Utiliser un dossier de téléchargement différent</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Choisir</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Aide</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>À propos de Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>Dossier de téléchargement</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Impossible de vérifier les mises à jour.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Une nouvelle version de NUSGet est disponible !</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Vous utilisez la dernière version de NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -1,6 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="it_IT">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Info su NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Versione {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Versione libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & Contributori</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Vedi il progetto su GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Traduzioni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Francese (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Tedesco (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italiano: <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Coreano (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norvegese (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Rumeno (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Spagnolo (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
@ -9,102 +82,199 @@
|
||||
<translation>Finestra principale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation>Titoli disponibili</translation>
|
||||
<translation type="vanished">Titoli disponibili</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Cerca</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Pulisci</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation>ID Titolo</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation>Versione</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation>Console:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation>Avvia download</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation>Avvia Script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation>Impostazioni generali</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Opzioni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Lingua</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Tema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Info su NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>Sistema (Default)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Chiaro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Scuro</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Archivio installabile (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Nome del file</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Mantieni contenuti criptati</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Crea contenuto decriptato (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Usa file locali, se esistenti</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation>Usa il NUS di Wii U (più veloce, riguarda solo Wii/vWii)</translation>
|
||||
<translation type="vanished">Usa il NUS di Wii U (più veloce, riguarda solo Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>Impostazioni titoli vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Cripta titolo usando la Chiave Comune Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Impostazioni app</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Controlla aggiornamenti all'avvio</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Usa una cartella di download personalizzata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Seleziona...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Aiuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Info su Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>Cartella output</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
@ -113,7 +283,7 @@ li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
@ -135,122 +305,296 @@ p, li { white-space: pre-wrap; }
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Sviluppato da NinjaCheetah
|
||||
Funzionante con libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Scegli un tittolo dalla lista a sinistra o inserisci un ID Titolo per iniziare.
|
||||
|
||||
I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e possono essere decriptati/scaricati come WAD o TAD. I titoli con una X non hanno un ticket e solo il contenuto criptato può essere salvato.
|
||||
|
||||
I titoli verranno scaricati nella cartella "NUSGet Downloads" all'interno della cartella Download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>Scegli un titolo dalla lista a sinistra o inserisci un ID Titolo per iniziare.
|
||||
|
||||
I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e possono essere decriptati e/o convertiti in WAD o TAD. I titoli con una X non hanno un ticket e solo il contenuto criptato può essere salvato.
|
||||
|
||||
Per impostazione predefinita, i titoli verranno scaricati nella cartella "NUSGet Downloads" all'interno della cartella Download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Usa il NUS di Wii U (più veloce, influisce solo su Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>È disponibile una nuova versione di NUSGet!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation>Nessun output selezionato</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>Non hai selezionato alcun formato in cui esportare i dati!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation>Per favore scegli almeno un opzione per come vorresti che fosse salvato il download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Cartella di download non valida</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>La cartella di download specificata non esiste!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Assicurati che la cartella di download specificata esista e che tu abbia i permessi per accedervi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>ID Titolo invalido</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation>L' ID Titolo che hai inserito non è in un formato valido!</translation>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>L'ID Titolo che hai inserito non è in un formato valido!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Gli ID Titolo sono un codice di 16 caratteri tra numeri e lettere. Per favore inserisci in ID Titolo formattato correttamente, o scegline uno dal menù a sinistra.</translation>
|
||||
<translation>Gli ID del titolo devono essere costituiti da stringhe di 16 cifre di numeri e lettere. Inserire un ID titolo formattato correttamente o selezionarne uno dal menu a sinistra.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Non è stato trovato alcun titolo con l'ID Titolo o la versione forniti!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>La decriptazione dei contenuti non è riuscita! Non è stato possibile creare i contenuti decriptati.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Nessun ticket disponibile per il titolo richiesto!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>Si è verificato un errore sconosciuto!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Si sono verificati alcuni problemi durante l'esecuzione dello script di download.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>Si è verificato un errore durante l'analisi del file script!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>Si è verificato un errore durante l'analisi degli ID Titolo!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Riavvio necessario</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet ha bisogno di essere riavviato per poter cambiare la lingua.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet ha bisogno di essere riavviato per poter cambiare il tema.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">L' ID Titolo che hai inserito non è in un formato valido!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>ID Titolo/Versione non trovata</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation>Non è stato trovato nessun titolo con l' ID Titolo o versione data!</translation>
|
||||
<translation type="vanished">Non è stato trovato nessun titolo con l' ID Titolo o versione data!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Assicurati di aver inserito un' ID Titolo valido, o scegline uno dal database, e che la versione richiesta esista per il titolo che vuoi scaricare.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Decriptazione contenuti fallita</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation>La decriptazione dei contenuti non è andata a buon fine! I contenuti decriptadi non sono stati creati.</translation>
|
||||
<translation type="vanished">La decriptazione dei contenuti non è andata a buon fine! I contenuti decriptadi non sono stati creati.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>Il tuo TMD o Ticket potrebbe essere danneggiato, o potrebbe non corrispondere col contenuto da decriptare. Se hai selezionato "Usa file locali, se esistenti", prova a disabilitare quell'opzione prima di riprovare a scaricare per aggiustare potenziali errori coi dati locali.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Ticket non disponibile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation>Nessun ticket disponibile per il titolo richiesto!</translation>
|
||||
<translation type="vanished">Nessun ticket disponibile per il titolo richiesto!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>Non è stato possibile scaricare un ticket per il titolo richiesto, ma hai selezionato "Crea archivio installabile" o "Crea contenuto decriptato". Queste opzioni non sono disponibili per i titoli senza un ticket. Sono stati salvati solo i contenuti criptati.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Errore sconosciuto</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation>Errore sconosciuto!</translation>
|
||||
<translation type="vanished">Errore sconosciuto!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Per favore riprova. Se il problema persiste, apri un issue su GitHub specificando in modo dettagliato cosa volevi fare quando è comparso questo errore.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation>Apri script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation>Scrpit NUS (*.nus *.txt)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Errore script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation>Impossibile aprire lo script.</translation>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">Ci sono stati degli errori con lo script di download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Guarda i log per più dettagli sull'errore.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>I seguenti titoli non sono stati scaricati a causa di un errore. Controlla che l'ID Titolo e la versione nello script siano validi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Hai abilitato "Crea contenuto decriptato" o "Archivio installabile", ma i seguenti titoli nello script non hanno ticket disponibili. Se abilitati, i contenuti criptati sono stati comunque scaricati.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Download script fallito</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Apri script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>Scrpit NUS (*.nus *.txt)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">Ci sono stati degli errori con lo script di download!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>Errore riscontrato alla riga {lineno}, colonna {colno}. Controlla nuovamente lo script e riprova.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">Ci sono stati degli errori con GLI id tITOLO!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Il titolo all'indice {index} non ha un ID Titolo!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Apri cartella</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>La cartella di download specificata non esiste!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Assicurati che la cartella di download che desideri utilizzare esista e che tu abbia i permessi per accedervi.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="vanished">Apri script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="vanished">Scrpit NUS (*.nus *.txt)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Script Failure</source>
|
||||
<translation type="vanished">Errore script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="vanished">Impossibile aprire lo script.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
@ -261,7 +605,7 @@ Select a title from the list on the left, or enter a Title ID to begin.
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation>NUSGet v{nusget_version}
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Sviluppato da NinjaCheetah
|
||||
Funzionante con libWiiPy {libwiipy_version}
|
||||
|
||||
@ -272,40 +616,41 @@ I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e poss
|
||||
I titoli verranno scaricati nella cartella "NUSGet" all'interno della cartella Download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation>Applica patch agli IOS (Solo per le WAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation>Aggiornamento di NUSGet disponibile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation>Una nuova versione di NUSGet è disponibile!</translation>
|
||||
<translation type="vanished">Una nuova versione di NUSGet è disponibile!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation>Impossibile trovare eventuali aggiornamenti.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation>Una nuova versione di NUSGet è disponibile!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation>Stai utilizzando l'ultima versione di NUSGet.</translation>
|
||||
<translation>
|
||||
|
||||
Stai utilizzando l'ultima versione di NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
658
resources/translations/nusget_ko.ts
Normal file
@ -0,0 +1,658 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ko_KR">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>NUSGet 정보</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>버전 {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version} 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & 기여자</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>GitHub에서 프로젝트 보기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>번역</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>프랑스어 (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>독일어 (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>이탈리아어 (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>한국어: <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>노르웨이어 (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>루마니아어 (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>스페인어 (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
|
||||
<source>MainWindow</source>
|
||||
<translation>메인 윈도우</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Available Titles</source>
|
||||
<translation type="vanished">사용 가능한 타이틀</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>검색</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>지우기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation>타이틀 ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation>버전</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation>콘솔:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation>다운로드 시작</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation>스크립트 실행</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation>일반 설정</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>옵션</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>언어</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>테마</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>NUSGet 정보</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>시스템 (기본)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>밝음</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>어두움</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>설치 가능한 아카이브 (WAD/TAD) 팩</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>파일 이름</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>암호화된 내용 보관</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>복호화된 콘텐츠 (*.app) 생성</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>로컬 파일이 있으면 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="vanished">Wii U NUS 사용(더 빠르고 Wii/vWii에만 효과 있음)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWii 타이틀 설정</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Wii 공통 키를 사용하여 타이틀을 다시 암호화</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>앱 설정</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>시작 시 업데이트 확인</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>커스텀 다운로드 디렉터리 사용</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>선택...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>도움말</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>About</source>
|
||||
<translation type="vanished">정보</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Qt 정보</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>출력 경로</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
</style></head><body style=" font-family:'Sans Serif'; font-size:9pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
개발자 : NinjaCheetah
|
||||
libWiiPy {libwiipy_version}에서 제공
|
||||
DSi 지원 : libTWLPy {libtwlpy_version}에서 제공
|
||||
|
||||
왼쪽 목록에서 타이틀을 선택하거나 타이틀 ID를 입력하여 시작하세요.
|
||||
|
||||
체크 표시가 있는 타이틀은 무료이며 티켓을 사용할 수 있으며, WAD 또는 TAD에 복호화 및/또는 패킹할 수 있습니다. X가 있는 타이틀은 티켓이 없으며 암호화된 콘텐츠만 저장할 수 있습니다.
|
||||
|
||||
타이틀은 다운로드 폴더 내의 "NUSGet Downloads"이라는 폴더에 다운로드됩니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>왼쪽 목록에서 타이틀을 선택하거나 타이틀 ID를 입력하여 시작하세요.
|
||||
|
||||
체크 표시가 있는 타이틀은 무료이며 티켓을 사용할 수 있습니다. 티켓을 사용하여 복호화하거나 WAD 또는 TAD에 압축할 수 있습니다. X 표시가 있는 타이틀은 티켓이 없으며 암호화된 콘텐츠만 저장할 수 있습니다.
|
||||
|
||||
기본적으로 타이틀은 다운로드 폴더 내의 "NUSBet Downloads" 폴더에 다운로드됩니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Wii U NUS 사용 (더 빠르고 Wii/vWii에만 효과 있음)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>NUSGet의 최신 버전이 출시되었습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation>선택된 출력 없음</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>데이터를 출력할 형식을 선택하지 않았습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation>다운로드를 저장할 방법을 하나 이상 선택하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>잘못된 다운로드 디렉터리</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>지정된 다운로드 디렉터리가 존재하지 않습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>지정된 다운로드 디렉터리가 있는지, 그리고 해당 디렉터리에 접근할 수 있는 권한이 있는지 확인하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>잘못된 제목 ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>입력하신 타이틀 ID의 형식이 올바르지 않습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>제공된 타이틀 ID 또는 버전으로 제목을 찾을 수 없습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>콘텐츠 복호화에 실패했습니다! 복호화된 콘텐츠를 생성할 수 없습니다.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>요청하신 작품에 대한 티켓이 없습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>알 수 없는 오류가 발생했습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>다운로드 스크립트를 실행하는 동안 문제가 발생했습니다.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>스크립트 파일을 구문 분석하는 동안 오류가 발생했습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>타이틀 ID를 구문 분석하는 동안 오류가 발생했습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>재시작 필요</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>선택한 언어를 적용하려면 NUSGet을 다시 시작해야 합니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>선택한 테마를 적용하려면 NUSGet을 다시 시작해야 합니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">입력한 타이틀 ID의 형식이 올바르지 않습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>타이틀 ID는 숫자와 문자로 구성된 16자리 문자열이어야 합니다. 올바르게 포맷된 타이틀 ID를 입력하거나 왼쪽 메뉴에서 하나를 선택하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>타이틀 ID/버전을 찾을 수 없음</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="vanished">제공된 타이틀 ID 또는 버전으로 제목을 찾을 수 없습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>유효한 타이틀 ID를 입력했는지 또는 타이틀 데이터베이스에서 선택했는지, 그리고 다운로드하려는 타이틀에 대해 제공된 버전이 있는지 확인하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>콘텐츠 복호화 실패</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="vanished">콘텐츠 복호화가 성공하지 못했습니다! 복호화된 콘텐츠를 만들 수 없습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>TMD 또는 티켓이 손상되었거나 복호화되는 콘텐츠와 일치하지 않을 수 있습니다. "로컬 파일이 있으면 사용"을 체크한 경우, 로컬 데이터와 관련된 잠재적인 문제를 해결하기 위해 다시 다운로드를 시도하기 전에 해당 옵션을 비활성화해 보세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>사용 가능한 티켓이 아님</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="vanished">요청한 타이틀에 대한 티켓이 없습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>요청한 타이틀에 대한 티켓을 다운로드할 수 없지만 "설치 가능한 아카이브 팩" 또는 "암호 해독된 콘텐츠 생성"을 선택했습니다. 이러한 옵션은 티켓이 없는 타이틀에는 사용할 수 없습니다. 암호화된 콘텐츠만 저장되었습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>알 수 없는 오류</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="vanished">알 수 없는 오류가 발생했습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>다시 시도하세요. 이 문제가 지속되면 GitHub에서 새 이슈를 열어 이 오류가 발생했을 때 무엇을 하려고 했는지 자세히 설명하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>스크립트 문제가 발생함</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">다운로드 스크립트를 실행하는 동안 몇 가지 문제가 발생했습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>발생한 문제에 대한 자세한 내용은 로그를 확인하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>다음 제목은 오류로 인해 다운로드할 수 없습니다. 스크립트에 나열된 타이틀 ID와 버전이 유효한지 확인하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>"암호 해독된 콘텐츠 만들기" 또는 "설치 가능한 아카이브 압축"을 활성화했지만 스크립트의 다음 타이틀에는 사용 가능한 티켓이 없습니다. 활성화된 경우 암호화된 콘텐츠가 여전히 다운로드되었습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>스크립트 다운로드 실패함</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>NUS 스크립트 열기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>NUS 스크립트 (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">스크립트 파일을 구문 분석하는 동안 오류가 발생했습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>{lineno} 줄, {colno} 열에서 오류가 발생했습니다. 스크립트를 다시 확인하고 다시 시도하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">타이틀 ID를 구문 분석하는 동안 오류가 발생했습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>{index} 인덱스의 타이틀에 타이틀 ID가 없습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>디렉터리 열기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>지정된 다운로드 디렉터리가 존재하지 않습니다!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>사용하려는 다운로드 디렉터리가 있는지, 그리고 해당 디렉터리에 접근할 수 있는 권한이 있는지 확인하세요.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="vanished">NUS 스크립트 열기</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="vanished">NUS 스크립트 (*.nus *.txt)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Script Failure</source>
|
||||
<translation type="vanished">스크립트 실패</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="vanished">스크립트를 열 수 없습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
개발자 : NinjaCheetah
|
||||
libWiiPy {libwiipy_version}에서 제공
|
||||
DSi 지원 : libTWLPy {libtwlpy_version}에서 제공
|
||||
|
||||
왼쪽 목록에서 타이틀을 선택하거나 타이틀 ID를 입력하여 시작하세요.
|
||||
|
||||
체크 표시가 있는 타이틀은 무료이며 티켓을 사용할 수 있으며, WAD 또는 TAD에 복호화 및/또는 패킹할 수 있습니다. X가 있는 타이틀은 티켓이 없으며 암호화된 콘텐츠만 저장할 수 있습니다.
|
||||
|
||||
타이틀은 다운로드 폴더 내의 "NUSBet"이라는 폴더에 다운로드됩니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation>IOS에 패치 적용 (WAD에만 적용)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation>NUSGet 업데이트 가능</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="vanished">NUSBet의 새로운 버전이 나왔습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation>
|
||||
|
||||
업데이트를 확인할 수 없습니다.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation>
|
||||
|
||||
NUSBet의 새로운 버전이 나왔습니다!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation>
|
||||
|
||||
NUSGet의 최신 릴리스를 실행하고 있습니다.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
@ -1,6 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="nb_NO">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Om NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Versjon {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Bruker libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & Contributors</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Se Prosjektet på GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Oversettelser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Fransk (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Tysk (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italiensk (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Koreansk (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norsk (Bokmål): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Rumensk (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Spansk (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
@ -9,102 +82,200 @@
|
||||
<translation>MainWindow</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation>Tilgjengelige Titler</translation>
|
||||
<translation type="vanished">Tilgjengelige Titler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Søk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Klar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation>Tittel ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation>Versjon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation>Konsoll:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation>Start Nedlasting</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Kjøre Skript</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation>Generelle Instillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Instillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Språk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Tema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Om NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>System (Standard)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Lys</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Mørk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Pakke installerbart arkiv (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Filnavn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Oppbevar kryptert innhold</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Opprette dekryptert innold (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Bruk lokale filer, hvis de finnes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
<translation type="vanished">Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWii Tittelinstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Krypter tittelen på nytt ved hjelp av Wii Common Key</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Appinstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Sjekk for oppdateringer ved oppstart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Bruke en egendefinert nedlastingsmappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Velg...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Hjelp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Om Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translatorcomment>Utgangsbane</translatorcomment>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
@ -113,7 +284,14 @@ li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
@ -128,7 +306,6 @@ p, li { white-space: pre-wrap; }
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
@ -139,7 +316,7 @@ Select a title from the list on the left, or enter a Title ID to begin.
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation>NUSGet v{nusget_version}
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Utviklet av NinjaCheetah
|
||||
Drevet av libWiiPy {libwiipy_version}
|
||||
DSi støtte levert av libTWLPy {libtwlpy_version}
|
||||
@ -151,155 +328,319 @@ Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypte
|
||||
Titler er lastes ned til en mappe med navnet "NUSGet" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Utviklet av NinjaCheetah
|
||||
Drevet av libWiiPy {libwiipy_version}
|
||||
DSi støtte levert av libTWLPy {libtwlpy_version}
|
||||
|
||||
Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
|
||||
|
||||
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
|
||||
|
||||
Titler er lastes ned til en mappe med navnet "NUSGet Downloads" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>Det finnes en nyere versjon av NUSGet tilgjengelig!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ingen Utgang Valgt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Du ikke har valgt noe format å lagre dataene i!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Velg minst ett valg for hvordan du vil at nedlastingen skal lagres.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Ugyldig Nedlastingsmappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>Den angitte nedlastingsmappen finnes ikke!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å få tilgang til den.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>Ugyldig Tittel ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation>Tittel IDen du har angitt er ikke i et gyldig format!</translation>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>Tittel IDen du har angitt er ikke i et gyldig format!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Ingen billett er tilgjengelig for den forespurte tittelen!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>En ukjent feil har oppstått!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Noen feil oppstod under kjøring av nedlastingsskriptet.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>Det oppstod en feil under parsing av skriptfilen!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>Det oppstod en feil under parsing av Tittel IDer!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Omstart Nødvendig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet må startes på nytt for at det valgte språket skal tre i kraft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet må startes på nytt for at det valgte temaet skal tre i kraft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">Tittel IDen du har angitt er ikke i et gyldig format!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Tittel IDer må være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>Tittel ID/Versjon Ikke Funnet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
|
||||
<translation type="vanished">Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Vennligst kontroller at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
|
||||
<translation>Sjekk at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Dekryptering av Innhold Mislyktes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
|
||||
<translation type="vanished">Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>TMDen eller Billetten kan være skadet, eller det kan hende at de ikke samsvarer med innholdet some dekrypteres. Hvis du har krysset av for "Bruk lokale filer, hvis de finnes", kan du prøve å deaktivere dette alternativet før du prøver nedlastingen på nytt for å løse eventuelle problemer med lokale data.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Billett Ikke Tilgjengelig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
|
||||
<translation type="vanished">Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>En billett kunne ikke lastes ned for den forespurte tittelen, men du har valgt "Pakk installerbart arkiv" eller "Opprett dekryptert innhold". Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Ukjent Feil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation>En ukjent feil har oppstått!</translation>
|
||||
<translation type="vanished">En ukjent feil har oppstått!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Vennligst prøv igjen. Hvis dette problemet vedvarer, åpne et nytt issue på GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
|
||||
<translation>Prøv igjen. Hvis dette problemet vedvarer, åpne et nytt issue på GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Skriptfeil Oppstod</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Følgende titler kunne ikke lastes ned på grunn av en feil. Sjekk at Tittel IDen og versjon som er oppført i skriptet er gyldige.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Du aktiverte "Opprett dekryptert innhold" eller "Pakk installerbart archive", men følgende titler i skriptet har ikke tilgjengelige billetter. Hvis aktivert, ble kryptert innhold fortsatt lastet ned.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Skriptnedlasting Mislyktes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Åpne NUS Skript</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>NUS Skript (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">Det oppstod en feil under parsing av skriptfilen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">Det oppstod en feil under parsing av Tittel IDer!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Tittelen ved indeks {index} har ikke en Tittel ID!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Åpen Mappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>Den angitte nedlastingsmappen finnes ikke!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å få tilgang til den.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Påfør patcher på IOS (gjelder kun WADer)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
|
||||
|
||||
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
|
||||
|
||||
Som standard, lastes titler ned til en mappe med navnet "NUSGet Downloads" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>NUSGet Oppdatering Tilgjengelig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="vanished">Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Kunne ikke sjekke for oppdateringer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Du kjører den nyeste versjonen av NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -1,6 +1,79 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="nb_NO">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Om NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Versjon {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Bruker libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & Contributors</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Se Prosjektet på GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Oversettelser</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Fransk (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Tysk (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italiensk (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Koreansk (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norsk (Bokmål): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Rumensk (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Spansk (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
@ -9,102 +82,200 @@
|
||||
<translation>MainWindow</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation>Tilgjengelige Titler</translation>
|
||||
<translation type="vanished">Tilgjengelige Titler</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Søk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Klar</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation>Tittel ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation>Versjon</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation>Konsoll:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation>Start Nedlasting</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Kjøre Skript</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation>Generelle Instillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Instillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Språk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Tema</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Om NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>System (Standard)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Lys</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Mørk</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Pakke installerbart arkiv (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Filnavn</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Oppbevar kryptert innhold</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Opprette dekryptert innold (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Bruk lokale filer, hvis de finnes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
<translation type="vanished">Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWii Tittelinstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Krypter tittelen på nytt ved hjelp av Wii Common Key</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Appinstillinger</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Sjekk for oppdateringer ved oppstart</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Bruke en egendefinert nedlastingsmappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Velg...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Hjelp</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Om Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translatorcomment>Utgangsbane</translatorcomment>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
@ -113,7 +284,14 @@ li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="vanished"><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
@ -128,7 +306,6 @@ p, li { white-space: pre-wrap; }
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;"><br /></p></body></html></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
@ -139,7 +316,7 @@ Select a title from the list on the left, or enter a Title ID to begin.
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation>NUSGet v{nusget_version}
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Utviklet av NinjaCheetah
|
||||
Drevet av libWiiPy {libwiipy_version}
|
||||
DSi støtte levert av libTWLPy {libtwlpy_version}
|
||||
@ -151,155 +328,319 @@ Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypte
|
||||
Titler er lastes ned til en mappe med navnet "NUSGet" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Utviklet av NinjaCheetah
|
||||
Drevet av libWiiPy {libwiipy_version}
|
||||
DSi støtte levert av libTWLPy {libtwlpy_version}
|
||||
|
||||
Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
|
||||
|
||||
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
|
||||
|
||||
Titler er lastes ned til en mappe med navnet "NUSGet Downloads" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>Det finnes en nyere versjon av NUSGet tilgjengelig!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Ingen Utgang Valgt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Du ikke har valgt noe format å lagre dataene i!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Velg minst ett valg for hvordan du vil at nedlastingen skal lagres.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Ugyldig Nedlastingsmappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>Den angitte nedlastingsmappen finnes ikke!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å få tilgang til den.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>Ugyldig Tittel ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation>Tittel IDen du har angitt er ikke i et gyldig format!</translation>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b>Tittel IDen du har angitt er ikke i et gyldig format!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Ingen billett er tilgjengelig for den forespurte tittelen!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>En ukjent feil har oppstått!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Noen feil oppstod under kjøring av nedlastingsskriptet.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>Det oppstod en feil under parsing av skriptfilen!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>Det oppstod en feil under parsing av Tittel IDer!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Omstart Nødvendig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet må startes på nytt for at det valgte språket skal tre i kraft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet må startes på nytt for at det valgte temaet skal tre i kraft.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">Tittel IDen du har angitt er ikke i et gyldig format!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Tittel IDer må være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>Tittel ID/Versjon Ikke Funnet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
|
||||
<translation type="vanished">Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Vennligst kontroller at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
|
||||
<translation>Sjekk at du har oppgitt en gyldig Tittel ID, eller valgt en fra titteldatabasen, og at den angitte versjonen finnes for tittelen du forsøker å laste ned.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Dekryptering av Innhold Mislyktes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
|
||||
<translation type="vanished">Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>TMDen eller Billetten kan være skadet, eller det kan hende at de ikke samsvarer med innholdet some dekrypteres. Hvis du har krysset av for "Bruk lokale filer, hvis de finnes", kan du prøve å deaktivere dette alternativet før du prøver nedlastingen på nytt for å løse eventuelle problemer med lokale data.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Billett Ikke Tilgjengelig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
|
||||
<translation type="vanished">Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>En billett kunne ikke lastes ned for den forespurte tittelen, men du har valgt "Pakk installerbart arkiv" eller "Opprett dekryptert innhold". Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Ukjent Feil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation>En ukjent feil har oppstått!</translation>
|
||||
<translation type="vanished">En ukjent feil har oppstått!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Vennligst prøv igjen. Hvis dette problemet vedvarer, åpne et nytt issue på GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
|
||||
<translation>Prøv igjen. Hvis dette problemet vedvarer, åpne et nytt issue på GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Skriptfeil Oppstod</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Følgende titler kunne ikke lastes ned på grunn av en feil. Sjekk at Tittel IDen og versjon som er oppført i skriptet er gyldige.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Du aktiverte "Opprett dekryptert innhold" eller "Pakk installerbart archive", men følgende titler i skriptet har ikke tilgjengelige billetter. Hvis aktivert, ble kryptert innhold fortsatt lastet ned.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Skriptnedlasting Mislyktes</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Åpne NUS Skript</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>NUS Skript (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">Det oppstod en feil under parsing av skriptfilen!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">Det oppstod en feil under parsing av Tittel IDer!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Tittelen ved indeks {index} har ikke en Tittel ID!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Åpen Mappe</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>Den angitte nedlastingsmappen finnes ikke!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Kontroller at den angitte nedlastingsmappen finnes, og at du har tillatelse fil å få tilgang til den.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Påfør patcher på IOS (gjelder kun WADer)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>Velg en tittel fra listen til venstre, eller skriv inn en Tittel ID for å begynne.
|
||||
|
||||
Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypteres og/eller pakkes inn i en WAD eller TAD. Titler med en X ikke har en billett, og bare det krypterte innholdet kan lagres.
|
||||
|
||||
Som standard, lastes titler ned til en mappe med navnet "NUSGet Downloads" i nedlastingsmappen din.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>NUSGet Oppdatering Tilgjengelig</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation type="vanished">Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Kunne ikke sjekke for oppdateringer.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>
|
||||
|
||||
Du kjører den nyeste versjonen av NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -1,10 +1,82 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!DOCTYPE TS>
|
||||
<TS version="2.1" language="ro_RO">
|
||||
<context>
|
||||
<name>AboutNUSGet</name>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="16"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Despre NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="33"/>
|
||||
<source>NUSGet</source>
|
||||
<translation>NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="38"/>
|
||||
<source>Version {nusget_version}</source>
|
||||
<translation>Versiunea {nusget_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="44"/>
|
||||
<source>Using libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</source>
|
||||
<translation>Folosește libWiiPy {libwiipy_version} & libTWLPy {libtwlpy_version}</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="49"/>
|
||||
<source>© 2024-2025 NinjaCheetah & Contributors</source>
|
||||
<translation>© 2024-2025 NinjaCheetah & Contributors</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="65"/>
|
||||
<source>View Project on GitHub</source>
|
||||
<translation>Vedeți proiectul pe GitHub</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="81"/>
|
||||
<source>Translations</source>
|
||||
<translation>Traduceri</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="89"/>
|
||||
<source>French (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></source>
|
||||
<translation>Franceză (Français): <a href=https://github.com/rougets style='color: #4a86e8; text-decoration: none;'><b>rougets</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="91"/>
|
||||
<source>German (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></source>
|
||||
<translation>Germană (Deutsch): <a href=https://github.com/yeah-its-gloria style='color: #4a86e8; text-decoration: none;'><b>yeah-its-gloria</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="93"/>
|
||||
<source>Italian (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></source>
|
||||
<translation>Italiană (Italiano): <a href=https://github.com/LNLenost style='color: #4a86e8; text-decoration: none;'><b>LNLenost</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="95"/>
|
||||
<source>Korean (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></source>
|
||||
<translation>Coreană (한국어): <a href=https://github.com/DDinghoya style='color: #4a86e8; text-decoration: none;'><b>DDinghoya</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="97"/>
|
||||
<source>Norwegian (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></source>
|
||||
<translation>Norvegiană (Norsk): <a href=https://github.com/rolfiee style='color: #4a86e8; text-decoration: none;'><b>rolfiee</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="99"/>
|
||||
<source>Romanian (Română): <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></source>
|
||||
<translation>Română: <a href=https://github.com/NotImplementedLife style='color: #4a86e8; text-decoration: none;'><b>NotImplementedLife</b></a></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/py/ui_AboutDialog.py" line="101"/>
|
||||
<source>Spanish (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></source>
|
||||
<translation>Spaniolă (Español): <a href=https://github.com/DarkMatterCore style='color: #4a86e8; text-decoration: none;'><b>DarkMatterCore</b></a></translation>
|
||||
</message>
|
||||
</context>
|
||||
<context>
|
||||
<name>MainWindow</name>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="85"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
@ -15,7 +87,7 @@ Select a title from the list on the left, or enter a Title ID to begin.
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet" inside your downloads folder.</source>
|
||||
<translation type="unfinished">NUSGet v{nusget_version}
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Dezvoltat de NinjaCheetah
|
||||
Operat de libWiiPy {libwiipy_version}
|
||||
Suport pentru DSi oferit de libTWLPy {libtwlpy_version}
|
||||
@ -27,267 +99,522 @@ Titlurile marcate cu bifă sunt gratuite și au un tichet disponibil și pot fi
|
||||
Titlurile vor fi descărcate într-un folder numit „NUSGet” în fișierul dvs. de download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="184"/>
|
||||
<source>NUSGet v{nusget_version}
|
||||
Developed by NinjaCheetah
|
||||
Powered by libWiiPy {libwiipy_version}
|
||||
DSi support provided by libTWLPy {libtwlpy_version}
|
||||
|
||||
Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
Titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation type="vanished">NUSGet v{nusget_version}
|
||||
Dezvoltat de NinjaCheetah
|
||||
Operat de libWiiPy {libwiipy_version}
|
||||
Suport pentru DSi oferit de libTWLPy {libtwlpy_version}
|
||||
|
||||
Selectează un titlu din lista din stânga, sau introdu un Title ID pentru a începe.
|
||||
|
||||
Titlurile marcate cu bifă sunt gratuite și au un tichet disponibil și pot fi decriptate și/sau incluse într-un WAD sau TAD. Titlurile cu un X nu au tichet, și pot fi salvate doar în formă encriptată.
|
||||
|
||||
Titlurile vor fi descărcate într-un folder numit „NUSGet Downloads” în fișierul dvs. de download.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="305"/>
|
||||
<source>NUSGet Update Available</source>
|
||||
<translation type="unfinished">Actualizare NUSGet disponibilă</translation>
|
||||
<translation>Actualizare NUSGet disponibilă</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="185"/>
|
||||
<source>There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished">O nouă versiune NUSGet este disponibilă!</translation>
|
||||
<translation type="vanished">O nouă versiune NUSGet este disponibilă!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="264"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation type="unfinished">Nu s-a selectat un output.</translation>
|
||||
<location filename="../../NUSGet.py" line="119"/>
|
||||
<source>Select a title from the list on the left, or enter a Title ID to begin.
|
||||
|
||||
Titles marked with a checkmark are free and have a ticket available, and can be decrypted and/or packed into a WAD or TAD. Titles with an X do not have a ticket, and only their encrypted contents can be saved.
|
||||
|
||||
By default, titles will be downloaded to a folder named "NUSGet Downloads" inside your downloads folder.</source>
|
||||
<translation>Selectați un titlu din lista din stânga, sau introduceți un Title ID pentru a începe.
|
||||
|
||||
Titlurile marcate cu bifă sunt libere și au un tichet valabil, ele pot fi decriptate și/sau împachetate într-un WAD sau TAD. Titlurile cu X nu au tichet, și doar conținutul lor criptat poate fi salvat.
|
||||
|
||||
Implicit, titlurile vor fi descărcate într-un folder numit „NUSGet Downloads” în folderul dvs. de descărcări.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="265"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation type="unfinished">Nu ați selectat niciun format de ieșire.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="267"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation type="unfinished">Vă rugăm să selectați cel puțin o opțiune pentru modul în care doriți să salvați datele descărcate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="298"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation type="unfinished">Title ID invalid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="299"/>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="unfinished">Title ID pe care l-ați introdus este invalid!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="301"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation type="unfinished">Title ID-urile trebuie să conțină exact 16 cifre și/sau litere. Vă rugăm introduceți un Title ID corect, sau selectați unul din meniul din stânga.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="303"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation type="unfinished">Title ID/Versiunea nu a fost găsită</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="304"/>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="unfinished">Niciun titlu care să corespundă cu Title ID sau cu versiunea introdusă nu a fost găsit!</translation>
|
||||
<location filename="../../NUSGet.py" line="224"/>
|
||||
<source>Use the Wii U NUS (faster, only affects Wii/vWii)</source>
|
||||
<translation>Folosiți Wii U NUS (mai rapid, afectează doar Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="306"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation type="unfinished">Vă rugăm să vă asigurați că ați introdus un Title ID valid sau selectat din baza de date cu titluri, și că versiunea introdusă există pentru titlul pe care încercați să îl descărcați.</translation>
|
||||
<source><b>There's a newer version of NUSGet available!</b></source>
|
||||
<translation><b>O nouă versiune de NUSGet este valabilă!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="308"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation type="unfinished">Decriptarea conținutului a eșuat.</translation>
|
||||
<location filename="../../NUSGet.py" line="407"/>
|
||||
<source>No Output Selected</source>
|
||||
<translation>Nu s-a selectat un output</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="309"/>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="unfinished">Decriptarea conținutului nu a reușit. Nu s-a putut crea conținutul decriptat.</translation>
|
||||
<location filename="../../NUSGet.py" line="408"/>
|
||||
<source>You have not selected any format to output the data in!</source>
|
||||
<translation>Nu ați selectat niciun format de ieșire!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="312"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation type="unfinished">TMD-ul sau Ticket-ul dvs. sunt corupte, sau nu corespund cu conținutul de decriptat. Dacă ați bifat „Folosiți fișiere locale, dacă există”, încercați să debifați această opțiune înainte de a descărca din nou pentru a rezolva potențiale probleme cu datele existente local.</translation>
|
||||
<location filename="../../NUSGet.py" line="410"/>
|
||||
<source>Please select at least one option for how you would like the download to be saved.</source>
|
||||
<translation>Vă rugăm să selectați cel puțin o opțiune pentru modul în care doriți să salvați datele descărcate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="315"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation type="unfinished">Ticket-ul nu este valabil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="316"/>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="unfinished">Niciun Ticket nu este valabil pentru titlul dorit.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="319"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation type="unfinished">Nu se poate descărca un tichet pentru titlul cerut, dar ați selectat „Împachetați arhiva instalabilă” sau „Creați conținut decriptat”. Aceste opțiuni nu sunt valabile pentru titluri fărătichet. Doar conținuturile criptate au fost salvate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="321"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation type="unfinished">Eroare necunoscută</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="322"/>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="unfinished">S-a produs o eroare necunoscută!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="324"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation type="unfinished">Vă rugăm încercați din nou. Dacă problema persistă, vă rugăm să deschideți un issue pe GitHub în care să explicați ce ați încercat să faceți atunci când această eroare a apărut.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="unfinished">Deschideți script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="364"/>
|
||||
<source>NUS Scripts (*.nus *.txt)</source>
|
||||
<translation type="unfinished"></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<location filename="../../NUSGet.py" line="386"/>
|
||||
<location filename="../../NUSGet.py" line="389"/>
|
||||
<location filename="../../NUSGet.py" line="397"/>
|
||||
<location filename="../../NUSGet.py" line="415"/>
|
||||
<location filename="../../NUSGet.py" line="422"/>
|
||||
<source>Script Failure</source>
|
||||
<translation type="unfinished">Eșuare Script</translation>
|
||||
<location filename="../../NUSGet.py" line="628"/>
|
||||
<source>Invalid Download Directory</source>
|
||||
<translation>Director de descărcare invalid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="423"/>
|
||||
<source>The specified download directory does not exist!</source>
|
||||
<translation>Directorul de descărcare specificat nu există!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="426"/>
|
||||
<source>Please make sure the specified download directory exists, and that you have permission to access it.</source>
|
||||
<translation>Vă rugăm să vă asigurați că directorul de descărcare specificat există, și că aveți permisiuni pentru a-l accesa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="456"/>
|
||||
<source>Invalid Title ID</source>
|
||||
<translation>Title ID invalid</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="457"/>
|
||||
<source><b>The Title ID you have entered is not in a valid format!</b></source>
|
||||
<translation><b> Title ID pe care l-ați introdus nu este într-un format valid!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="462"/>
|
||||
<source><b>No title with the provided Title ID or version could be found!</b></source>
|
||||
<translation><b>Nu s-a găsit niciun titlu cu Title ID sau versiunea introdusă!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="467"/>
|
||||
<source><b>Content decryption was not successful! Decrypted contents could not be created.</b></source>
|
||||
<translation><b>Decriptarea conținutului a eșuat! Nu s-a putut crea conținutul decriptat.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="474"/>
|
||||
<source><b>No Ticket is Available for the Requested Title!</b></source>
|
||||
<translation><b>Nu există tichet valabil pentru titlul cerut!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="480"/>
|
||||
<source><b>An Unknown Error has Occurred!</b></source>
|
||||
<translation><b>S-a produs o eroare necunoscută!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="502"/>
|
||||
<source><b>Some issues occurred while running the download script.</b></source>
|
||||
<translation><b>Au apărut câteva probleme la rularea scriptului de descărcare.</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="552"/>
|
||||
<source><b>An error occurred while parsing the script file!</b></source>
|
||||
<translation><b>A apărut o eroare la procesarea fișierului script!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="563"/>
|
||||
<source><b>An error occurred while parsing Title IDs!</b></source>
|
||||
<translation><b>A apărut o eroare la procesarea Title ID-urilor!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="661"/>
|
||||
<location filename="../../NUSGet.py" line="671"/>
|
||||
<source>Restart Required</source>
|
||||
<translation>Repornire necesară</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="662"/>
|
||||
<source>NUSGet must be restarted for the selected language to take effect.</source>
|
||||
<translation>NUSGet trebuie repornit pentru ca noua limbă să aibă efect.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="672"/>
|
||||
<source>NUSGet must be restarted for the selected theme to take effect.</source>
|
||||
<translation>NUSGet trebuie repornit pentru ca noua temă să aibă efect.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>The Title ID you have entered is not in a valid format!</source>
|
||||
<translation type="vanished">Title ID pe care l-ați introdus este invalid!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="459"/>
|
||||
<source>Title IDs must be 16 digit strings of numbers and letters. Please enter a correctly formatted Title ID, or select one from the menu on the left.</source>
|
||||
<translation>Title ID-urile trebuie să conțină exact 16 cifre și/sau litere. Vă rugăm introduceți un Title ID corect, sau selectați unul din meniul din stânga.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="461"/>
|
||||
<source>Title ID/Version Not Found</source>
|
||||
<translation>Title ID/Versiunea nu a fost găsită</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No title with the provided Title ID or version could be found!</source>
|
||||
<translation type="vanished">Niciun titlu care să corespundă cu Title ID-ul sau cu versiunea introdusă nu a fost găsit!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="464"/>
|
||||
<source>Please make sure that you have entered a valid Title ID, or selected one from the title database, and that the provided version exists for the title you are attempting to download.</source>
|
||||
<translation>Vă rugăm să vă asigurați că ați introdus un Title ID valid sau ați selectat unul din baza de date cu titluri, și că versiunea introdusă există pentru titlul pe care încercați să îl descărcați.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="466"/>
|
||||
<source>Content Decryption Failed</source>
|
||||
<translation>Decriptarea conținutului a eșuat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
|
||||
<translation type="vanished">Decriptarea conținutului nu a reușit. Nu s-a putut crea conținutul decriptat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="470"/>
|
||||
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked "Use local files, if they exist", try disabling that option before trying the download again to fix potential issues with local data.</source>
|
||||
<translation>TMD-ul sau Ticket-ul dvs. sunt corupte, sau nu corespund cu conținutul de decriptat. Dacă ați bifat „Folosiți fișiere locale, dacă există”, încercați să debifați această opțiune înainte de a descărca din nou pentru a rezolva potențiale probleme cu datele existente local.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="473"/>
|
||||
<source>Ticket Not Available</source>
|
||||
<translation>Ticket-ul nu este valabil</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>No Ticket is Available for the Requested Title!</source>
|
||||
<translation type="vanished">Niciun Ticket nu este valabil pentru titlul dorit!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="477"/>
|
||||
<source>A ticket could not be downloaded for the requested title, but you have selected "Pack installable archive" or "Create decrypted contents". These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
|
||||
<translation>Nu se poate descărca un tichet pentru titlul cerut, dar ați selectat „Împachetați arhiva instalabilă” sau „Creați conținut decriptat”. Aceste opțiuni nu sunt valabile pentru titluri fărătichet. Doar conținuturile criptate au fost salvate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="479"/>
|
||||
<source>Unknown Error</source>
|
||||
<translation>Eroare necunoscută</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An Unknown Error has Occurred!</source>
|
||||
<translation type="vanished">S-a produs o eroare necunoscută!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="482"/>
|
||||
<source>Please try again. If this issue persists, please open a new issue on GitHub detailing what you were trying to do when this error occurred.</source>
|
||||
<translation>Vă rugăm încercați din nou. Dacă problema persistă, vă rugăm să deschideți un issue pe GitHub în care să explicați ce ați încercat să faceți atunci când această eroare a apărut.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="501"/>
|
||||
<source>Script Issues Occurred</source>
|
||||
<translation>Au apărut probleme cu scriptul</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Some issues occurred while running the download script.</source>
|
||||
<translation type="vanished">Au apărut câteva probleme la rularea scriptului descărcat.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="504"/>
|
||||
<source>Check the log for more details about what issues were encountered.</source>
|
||||
<translation>Verificați logurile pentru mai multe detalii despre problemele întâmpinate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="511"/>
|
||||
<source>The following titles could not be downloaded due to an error. Please ensure that the Title ID and version listed in the script are valid.</source>
|
||||
<translation>Următoarele titluri nu au putut fi descărcate din cauza unei erori. Vă rugăm să vă asigurați că Title ID și versiunea listate în script sunt valide.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="521"/>
|
||||
<source>You enabled "Create decrypted contents" or "Pack installable archive", but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
|
||||
<translation>Ați activat „Creare conținut decriptat” sau „Împachetați arhiva instalabilă”, dar următoarele titluri în script nu au tichete valabile.În acest caz, conținuturile encriptate au fost oricum descărcate.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="540"/>
|
||||
<source>Script Download Failed</source>
|
||||
<translation>Descărcarea scriptului a eșuat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="541"/>
|
||||
<source>Open NUS Script</source>
|
||||
<translation>Deschideți script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="542"/>
|
||||
<source>NUS Scripts (*.nus *.json)</source>
|
||||
<translation>Scripturi NUS (*.nus *.json)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing the script file!</source>
|
||||
<translation type="vanished">A apărut o eroare la parssarea acestui fișier script!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="554"/>
|
||||
<source>Error encountered at line {lineno}, column {colno}. Please double-check the script and try again.</source>
|
||||
<translation>S-a produs o eroare la linia {lineno}, coloana {colno}. Vă rugăm verificați scriptul și încercați din nou.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>An error occurred while parsing Title IDs!</source>
|
||||
<translation type="vanished">A apărut o eroare la procesarea Title ID-urilor!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="565"/>
|
||||
<source>The title at index {index} does not have a Title ID!</source>
|
||||
<translation>Titlul la poziția {index} nu are un Title ID!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="618"/>
|
||||
<source>Open Directory</source>
|
||||
<translation>Deschideți folder</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="629"/>
|
||||
<source><b>The specified download directory does not exist!</b></source>
|
||||
<translation><b>Directorul de descărcare specificat nu există!</b></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="632"/>
|
||||
<source>Please make sure the download directory you want to use exists, and that you have permission to access it.</source>
|
||||
<translation>Vă rugăm să vă asigurați că directorul de descărcare pe care vreți să il folosiți există, și că aveți permisiunea de a-l accesa.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Open NUS script</source>
|
||||
<translation type="obsolete">Deschideți script NUS</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Script Failure</source>
|
||||
<translation type="obsolete">Eșuare Script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="371"/>
|
||||
<source>Failed to open the script.</source>
|
||||
<translation type="unfinished">Nu s-a putut deschide script-ul.</translation>
|
||||
<translation type="obsolete">Nu s-a putut deschide script-ul.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="26"/>
|
||||
<source>MainWindow</source>
|
||||
<translation type="unfinished">Fereastra principală</translation>
|
||||
<translation>Fereastra principală</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
|
||||
<source>Available Titles</source>
|
||||
<translation type="unfinished">Titluri valabile</translation>
|
||||
<translation type="obsolete">Titluri valabile</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="72"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="46"/>
|
||||
<source>Search</source>
|
||||
<translation>Căutați</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="59"/>
|
||||
<source>Clear</source>
|
||||
<translation>Goliți câmpul</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
|
||||
<source>Wii</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="103"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="100"/>
|
||||
<source>vWii</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>vWii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="134"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="110"/>
|
||||
<source>DSi</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>DSi</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="174"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
|
||||
<source>Title ID</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>Title ID</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="181"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="142"/>
|
||||
<source>v</source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation>v</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="194"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="155"/>
|
||||
<source>Version</source>
|
||||
<translation type="unfinished">Versiune</translation>
|
||||
<translation>Versiune</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="201"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="162"/>
|
||||
<source>Console:</source>
|
||||
<translation type="unfinished">Consolă</translation>
|
||||
<translation>Consolă:</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="237"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="198"/>
|
||||
<source>Start Download</source>
|
||||
<translation type="unfinished">Începeți descărcarea</translation>
|
||||
<translation>Începeți descărcarea</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="250"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="211"/>
|
||||
<source>Run Script</source>
|
||||
<translation type="unfinished">Rulați script</translation>
|
||||
<translation>Rulați script</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="277"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="238"/>
|
||||
<source>General Settings</source>
|
||||
<translation type="unfinished">Setări Generale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="308"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation type="unfinished">Împachetați arhiva instalabilă (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="323"/>
|
||||
<source>File Name</source>
|
||||
<translation type="unfinished">Nume fișier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="357"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation type="unfinished">Păstrați conținuturile encriptate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation type="unfinished">Creați conținuturi decriptate (*.app)</translation>
|
||||
<translation>Setări Generale</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation type="unfinished">Folosiți fișiere locale, dacă există</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="unfinished">Folosiți Wii U NUS (mai rapid, doar pentru Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="519"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation type="unfinished">Aplicați patch-uri pentru IOS (se aplică doar pe WAD-uri)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="575"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation type="unfinished">vWII Setări titlu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="609"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation type="unfinished">Re-encriptați titlul folosind cheia comună Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="666"/>
|
||||
<source><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
|
||||
<html><head><meta name="qrichtext" content="1" /><meta charset="utf-8" /><style type="text/css">
|
||||
p, li { white-space: pre-wrap; }
|
||||
hr { height: 1px; border-width: 0; }
|
||||
li.unchecked::marker { content: "\2610"; }
|
||||
li.checked::marker { content: "\2612"; }
|
||||
</style></head><body style=" font-family:'Noto Sans'; font-size:10pt; font-weight:400; font-style:normal;">
|
||||
</style></head><body style=" font-family:'.AppleSystemUIFont'; font-size:13pt; font-weight:400; font-style:normal;">
|
||||
<p style="-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px; font-family:'Sans Serif'; font-size:9pt;"><br /></p></body></html></source>
|
||||
<translation type="unfinished"></translation>
|
||||
<translation></translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="26"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="485"/>
|
||||
<source>Options</source>
|
||||
<translation>Opțiuni</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="489"/>
|
||||
<source>Language</source>
|
||||
<translation>Limbă</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="503"/>
|
||||
<source>Theme</source>
|
||||
<translation>Temă</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="520"/>
|
||||
<source>About NUSGet</source>
|
||||
<translation>Despre NUSGet</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="545"/>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="617"/>
|
||||
<source>System (Default)</source>
|
||||
<translation>Sistem (Implicit)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="625"/>
|
||||
<source>Light</source>
|
||||
<translation>Luminos</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="633"/>
|
||||
<source>Dark</source>
|
||||
<translation>Întunecat</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="218"/>
|
||||
<source>Pack installable archive (WAD/TAD)</source>
|
||||
<translation>Împachetați arhiva instalabilă (WAD/TAD)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="251"/>
|
||||
<source>File Name</source>
|
||||
<translation>Nume fișier</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="220"/>
|
||||
<source>Keep encrypted contents</source>
|
||||
<translation>Păstrați conținuturile encriptate</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="222"/>
|
||||
<source>Create decrypted contents (*.app)</source>
|
||||
<translation>Creați conținuturi decriptate (*.app)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="223"/>
|
||||
<source>Use local files, if they exist</source>
|
||||
<translation>Folosiți fișiere locale, dacă există</translation>
|
||||
</message>
|
||||
<message>
|
||||
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
|
||||
<translation type="vanished">Folosiți Wii U NUS (mai rapid, doar pentru Wii/vWii)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="226"/>
|
||||
<source>Apply patches to IOS (Applies to WADs only)</source>
|
||||
<translation>Aplicați patch-uri pentru IOS (se aplică doar pentru WAD-uri)</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="324"/>
|
||||
<source>vWii Title Settings</source>
|
||||
<translation>vWII Setări titlu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="227"/>
|
||||
<source>Re-encrypt title using the Wii Common Key</source>
|
||||
<translation>Re-encriptați titlul folosind cheia comună Wii</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="343"/>
|
||||
<source>App Settings</source>
|
||||
<translation>Setări aplicație</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="228"/>
|
||||
<source>Check for updates on startup</source>
|
||||
<translation>Verificați dacă există actualizări la startup</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../NUSGet.py" line="229"/>
|
||||
<source>Use a custom download directory</source>
|
||||
<translation>Folosiți un director de descărcare propriu</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="378"/>
|
||||
<source>Select...</source>
|
||||
<translation>Selectează...</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="477"/>
|
||||
<source>Help</source>
|
||||
<translation>Ajutor</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="531"/>
|
||||
<source>About Qt</source>
|
||||
<translation>Despre Qt</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../qt/ui/MainMenu.ui" line="368"/>
|
||||
<source>Output Path</source>
|
||||
<translation>Cale de ieșire</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="74"/>
|
||||
<source>
|
||||
|
||||
Could not check for updates.</source>
|
||||
<translation type="unfinished">Nu s-a putut verifica dacă există actualizări.</translation>
|
||||
<translation>
|
||||
|
||||
Nu s-a putut verifica dacă există actualizări.</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="34"/>
|
||||
<location filename="../../modules/core.py" line="84"/>
|
||||
<source>
|
||||
|
||||
There's a newer version of NUSGet available!</source>
|
||||
<translation type="unfinished">O nouă versiune de NUSGet este valabilă!</translation>
|
||||
<translation>
|
||||
|
||||
O nouă versiune de NUSGet este valabilă!</translation>
|
||||
</message>
|
||||
<message>
|
||||
<location filename="../../modules/core.py" line="36"/>
|
||||
<location filename="../../modules/core.py" line="86"/>
|
||||
<source>
|
||||
|
||||
You're running the latest release of NUSGet.</source>
|
||||
<translation type="unfinished">Utilizați ultima versiune de NUSGet.</translation>
|
||||
<translation>
|
||||
|
||||
Utilizați ultima versiune de NUSGet.</translation>
|
||||
</message>
|
||||
</context>
|
||||
</TS>
|
||||
|
@ -1,5 +1,5 @@
|
||||
# "update_translations.py", licensed under the MIT license
|
||||
# Copyright 2024 NinjaCheetah
|
||||
# Copyright 2024-2025 NinjaCheetah
|
||||
# This script exists to work around an issue in PySide6 where the "pyside6-project lupdate" command doesn't work as
|
||||
# expected, as it struggles to parse the paths in the .pyproject file. This does what it's meant to do for it.
|
||||
|
||||
|