25 Commits

Author SHA1 Message Date
f2ae4b26ba Fix workflow for Ubuntu 24.04, finalize translations for v1.3.0 2025-01-13 13:54:51 -05:00
LNLenost
adea7ad35f Updated Italian translations (#21)
* Delete old Italian translations

* Uploaded new translations
2025-01-13 13:40:51 -05:00
87905eab2b Clicking the labels for checkboxes now toggles the checkboxes again 2025-01-05 01:18:44 -05:00
5e37dce4e3 Download to "NUSGet Downloads" instead of "NUSGet"
I edited existing translations accordingly, since the folder name was quoted and is the same regardless of your system language, so I figured I could safely change it to "NUSGet Downloads" without damaging the translation.
2024-12-23 18:01:33 -05:00
Rolfie
748123d190 Updated Norwegian translations (#20) 2024-12-23 12:53:25 -05:00
18f351c481 Merge remote-tracking branch 'origin/main' 2024-12-23 12:43:58 -05:00
49e53bf064 Merge branch 'trans-de'
# Conflicts:
#	resources/translations/nusget_de.ts
2024-12-23 12:43:01 -05:00
DDinghoya
102e741a4e Updated Korean translations (#19) 2024-12-23 12:34:49 -05:00
N•I•L
0edff8e5e9 Updated Romanian translations (#17) 2024-12-23 12:27:01 -05:00
yeah-its-gloria
76ee01c07d Update German translation 2024-12-23 12:55:21 +01:00
588b44381c Install standalone instead of onefile when using make install
This makes the app load faster, because the current install setup makes using the compressed onefile over the standalone build pointless and wastes time on launch.
2024-12-22 21:52:20 -05:00
9dcaa22e89 Added ability to filter title trees with search box
Also fixed tree widths not expanding for titles with long names
2024-12-22 17:07:27 -05:00
20439f8785 Huge database update, all missing Virtual Console/WiiWare titles added 2024-12-21 20:05:31 -05:00
4ec15d0eb3 Mention scripting in README, added example script 2024-12-19 20:28:53 -05:00
2142dbad7e Added error reporting to script downloads, errors do not stop scripts 2024-12-19 20:16:15 -05:00
31f47f2acd Fixed checkmarks/Xs for showing if a ticket is available 2024-12-18 16:38:14 -05:00
87da32d62e Improved WAD name formatting for batch downloads
Also started working on a fix for the checkmark/X icons denoting a ticket not appearing anymore.
2024-12-18 09:08:21 -05:00
6660e129a8 Added WIP JSON-based script support, removed old format
The old script code was already broken from the previous commits anyway, since they changed too much internally. This new format is much easier to understand and will allow for creating more powerful scripts.
2024-12-17 21:55:01 -05:00
62fa5ef7b1 Entirely rewrote title tree backend
Title trees are now model-based rather than item based. Coming with this is proper item metadata, so the data and UI are finally disconnected, making future development much easier. There are also some minor visual improvements as a result of using a TreeView instead of a TreeWidget.
vWii System Menus now have public versions defined in the database. Public version display code has also been entirely rewritten, as the version displayed in the interface and the version used by the code are no longer the same.
2024-12-13 22:39:09 -05:00
c1eb80fbb6 Massively improved code readability
Some checks failed
Python application / build-linux (push) Has been cancelled
Python application / build-macos-x86 (push) Has been cancelled
Python application / build-macos-arm64 (push) Has been cancelled
Python application / build-windows (push) Has been cancelled
NUSGet's code has been updated to use better formatting and practices that align with how my other projects like libWiiPy and WiiPy are written.
2024-12-13 18:34:37 -05:00
Aep
08c2bd27f5 Add Public System Menu Versions (#16)
* Add System Menu Versions

* add ()

* fix comments

* Fix version getting messed up by public version

---------

Co-authored-by: Aep <itisinfactmark@gmail.com>
2024-11-27 11:50:34 -05:00
dadcc02701 Fix --onefile accidentally being passed for macOS builds instead of only --standalone 2024-11-16 23:00:37 -05:00
c716291c2d Updated build process, workflow, and build directions in README 2024-11-16 22:50:36 -05:00
DDinghoya
7c35e2090d Add Korean translations (#15)
* Create nusget_ko.ts

* Update NUSGet.pyproject
2024-11-16 22:02:52 -05:00
1ae712918e Run extra build job for macOS x86_64 2024-11-16 01:13:29 -05:00
27 changed files with 13082 additions and 1092 deletions

View File

@@ -1,5 +1,4 @@
# This workflow will install Python dependencies, run tests and lint with a single version of Python # This workflow will install Python dependencies and then build NUSGet for all platforms
# For more information see: https://docs.github.com/en/actions/automating-builds-and-tests/building-and-testing-python
name: Python application name: Python application
@@ -20,18 +19,19 @@ jobs:
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Install ccache for Nuitka - name: Install ccache for Nuitka
run: sudo apt update && sudo apt install -y ccache libicu70 run: |
- name: Set up Python 3.11 sudo apt update && \
sudo apt install -y ccache patchelf
- name: Set up Python 3.12
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.11" python-version: "3.12"
- name: Install Dependencies - name: Install Dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
- name: Build Package - name: Build Package
run: | run: make all
make linux
- name: Prepare Package for Upload - name: Prepare Package for Upload
run: | run: |
mv NUSGet ~/NUSGet mv NUSGet ~/NUSGet
@@ -41,26 +41,24 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: ~/NUSGet.tar path: ~/NUSGet.tar
name: NUSGet-linux-bin name: NUSGet-Linux-bin
build-macos: build-macos-x86:
runs-on: macos-latest runs-on: macos-latest
steps: steps:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Set up Python 3.11 - name: Set up Python 3.12
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.11" python-version: "3.12"
- name: Install Dependencies - name: Install Dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
- name: Build Package - name: Build Package
run: | run: ARCH_FLAGS=--macos-target-arch=x86_64 make all
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
- name: Prepare Package for Upload - name: Prepare Package for Upload
run: | run: |
mv NUSGet.app ~/NUSGet.app mv NUSGet.app ~/NUSGet.app
@@ -70,7 +68,34 @@ jobs:
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: ~/NUSGet.tar 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: build-windows:
@@ -80,26 +105,23 @@ jobs:
- uses: actions/checkout@v4 - uses: actions/checkout@v4
- name: Enable Developer Command Prompt - name: Enable Developer Command Prompt
uses: ilammy/msvc-dev-cmd@v1.13.0 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 uses: actions/setup-python@v5
with: with:
python-version: "3.11" python-version: "3.12"
- name: Install Dependencies - name: Install Dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
pip install -r requirements.txt pip install -r requirements.txt
- name: Build Package - name: Build Package
run: | run: .\Build.ps1
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
- name: Upload Package - name: Upload Package
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: D:\a\NUSGet\NUSGet\NUSGet.dist path: D:\a\NUSGet\NUSGet\NUSGet.dist
name: NUSGet-windows-bin name: NUSGet-Windows-bin
- name: Upload Onefile Package - name: Upload Onefile Package
uses: actions/upload-artifact@v4 uses: actions/upload-artifact@v4
with: with:
path: D:\a\NUSGet\NUSGet\NUSGet.exe path: D:\a\NUSGet\NUSGet\NUSGet.exe
name: NUSGet-windows-onefile-bin name: NUSGet-Windows-onefile-bin

33
Build.ps1 Normal file
View 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
}
}

View File

@@ -1,12 +1,15 @@
CC=python -m nuitka CC=python -m nuitka
ARCH_FLAGS?=
linux: all:
python build_translations.py 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 -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/icon.png /opt/NUSGet/NUSGet.png
install ./packaging/NUSGet.desktop /usr/share/applications install ./packaging/NUSGet.desktop /usr/share/applications

414
NUSGet.py
View File

@@ -1,5 +1,22 @@
# "NUSGet.py", licensed under the MIT license # "NUSGet.py", licensed under the MIT license
# Copyright 2024 NinjaCheetah # Copyright 2024-2025 NinjaCheetah
# 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 os
import sys import sys
@@ -10,17 +27,18 @@ import webbrowser
from importlib.metadata import version from importlib.metadata import version
from PySide6.QtGui import QIcon from PySide6.QtGui import QIcon
from PySide6.QtWidgets import (QApplication, QMainWindow, QMessageBox, QTreeWidgetItem, QHeaderView, QStyle, from PySide6.QtWidgets import QApplication, QMainWindow, QMessageBox, QStyleFactory, QFileDialog
QStyleFactory, QFileDialog)
from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo, QTranslator, QLocale from PySide6.QtCore import QRunnable, Slot, QThreadPool, Signal, QObject, QLibraryInfo, QTranslator, QLocale
from qt.py.ui_MainMenu import Ui_MainWindow from qt.py.ui_MainMenu import Ui_MainWindow
from modules.core import * from modules.core import *
from modules.download_wii import run_nus_download_wii, run_nus_download_wii_batch from modules.tree import NUSGetTreeModel, TIDFilterProxyModel
from modules.download_dsi import run_nus_download_dsi, run_nus_download_dsi_batch 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.3.0"
regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"], regions = {"World": ["41"], "USA/NTSC": ["45"], "Europe/PAL": ["50"], "Japan": ["4A"], "Korea": ["4B"], "China": ["43"],
"Australia/NZ": ["55"]} "Australia/NZ": ["55"]}
@@ -64,14 +82,9 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.threadpool = QThreadPool() self.threadpool = QThreadPool()
self.ui.download_btn.clicked.connect(self.download_btn_pressed) self.ui.download_btn.clicked.connect(self.download_btn_pressed)
self.ui.script_btn.clicked.connect(self.script_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.pack_archive_chkbox.toggled.connect(
lambda: self.ui.archive_file_entry.setEnabled(self.ui.pack_archive_chkbox.isChecked()))
self.ui.tid_entry.textChanged.connect(self.tid_updated) 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)
# Basic intro text set to automatically show when the app loads. This may be changed in the future. # Basic intro text set to automatically show when the app loads. This may be changed in the future.
libwiipy_version = "v" + version("libWiiPy") libwiipy_version = "v" + version("libWiiPy")
libtwlpy_version = "v" + version("libTWLPy") libtwlpy_version = "v" + version("libTWLPy")
@@ -81,7 +94,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
"Titles marked with a checkmark are free and have a ticket available, and can" "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 " " 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 " "a ticket, and only their encrypted contents can be saved.\n\nTitles will be "
"downloaded to a folder named \"NUSGet\" inside your downloads folder.") "downloaded to a folder named \"NUSGet Downloads\" inside your downloads folder.")
.format(nusget_version=nusget_version, libwiipy_version=libwiipy_version, .format(nusget_version=nusget_version, libwiipy_version=libwiipy_version,
libtwlpy_version=libtwlpy_version)) libtwlpy_version=libtwlpy_version))
self.ui.log_text_browser.setText(self.log_text) self.ui.log_text_browser.setText(self.log_text)
@@ -90,73 +103,68 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ui.console_select_dropdown.addItem("vWii") self.ui.console_select_dropdown.addItem("vWii")
self.ui.console_select_dropdown.addItem("DSi") self.ui.console_select_dropdown.addItem("DSi")
self.ui.console_select_dropdown.currentIndexChanged.connect(self.selected_console_changed) self.ui.console_select_dropdown.currentIndexChanged.connect(self.selected_console_changed)
# Title tree building code. # Title tree loading code. Now powered by Models:tm:
wii_tree = self.ui.wii_title_tree wii_model = NUSGetTreeModel(wii_database, root_name="Wii Titles")
vwii_tree = self.ui.vwii_title_tree vwii_model = NUSGetTreeModel(vwii_database, root_name="vWii Titles")
dsi_tree = self.ui.dsi_title_tree dsi_model = NUSGetTreeModel(dsi_database, root_name="DSi Titles")
self.trees = [[wii_tree, wii_database], [vwii_tree, vwii_database], [dsi_tree, dsi_database]] self.tree_models = [wii_model, vwii_model, dsi_model]
for tree in self.trees: self.trees = [self.ui.wii_title_tree, self.ui.vwii_title_tree, self.ui.dsi_title_tree]
self.tree_categories = [] # Build proxy models required for searching
global regions self.proxy_models = [TIDFilterProxyModel(self.ui.wii_title_tree), TIDFilterProxyModel(self.ui.vwii_title_tree),
# Iterate over each category in the database file. TIDFilterProxyModel(self.ui.dsi_title_tree)]
for key in tree[1]: for model in range(len(self.proxy_models)):
new_category = QTreeWidgetItem() self.proxy_models[model].setSourceModel(self.tree_models[model])
new_category.setText(0, key) self.proxy_models[model].setFilterKeyColumn(0)
# Iterate over each title in the current category. self.ui.tree_filter_input.textChanged.connect(lambda: self.filter_text_updated(self.ui.platform_tabs.currentIndex()))
for title in tree[1][key]: self.ui.tree_filter_reset_btn.clicked.connect(lambda: self.ui.tree_filter_input.setText(""))
new_title = QTreeWidgetItem() for tree in range(len(self.trees)):
new_title.setText(0, title["TID"] + " - " + title["Name"]) self.trees[tree].setModel(self.proxy_models[tree])
# Build the list of regions and what versions are offered for each region. self.trees[tree].doubleClicked.connect(self.title_double_clicked)
for region in title["Versions"]: self.trees[tree].expanded.connect(lambda: self.resize_tree(self.ui.platform_tabs.currentIndex()))
new_region = QTreeWidgetItem() self.trees[tree].collapsed.connect(lambda: self.resize_tree(self.ui.platform_tabs.currentIndex()))
new_region.setText(0, region) # Prevent resizing.
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))
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
self.setFixedSize(self.size()) self.setFixedSize(self.size())
# 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.
connect_label_to_checkbox(self.ui.pack_archive_chkbox_lbl, self.ui.pack_archive_chkbox)
connect_label_to_checkbox(self.ui.keep_enc_chkbox_lbl, self.ui.keep_enc_chkbox)
connect_label_to_checkbox(self.ui.create_dec_chkbox_lbl, self.ui.create_dec_chkbox)
connect_label_to_checkbox(self.ui.use_local_chkbox_lbl, self.ui.use_local_chkbox)
connect_label_to_checkbox(self.ui.use_wiiu_nus_chkbox_lbl, self.ui.use_wiiu_nus_chkbox)
connect_label_to_checkbox(self.ui.patch_ios_chkbox_lbl, self.ui.patch_ios_chkbox)
connect_label_to_checkbox(self.ui.pack_vwii_mode_chkbox_lbl, self.ui.pack_vwii_mode_chkbox)
# Do a quick check to see if there's a newer release available, and inform the user if there is. # Do a quick check to see if there's a newer release available, and inform the user if there is.
worker = Worker(check_nusget_updates, app, nusget_version) worker = Worker(check_nusget_updates, app, nusget_version)
worker.signals.result.connect(self.prompt_for_update) worker.signals.result.connect(self.prompt_for_update)
worker.signals.progress.connect(self.update_log_text) worker.signals.progress.connect(self.update_log_text)
self.threadpool.start(worker) self.threadpool.start(worker)
@Slot(QTreeWidgetItem, int) def title_double_clicked(self, index):
def onItemClicked(self, item, col):
if self.ui.download_btn.isEnabled() is True: 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 # Need to map the proxy index to the source index because we're using a proxy model for searching. If we
# than a version, this returns an AttributeError and the click can be ignored. # don't, this for some reason isn't handled by PySide and causes a segfault.
try: source_index = self.proxy_models[self.ui.platform_tabs.currentIndex()].mapToSource(index)
category = item.parent().parent().parent().text(0) title = source_index.internalPointer().metadata
except AttributeError: if title is not None:
return self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex())
tree = self.trees[self.ui.platform_tabs.currentIndex()] selected_title = TitleData(title.tid, title.name, title.archive_name, title.version, title.ticket,
for title in tree[1][category]: title.region, title.category, title.danger)
# Check to see if the current title matches the selected one, and if it does, pass that info on. self.load_title_data(selected_title)
if item.parent().parent().text(0) == (title["TID"] + " - " + title["Name"]):
self.ui.console_select_dropdown.setCurrentIndex(self.ui.platform_tabs.currentIndex()) def filter_text_updated(self, target: int):
try: text = self.ui.tree_filter_input.text()
danger_text = title["Danger"] if text != "":
except KeyError: self.trees[target].expandToDepth(0)
danger_text = "" else:
selected_title = SelectedTitle(title["TID"], title["Name"], title["Archive Name"], item.text(0)[1:], self.trees[target].collapseAll()
title["Ticket"], item.parent().text(0), category, self.proxy_models[target].setFilterRegularExpression(text)
self.ui.console_select_dropdown.currentText(), danger_text) self.trees[target].resizeColumnToContents(0)
self.load_title_data(selected_title)
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): def tid_updated(self):
tid = self.ui.tid_entry.text() tid = self.ui.tid_entry.text()
@@ -191,7 +199,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
if ret == QMessageBox.StandardButton.Yes: if ret == QMessageBox.StandardButton.Yes:
webbrowser.open("https://github.com/NinjaCheetah/NUSGet/releases/latest") 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. # 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 # 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. # two-digit code. Use the region info passed to load the correct code.
@@ -203,29 +211,26 @@ class MainWindow(QMainWindow, Ui_MainWindow):
tid = selected_title.tid tid = selected_title.tid
# Load the TID and version into the entry boxes. # Load the TID and version into the entry boxes.
self.ui.tid_entry.setText(tid) self.ui.tid_entry.setText(tid)
self.ui.version_entry.setText(selected_title.version) self.ui.version_entry.setText(str(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 # 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. # for every single title, regardless of whether it can be packed or not.
try: archive_name = selected_title.archive_name
archive_name = f"{selected_title.archive_name}" if selected_title.category != "System" and selected_title.category != "IOS":
if selected_title.category != "System" and selected_title.category != "IOS": archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}"
archive_name += f"-{str(bytes.fromhex(tid).decode())[-4:]}" archive_name += f"-v{selected_title.version}"
archive_name += f"-v{selected_title.version}" if selected_title.region != "World":
if selected_title.region != "World": archive_name += f"-{selected_title.region.split('/')[0]}"
archive_name += f"-{selected_title.region.split('/')[0]}" if self.ui.console_select_dropdown.currentText() == "DSi":
if self.ui.console_select_dropdown.currentText() == "DSi": archive_name += ".tad"
archive_name += ".tad" elif self.ui.console_select_dropdown.currentText() == "vWii":
elif self.ui.console_select_dropdown.currentText() == "vWii": if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
if selected_title.category.find("System") != -1 or selected_title.category == "IOS": archive_name += "-vWii"
archive_name += "-vWii" archive_name += ".wad"
archive_name += ".wad" else:
else: if selected_title.category.find("System") != -1 or selected_title.category == "IOS":
if selected_title.category.find("System") != -1 or selected_title.category == "IOS": archive_name += "-Wii"
archive_name += "-Wii" archive_name += ".wad"
archive_name += ".wad" self.ui.archive_file_entry.setText(archive_name)
self.ui.archive_file_entry.setText(archive_name)
except KeyError:
pass
danger_text = selected_title.danger danger_text = selected_title.danger
# Add warning text to the log if the selected title has no ticket. # Add warning text to the log if the selected title has no ticket.
if selected_title.ticket is False: if selected_title.ticket is False:
@@ -235,7 +240,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.log_text = f"{tid} - {selected_title.name}\nVersion: {selected_title.version}\n\n{danger_text}\n" 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) 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. # Lock the UI prior to the download beginning to avoid spawning multiple threads or changing info part way in.
# Also resets the log. # Also resets the log.
self.ui.tid_entry.setEnabled(False) self.ui.tid_entry.setEnabled(False)
@@ -246,6 +251,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ui.keep_enc_chkbox.setEnabled(False) self.ui.keep_enc_chkbox.setEnabled(False)
self.ui.create_dec_chkbox.setEnabled(False) self.ui.create_dec_chkbox.setEnabled(False)
self.ui.use_local_chkbox.setEnabled(False) self.ui.use_local_chkbox.setEnabled(False)
self.ui.patch_ios_chkbox.setEnabled(False)
self.ui.use_wiiu_nus_chkbox.setEnabled(False) self.ui.use_wiiu_nus_chkbox.setEnabled(False)
self.ui.pack_vwii_mode_chkbox.setEnabled(False) self.ui.pack_vwii_mode_chkbox.setEnabled(False)
self.ui.archive_file_entry.setEnabled(False) self.ui.archive_file_entry.setEnabled(False)
@@ -253,6 +259,22 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.log_text = "" self.log_text = ""
self.ui.log_text_browser.setText(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_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.patch_ios_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)
def download_btn_pressed(self): 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. # 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 if (self.ui.pack_archive_chkbox.isChecked() is False and self.ui.keep_enc_chkbox.isChecked() is False and
@@ -267,9 +289,7 @@ class MainWindow(QMainWindow, Ui_MainWindow):
"like the download to be saved.")) "like the download to be saved."))
msg_box.exec() msg_box.exec()
return return
self.lock_ui()
self.lock_ui_for_download()
# Create a new worker object to handle the download in a new thread. # Create a new worker object to handle the download in a new thread.
if self.ui.console_select_dropdown.currentText() == "DSi": if self.ui.console_select_dropdown.currentText() == "DSi":
worker = Worker(run_nus_download_dsi, out_folder, self.ui.tid_entry.text(), worker = Worker(run_nus_download_dsi, out_folder, self.ui.tid_entry.text(),
@@ -326,30 +346,44 @@ class MainWindow(QMainWindow, Ui_MainWindow):
msg_box.setText(title_text) msg_box.setText(title_text)
msg_box.setInformativeText(body_text) msg_box.setInformativeText(body_text)
msg_box.exec() msg_box.exec()
# Now that the thread has closed, unlock the UI to allow for the next download. self.unlock_ui()
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)
# Call the dropdown callback because this will automagically handle setting console-specific settings based # Call the dropdown callback because this will automagically handle setting console-specific settings based
# on the currently selected console, and saves on duplicate code. # on the currently selected console, and saves on duplicate code.
self.selected_console_changed() self.selected_console_changed()
def pack_wad_chkbox_toggled(self): def check_batch_result(self, result: BatchResults):
# Simple function to catch when the WAD/TAD checkbox is toggled and enable/disable the file name entry box if result.code != 0:
# accordingly. msg_box = QMessageBox()
if self.ui.pack_archive_chkbox.isChecked() is True: if result.failed_titles:
self.ui.archive_file_entry.setEnabled(True) msg_box.setIcon(QMessageBox.Icon.Critical)
else: 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", "Some issues occurred while running the download script."))
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): def selected_console_changed(self):
# Callback function to enable or disable console-specific settings based on the selected console. # Callback function to enable or disable console-specific settings based on the selected console.
@@ -361,84 +395,80 @@ class MainWindow(QMainWindow, Ui_MainWindow):
self.ui.pack_vwii_mode_chkbox.setEnabled(False) self.ui.pack_vwii_mode_chkbox.setEnabled(False)
def script_btn_pressed(self): 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: if len(file_name[0]) == 0:
return return
try: try:
file = open(file_name[0], "r") with open(file_name[0]) as script_file:
except: script_data = json.load(script_file)
QMessageBox.critical(self, app.translate("MainWindow", "Script Failure"), app.translate("MainWindow", "Failed to open the script."), buttons=QMessageBox.StandardButton.Ok, defaultButton=QMessageBox.StandardButton.Ok) except json.JSONDecodeError as e:
msg_box.setText(app.translate("MainWindow", "An error occurred while parsing the script file!"))
msg_box.setInformativeText(app.translate("MainWindow", f"Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again."))
msg_box.exec()
return return
# Build a list of the titles we need to download.
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.
titles = [] titles = []
for title in script_data:
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]
try: try:
version = int(decoded[1], 16) tid = title["Title ID"]
except: except KeyError:
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) msg_box.setText(app.translate("MainWindow", "An error occurred while parsing Title IDs!"))
msg_box.setInformativeText(app.translate("MainWindow", f"The title at index {script_data.index(title)} does not have a Title ID!"))
msg_box.exec()
return return
# No version key is acceptable, just treat it as latest.
title = None try:
for category in self.trees[self.ui.platform_tabs.currentIndex()][1]: title_version = int(title["Version"])
for title_ in self.trees[self.ui.platform_tabs.currentIndex()][1][category]: except KeyError:
# 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 title_version = -1
if not ((title_["TID"][-2:] == "XX" and title_["TID"][:-2] == tid[:-2]) or title_["TID"] == tid): # If no console was specified, assume Wii.
continue try:
console = title["Console"]
found_ver = False except KeyError:
for region in title_["Versions"]: console = "Wii"
for db_version in title_["Versions"][region]: # Look up the title, and load the archive name for it if one can be found.
if db_version == version: archive_name = ""
found_ver = True if console == "vWii":
target_database = vwii_database
elif console == "DSi":
target_database = dsi_database
else:
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["Archive Name"]
break
except KeyError:
archive_name = ""
break
else:
if t["TID"] == tid:
try:
archive_name = t["Archive Name"]
break break
except KeyError:
if not found_ver: archive_name = ""
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) break
return titles.append(BatchTitleData(tid, title_version, console, archive_name))
self.lock_ui()
title = title_ worker = Worker(run_nus_download_batch, out_folder, titles, self.ui.pack_archive_chkbox.isChecked(),
break 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(),
if title == None: self.ui.pack_vwii_mode_chkbox.isChecked(), self.ui.patch_ios_chkbox.isChecked())
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) worker.signals.result.connect(self.check_batch_result)
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())
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) worker.signals.progress.connect(self.update_log_text)
self.threadpool.start(worker) self.threadpool.start(worker)
@@ -462,9 +492,9 @@ if __name__ == "__main__":
else: else:
location = pathlib.Path(os.path.expanduser('~')).joinpath('Downloads') location = pathlib.Path(os.path.expanduser('~')).joinpath('Downloads')
# Build the path by combining the path to the Downloads photo with "NUSGet". # Build the path by combining the path to the Downloads photo with "NUSGet".
out_folder = location.joinpath("NUSGet") out_folder = location.joinpath("NUSGet Downloads")
# Create the "NUSGet" directory if it doesn't exist. In the future, this will be user-customizable, but this works # Create the "NUSGet Downloads" directory if it doesn't exist. In the future, this will be user-customizable, but
# for now, and avoids the issues from when it used to use a directory next to the binary (mostly on macOS). # 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(): if not out_folder.is_dir():
out_folder.mkdir() out_folder.mkdir()

View File

@@ -9,6 +9,7 @@
"./resources/translations/nusget_fr.ts", "./resources/translations/nusget_fr.ts",
"./resources/translations/nusget_it.ts", "./resources/translations/nusget_it.ts",
"./resources/translations/nusget_de.ts", "./resources/translations/nusget_de.ts",
"./resources/translations/nusget_ro.ts" "./resources/translations/nusget_ro.ts",
"./resources/translations/nusget_ko.ts"
] ]
} }

View File

@@ -13,6 +13,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: 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. - 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. - 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:** **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. - "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,48 +34,43 @@ For basic usage on all platforms, you can download the latest release for your o
## Building ## Building
### System Requirements ### System Requirements
- **Windows:** Python 3.11 (Requires Windows 8.1 or later) - **Windows:** Python 3.12 (Requires Windows 8.1 or later)
- **Linux:** Python 3.11 - **Linux:** Python 3.12
- **macOS:** Python 3.11 (Requires macOS 10.9 or later, however macOS 11.0 or later may be required for library support) - **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, make sure you're inside a venv, and then install the required dependencies:
First, install the required dependencies:
```
pip install -r requirements.txt
```
Then, use the command for your platform to build an executable with Nuitka:
**Windows**
```shell ```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 ```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 ```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. ### 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.
### 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):
```shell ```shell
make linux .\Build.ps1
``` ```
Then, run the install command with `sudo` (or your favorite alternative): ## Translations
```shell A huge thanks to all the wonderful translators who've helped make NUSGet available to more people!
sudo make linux-install - **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)
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? ## Why this and not NUSD?

View File

@@ -1,5 +1,5 @@
# "build_translations.py", licensed under the MIT license # "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 # 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. # translation files in the root of the project directory while building.

View File

@@ -30,7 +30,18 @@
}, },
"Ticket": true, "Ticket": true,
"Archive Name": "System-Menu", "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": [ "System Channels": [

File diff suppressed because it is too large Load Diff

16
example-script.json Normal file
View File

@@ -0,0 +1,16 @@
[
{
"Title ID": "0000000100000050",
"Console": "Wii"
},
{
"Title ID": "0000000100000002",
"Version": 518,
"Console": "Wii"
},
{
"Title ID": "00030017484E4145",
"Version": 1792,
"Console": "DSi"
}
]

View File

@@ -1,13 +1,16 @@
# "modules/core.py", licensed under the MIT license # "modules/core.py", licensed under the MIT license
# Copyright 2024 NinjaCheetah # Copyright 2024-2025 NinjaCheetah
import requests import requests
from dataclasses import dataclass from dataclasses import dataclass
from typing import List
from PySide6.QtCore import Qt as _Qt
@dataclass @dataclass
class SelectedTitle: class TitleData:
# Class to store all components of a selected title to make tracking it easier. # Class to store all data for a Title.
tid: str tid: str
name: str name: str
archive_name: str archive_name: str
@@ -15,10 +18,33 @@ class SelectedTitle:
ticket: bool ticket: bool
region: str region: str
category: str category: str
console: str
danger: 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 check_nusget_updates(app, current_version: str, progress_callback=None) -> str | None: 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. # 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) gh_api_request = requests.get(url="https://api.github.com/repos/NinjaCheetah/NUSGet/releases/latest", stream=True)

57
modules/download_batch.py Normal file
View 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(f"Batch download finished.")
return BatchResults(result, warning_titles, failed_titles)

View File

@@ -1,7 +1,6 @@
# "modules/download_dsi.py", licensed under the MIT license # "modules/download_dsi.py", licensed under the MIT license
# Copyright 2024 NinjaCheetah # Copyright 2024-2025 NinjaCheetah
import os
import pathlib import pathlib
from typing import List, Tuple from typing import List, Tuple
@@ -27,14 +26,13 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
# Create a new libTWLPy Title. # Create a new libTWLPy Title.
title = libTWLPy.Title() title = libTWLPy.Title()
# Make a directory for this title if it doesn't exist. # Make a directory for this title if it doesn't exist.
title_dir = pathlib.Path(os.path.join(out_folder, tid)) title_dir = out_folder.joinpath(tid)
if not title_dir.is_dir(): title_dir.mkdir(exist_ok=True)
title_dir.mkdir()
# Announce the title being downloaded, and the version if applicable. # Announce the title being downloaded, and the version if applicable.
if title_version is not None: if title_version is not None:
progress_callback.emit("Downloading title " + tid + " v" + str(title_version) + ", please wait...") progress_callback.emit(f"Downloading title {tid} v{title_version}, please wait...")
else: else:
progress_callback.emit("Downloading title " + tid + " vLatest, please wait...") progress_callback.emit(f"Downloading title {tid} vLatest, please wait...")
progress_callback.emit(" - Downloading and parsing TMD...") progress_callback.emit(" - Downloading and parsing TMD...")
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD. # Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
try: try:
@@ -47,25 +45,19 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
except ValueError: except ValueError:
return -2 return -2
# Make a directory for this version if it doesn't exist. # Make a directory for this version if it doesn't exist.
version_dir = pathlib.Path(os.path.join(title_dir, str(title_version))) version_dir = title_dir.joinpath(str(title_version))
if not version_dir.is_dir(): version_dir.mkdir(exist_ok=True)
version_dir.mkdir()
# Write out the TMD to a file. # Write out the TMD to a file.
tmd_out = open(os.path.join(version_dir, "tmd." + str(title_version)), "wb") version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
tmd_out.write(title.tmd.dump())
tmd_out.close()
# Use a local ticket, if one exists and "use local files" is enabled. # 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")): if use_local_chkbox and version_dir.joinpath("tik").exists():
progress_callback.emit(" - Parsing local copy of Ticket...") progress_callback.emit(" - Parsing local copy of Ticket...")
local_ticket = open(os.path.join(version_dir, "tik"), "rb") title.load_ticket(version_dir.joinpath("tik").read_bytes())
title.load_ticket(local_ticket.read())
else: else:
progress_callback.emit(" - Downloading and parsing Ticket...") progress_callback.emit(" - Downloading and parsing Ticket...")
try: try:
title.load_ticket(libTWLPy.download_ticket(tid)) title.load_ticket(libTWLPy.download_ticket(tid))
ticket_out = open(os.path.join(version_dir, "tik"), "wb") version_dir.joinpath("tik").write_bytes(title.ticket.dump())
ticket_out.write(title.ticket.dump())
ticket_out.close()
except ValueError: except ValueError:
# If libTWLPy returns an error, then no ticket is available. Log this, and disable options requiring a # 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. # ticket so that they aren't attempted later.
@@ -74,38 +66,27 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
decrypt_contents_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. # Load the content record from the TMD, and download the content it lists. DSi titles only have one content.
title.load_content_records() title.load_content_records()
content_file_name = hex(title.tmd.content_record.content_id)[2:] content_file_name = f"{title.tmd.content_record.content_id:08X}"
while len(content_file_name) < 8:
content_file_name = "0" + content_file_name
# Check for a local copy of the current content if "use local files" is enabled, and use it. # 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)): if use_local_chkbox and version_dir.joinpath(content_file_name).exists():
progress_callback.emit(" - Using local copy of content") progress_callback.emit(" - Using local copy of content")
local_file = open(os.path.join(version_dir, content_file_name), "rb") content = version_dir.joinpath(content_file_name).read_bytes()
content = local_file.read()
else: else:
progress_callback.emit(" - Downloading content (Content ID: " + str(title.tmd.content_record.content_id) + progress_callback.emit(f" - Downloading content (Content ID: {title.tmd.content_record.content_id}, Size: "
", Size: " + str(title.tmd.content_record.content_size) + " bytes)...") f"{title.tmd.content_record.content_size} bytes)...")
content = libTWLPy.download_content(tid, title.tmd.content_record.content_id) content = libTWLPy.download_content(tid, title.tmd.content_record.content_id)
progress_callback.emit(" - Done!") progress_callback.emit(" - Done!")
# If keep encrypted contents is on, write out each content after its downloaded. # If keep encrypted contents is on, write out the content after its downloaded.
if keep_enc_chkbox is True: if keep_enc_chkbox is True:
enc_content_out = open(os.path.join(version_dir, content_file_name), "wb") version_dir.joinpath(content_file_name).write_bytes(content)
enc_content_out.write(content)
enc_content_out.close()
title.content.content = 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: if decrypt_contents_enabled is True:
try: try:
progress_callback.emit(" - Decrypting content (Content ID: " + str(title.tmd.content_record.content_id) progress_callback.emit(f" - Decrypting content (Content ID: {title.tmd.content_record.content_id})...")
+ ")...")
dec_content = title.get_content() dec_content = title.get_content()
content_file_name = hex(title.tmd.content_record.content_id)[2:] content_file_name = f"{title.tmd.content_record.content_id:08X}.app"
while len(content_file_name) < 8: version_dir.joinpath(content_file_name).write_bytes(dec_content)
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()
except ValueError: except ValueError:
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using # 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. # local encrypted contents that have been altered at present.
@@ -118,14 +99,14 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
# Use a typed TAD name if there is one, and auto generate one based on the TID and version if there isn't. # 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("Packing TAD...")
if tad_file_name != "" and tad_file_name is not None: if tad_file_name != "" and tad_file_name is not None:
if tad_file_name[-4:] != ".tad": # Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
tad_file_name = tad_file_name + ".tad" tad_file_name = tad_file_name.replace("-vLatest", f"-v{title_version}")
if tad_file_name[-4:].lower() != ".tad":
tad_file_name += ".tad"
else: else:
tad_file_name = tid + "-v" + str(title_version) + ".tad" tad_file_name = f"{tid}-v{title_version}.tad"
# Have libTWLPy dump the TAD, and write that data out. # Have libTWLPy dump the TAD, and write that data out.
file = open(os.path.join(version_dir, tad_file_name), "wb") version_dir.joinpath(tad_file_name).write_bytes(title.dump_tad())
file.write(title.dump_tad())
file.close()
progress_callback.emit("Download complete!") progress_callback.emit("Download complete!")
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this # 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 # point, it means that they enabled decryption or TAD packing for a title that doesn't have a ticket. Return
@@ -133,13 +114,3 @@ def run_nus_download_dsi(out_folder: pathlib.Path, tid: str, version: str, pack_
if (not pack_tad_enabled and pack_tad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox): if (not pack_tad_enabled and pack_tad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1 return 1
return 0 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

View File

@@ -1,7 +1,6 @@
# "modules/download_wii.py", licensed under the MIT license # "modules/download_wii.py", licensed under the MIT license
# Copyright 2024 NinjaCheetah # Copyright 2024-2025 NinjaCheetah
import os
import pathlib import pathlib
from typing import List, Tuple from typing import List, Tuple
@@ -29,14 +28,13 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
# Create a new libWiiPy Title. # Create a new libWiiPy Title.
title = libWiiPy.title.Title() title = libWiiPy.title.Title()
# Make a directory for this title if it doesn't exist. # Make a directory for this title if it doesn't exist.
title_dir = pathlib.Path(os.path.join(out_folder, tid)) title_dir = out_folder.joinpath(tid)
if not title_dir.is_dir(): title_dir.mkdir(exist_ok=True)
title_dir.mkdir()
# Announce the title being downloaded, and the version if applicable. # Announce the title being downloaded, and the version if applicable.
if title_version is not None: if title_version is not None:
progress_callback.emit("Downloading title " + tid + " v" + str(title_version) + ", please wait...") progress_callback.emit(f"Downloading title {tid} v{title_version}, please wait...")
else: else:
progress_callback.emit("Downloading title " + tid + " vLatest, please wait...") progress_callback.emit(f"Downloading title {tid} vLatest, please wait...")
progress_callback.emit(" - Downloading and parsing TMD...") progress_callback.emit(" - Downloading and parsing TMD...")
# Download a specific TMD version if a version was specified, otherwise just download the latest TMD. # Download a specific TMD version if a version was specified, otherwise just download the latest TMD.
try: try:
@@ -49,25 +47,19 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
except ValueError: except ValueError:
return -2 return -2
# Make a directory for this version if it doesn't exist. # Make a directory for this version if it doesn't exist.
version_dir = pathlib.Path(os.path.join(title_dir, str(title_version))) version_dir = title_dir.joinpath(str(title_version))
if not version_dir.is_dir(): version_dir.mkdir(exist_ok=True)
version_dir.mkdir()
# Write out the TMD to a file. # Write out the TMD to a file.
tmd_out = open(os.path.join(version_dir, "tmd." + str(title_version)), "wb") version_dir.joinpath(f"tmd.{title_version}").write_bytes(title.tmd.dump())
tmd_out.write(title.tmd.dump())
tmd_out.close()
# Use a local ticket, if one exists and "use local files" is enabled. # 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")): if use_local_chkbox and version_dir.joinpath("tik").exists():
progress_callback.emit(" - Parsing local copy of Ticket...") progress_callback.emit(" - Parsing local copy of Ticket...")
local_ticket = open(os.path.join(version_dir, "tik"), "rb") title.load_ticket(version_dir.joinpath("tik").read_bytes())
title.load_ticket(local_ticket.read())
else: else:
progress_callback.emit(" - Downloading and parsing Ticket...") progress_callback.emit(" - Downloading and parsing Ticket...")
try: try:
title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled)) title.load_ticket(libWiiPy.title.download_ticket(tid, wiiu_endpoint=wiiu_nus_enabled))
ticket_out = open(os.path.join(version_dir, "tik"), "wb") version_dir.joinpath("tik").write_bytes(title.ticket.dump())
ticket_out.write(title.ticket.dump())
ticket_out.close()
except ValueError: except ValueError:
# If libWiiPy returns an error, then no ticket is available. Log this, and disable options requiring a # 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. # ticket so that they aren't attempted later.
@@ -78,47 +70,32 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
title.load_content_records() title.load_content_records()
content_list = [] content_list = []
for content in range(len(title.tmd.content_records)): 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 # Generate the correct file name by converting the content ID into hex.
# 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 = f"{title.tmd.content_records[content].content_id:08X}"
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
# Check for a local copy of the current content if "use local files" is enabled, and use it. # 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, if use_local_chkbox is True and version_dir.joinpath(content_file_name).exists():
content_file_name)): progress_callback.emit(f" - Using local copy of content {content + 1} of {len(title.tmd.content_records)}")
progress_callback.emit(" - Using local copy of content " + str(content + 1) + " of " + content_list.append(version_dir.joinpath(content_file_name).read_bytes())
str(len(title.tmd.content_records)))
local_file = open(os.path.join(version_dir, content_file_name), "rb")
content_list.append(local_file.read())
else: else:
progress_callback.emit(" - Downloading content " + str(content + 1) + " of " + progress_callback.emit(f" - Downloading content {content + 1} of {len(title.tmd.content_records)} "
str(len(title.tmd.content_records)) + " (Content ID: " + f"(Content ID: {title.tmd.content_records[content].content_id}, Size: "
str(title.tmd.content_records[content].content_id) + ", Size: " + f"{title.tmd.content_records[content].content_size} bytes)...")
str(title.tmd.content_records[content].content_size) + " bytes)...")
content_list.append(libWiiPy.title.download_content(tid, title.tmd.content_records[content].content_id, content_list.append(libWiiPy.title.download_content(tid, title.tmd.content_records[content].content_id,
wiiu_endpoint=wiiu_nus_enabled)) wiiu_endpoint=wiiu_nus_enabled))
progress_callback.emit(" - Done!") progress_callback.emit(" - Done!")
# If keep encrypted contents is on, write out each content after its downloaded. # If keep encrypted contents is on, write out each content after its downloaded.
if keep_enc_chkbox is True: if keep_enc_chkbox is True:
enc_content_out = open(os.path.join(version_dir, content_file_name), "wb") version_dir.joinpath(content_file_name).write_bytes(content_list[content])
enc_content_out.write(content_list[content])
enc_content_out.close()
title.content.content_list = content_list title.content.content_list = content_list
# If decrypt local contents is still true, decrypt each content and write out the decrypted file. # If decrypt local contents is still true, decrypt each content and write out the decrypted file.
if decrypt_contents_enabled is True: if decrypt_contents_enabled is True:
try: try:
for content in range(len(title.tmd.content_records)): for content in range(len(title.tmd.content_records)):
progress_callback.emit(" - Decrypting content " + str(content + 1) + " of " + progress_callback.emit(f" - Decrypting content {content + 1} of {len(title.tmd.content_records)} "
str(len(title.tmd.content_records)) + " (Content ID: " + f"(Content ID: {title.tmd.content_records[content].content_id})...")
str(title.tmd.content_records[content].content_id) + ")...")
dec_content = title.get_content_by_index(content) dec_content = title.get_content_by_index(content)
content_file_name = hex(title.tmd.content_records[content].content_id)[2:] content_file_name = f"{title.tmd.content_records[content].content_id:08X}.app"
while len(content_file_name) < 8: version_dir.joinpath(content_file_name).write_bytes(dec_content)
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()
except ValueError: except ValueError:
# If libWiiPy throws an error during decryption, return code -3. This should only be possible if using # 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. # local encrypted contents that have been altered at present.
@@ -130,8 +107,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
# vWii mode. (vWii mode does not have access to the vWii key, only Wii U mode has that.) # 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"): 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...") 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.ticket.get_title_key(), 0, title.tmd.title_id)
title_key_common = libWiiPy.title.encrypt_title_key(title_key_dec, 0, title.tmd.title_id)
title.ticket.common_key_index = 0 title.ticket.common_key_index = 0
title.ticket.title_key_enc = title_key_common title.ticket.title_key_enc = title_key_common
# Get the WAD certificate chain, courtesy of libWiiPy. # Get the WAD certificate chain, courtesy of libWiiPy.
@@ -140,10 +116,12 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
# Use a typed WAD name if there is one, and auto generate one based on the TID and version if there isn't. # 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(" - Packing WAD...")
if wad_file_name != "" and wad_file_name is not None: if wad_file_name != "" and wad_file_name is not None:
if wad_file_name[-4:] != ".wad": # Batch downloads may insert -vLatest, so if it did we can fill in the real number now.
wad_file_name = wad_file_name + ".wad" wad_file_name = wad_file_name.replace("-vLatest", f"-v{title_version}")
if wad_file_name[-4:].lower() != ".wad":
wad_file_name += ".wad"
else: 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 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): if patch_ios and (tid[:8] == "00000001" and int(tid[-2:], 16) > 2):
progress_callback.emit(" - Patching IOS...") progress_callback.emit(" - Patching IOS...")
@@ -156,9 +134,7 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
progress_callback.emit(" - No patches could be applied! Is this a stub IOS?") progress_callback.emit(" - No patches could be applied! Is this a stub IOS?")
title = ios_patcher.dump() title = ios_patcher.dump()
# Have libWiiPy dump the WAD, and write that data out. # Have libWiiPy dump the WAD, and write that data out.
file = open(os.path.join(version_dir, wad_file_name), "wb") version_dir.joinpath(wad_file_name).write_bytes(title.dump_wad())
file.write(title.dump_wad())
file.close()
progress_callback.emit("Download complete!") progress_callback.emit("Download complete!")
# This is where the variables come in. If the state of these variables doesn't match the user's choice by this # 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 # point, it means that they enabled decryption or WAD packing for a title that doesn't have a ticket. Return
@@ -166,14 +142,3 @@ def run_nus_download_wii(out_folder: pathlib.Path, tid: str, version: str, pack_
if (not pack_wad_enabled and pack_wad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox): if (not pack_wad_enabled and pack_wad_chkbox) or (not decrypt_contents_enabled and decrypt_contents_chkbox):
return 1 return 1
return 0 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

163
modules/tree.py Normal file
View File

@@ -0,0 +1,163 @@
# "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 ""
archive_name = (entry.get("Archive Name") if entry.get("Archive Name") is not None
else entry.get("Name").replace(" ", "-"))
metadata = TitleData(entry.get("TID"), entry.get("Name"), archive_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

View File

@@ -1,6 +1,6 @@
[Desktop Entry] [Desktop Entry]
Name=NUSGet Name=NUSGet
Exec=/opt/NUSGet/NUSGet %U Exec=/opt/NUSGet/NUSGet.bin %U
Terminal=false Terminal=false
Type=Application Type=Application
Icon=/opt/NUSGet/NUSGet.png Icon=/opt/NUSGet/NUSGet.png

View File

@@ -3,7 +3,7 @@
################################################################################ ################################################################################
## Form generated from reading UI file 'MainMenu.ui' ## 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.8.1
## ##
## WARNING! All changes made in this file will be lost when recompiling UI file! ## WARNING! All changes made in this file will be lost when recompiling UI file!
################################################################################ ################################################################################
@@ -18,8 +18,8 @@ from PySide6.QtGui import (QBrush, QColor, QConicalGradient, QCursor,
from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QHBoxLayout, from PySide6.QtWidgets import (QApplication, QCheckBox, QComboBox, QHBoxLayout,
QHeaderView, QLabel, QLayout, QLineEdit, QHeaderView, QLabel, QLayout, QLineEdit,
QMainWindow, QMenuBar, QPushButton, QSizePolicy, QMainWindow, QMenuBar, QPushButton, QSizePolicy,
QSpacerItem, QTabWidget, QTextBrowser, QTreeWidget, QSpacerItem, QTabWidget, QTextBrowser, QTreeView,
QTreeWidgetItem, QVBoxLayout, QWidget) QVBoxLayout, QWidget)
class Ui_MainWindow(object): class Ui_MainWindow(object):
def setupUi(self, MainWindow): def setupUi(self, MainWindow):
@@ -35,37 +35,46 @@ class Ui_MainWindow(object):
self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) self.horizontalLayout_3.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.vertical_layout_trees = QVBoxLayout() self.vertical_layout_trees = QVBoxLayout()
self.vertical_layout_trees.setObjectName(u"vertical_layout_trees") self.vertical_layout_trees.setObjectName(u"vertical_layout_trees")
self.label_2 = QLabel(self.centralwidget) self.tree_filter_layout = QHBoxLayout()
self.label_2.setObjectName(u"label_2") self.tree_filter_layout.setObjectName(u"tree_filter_layout")
font = QFont() self.tree_filter_input = QLineEdit(self.centralwidget)
font.setBold(True) self.tree_filter_input.setObjectName(u"tree_filter_input")
self.label_2.setFont(font) 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 = QTabWidget(self.centralwidget)
self.platform_tabs.setObjectName(u"platform_tabs") self.platform_tabs.setObjectName(u"platform_tabs")
sizePolicy = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding) sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Expanding)
sizePolicy.setHorizontalStretch(0) sizePolicy2.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0) sizePolicy2.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth()) sizePolicy2.setHeightForWidth(self.platform_tabs.sizePolicy().hasHeightForWidth())
self.platform_tabs.setSizePolicy(sizePolicy) self.platform_tabs.setSizePolicy(sizePolicy2)
self.platform_tabs.setMinimumSize(QSize(410, 0)) self.platform_tabs.setMinimumSize(QSize(410, 0))
self.platform_tabs.setMaximumSize(QSize(410, 16777215)) self.platform_tabs.setMaximumSize(QSize(410, 16777215))
self.wii_tab = QWidget() self.wii_tab = QWidget()
self.wii_tab.setObjectName(u"wii_tab") self.wii_tab.setObjectName(u"wii_tab")
self.verticalLayout_2 = QVBoxLayout(self.wii_tab) self.verticalLayout_2 = QVBoxLayout(self.wii_tab)
self.verticalLayout_2.setObjectName(u"verticalLayout_2") self.verticalLayout_2.setObjectName(u"verticalLayout_2")
self.wii_title_tree = QTreeWidget(self.wii_tab) self.wii_title_tree = QTreeView(self.wii_tab)
__qtreewidgetitem = QTreeWidgetItem()
__qtreewidgetitem.setText(0, u"1");
self.wii_title_tree.setHeaderItem(__qtreewidgetitem)
self.wii_title_tree.setObjectName(u"wii_title_tree") 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) self.verticalLayout_2.addWidget(self.wii_title_tree)
@@ -74,16 +83,8 @@ class Ui_MainWindow(object):
self.vwii_tab.setObjectName(u"vwii_tab") self.vwii_tab.setObjectName(u"vwii_tab")
self.verticalLayout_4 = QVBoxLayout(self.vwii_tab) self.verticalLayout_4 = QVBoxLayout(self.vwii_tab)
self.verticalLayout_4.setObjectName(u"verticalLayout_4") self.verticalLayout_4.setObjectName(u"verticalLayout_4")
self.vwii_title_tree = QTreeWidget(self.vwii_tab) self.vwii_title_tree = QTreeView(self.vwii_tab)
__qtreewidgetitem1 = QTreeWidgetItem()
__qtreewidgetitem1.setText(0, u"1");
self.vwii_title_tree.setHeaderItem(__qtreewidgetitem1)
self.vwii_title_tree.setObjectName(u"vwii_title_tree") 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) self.verticalLayout_4.addWidget(self.vwii_title_tree)
@@ -92,14 +93,8 @@ class Ui_MainWindow(object):
self.dsi_tab.setObjectName(u"dsi_tab") self.dsi_tab.setObjectName(u"dsi_tab")
self.verticalLayout = QVBoxLayout(self.dsi_tab) self.verticalLayout = QVBoxLayout(self.dsi_tab)
self.verticalLayout.setObjectName(u"verticalLayout") self.verticalLayout.setObjectName(u"verticalLayout")
self.dsi_title_tree = QTreeWidget(self.dsi_tab) self.dsi_title_tree = QTreeView(self.dsi_tab)
__qtreewidgetitem2 = QTreeWidgetItem()
__qtreewidgetitem2.setText(0, u"1");
self.dsi_title_tree.setHeaderItem(__qtreewidgetitem2)
self.dsi_title_tree.setObjectName(u"dsi_title_tree") 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) self.verticalLayout.addWidget(self.dsi_title_tree)
@@ -150,21 +145,18 @@ class Ui_MainWindow(object):
self.horizontalLayout.setObjectName(u"horizontalLayout") self.horizontalLayout.setObjectName(u"horizontalLayout")
self.download_btn = QPushButton(self.centralwidget) self.download_btn = QPushButton(self.centralwidget)
self.download_btn.setObjectName(u"download_btn") self.download_btn.setObjectName(u"download_btn")
sizePolicy1 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed) sizePolicy3 = QSizePolicy(QSizePolicy.Policy.MinimumExpanding, QSizePolicy.Policy.Fixed)
sizePolicy1.setHorizontalStretch(0) sizePolicy3.setHorizontalStretch(0)
sizePolicy1.setVerticalStretch(0) sizePolicy3.setVerticalStretch(0)
sizePolicy1.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth()) sizePolicy3.setHeightForWidth(self.download_btn.sizePolicy().hasHeightForWidth())
self.download_btn.setSizePolicy(sizePolicy1) self.download_btn.setSizePolicy(sizePolicy3)
self.horizontalLayout.addWidget(self.download_btn) self.horizontalLayout.addWidget(self.download_btn)
self.script_btn = QPushButton(self.centralwidget) self.script_btn = QPushButton(self.centralwidget)
self.script_btn.setObjectName(u"script_btn") self.script_btn.setObjectName(u"script_btn")
sizePolicy2 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Fixed) sizePolicy.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
sizePolicy2.setHorizontalStretch(0) self.script_btn.setSizePolicy(sizePolicy)
sizePolicy2.setVerticalStretch(0)
sizePolicy2.setHeightForWidth(self.script_btn.sizePolicy().hasHeightForWidth())
self.script_btn.setSizePolicy(sizePolicy2)
self.horizontalLayout.addWidget(self.script_btn) self.horizontalLayout.addWidget(self.script_btn)
@@ -180,6 +172,8 @@ class Ui_MainWindow(object):
self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize) self.verticalLayout_7.setSizeConstraint(QLayout.SizeConstraint.SetMinimumSize)
self.label_3 = QLabel(self.centralwidget) self.label_3 = QLabel(self.centralwidget)
self.label_3.setObjectName(u"label_3") self.label_3.setObjectName(u"label_3")
font = QFont()
font.setBold(True)
self.label_3.setFont(font) self.label_3.setFont(font)
self.verticalLayout_7.addWidget(self.label_3) self.verticalLayout_7.addWidget(self.label_3)
@@ -189,25 +183,22 @@ class Ui_MainWindow(object):
self.pack_archive_row.setObjectName(u"pack_archive_row") self.pack_archive_row.setObjectName(u"pack_archive_row")
self.pack_archive_chkbox = QCheckBox(self.centralwidget) self.pack_archive_chkbox = QCheckBox(self.centralwidget)
self.pack_archive_chkbox.setObjectName(u"pack_archive_chkbox") self.pack_archive_chkbox.setObjectName(u"pack_archive_chkbox")
sizePolicy3 = QSizePolicy(QSizePolicy.Policy.Maximum, QSizePolicy.Policy.Fixed) sizePolicy1.setHeightForWidth(self.pack_archive_chkbox.sizePolicy().hasHeightForWidth())
sizePolicy3.setHorizontalStretch(0) self.pack_archive_chkbox.setSizePolicy(sizePolicy1)
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_chkbox.setText(u"")
self.pack_archive_row.addWidget(self.pack_archive_chkbox) self.pack_archive_row.addWidget(self.pack_archive_chkbox)
self.label_7 = QLabel(self.centralwidget) self.pack_archive_chkbox_lbl = QLabel(self.centralwidget)
self.label_7.setObjectName(u"label_7") self.pack_archive_chkbox_lbl.setObjectName(u"pack_archive_chkbox_lbl")
sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding) sizePolicy4 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.MinimumExpanding)
sizePolicy4.setHorizontalStretch(0) sizePolicy4.setHorizontalStretch(0)
sizePolicy4.setVerticalStretch(0) sizePolicy4.setVerticalStretch(0)
sizePolicy4.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth()) sizePolicy4.setHeightForWidth(self.pack_archive_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.label_7.setSizePolicy(sizePolicy4) self.pack_archive_chkbox_lbl.setSizePolicy(sizePolicy4)
self.label_7.setWordWrap(True) self.pack_archive_chkbox_lbl.setWordWrap(True)
self.pack_archive_row.addWidget(self.label_7) self.pack_archive_row.addWidget(self.pack_archive_chkbox_lbl)
self.verticalLayout_7.addLayout(self.pack_archive_row) self.verticalLayout_7.addLayout(self.pack_archive_row)
@@ -223,20 +214,20 @@ class Ui_MainWindow(object):
self.keep_enc_row.setObjectName(u"keep_enc_row") self.keep_enc_row.setObjectName(u"keep_enc_row")
self.keep_enc_chkbox = QCheckBox(self.centralwidget) self.keep_enc_chkbox = QCheckBox(self.centralwidget)
self.keep_enc_chkbox.setObjectName(u"keep_enc_chkbox") self.keep_enc_chkbox.setObjectName(u"keep_enc_chkbox")
sizePolicy3.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.keep_enc_chkbox.sizePolicy().hasHeightForWidth())
self.keep_enc_chkbox.setSizePolicy(sizePolicy3) self.keep_enc_chkbox.setSizePolicy(sizePolicy1)
self.keep_enc_chkbox.setText(u"") self.keep_enc_chkbox.setText(u"")
self.keep_enc_chkbox.setChecked(True) self.keep_enc_chkbox.setChecked(True)
self.keep_enc_row.addWidget(self.keep_enc_chkbox) self.keep_enc_row.addWidget(self.keep_enc_chkbox)
self.label_6 = QLabel(self.centralwidget) self.keep_enc_chkbox_lbl = QLabel(self.centralwidget)
self.label_6.setObjectName(u"label_6") self.keep_enc_chkbox_lbl.setObjectName(u"keep_enc_chkbox_lbl")
sizePolicy4.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) sizePolicy4.setHeightForWidth(self.keep_enc_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.label_6.setSizePolicy(sizePolicy4) self.keep_enc_chkbox_lbl.setSizePolicy(sizePolicy4)
self.label_6.setWordWrap(True) self.keep_enc_chkbox_lbl.setWordWrap(True)
self.keep_enc_row.addWidget(self.label_6) self.keep_enc_row.addWidget(self.keep_enc_chkbox_lbl)
self.verticalLayout_7.addLayout(self.keep_enc_row) self.verticalLayout_7.addLayout(self.keep_enc_row)
@@ -246,8 +237,8 @@ class Ui_MainWindow(object):
self.create_dec_row.setObjectName(u"create_dec_row") self.create_dec_row.setObjectName(u"create_dec_row")
self.create_dec_chkbox = QCheckBox(self.centralwidget) self.create_dec_chkbox = QCheckBox(self.centralwidget)
self.create_dec_chkbox.setObjectName(u"create_dec_chkbox") self.create_dec_chkbox.setObjectName(u"create_dec_chkbox")
sizePolicy3.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.create_dec_chkbox.sizePolicy().hasHeightForWidth())
self.create_dec_chkbox.setSizePolicy(sizePolicy3) self.create_dec_chkbox.setSizePolicy(sizePolicy1)
self.create_dec_chkbox.setText(u"") self.create_dec_chkbox.setText(u"")
self.create_dec_row.addWidget(self.create_dec_chkbox) self.create_dec_row.addWidget(self.create_dec_chkbox)
@@ -269,8 +260,8 @@ class Ui_MainWindow(object):
self.use_local_chkbox = QCheckBox(self.centralwidget) self.use_local_chkbox = QCheckBox(self.centralwidget)
self.use_local_chkbox.setObjectName(u"use_local_chkbox") self.use_local_chkbox.setObjectName(u"use_local_chkbox")
self.use_local_chkbox.setEnabled(True) self.use_local_chkbox.setEnabled(True)
sizePolicy3.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.use_local_chkbox.sizePolicy().hasHeightForWidth())
self.use_local_chkbox.setSizePolicy(sizePolicy3) self.use_local_chkbox.setSizePolicy(sizePolicy1)
self.use_local_chkbox.setText(u"") self.use_local_chkbox.setText(u"")
self.use_local_row.addWidget(self.use_local_chkbox) self.use_local_row.addWidget(self.use_local_chkbox)
@@ -292,8 +283,8 @@ class Ui_MainWindow(object):
self.use_wiiu_nus_row.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint) self.use_wiiu_nus_row.setSizeConstraint(QLayout.SizeConstraint.SetDefaultConstraint)
self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget) self.use_wiiu_nus_chkbox = QCheckBox(self.centralwidget)
self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox") self.use_wiiu_nus_chkbox.setObjectName(u"use_wiiu_nus_chkbox")
sizePolicy.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy2.setHeightForWidth(self.use_wiiu_nus_chkbox.sizePolicy().hasHeightForWidth())
self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy) self.use_wiiu_nus_chkbox.setSizePolicy(sizePolicy2)
self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight) self.use_wiiu_nus_chkbox.setLayoutDirection(Qt.LayoutDirection.LeftToRight)
self.use_wiiu_nus_chkbox.setText(u"") self.use_wiiu_nus_chkbox.setText(u"")
self.use_wiiu_nus_chkbox.setChecked(True) self.use_wiiu_nus_chkbox.setChecked(True)
@@ -317,20 +308,20 @@ class Ui_MainWindow(object):
self.patch_ios_chkbox = QCheckBox(self.centralwidget) self.patch_ios_chkbox = QCheckBox(self.centralwidget)
self.patch_ios_chkbox.setObjectName(u"patch_ios_chkbox") self.patch_ios_chkbox.setObjectName(u"patch_ios_chkbox")
self.patch_ios_chkbox.setEnabled(False) self.patch_ios_chkbox.setEnabled(False)
sizePolicy3.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.patch_ios_chkbox.sizePolicy().hasHeightForWidth())
self.patch_ios_chkbox.setSizePolicy(sizePolicy3) self.patch_ios_chkbox.setSizePolicy(sizePolicy1)
self.patch_ios_chkbox.setText(u"") self.patch_ios_chkbox.setText(u"")
self.patch_ios_row.addWidget(self.patch_ios_chkbox) self.patch_ios_row.addWidget(self.patch_ios_chkbox)
self.patch_ios_lbl = QLabel(self.centralwidget) self.patch_ios_chkbox_lbl = QLabel(self.centralwidget)
self.patch_ios_lbl.setObjectName(u"patch_ios_lbl") self.patch_ios_chkbox_lbl.setObjectName(u"patch_ios_chkbox_lbl")
self.patch_ios_lbl.setEnabled(True) self.patch_ios_chkbox_lbl.setEnabled(True)
sizePolicy4.setHeightForWidth(self.patch_ios_lbl.sizePolicy().hasHeightForWidth()) sizePolicy4.setHeightForWidth(self.patch_ios_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.patch_ios_lbl.setSizePolicy(sizePolicy4) self.patch_ios_chkbox_lbl.setSizePolicy(sizePolicy4)
self.patch_ios_lbl.setWordWrap(True) self.patch_ios_chkbox_lbl.setWordWrap(True)
self.patch_ios_row.addWidget(self.patch_ios_lbl) self.patch_ios_row.addWidget(self.patch_ios_chkbox_lbl)
self.verticalLayout_7.addLayout(self.patch_ios_row) self.verticalLayout_7.addLayout(self.patch_ios_row)
@@ -360,23 +351,23 @@ class Ui_MainWindow(object):
self.pack_vwii_mode_chkbox = QCheckBox(self.centralwidget) self.pack_vwii_mode_chkbox = QCheckBox(self.centralwidget)
self.pack_vwii_mode_chkbox.setObjectName(u"pack_vwii_mode_chkbox") self.pack_vwii_mode_chkbox.setObjectName(u"pack_vwii_mode_chkbox")
self.pack_vwii_mode_chkbox.setEnabled(False) self.pack_vwii_mode_chkbox.setEnabled(False)
sizePolicy3.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth()) sizePolicy1.setHeightForWidth(self.pack_vwii_mode_chkbox.sizePolicy().hasHeightForWidth())
self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy3) self.pack_vwii_mode_chkbox.setSizePolicy(sizePolicy1)
self.pack_vwii_mode_chkbox.setText(u"") self.pack_vwii_mode_chkbox.setText(u"")
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox) self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox)
self.pack_vwii_mode_lbl = QLabel(self.centralwidget) self.pack_vwii_mode_chkbox_lbl = QLabel(self.centralwidget)
self.pack_vwii_mode_lbl.setObjectName(u"pack_vwii_mode_lbl") self.pack_vwii_mode_chkbox_lbl.setObjectName(u"pack_vwii_mode_chkbox_lbl")
self.pack_vwii_mode_lbl.setEnabled(True) self.pack_vwii_mode_chkbox_lbl.setEnabled(True)
sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred) sizePolicy5 = QSizePolicy(QSizePolicy.Policy.Preferred, QSizePolicy.Policy.Preferred)
sizePolicy5.setHorizontalStretch(0) sizePolicy5.setHorizontalStretch(0)
sizePolicy5.setVerticalStretch(0) sizePolicy5.setVerticalStretch(0)
sizePolicy5.setHeightForWidth(self.pack_vwii_mode_lbl.sizePolicy().hasHeightForWidth()) sizePolicy5.setHeightForWidth(self.pack_vwii_mode_chkbox_lbl.sizePolicy().hasHeightForWidth())
self.pack_vwii_mode_lbl.setSizePolicy(sizePolicy5) self.pack_vwii_mode_chkbox_lbl.setSizePolicy(sizePolicy5)
self.pack_vwii_mode_lbl.setWordWrap(True) self.pack_vwii_mode_chkbox_lbl.setWordWrap(True)
self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_lbl) self.pack_vwii_mode_row.addWidget(self.pack_vwii_mode_chkbox_lbl)
self.verticalLayout_8.addLayout(self.pack_vwii_mode_row) self.verticalLayout_8.addLayout(self.pack_vwii_mode_row)
@@ -421,7 +412,8 @@ class Ui_MainWindow(object):
def retranslateUi(self, MainWindow): def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None)) MainWindow.setWindowTitle(QCoreApplication.translate("MainWindow", u"MainWindow", None))
self.label_2.setText(QCoreApplication.translate("MainWindow", u"Available Titles", 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.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.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)) self.platform_tabs.setTabText(self.platform_tabs.indexOf(self.dsi_tab), QCoreApplication.translate("MainWindow", u"DSi", None))
@@ -434,15 +426,15 @@ class Ui_MainWindow(object):
self.download_btn.setText(QCoreApplication.translate("MainWindow", u"Start Download", None)) self.download_btn.setText(QCoreApplication.translate("MainWindow", u"Start Download", None))
self.script_btn.setText(QCoreApplication.translate("MainWindow", u"Run Script", 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_3.setText(QCoreApplication.translate("MainWindow", u"General Settings", None))
self.label_7.setText(QCoreApplication.translate("MainWindow", u"Pack installable archive (WAD/TAD)", None)) self.pack_archive_chkbox_lbl.setText(QCoreApplication.translate("MainWindow", u"Pack installable archive (WAD/TAD)", None))
self.archive_file_entry.setPlaceholderText(QCoreApplication.translate("MainWindow", u"File Name", 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.keep_enc_chkbox_lbl.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.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_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.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.patch_ios_chkbox_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.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.pack_vwii_mode_chkbox_lbl.setText(QCoreApplication.translate("MainWindow", u"Re-encrypt title using the Wii Common Key", None))
self.log_text_browser.setMarkdown("") 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" 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" "<html><head><meta name=\"qrichtext\" content=\"1\" /><meta charset=\"utf-8\" /><style type=\"text/css\">\n"

View File

@@ -33,16 +33,34 @@
<item> <item>
<layout class="QVBoxLayout" name="vertical_layout_trees"> <layout class="QVBoxLayout" name="vertical_layout_trees">
<item> <item>
<widget class="QLabel" name="label_2"> <layout class="QHBoxLayout" name="tree_filter_layout">
<property name="font"> <item>
<font> <widget class="QLineEdit" name="tree_filter_input">
<bold>true</bold> <property name="sizePolicy">
</font> <sizepolicy hsizetype="Preferred" vsizetype="Fixed">
</property> <horstretch>0</horstretch>
<property name="text"> <verstretch>0</verstretch>
<string>Available Titles</string> </sizepolicy>
</property> </property>
</widget> <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>
<item> <item>
<widget class="QTabWidget" name="platform_tabs"> <widget class="QTabWidget" name="platform_tabs">
@@ -73,28 +91,7 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_2"> <layout class="QVBoxLayout" name="verticalLayout_2">
<item> <item>
<widget class="QTreeWidget" name="wii_title_tree"> <widget class="QTreeView" 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>
</item> </item>
</layout> </layout>
</widget> </widget>
@@ -104,28 +101,7 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout_4"> <layout class="QVBoxLayout" name="verticalLayout_4">
<item> <item>
<widget class="QTreeWidget" name="vwii_title_tree"> <widget class="QTreeView" 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>
</item> </item>
</layout> </layout>
</widget> </widget>
@@ -135,22 +111,7 @@
</attribute> </attribute>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<item> <item>
<widget class="QTreeWidget" name="dsi_title_tree"> <widget class="QTreeView" 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>
</item> </item>
</layout> </layout>
</widget> </widget>
@@ -297,7 +258,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_7"> <widget class="QLabel" name="pack_archive_chkbox_lbl">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -346,7 +307,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="label_6"> <widget class="QLabel" name="keep_enc_chkbox_lbl">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding"> <sizepolicy hsizetype="Preferred" vsizetype="MinimumExpanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
@@ -505,7 +466,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="patch_ios_lbl"> <widget class="QLabel" name="patch_ios_chkbox_lbl">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>
@@ -595,7 +556,7 @@
</widget> </widget>
</item> </item>
<item> <item>
<widget class="QLabel" name="pack_vwii_mode_lbl"> <widget class="QLabel" name="pack_vwii_mode_chkbox_lbl">
<property name="enabled"> <property name="enabled">
<bool>true</bool> <bool>true</bool>
</property> </property>

View File

@@ -4,7 +4,6 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../../NUSGet.py" line="85"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -16,6 +15,31 @@ Titles marked with a checkmark are free and have a ticket available, and can be
Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source>
<translatorcomment>&quot;Downloads&quot; in German copies of Windows and macOS isn&apos;t translated <translatorcomment>&quot;Downloads&quot; in German copies of Windows and macOS isn&apos;t translated
Specified that the tickets for titles with a checkmark are publicly available, for clarity in the translation</translatorcomment>
<translation type="vanished">NUSGet v{nusget_version}
Entwickelt von NinjaCheetah
Nutzt libWiiPy {libwiipy_version}
Unterstützung für DSi bereitgestelt durch libTWLPy {libtwlpy_version}
Wähle einen Titel aus der Liste auf der linken Seite oder gebe eine Title-ID ein, um zu beginnen.
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 nicht entschlüsselt oder verpackt werden.
Titel werden in einem &quot;NUSGet&quot; Ordner innerhalb des Downloads-Ordners gespeichert.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translatorcomment>&quot;Downloads&quot; in German copies of Windows and macOS isn&apos;t translated
Specified that the tickets for titles with a checkmark are publicly available, for clarity in the translation</translatorcomment> Specified that the tickets for titles with a checkmark are publicly available, for clarity in the translation</translatorcomment>
<translation>NUSGet v{nusget_version} <translation>NUSGet v{nusget_version}
Entwickelt von NinjaCheetah Entwickelt von NinjaCheetah
@@ -24,141 +48,178 @@ Unterstützung für DSi bereitgestelt durch libTWLPy {libtwlpy_version}
Wähle einen Titel aus der Liste auf der linken Seite oder gebe eine Title-ID ein, 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 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, 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 nicht entschlüsselt oder verpackt werden.
Titel werden in einem &quot;NUSGet&quot; Ordner innerhalb des Downloads-Ordners gespeichert.</translation> Titel werden in einem &quot;NUSGet Downloads&quot; Ordner innerhalb des Downloads-Ordners gespeichert.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation>NUSGet-Update verfügbar</translation> <translation>NUSGet-Update verfügbar</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation>Eine neuere Version von NUSGet ist verfügbar.</translation> <translation>Eine neuere Version von NUSGet ist verfügbar.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translatorcomment>Changed from &quot;output&quot; to &quot;packaging&quot; for clarity</translatorcomment> <translatorcomment>Changed from &quot;output&quot; to &quot;packaging&quot; for clarity</translatorcomment>
<translation>Keine Verpackmethode ausgewählt</translation> <translation>Keine Verpackmethode ausgewählt</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <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 keine Methode zum Verpacken der Inhalte ausgewählt.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <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> <translatorcomment>Explicitly mentions options for clarity</translatorcomment>
<translation>Es muss mindestens &quot;verschlüsselte Inhalte speichern&quot;, &quot;entschlüsselte Inhalte speichern&quot; oder &quot;Verpacke als WAD/TAD&quot; ausgewählt worden sein.</translation> <translation>Es muss mindestens &quot;verschlüsselte Inhalte speichern&quot;, &quot;entschlüsselte Inhalte speichern (*.app)&quot; oder &quot;Installierbar verpacken (WAD/TAD)&quot; ausgewählt worden sein.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation>Fehlerhafte Title-ID</translation> <translation>Fehlerhafte Title-ID</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <source>The Title ID you have entered is not in a valid format!</source>
<translation>Die eingegebene Title-ID ist nicht korrekt.</translation> <translation>Die eingegebene Title-ID ist nicht korrekt.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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>Die Title-ID muss mindestens 16 alphanumerische Zeichen enthalten.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation>Title-ID/Version nicht gefunden</translation> <translation>Title-ID/Version nicht gefunden</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <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> <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> <translation>Es konnte kein Titel mit der gegebenen Title-ID oder Version gefunden werden.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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>Die Title-ID könnte möglicherweise fehlerhaft sein.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation>Entschlüsselung fehlgeschlagen</translation> <translation>Entschlüsselung fehlgeschlagen</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <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> <translation>Die Inhalte des Titels konnten nicht korrekt entschlüsselt werden.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, 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. &quot;Lokale Dateien nutzen&quot; kann ausgeschaltet werden, um diese erneut herunterzuladen.</translation> <translation>Die gespeicherte TMD oder das Ticket könnten möglicherweise fehlerhaft sein. &quot;Lokale Dateien nutzen&quot; kann deaktiviert werden, um diese erneut herunterzuladen.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation>Ticket nicht verfügbar</translation> <translation>Ticket nicht verfügbar</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation>Kein Ticket konnte für den geforderten Titel gefunden werden.</translation> <translation>Es konnte kein Ticket für den geforderten Titel gefunden werden.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. 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>Das Ticket zum Entschlüsseln konnte nicht heruntergeladen werden, jedoch ist &quot;Installierbar verpacken&quot; bzw. &quot;Entschlüsselte Inhalte speichern&quot; aktiv. Diese Optionen erfordern ein Ticket, daher wurden nur verschlüsselte Inhalte gespeichert.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation>Unbekannter Fehler</translation> <translation>Unbekannter Fehler</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation>Ein unbekannter Fehler ist aufgetreten.</translation> <translation>Ein unbekannter Fehler ist aufgetreten.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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>Versuchen Sie es erneut. Sofern das Problem bestehen bleibt, können Sie ein Issue auf GitHub öffnen, um den Fehler zu berichten.</translation>
</message> </message>
<message>
<location filename="../../NUSGet.py" line="363"/>
<source>Script Issues Occurred</source>
<translation>Script-Fehler</translation>
</message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>Open NUS script</source> <source>Some issues occurred while running the download script.</source>
<translation>Ein Fehler ist im Script aufgetreten.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translatorcomment>To keep the indirectness of other text, this was changed to &quot;Error details have been written to the log.&quot;</translatorcomment>
<translation>Fehlerdetails wurden in den Log geschrieben.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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 angezeigten Titel konnten wegen einem Fehler nicht heruntergeladen werden. Die Title-ID oder Version im Script könnte wohlmöglich fehlerhaft sein.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation>&quot;Entschlüsselte Inhalte speichern&quot; bzw. &quot;Installierbar verpacken&quot; ist aktiv, jedoch fehlen Tickets für die angezeigten Titel. Sofern aktiv werden die verschlüsselten Inhalte trotzdem heruntergeladen.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation>Script-Herunterladen fehlgeschlagen</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translatorcomment>Translating the file type is pointless, since it&apos;s not an actual &quot;script&quot;</translatorcomment> <translatorcomment>Translating the file type is pointless, since it&apos;s not an actual &quot;script&quot;</translatorcomment>
<translation>NUS-Script öffnen</translation> <translation>NUS-Script öffnen</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>NUS Scripts (*.nus *.json)</source>
<translation>NUS Script (*.nus *.txt)</translation> <translatorcomment>&quot;Scripts&quot; isn&apos;t the correct way to pluralize a word, and &quot;Scripte&quot; would misalign with referring to them as &quot;Script&quot;, so we just keep it as-is (it sounds plural enough anyway!)</translatorcomment>
<translation>NUS-Script (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation>Ein Fehler ist während des Parsen des Script aufgetreten.</translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source> <translation>Ein Fehler wurde in Linie {e.lineno}, Spalte {e.colno} gefunden. Das Script muss korrigiert werden.</translation>
<translation>Script-Fehler</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="424"/>
<source>Failed to open the script.</source> <source>An error occurred while parsing Title IDs!</source>
<translation>Konnte das NUS-Script nicht öffnen.</translation> <translation>Ein Fehler ist während des Parsen der Title-IDs aufgetreten.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>Der Titel an Stelle {script_data.index(title)} hat keine Title-ID.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
@@ -167,7 +228,7 @@ Could not check for updates.</source>
Konnte nicht nach Updates suchen.</translation> Konnte nicht nach Updates suchen.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
@@ -176,7 +237,7 @@ There&apos;s a newer version of NUSGet available!</source>
Eine neuere Version von NUSGet ist verfügbar.</translation> Eine neuere Version von NUSGet ist verfügbar.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>
@@ -192,112 +253,117 @@ Die neuste Version von NUSGet ist bereits aktiv.</translation>
<translation>Hauptmenü</translation> <translation>Hauptmenü</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/> <location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Available Titles</source> <source>Search</source>
<translation>Verfügbare Titel</translation> <translation>Suche</translation>
</message> </message>
<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> <source>Wii</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translatorcomment>We do not translate &quot;Title ID&quot; beyond making it grammatically correct (hence the dash), since it refers to a NUS specific component</translatorcomment> <translatorcomment>We do not translate &quot;Title ID&quot; beyond making it grammatically correct (hence the dash), since it refers to a NUS specific component</translatorcomment>
<translation>Title-ID</translation> <translation>Title-ID</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <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> <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></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translatorcomment>The same word is used in German</translatorcomment> <translatorcomment>The same word is used in German</translatorcomment>
<translation></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation>Konsole:</translation> <translation>Konsole:</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation>Herunterladen</translation> <translation>Herunterladen</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation>Script starten</translation> <translation>Script starten</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation>Einstellungen</translation> <translation>Einstellungen</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation>Installierbar verpacken (WAD/TAD)</translation> <translation>Installierbar verpacken (WAD/TAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation>Dateiname</translation> <translation>Dateiname</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation>Verschlüsselte Inhalte speichern</translation> <translation>Verschlüsselte Inhalte speichern</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation>Entschlüsselte Inhalte speichern (*.app)</translation> <translation>Entschlüsselte Inhalte speichern (*.app)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation>Lokale Dateien nutzen, sofern verfügbar</translation> <translation>Lokale Dateien nutzen, sofern verfügbar</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <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> <translation>Wii U-NUS nutzen (schneller, gilt nur für Wii/vWii)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translatorcomment>&quot;Patch&quot; does not have a good translation into German, and in most modding forums, it&apos;s used as is</translatorcomment> <translatorcomment>&quot;Patch&quot; does not have a good translation into German, and in most modding forums, it&apos;s used as is</translatorcomment>
<translation>Patches für IOS anwenden (Gilt nur für WAD)</translation> <translation>Patches für IOS anwenden (Gilt nur für WAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation>vWii Titel-Einstellungen</translation> <translation>vWii Titel-Einstellungen</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translatorcomment>Common key does not get translated</translatorcomment> <translatorcomment>Common key does not get translated</translatorcomment>
<translation>Titel mit dem Common-Key der Wii neu verschlüsseln</translation> <translation>Titel mit dem Common-Key der Wii neu verschlüsseln</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }

View File

@@ -4,25 +4,25 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="72"/> <location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source> <source>Wii</source>
<translatorcomment>Does not change.</translatorcomment> <translatorcomment>Does not change.</translatorcomment>
<translation type="unfinished">Wii</translation> <translation type="unfinished">Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translatorcomment>Does not change.</translatorcomment> <translatorcomment>Does not change.</translatorcomment>
<translation>vWii</translation> <translation>vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translatorcomment>Does not change.</translatorcomment> <translatorcomment>Does not change.</translatorcomment>
<translation>DSi</translation> <translation>DSi</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translatorcomment>Does not change.</translatorcomment> <translatorcomment>Does not change.</translatorcomment>
<translation>v</translation> <translation>v</translation>
@@ -33,82 +33,87 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/> <location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Available Titles</source> <source>Search</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -120,12 +125,12 @@ li.checked::marker { content: &quot;\2612&quot;; }
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="85"/> <location filename="../../NUSGet.py" line="98"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -135,150 +140,185 @@ 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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <source>You have not selected any format to output the data in!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <source>Please select at least one option for how you would like the download to be saved.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <source>The Title ID you have entered is not in a valid format!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <source>No title with the provided Title ID or version could be found!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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 type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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 type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="363"/>
<source>Open NUS script</source> <source>Script Issues Occurred</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>Some issues occurred while running the download script.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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 type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="424"/>
<source>Failed to open the script.</source> <source>An error occurred while parsing Title IDs!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>

View File

@@ -4,7 +4,7 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../../NUSGet.py" line="85"/> <location filename="../../NUSGet.py" line="98"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -14,132 +14,167 @@ 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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <source>You have not selected any format to output the data in!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <source>Please select at least one option for how you would like the download to be saved.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <source>The Title ID you have entered is not in a valid format!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <source>No title with the provided Title ID or version could be found!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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 type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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 type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="363"/>
<source>Open NUS script</source> <source>Script Issues Occurred</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>Some issues occurred while running the download script.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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 type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="424"/>
<source>Failed to open the script.</source> <source>An error occurred while parsing Title IDs!</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@@ -148,107 +183,112 @@ Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downl
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/> <location filename="../../qt/ui/MainMenu.ui" line="46"/>
<source>Available Titles</source> <source>Search</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="72"/> <location filename="../../qt/ui/MainMenu.ui" line="59"/>
<source>Clear</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="90"/>
<source>Wii</source> <source>Wii</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -260,21 +300,21 @@ li.checked::marker { content: &quot;\2612&quot;; }
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>

View File

@@ -9,102 +9,111 @@
<translation>Finestra principale</translation> <translation>Finestra principale</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
<source>Available Titles</source> <source>Available Titles</source>
<translation>Titoli disponibili</translation> <translation type="vanished">Titoli disponibili</translation>
</message> </message>
<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> <source>Wii</source>
<translation>Wii</translation> <translation>Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation>vWii</translation> <translation>vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation>DSi</translation> <translation>DSi</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation>ID Titolo</translation> <translation>ID Titolo</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translation>v</translation> <translation>v</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation>Versione</translation> <translation>Versione</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation>Console:</translation> <translation>Console:</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation>Avvia download</translation> <translation>Avvia download</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation>Avvia Script</translation> <translation>Avvia Script</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation>Impostazioni generali</translation> <translation>Impostazioni generali</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation>Archivio installabile (WAD/TAD)</translation> <translation>Archivio installabile (WAD/TAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation>Nome del file</translation> <translation>Nome del file</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation>Mantieni contenuti criptati</translation> <translation>Mantieni contenuti criptati</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation>Crea contenuto decriptato (*.app)</translation> <translation>Crea contenuto decriptato (*.app)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation>Usa file locali, se esistenti</translation> <translation>Usa file locali, se esistenti</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <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>Usa il NUS di Wii U (più veloce, riguarda solo Wii/vWii)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation>Impostazioni titoli vWii</translation> <translation>Impostazioni titoli vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation>Cripta titolo usando la Chiave Comune Wii</translation> <translation>Cripta titolo usando la Chiave Comune Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -135,122 +144,195 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation> &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>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 &quot;NUSGet Downloads&quot; all&apos;interno della cartella Download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation>Nessun output selezionato</translation> <translation>Nessun output selezionato</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <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> <translation>Non hai selezionato alcun formato in cui esportare i dati!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <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> <translation>Per favore scegli almeno un opzione per come vorresti che fosse salvato il download.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation>ID Titolo invalido</translation> <translation>ID Titolo invalido</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <source>The Title ID you have entered is not in a valid format!</source>
<translation>L&apos; ID Titolo che hai inserito non è in un formato valido!</translation> <translation>L&apos; ID Titolo che hai inserito non è in un formato valido!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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 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>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation>ID Titolo/Versione non trovata</translation> <translation>ID Titolo/Versione non trovata</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <source>No title with the provided Title ID or version could be found!</source>
<translation>Non è stato trovato nessun titolo con l&apos; ID Titolo o versione data!</translation> <translation>Non è stato trovato nessun titolo con l&apos; ID Titolo o versione data!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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&apos; ID Titolo valido, o scegline uno dal database, e che la versione richiesta esista per il titolo che vuoi scaricare.</translation> <translation>Assicurati di aver inserito un&apos; ID Titolo valido, o scegline uno dal database, e che la versione richiesta esista per il titolo che vuoi scaricare.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation>Decriptazione contenuti fallita</translation> <translation>Decriptazione contenuti fallita</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <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>La decriptazione dei contenuti non è andata a buon fine! I contenuti decriptadi non sono stati creati.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, 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 &quot;Usa file locali, se esistenti&quot;, prova a disabilitare quell&apos;opzione prima di riprovare a scaricare per aggiustare potenziali errori coi dati locali.</translation> <translation>Il tuo TMD o Ticket potrebbe essere danneggiato, o potrebbe non corrispondere col contenuto da decriptare. Se hai selezionato &quot;Usa file locali, se esistenti&quot;, prova a disabilitare quell&apos;opzione prima di riprovare a scaricare per aggiustare potenziali errori coi dati locali.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation>Ticket non disponibile</translation> <translation>Ticket non disponibile</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation>Nessun ticket disponibile per il titolo richiesto!</translation> <translation>Nessun ticket disponibile per il titolo richiesto!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. 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 &quot;Crea archivio installabile&quot; o &quot;Crea contenuto decriptato&quot;. Queste opzioni non sono disponibili per i titoli senza un ticket. Sono stati salvati solo i contenuti criptati.</translation> <translation>Non è stato possibile scaricare un ticket per il titolo richiesto, ma hai selezionato &quot;Crea archivio installabile&quot; o &quot;Crea contenuto decriptato&quot;. Queste opzioni non sono disponibili per i titoli senza un ticket. Sono stati salvati solo i contenuti criptati.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation>Errore sconosciuto</translation> <translation>Errore sconosciuto</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation>Errore sconosciuto!</translation> <translation>Errore sconosciuto!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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> <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>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="363"/>
<source>Open NUS script</source> <source>Script Issues Occurred</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>
<translation>Errore script</translation> <translation>Errore script</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="364"/>
<source>Failed to open the script.</source> <source>Some issues occurred while running the download script.</source>
<translation>Impossibile aprire lo script.</translation> <translation>Ci sono stati degli errori con lo script di download.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation>Guarda i log per più dettagli sull&apos;errore.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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&apos;ID Titolo e la versione nello script siano validi.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation>Download script fallito</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation>Apri script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scrpit NUS (*.nus *.txt)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation>Ci sono stati degli errori con lo script di download!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="415"/>
<source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<translation>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="424"/>
<source>An error occurred while parsing Title IDs!</source>
<translation>Ci sono stati degli errori con GLI id tITOLO!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>The title at index {script_data.index(title)} does not have a Title ID!</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>
<message> <message>
<location filename="../../NUSGet.py" line="85"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -261,7 +343,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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source>
<translation>NUSGet v{nusget_version} <translation type="vanished">NUSGet v{nusget_version}
Sviluppato da NinjaCheetah Sviluppato da NinjaCheetah
Funzionante con libWiiPy {libwiipy_version} Funzionante con libWiiPy {libwiipy_version}
@@ -272,40 +354,42 @@ I titoli marcati da una spunta sono disponibili e hanno un ticket libero, e poss
I titoli verranno scaricati nella cartella &quot;NUSGet&quot; all&apos;interno della cartella Download.</translation> I titoli verranno scaricati nella cartella &quot;NUSGet&quot; all&apos;interno della cartella Download.</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translation>Applica patch agli IOS (Solo per le WAD)</translation> <translation>Applica patch agli IOS (Solo per le WAD)</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation>Aggiornamento di NUSGet disponibile</translation> <translation>Aggiornamento di NUSGet disponibile</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation>Una nuova versione di NUSGet è disponibile!</translation> <translation>Una nuova versione di NUSGet è disponibile!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
<translation>Impossibile trovare eventuali aggiornamenti.</translation> <translation>Impossibile trovare eventuali aggiornamenti.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
<translation>Una nuova versione di NUSGet è disponibile!</translation> <translation>Una nuova versione di NUSGet è disponibile!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>
<translation>Stai utilizzando l&apos;ultima versione di NUSGet.</translation> <translation>
Stai utilizzando l&apos;ultima versione di NUSGet.</translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@@ -0,0 +1,400 @@
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ko_KR">
<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="269"/>
<source>Pack installable archive (WAD/TAD)</source>
<translation> (WAD/TAD) </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source>
<translation> (*.app) </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source>
<translation> </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source>
<translation>Wii U NUS ( Wii/vWii에만 )</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source>
<translation>vWii </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source>
<translation>Wii </translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="vanished">&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Sans Serif&apos;; font-size:9pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>NUSGet v{nusget_version}
개발자 : NinjaCheetah
libWiiPy {libwiipy_version}
DSi 지원 : libTWLPy {libtwlpy_version}
ID를 .
, WAD TAD에 / . X가 .
&quot;NUSGet Downloads&quot; .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="289"/>
<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="318"/>
<source>Invalid Title ID</source>
<translation> ID</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source>
<translation> ID의 !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="321"/>
<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="323"/>
<source>Title ID/Version Not Found</source>
<translation> ID/ </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source>
<translation> ID !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="326"/>
<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="328"/>
<source>Content Decryption Failed</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation> ! .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source>
<translation>TMD . &quot; &quot; , .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source>
<translation> &quot; &quot; &quot; &quot; . . .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="344"/>
<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="363"/>
<source>Script Issues Occurred</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="364"/>
<source>Some issues occurred while running the download script.</source>
<translation> .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="366"/>
<source>Check the log for more details about what issues were encountered.</source>
<translation> .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation>&quot; &quot; &quot; &quot; . .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="402"/>
<source>Script Download Failed</source>
<translation> </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation>NUS </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation> !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="415"/>
<source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<translation>{e.lineno} , {e.colno} . .</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="424"/>
<source>An error occurred while parsing Title IDs!</source>
<translation> ID를 !</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>{script_data.index(title)} ID가 !</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 &quot;NUSGet&quot; inside your downloads folder.</source>
<translation type="vanished">NUSGet v{nusget_version}
개발자 : NinjaCheetah
libWiiPy {libwiipy_version}
DSi 지원 : libTWLPy {libtwlpy_version}
ID를 .
, WAD TAD에 / . X가 .
&quot;NUSBet&quot; .</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source>
<translation>IOS에 (WAD에만 )</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source>
<translation>NUSGet </translation>
</message>
<message>
<location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source>
<translation>NUSBet의 !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="52"/>
<source>
Could not check for updates.</source>
<translation>
.</translation>
</message>
<message>
<location filename="../../modules/core.py" line="60"/>
<source>
There&apos;s a newer version of NUSGet available!</source>
<translation>
NUSBet의 !</translation>
</message>
<message>
<location filename="../../modules/core.py" line="62"/>
<source>
You&apos;re running the latest release of NUSGet.</source>
<translation>
NUSGet의 .</translation>
</message>
</context>
</TS>

View File

@@ -9,102 +9,111 @@
<translation>MainWindow</translation> <translation>MainWindow</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
<source>Available Titles</source> <source>Available Titles</source>
<translation>Tilgjengelige Titler</translation> <translation type="vanished">Tilgjengelige Titler</translation>
</message> </message>
<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> <source>Wii</source>
<translation>Wii</translation> <translation>Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation>vWii</translation> <translation>vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation>DSi</translation> <translation>DSi</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation>Tittel ID</translation> <translation>Tittel ID</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translation>v</translation> <translation>v</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation>Versjon</translation> <translation>Versjon</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation>Konsoll:</translation> <translation>Konsoll:</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation>Start Nedlasting</translation> <translation>Start Nedlasting</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation type="unfinished"></translation> <translation>Kjøre Skript</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation>Generelle Instillinger</translation> <translation>Generelle Instillinger</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation>Pakke installerbart arkiv (WAD/TAD)</translation> <translation>Pakke installerbart arkiv (WAD/TAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation>Filnavn</translation> <translation>Filnavn</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation>Oppbevar kryptert innhold</translation> <translation>Oppbevar kryptert innhold</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation>Opprette dekryptert innold (*.app)</translation> <translation>Opprette dekryptert innold (*.app)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation>Bruk lokale filer, hvis de finnes</translation> <translation>Bruk lokale filer, hvis de finnes</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <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>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation>vWii Tittelinstillinger</translation> <translation>vWii Tittelinstillinger</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation> <translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -113,7 +122,14 @@ li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; } li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
@@ -128,7 +144,6 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation> &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="85"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -139,7 +154,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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source>
<translation>NUSGet v{nusget_version} <translation type="vanished">NUSGet v{nusget_version}
Utviklet av NinjaCheetah Utviklet av NinjaCheetah
Drevet av libWiiPy {libwiipy_version} Drevet av libWiiPy {libwiipy_version}
DSi støtte levert av libTWLPy {libtwlpy_version} DSi støtte levert av libTWLPy {libtwlpy_version}
@@ -151,155 +166,219 @@ Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypte
Titler er lastes ned til en mappe med navnet &quot;NUSGet&quot; i nedlastingsmappen din.</translation> Titler er lastes ned til en mappe med navnet &quot;NUSGet&quot; i nedlastingsmappen din.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>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 &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation type="unfinished"></translation> <translation>Ingen Utgang Valgt</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <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>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <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>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation>Ugyldig Tittel ID</translation> <translation>Ugyldig Tittel ID</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <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> <translation>Tittel IDen du har angitt er ikke i et gyldig format!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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 være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation> <translation>Tittel IDer 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>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation>Tittel ID/Versjon Ikke Funnet</translation> <translation>Tittel ID/Versjon Ikke Funnet</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <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>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation>Dekryptering av Innhold Mislyktes</translation> <translation>Dekryptering av Innhold Mislyktes</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <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>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, 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 &quot;Bruk lokale filer, hvis de finnes&quot;, kan du prøve å deaktivere dette alternativet før du prøver nedlastingen nytt for å løse eventuelle problemer med lokale data.</translation> <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 &quot;Bruk lokale filer, hvis de finnes&quot;, kan du prøve å deaktivere dette alternativet før du prøver nedlastingen nytt for å løse eventuelle problemer med lokale data.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation>Billett Ikke Tilgjengelig</translation> <translation>Billett Ikke Tilgjengelig</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation> <translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. 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 &quot;Pakk installerbart arkiv&quot; eller &quot;Opprett dekryptert innhold&quot;. Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation> <translation>En billett kunne ikke lastes ned for den forespurte tittelen, men du har valgt &quot;Pakk installerbart arkiv&quot; eller &quot;Opprett dekryptert innhold&quot;. Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation>Ukjent Feil</translation> <translation>Ukjent Feil</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation>En ukjent feil har oppstått!</translation> <translation>En ukjent feil har oppstått!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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 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 GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="363"/>
<source>Script Issues Occurred</source>
<translation>Skriptfeil Oppstod</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>Open NUS script</source> <source>Some issues occurred while running the download script.</source>
<translation type="unfinished"></translation> <translation>Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="366"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation> <translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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 grunn av en feil. Sjekk at Tittel IDen og versjon som er oppført i skriptet er gyldige.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation>Du aktiverte &quot;Opprett dekryptert innhold&quot; eller &quot;Pakk installerbart archive&quot;, 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="402"/>
<source>Script Download Failed</source>
<translation>Skriptnedlasting Mislyktes</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation>Åpne NUS Skript</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS Skript (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation>Det oppstod en feil under parsing av skriptfilen!</translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source> <translation></translation>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="424"/>
<source>Failed to open the script.</source> <source>An error occurred while parsing Title IDs!</source>
<translation type="unfinished"></translation> <translation>Det oppstod en feil under parsing av Tittel IDer!</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>Tittelen ved indeks {script_data.index(title)} har ikke en Tittel ID!</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translation type="unfinished"></translation> <translation>Påfør patcher IOS (gjelder kun WADer)</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation type="unfinished"></translation> <translation>NUSGet Oppdatering Tilgjengelig</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation>Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
<translation type="unfinished"></translation> <translation>
Kunne ikke sjekke for oppdateringer.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation>
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>
<translation type="unfinished"></translation> <translation>
Du kjører den nyeste versjonen av NUSGet.</translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@@ -9,102 +9,111 @@
<translation>MainWindow</translation> <translation>MainWindow</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
<source>Available Titles</source> <source>Available Titles</source>
<translation>Tilgjengelige Titler</translation> <translation type="vanished">Tilgjengelige Titler</translation>
</message> </message>
<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> <source>Wii</source>
<translation>Wii</translation> <translation>Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation>vWii</translation> <translation>vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation>DSi</translation> <translation>DSi</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation>Tittel ID</translation> <translation>Tittel ID</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translation>v</translation> <translation>v</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation>Versjon</translation> <translation>Versjon</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation>Konsoll:</translation> <translation>Konsoll:</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation>Start Nedlasting</translation> <translation>Start Nedlasting</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation type="unfinished"></translation> <translation>Kjøre Skript</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation>Generelle Instillinger</translation> <translation>Generelle Instillinger</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation>Pakke installerbart arkiv (WAD/TAD)</translation> <translation>Pakke installerbart arkiv (WAD/TAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation>Filnavn</translation> <translation>Filnavn</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation>Oppbevar kryptert innhold</translation> <translation>Oppbevar kryptert innhold</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source> <source>Create decrypted contents (*.app)</source>
<translation>Opprette dekryptert innold (*.app)</translation> <translation>Opprette dekryptert innold (*.app)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation>Bruk lokale filer, hvis de finnes</translation> <translation>Bruk lokale filer, hvis de finnes</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <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>Bruk Wii U NUS (raskere, påvirker bare Wii/vWii)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation>vWii Tittelinstillinger</translation> <translation>vWii Tittelinstillinger</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation> <translation>Krypter tittelen nytt ved hjelp av Wii Common Key</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -113,7 +122,14 @@ li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; } li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; }
hr { height: 1px; border-width: 0; }
li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
@@ -128,7 +144,6 @@ p, li { white-space: pre-wrap; }
&lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation> &lt;p style=&quot;-qt-paragraph-type:empty; margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-indent:0px;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="85"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -139,7 +154,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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source>
<translation>NUSGet v{nusget_version} <translation type="vanished">NUSGet v{nusget_version}
Utviklet av NinjaCheetah Utviklet av NinjaCheetah
Drevet av libWiiPy {libwiipy_version} Drevet av libWiiPy {libwiipy_version}
DSi støtte levert av libTWLPy {libtwlpy_version} DSi støtte levert av libTWLPy {libtwlpy_version}
@@ -151,155 +166,219 @@ Titler merket med en hake er fri og har en billett tilgjengelig, og kan dekrypte
Titler er lastes ned til en mappe med navnet &quot;NUSGet&quot; i nedlastingsmappen din.</translation> Titler er lastes ned til en mappe med navnet &quot;NUSGet&quot; i nedlastingsmappen din.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>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 &quot;NUSGet Downloads&quot; i nedlastingsmappen din.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation type="unfinished"></translation> <translation>Ingen Utgang Valgt</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <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>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <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>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation>Ugyldig Tittel ID</translation> <translation>Ugyldig Tittel ID</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="299"/> <location filename="../../NUSGet.py" line="319"/>
<source>The Title ID you have entered is not in a valid format!</source> <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> <translation>Tittel IDen du har angitt er ikke i et gyldig format!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="301"/> <location filename="../../NUSGet.py" line="321"/>
<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> <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 være 16-sifrede tall og bokstav strenger. Vennligst skriv inn en korrekt formatert Tittel ID, eller velg en fra menyen til venstre.</translation> <translation>Tittel IDer 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>
<message> <message>
<location filename="../../NUSGet.py" line="303"/> <location filename="../../NUSGet.py" line="323"/>
<source>Title ID/Version Not Found</source> <source>Title ID/Version Not Found</source>
<translation>Tittel ID/Versjon Ikke Funnet</translation> <translation>Tittel ID/Versjon Ikke Funnet</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="304"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source> <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>Ingen tittel med oppgitt Tittel ID eller versjon ble funnet!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="306"/> <location filename="../../NUSGet.py" line="326"/>
<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> <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>
<message> <message>
<location filename="../../NUSGet.py" line="308"/> <location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source> <source>Content Decryption Failed</source>
<translation>Dekryptering av Innhold Mislyktes</translation> <translation>Dekryptering av Innhold Mislyktes</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="309"/> <location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source> <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>Dekryptering av innhold var ikke vellykket! Dekryptert innhold kunne ikke opprettes.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="312"/> <location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, try disabling that option before trying the download again to fix potential issues with local data.</source> <source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, 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 &quot;Bruk lokale filer, hvis de finnes&quot;, kan du prøve å deaktivere dette alternativet før du prøver nedlastingen nytt for å løse eventuelle problemer med lokale data.</translation> <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 &quot;Bruk lokale filer, hvis de finnes&quot;, kan du prøve å deaktivere dette alternativet før du prøver nedlastingen nytt for å løse eventuelle problemer med lokale data.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="315"/> <location filename="../../NUSGet.py" line="335"/>
<source>Ticket Not Available</source> <source>Ticket Not Available</source>
<translation>Billett Ikke Tilgjengelig</translation> <translation>Billett Ikke Tilgjengelig</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="316"/> <location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source> <source>No Ticket is Available for the Requested Title!</source>
<translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation> <translation>Ingen billett er tilgjengelig for den forespurte tittelen!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. 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 &quot;Pakk installerbart arkiv&quot; eller &quot;Opprett dekryptert innhold&quot;. Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation> <translation>En billett kunne ikke lastes ned for den forespurte tittelen, men du har valgt &quot;Pakk installerbart arkiv&quot; eller &quot;Opprett dekryptert innhold&quot;. Disse alternativene er ikke tilgjenelige for titler uten billett. Bare kryptert innhold har blitt lagret.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="341"/>
<source>Unknown Error</source> <source>Unknown Error</source>
<translation>Ukjent Feil</translation> <translation>Ukjent Feil</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source> <source>An Unknown Error has Occurred!</source>
<translation>En ukjent feil har oppstått!</translation> <translation>En ukjent feil har oppstått!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="344"/>
<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> <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 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 GitHub med detaljer om hva du prøvde å gjøre da denne feilen oppstod.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="363"/>
<source>Script Issues Occurred</source>
<translation>Skriptfeil Oppstod</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>Open NUS script</source> <source>Some issues occurred while running the download script.</source>
<translation type="unfinished"></translation> <translation>Noen feil oppstod under kjøring av nedlastingsskriptet.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="366"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation> <translation>Sjekk loggen for mer informasjon om feilene som har oppstått.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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 grunn av en feil. Sjekk at Tittel IDen og versjon som er oppført i skriptet er gyldige.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, but the following titles in the script do not have tickets available. If enabled, encrypted contents were still downloaded.</source>
<translation>Du aktiverte &quot;Opprett dekryptert innhold&quot; eller &quot;Pakk installerbart archive&quot;, 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="402"/>
<source>Script Download Failed</source>
<translation>Skriptnedlasting Mislyktes</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation>Åpne NUS Skript</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>NUS Skript (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation>Det oppstod en feil under parsing av skriptfilen!</translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source> <translation></translation>
<translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="371"/> <location filename="../../NUSGet.py" line="424"/>
<source>Failed to open the script.</source> <source>An error occurred while parsing Title IDs!</source>
<translation type="unfinished"></translation> <translation>Det oppstod en feil under parsing av Tittel IDer!</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>Tittelen ved indeks {script_data.index(title)} har ikke en Tittel ID!</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <source>Apply patches to IOS (Applies to WADs only)</source>
<translation type="unfinished"></translation> <translation>Påfør patcher IOS (gjelder kun WADer)</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation type="unfinished"></translation> <translation>NUSGet Oppdatering Tilgjengelig</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation>Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</source> Could not check for updates.</source>
<translation type="unfinished"></translation> <translation>
Kunne ikke sjekke for oppdateringer.</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished"></translation> <translation>
Det finnes en nyere versjon av NUSGet tilgjengelig!</translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;re running the latest release of NUSGet.</source>
<translation type="unfinished"></translation> <translation>
Du kjører den nyeste versjonen av NUSGet.</translation>
</message> </message>
</context> </context>
</TS> </TS>

View File

@@ -4,7 +4,6 @@
<context> <context>
<name>MainWindow</name> <name>MainWindow</name>
<message> <message>
<location filename="../../NUSGet.py" line="85"/>
<source>NUSGet v{nusget_version} <source>NUSGet v{nusget_version}
Developed by NinjaCheetah Developed by NinjaCheetah
Powered by libWiiPy {libwiipy_version} Powered by libWiiPy {libwiipy_version}
@@ -15,7 +14,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 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 &quot;NUSGet&quot; inside your downloads folder.</source> Titles will be downloaded to a folder named &quot;NUSGet&quot; inside your downloads folder.</source>
<translation type="unfinished">NUSGet v{nusget_version} <translation type="vanished">NUSGet v{nusget_version}
Dezvoltat de NinjaCheetah Dezvoltat de NinjaCheetah
Operat de libWiiPy {libwiipy_version} Operat de libWiiPy {libwiipy_version}
Suport pentru DSi oferit de libTWLPy {libtwlpy_version} Suport pentru DSi oferit de libTWLPy {libtwlpy_version}
@@ -27,237 +26,316 @@ 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> Titlurile vor fi descărcate într-un folder numit NUSGet în fișierul dvs. de download.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="184"/> <location filename="../../NUSGet.py" line="98"/>
<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 &quot;NUSGet Downloads&quot; inside your downloads folder.</source>
<translation>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="192"/>
<source>NUSGet Update Available</source> <source>NUSGet Update Available</source>
<translation type="unfinished">Actualizare NUSGet disponibilă</translation> <translation>Actualizare NUSGet disponibilă</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="185"/> <location filename="../../NUSGet.py" line="193"/>
<source>There&apos;s a newer version of NUSGet available!</source> <source>There&apos;s a newer version of NUSGet available!</source>
<translation type="unfinished">O nouă versiune NUSGet este disponibilă!</translation> <translation>O nouă versiune NUSGet este disponibilă!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="264"/> <location filename="../../NUSGet.py" line="286"/>
<source>No Output Selected</source> <source>No Output Selected</source>
<translation type="unfinished">Nu s-a selectat un output.</translation> <translation>Nu s-a selectat un output</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="265"/> <location filename="../../NUSGet.py" line="287"/>
<source>You have not selected any format to output the data in!</source> <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> <translation>Nu ați selectat niciun format de ieșire!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="267"/> <location filename="../../NUSGet.py" line="289"/>
<source>Please select at least one option for how you would like the download to be saved.</source> <source>Please select at least one option for how you would like the download to be saved.</source>
<translation type="unfinished"> rugăm selectați cel puțin o opțiune pentru modul în care doriți salvați datele descărcate.</translation> <translation> rugăm selectați cel puțin o opțiune pentru modul în care doriți salvați datele descărcate.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="298"/> <location filename="../../NUSGet.py" line="318"/>
<source>Invalid Title ID</source> <source>Invalid Title ID</source>
<translation type="unfinished">Title ID invalid</translation> <translation>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 conțină exact 16 cifre și/sau litere. 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 corespundă cu Title ID sau cu versiunea introdusă nu a fost găsit!</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"> rugăm asigurați ați introdus un Title ID valid sau selectat din baza de date cu titluri, și versiunea introdusă există pentru titlul pe care încercați îl descărcați.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="308"/>
<source>Content Decryption Failed</source>
<translation type="unfinished">Decriptarea conținutului a eșuat.</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>
</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 &quot;Use local files, if they exist&quot;, 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 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="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>
<message> <message>
<location filename="../../NUSGet.py" line="319"/> <location filename="../../NUSGet.py" line="319"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. These options are not available for titles without a ticket. Only encrypted contents have been saved.</source> <source>The Title ID you have entered is not in a valid format!</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> <translation>Title ID pe care l-ați introdus este invalid!</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="321"/> <location filename="../../NUSGet.py" line="321"/>
<source>Unknown Error</source> <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">Eroare necunoscută</translation> <translation>Title ID-urile trebuie conțină exact 16 cifre și/sau litere. rugăm introduceți un Title ID corect, sau selectați unul din meniul din stânga.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="322"/> <location filename="../../NUSGet.py" line="323"/>
<source>An Unknown Error has Occurred!</source> <source>Title ID/Version Not Found</source>
<translation type="unfinished">S-a produs o eroare necunoscută!</translation> <translation>Title ID/Versiunea nu a fost găsită</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="324"/> <location filename="../../NUSGet.py" line="324"/>
<source>No title with the provided Title ID or version could be found!</source>
<translation>Niciun titlu care corespundă cu Title ID-ul sau cu versiunea introdusă nu a fost găsit!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="326"/>
<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> rugăm asigurați ați introdus un Title ID valid sau ați selectat unul din baza de date cu titluri, și versiunea introdusă există pentru titlul pe care încercați îl descărcați.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="328"/>
<source>Content Decryption Failed</source>
<translation>Decriptarea conținutului a eșuat</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="329"/>
<source>Content decryption was not successful! Decrypted contents could not be created.</source>
<translation>Decriptarea conținutului nu a reușit. Nu s-a putut crea conținutul decriptat.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="332"/>
<source>Your TMD or Ticket may be damaged, or they may not correspond with the content being decrypted. If you have checked &quot;Use local files, if they exist&quot;, 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 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="335"/>
<source>Ticket Not Available</source>
<translation>Ticket-ul nu este valabil</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="336"/>
<source>No Ticket is Available for the Requested Title!</source>
<translation>Niciun Ticket nu este valabil pentru titlul dorit!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="339"/>
<source>A ticket could not be downloaded for the requested title, but you have selected &quot;Pack installable archive&quot; or &quot;Create decrypted contents&quot;. 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="341"/>
<source>Unknown Error</source>
<translation>Eroare necunoscută</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="342"/>
<source>An Unknown Error has Occurred!</source>
<translation>S-a produs o eroare necunoscută!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="344"/>
<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> <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"> rugăm încercați din nou. Dacă problema persistă, rugăm deschideți un issue pe GitHub în care explicați ce ați încercat faceți atunci când această eroare a apărut.</translation> <translation> rugăm încercați din nou. Dacă problema persistă, rugăm deschideți un issue pe GitHub în care explicați ce ați încercat faceți atunci când această eroare a apărut.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="363"/>
<source>Script Issues Occurred</source>
<translation>Au apărut probleme cu scriptul</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="364"/>
<source>Open NUS script</source> <source>Some issues occurred while running the download script.</source>
<translation type="unfinished">Deschideți script NUS</translation> <translation>Au apărut câteva probleme la rularea scriptului descărcat.</translation>
</message> </message>
<message> <message>
<location filename="../../NUSGet.py" line="364"/> <location filename="../../NUSGet.py" line="366"/>
<source>NUS Scripts (*.nus *.txt)</source> <source>Check the log for more details about what issues were encountered.</source>
<translation type="unfinished"></translation> <translation>Verificați logurile pentru mai multe detalii despre problemele întâmpinate.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="373"/>
<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. rugăm asigurați Title ID și versiunea listate în script sunt valide.</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="383"/>
<source>You enabled &quot;Create decrypted contents&quot; or &quot;Pack installable archive&quot;, 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="402"/>
<source>Script Download Failed</source>
<translation>Descărcarea scriptului a eșuat</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="403"/>
<source>Open NUS Script</source>
<translation>Deschideți script NUS</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="404"/>
<source>NUS Scripts (*.nus *.json)</source>
<translation>Scripturi NUS (*.nus *.json)</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="414"/>
<source>An error occurred while parsing the script file!</source>
<translation>A apărut o eroare la parssarea acestui fișier script!</translation>
</message> </message>
<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="415"/>
<location filename="../../NUSGet.py" line="422"/> <source>Error encountered at line {e.lineno}, column {e.colno}. Please double-check the script and try again.</source>
<source>Script Failure</source> <translation>S-a produs o eroare la linia {e.lineno}, coloana {e.colno}. rugăm verificați scriptul și încercați din nou.</translation>
<translation type="unfinished">Eșuare Script</translation> </message>
<message>
<location filename="../../NUSGet.py" line="424"/>
<source>An error occurred while parsing Title IDs!</source>
<translation>A apărut o eroare la procesarea Title ID-urilor!</translation>
</message>
<message>
<location filename="../../NUSGet.py" line="425"/>
<source>The title at index {script_data.index(title)} does not have a Title ID!</source>
<translation>Titlul la poziția {script_data.index(title)} nu are un Title ID!</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>
<message> <message>
<location filename="../../NUSGet.py" line="371"/>
<source>Failed to open the script.</source> <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>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="26"/> <location filename="../../qt/ui/MainMenu.ui" line="26"/>
<source>MainWindow</source> <source>MainWindow</source>
<translation type="unfinished">Fereastra principală</translation> <translation>Fereastra principală</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="43"/>
<source>Available Titles</source> <source>Available Titles</source>
<translation type="unfinished">Titluri valabile</translation> <translation type="obsolete">Titluri valabile</translation>
</message> </message>
<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> <source>Wii</source>
<translation type="unfinished"></translation> <translation>Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="103"/> <location filename="../../qt/ui/MainMenu.ui" line="100"/>
<source>vWii</source> <source>vWii</source>
<translation type="unfinished"></translation> <translation>vWii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="134"/> <location filename="../../qt/ui/MainMenu.ui" line="110"/>
<source>DSi</source> <source>DSi</source>
<translation type="unfinished"></translation> <translation>DSi</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="174"/> <location filename="../../qt/ui/MainMenu.ui" line="135"/>
<source>Title ID</source> <source>Title ID</source>
<translation type="unfinished"></translation> <translation>Title ID</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="181"/> <location filename="../../qt/ui/MainMenu.ui" line="142"/>
<source>v</source> <source>v</source>
<translation type="unfinished"></translation> <translation>v</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="194"/> <location filename="../../qt/ui/MainMenu.ui" line="155"/>
<source>Version</source> <source>Version</source>
<translation type="unfinished">Versiune</translation> <translation>Versiune</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="201"/> <location filename="../../qt/ui/MainMenu.ui" line="162"/>
<source>Console:</source> <source>Console:</source>
<translation type="unfinished">Consolă</translation> <translation>Consolă:</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="237"/> <location filename="../../qt/ui/MainMenu.ui" line="198"/>
<source>Start Download</source> <source>Start Download</source>
<translation type="unfinished">Începeți descărcarea</translation> <translation>Începeți descărcarea</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="250"/> <location filename="../../qt/ui/MainMenu.ui" line="211"/>
<source>Run Script</source> <source>Run Script</source>
<translation type="unfinished">Rulați script</translation> <translation>Rulați script</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="277"/> <location filename="../../qt/ui/MainMenu.ui" line="238"/>
<source>General Settings</source> <source>General Settings</source>
<translation type="unfinished">Setări Generale</translation> <translation>Setări Generale</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="308"/> <location filename="../../qt/ui/MainMenu.ui" line="269"/>
<source>Pack installable archive (WAD/TAD)</source> <source>Pack installable archive (WAD/TAD)</source>
<translation type="unfinished">Împachetați arhiva instalabilă (WAD/TAD)</translation> <translation>Împachetați arhiva instalabilă (WAD/TAD)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="323"/> <location filename="../../qt/ui/MainMenu.ui" line="284"/>
<source>File Name</source> <source>File Name</source>
<translation type="unfinished">Nume fișier</translation> <translation>Nume fișier</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="357"/> <location filename="../../qt/ui/MainMenu.ui" line="318"/>
<source>Keep encrypted contents</source> <source>Keep encrypted contents</source>
<translation type="unfinished">Păstrați conținuturile encriptate</translation> <translation>Păstrați conținuturile encriptate</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="354"/>
<source>Create decrypted contents (*.app)</source>
<translation>Creați conținuturi decriptate (*.app)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="393"/> <location filename="../../qt/ui/MainMenu.ui" line="393"/>
<source>Create decrypted contents (*.app)</source>
<translation type="unfinished">Creați conținuturi decriptate (*.app)</translation>
</message>
<message>
<location filename="../../qt/ui/MainMenu.ui" line="432"/>
<source>Use local files, if they exist</source> <source>Use local files, if they exist</source>
<translation type="unfinished">Folosiți fișiere locale, dacă există</translation> <translation>Folosiți fișiere locale, dacă există</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="477"/> <location filename="../../qt/ui/MainMenu.ui" line="438"/>
<source>Use the Wii U NUS (faster, only effects Wii/vWii)</source> <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> <translation>Folosiți Wii U NUS (mai rapid, doar pentru Wii/vWii)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="519"/> <location filename="../../qt/ui/MainMenu.ui" line="480"/>
<source>Apply patches to IOS (Applies to WADs only)</source> <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> <translation>Aplicați patch-uri pentru IOS (se aplică doar pentru WAD-uri)</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="575"/> <location filename="../../qt/ui/MainMenu.ui" line="536"/>
<source>vWii Title Settings</source> <source>vWii Title Settings</source>
<translation type="unfinished">vWII Setări titlu</translation> <translation>vWII Setări titlu</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="609"/> <location filename="../../qt/ui/MainMenu.ui" line="570"/>
<source>Re-encrypt title using the Wii Common Key</source> <source>Re-encrypt title using the Wii Common Key</source>
<translation type="unfinished">Re-encriptați titlul folosind cheia comună Wii</translation> <translation>Re-encriptați titlul folosind cheia comună Wii</translation>
</message> </message>
<message> <message>
<location filename="../../qt/ui/MainMenu.ui" line="666"/> <location filename="../../qt/ui/MainMenu.ui" line="627"/>
<source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt; <source>&lt;!DOCTYPE HTML PUBLIC &quot;-//W3C//DTD HTML 4.0//EN&quot; &quot;http://www.w3.org/TR/REC-html40/strict.dtd&quot;&gt;
&lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt; &lt;html&gt;&lt;head&gt;&lt;meta name=&quot;qrichtext&quot; content=&quot;1&quot; /&gt;&lt;meta charset=&quot;utf-8&quot; /&gt;&lt;style type=&quot;text/css&quot;&gt;
p, li { white-space: pre-wrap; } p, li { white-space: pre-wrap; }
@@ -266,28 +344,34 @@ li.unchecked::marker { content: &quot;\2610&quot;; }
li.checked::marker { content: &quot;\2612&quot;; } li.checked::marker { content: &quot;\2612&quot;; }
&lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt; &lt;/style&gt;&lt;/head&gt;&lt;body style=&quot; font-family:&apos;Noto Sans&apos;; font-size:10pt; font-weight:400; font-style:normal;&quot;&gt;
&lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source> &lt;p style=&quot;-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:&apos;Sans Serif&apos;; font-size:9pt;&quot;&gt;&lt;br /&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<translation type="unfinished"></translation> <translation></translation>
</message> </message>
<message> <message>
<location filename="../../modules/core.py" line="26"/> <location filename="../../modules/core.py" line="52"/>
<source> <source>
Could not check for updates.</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>
<message> <message>
<location filename="../../modules/core.py" line="34"/> <location filename="../../modules/core.py" line="60"/>
<source> <source>
There&apos;s a newer version of NUSGet available!</source> There&apos;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>
<message> <message>
<location filename="../../modules/core.py" line="36"/> <location filename="../../modules/core.py" line="62"/>
<source> <source>
You&apos;re running the latest release of NUSGet.</source> You&apos;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> </message>
</context> </context>
</TS> </TS>

View File

@@ -1,5 +1,5 @@
# "update_translations.py", licensed under the MIT license # "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 # 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. # expected, as it struggles to parse the paths in the .pyproject file. This does what it's meant to do for it.